Изменить исходный адрес на основе 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
Вы можете добавить столько таблиц, сколько захотите, просто помните, что всем им потребуется маршрут по умолчанию, интерфейс источника и адрес источника, поэтому, когда пакет маршрутизируется через таблицу, адрес источника будет установлен правильно, и он будет использовать правильный интерфейс.
Посмотрите на эти страницы, это дает много дополнительной информации о том, как настроить таблицу такого типа: