Изменить исходный адрес на основе IP-адреса назначения

У нас есть несколько машин-маршрутизаторов, которые собирают множество внешних IP-адресов на одном хосте и перенаправляют NAT или прокси-трафик во внутреннюю сеть. Они также действуют как маршрутизаторы для машин во внутренней сети. Это работает нормально, однако я не могу составить таблицу маршрутизации, поэтому я могу изменить исходный адрес в зависимости от назначения, к которому машина из внутренней сети хочет получить доступ.

Допустим, у меня есть маршрутизатор, который имеет публичные адреса P1 (5.5.5.1/24) а также P2 (5.5.5.2/24), Весь трафик проходит P1, но при необходимости хост доступен на P2 тоже. Это выглядит так и работает нормально:

> ip addr
...
1: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether aa:bb:cc:dd:ee:11 brd ff:ff:ff:ff:ff:ff
    inet 5.5.5.1/24 brd 5.5.5.255 scope global eth1
    inet 5.5.5.2/24 brd 5.5.5.255 scope global secondary eth1:p2
...

Теперь я хочу использовать P2 в качестве исходного адреса, если я хочу получить доступ к службе Google DNS, например (8.8.8.8). Поэтому я добавляю строку в таблицу маршрутизации, например:

> ip route add 8.8.8.8 via 5.5.5.254 dev eth1 src 5.5.5.2
> ip route
...
default via 5.5.5.254 dev eth1
5.5.5.0/24 dev eth1  proto kernel  scope link  src 5.5.5.1
8.8.8.8 via 5.5.5.254 dev eth1  src 5.5.5.2 
...

Но это не работает. Если я пинг 8.8.8.8Хост все еще использует P1 как адрес источника, так и не использует P2 на все для исходящих соединений.

Я делаю это правильно? Я думаю, нет...

2 ответа

Решение

Тот факт, что вы можете пропинговать пункт назначения с правильным IP-адресом от хоста, но не от внутренней сети (если я правильно прочитал ваш комментарий), предполагает, что у вас включен NAT для внутренней сети.

В этом случае вам нужно просмотреть правила iptables и отредактировать соответствующие правила SNAT или MASQUERADE. Например:

iptables -A POSTROUTING -s <your-internal-network> -d 8.8.8.8 -o eth1 \
-j SNAT --to-source 5.5.5.2

Обратите внимание, что это приведет только к тому, что перенаправленный внутренний сетевой трафик будет поступать с нужного IP-адреса (в примере 5.5.5.2), вам все еще нужны правила / таблицы iproute, чтобы применить те же правила к маршрутизатору. (Соединения идут от самого роутера.)

Вам необходимо настроить конкретные таблицы маршрутизации для каждого соединения, которое называется маршрутизацией на основе политик. У каждой таблицы есть политика, в которой вы можете установить адрес источника и другие опции, если вам нужно.

В вашем случае вы бы добавили новые таблицы:

echo 200 P1 >> / etc / iproute2 / rt_tables
echo 200 P2 >> / etc / iproute2 / rt_tables

Добавьте в маршруты:

ip route add 5.5.5.0/24 dev eth1 src 5.5.5.1 таблица P1
ip route добавить по умолчанию через таблицу 5.5.5.254 P1
ip route add 5.5.5.0/24 dev eth1 src 5.5.5.2 таблица P2
IP-маршрут добавить по умолчанию через 5.5.5.254 таблицы P2
ip route add 8.8.8.8 через 5.5.5.254 таблицу P2

Это важный бит, когда вы говорите ему отвечать тем же IP-адресом, на который он получил соединение.

IP-правило добавить из 5.5.5.1 таблицы P1
IP-правило добавить из 5.5.5.2 таблицы P2

Вы можете добавить столько таблиц, сколько захотите, просто помните, что всем им потребуется маршрут по умолчанию, интерфейс источника и адрес источника, поэтому, когда пакет маршрутизируется через таблицу, адрес источника будет установлен правильно, и он будет использовать правильный интерфейс.

Посмотрите на эти страницы, это дает много дополнительной информации о том, как настроить таблицу такого типа:

http://lartc.org/howto/lartc.rpdb.html

Другие вопросы по тегам