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