У нас есть несколько машин-маршрутизаторов, которые собирают множество внешних 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
совсем не для исходящих подключений.
Правильно ли я делаю? Думаю, нет ...
Тот факт, что вы можете пропинговать пункт назначения с правильным 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, чтобы те же правила применялись к маршрутизатору. (Соединения идут от самого роутера.)
Вам необходимо настроить определенные таблицы маршрутизации для каждого соединения, что известно как маршрутизация на основе политик. Каждая таблица имеет политику, в которой вы можете установить исходный адрес и другие параметры, если вам нужно.
В вашем случае вы бы добавили новые таблицы:
эхо 200 P1 >> / etc / iproute2 / rt_tables
эхо 200 P2 >> / etc / iproute2 / rt_tables
Добавьте в маршруты:
ip route add 5.5.5.0/24 dev eth1 src 5.5.5.1 table 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 route добавить по умолчанию через 5.5.5.254 таблица P2
ip route добавить 8.8.8.8 через 5.5.5.254 таблицу P2
Это важный бит, когда вы указываете ему отвечать с тем же IP-адресом, по которому он получил соединение.
ip правило добавить из 5.5.5.1 таблицы P1
ip правило добавить из 5.5.5.2 таблицы P2
Вы можете добавить столько таблиц, сколько захотите, просто помните, что все они будут нуждаться в маршруте по умолчанию, исходном интерфейсе и исходном адресе, поэтому, когда пакет маршрутизируется через таблицу, исходный адрес будет установлен правильно, и он будет использовать правильный интерфейс.
Взгляните на эти страницы, они дают много дополнительной информации о том, как настроить такую таблицу: