Назад | Перейти на главную страницу

Как перенаправить трафик на разные ники в зависимости от источника?

Я новичок в IPtables, но хочу отправлять трафик на определенную карту в зависимости от источника. Вот чего бы я хотел:

eth0 - весь трафик идет на этот сетевой адаптер

В зависимости от исходного IP-адреса я хочу направлять трафик в Интернет либо по eth1, либо по eth2.

Я пробовал добавить следующее в nat iptable, но он не работает.

iptables -t nat -A POSTROUTING -s 10.0.0.100 -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.0.0.200 -o eth2 -j MASQUERADE

Какие шаги мне не хватает?

Я смог выполнить эту работу, используя пользовательские таблицы маршрутов

Создайте собственную таблицу маршрутов: echo 2000 CustomTable >> /etc/iproute2/rt_tables

Добавить правило: ip rule add from 10.0.0.100 lookup CustomTable

Добавить маршрут: ip route add default via 10.0.0.254 dev eth1 table CustomTable

Это отправит любой трафик с 10.0.0.100 на dev eth1

Имейте в виду, что эти настройки будут потеряны при перезагрузке или перезапуске сетевых служб.

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

При этом вы можете использовать несколько таблиц маршрутизации вместе с правилами маршрутизации. Сначала вы, вероятно, захотите дать имена новым таблицам, которые вы создадите:

echo 2001 default-via-eth1 >> /dev/iproute2/rt_tables
echo 2002 default-via-eth2 >> /dev/iproute2/rt_tables

Затем вам нужно создать свои специальные таблицы маршрутизации, что легко - просто добавьте имя таблицы при создании маршрута (и 1.2.3.4 и 5.6.7.8 являются примерами - используйте здесь правильные IP-адреса ваших шлюзов) :

ip route add default via 1.2.3.4 dev eth1 table default-via-eth1
ip route add default via 5.6.7.8 dev eth2 table default-via-eth2

И, наконец, вы связываете их вместе с "правилами":

ip rule add pref 30000 from 10.0.0.100 table default-via-eth1
ip rule add pref 30001 from 10.0.0.200 table default-via-eth2

Вы можете увидеть действующие правила с помощью этой команды:

ip rule

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

ip route show table via-eth1

ВНИМАНИЕ С этим возникают проблемы, если вы используете виртуальный сервер типа «контейнер», такой как openvz или lxc, и это потому, что большинство программ написаны с использованием «неуказанного» IP-адреса в качестве адреса источника. Поэтому ядро ​​должно определить, какой исходный IP-адрес использовать, и выберет его на основе используемого маршрута. И я надеюсь, вы видите в этом иронию - адрес источника основан на маршруте, который основан на адресе источника! Кажется, что происходит то, что правила ip игнорируются, и он использует встроенный список таблиц для поиска маршрута.