Ответить на тот же интерфейс, что и входящий?


51

У меня есть система с двумя интерфейсами. Оба интерфейса подключены к Интернету. Один из них установлен как маршрут по умолчанию; побочным эффектом этого является то, что если пакет поступает на интерфейс не-default-route, ответ отправляется обратно через интерфейс маршрута по умолчанию. Есть ли способ использовать iptables (или что-то еще) для отслеживания соединения и отправки ответа обратно через интерфейс, из которого оно получено?

Ответы:


61
echo 200 isp2 >> /etc/iproute2/rt_tables
ip rule add from <interface_IP> dev <interface> table isp2
ip route add default via <gateway_IP> dev <interface> table isp2

Выше не требуется маркировки пакетов с помощью ipfilter. Это работает, потому что исходящие (ответные) пакеты будут иметь IP-адрес, который первоначально использовался для подключения ко 2-му интерфейсу, в качестве адреса источника (от) в исходящем пакете.


7
Вау, это именно то, что я искал. Если кто-то ищет дистрибутивы на основе RH, вы можете поместить соответствующие правила и команды маршрутизации в файлы с именем «rule-eth0» или «route-eth0» (например), которые будут добавлены или удалены при ifup / ifdown. Разместите эти файлы рядом с файлом ifcfg-eth0. Для IPv6 встроена функциональность route6-eth0, но нет встроенного правила rule6-eth0 (пока).
Кайл Брантли

18
Для меня это сработало только когда я пропустил devпараметр в ip ruleкоманде, поэтому запустилip rule add from <interface_IP> table isp2
cdauth

2
Вы можете создать их, когда интерфейс поднимется, добавив up ip rule add from <interface_IP> table isp2и up ip route add default via <gateway_IP> dev ppp0 table isp2к / etc / network / interfaces под соответствующим интерфейсом.
g.rocket

4
Мне пришлось удалить dev <interface>из, ip ruleчтобы заставить его работать на моей коробке. Если я правильно понимаю, dev <interface>была фильтрация пакетов, которые были каким-то образом установлены на неправильном интерфейсе, который нужно было переместить в правильный интерфейс по переопределенному маршруту, но фильтрация правил по интерфейсу предотвращала это.
Бинки

2
Как и большинству других людей, мне пришлось удалить dev <interface>из ip ruleкоманды, чтобы это работало. Пожалуйста, обновите ответ! За исключением этой детали, он работал как шарм. Большое спасибо, @Peter!
MoonSweep

6

Следующие команды создают альтернативную таблицу маршрутизации через eth1для пакетов, которые имеют метку 1 (кроме пакетов для localhost). Команда ipиз пакета iproute2 (Ubuntu: iproute Установить iproute http://bit.ly/software-small , iproute-doc Установить iproute-doc http://bit.ly/software-small ).

ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth1

Другая половина задания распознает пакеты, которые должны получить оценку 1; затем используйте iptables -t mangle -A OUTPUT … -j MARK --set-mark 1эти пакеты для маршрутизации через таблицу маршрутизации 1. Я думаю, что следующее должно сделать это (замените 1.2.3.4 адресом интерфейса не-default-route):

iptables -t mangle -A OUTPUT -m conntrack --ctorigdst 1.2.3.4 -j MARK --set-mark 1

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


Приятно. Я забыл все о маркировке. Это должно привести меня туда.
Шон Дж. Гофф

5

У меня были проблемы с локально сгенерированными пакетами с помощью решения, предложенного Питером. Я обнаружил, что следующее исправляет это:

echo 200 isp2 >> /etc/iproute2/rt_tables
ip rule add from <interface_IP> table isp2 priority 900
ip rule add from dev <interface> table isp2 priority 1000
ip route add default via <gateway_IP> dev <interface> table isp2
ip route add <interface_prefix> dev <interface> proto static scope link src <interface_IP> table isp2

ПРИМЕЧАНИЕ. Вы можете столкнуться с проблемами синтаксиса в 4-й строке выше. В таких случаях синтаксис для 4-й команды может быть следующим:

ip rule add iif <interface> table isp2 priority 1000

Попробовал так много, но ничего не сработало в моем сценарии, кроме этого .. большое спасибо.
agaggi

3

Я предполагаю, что вы используете Linux и, кроме того, что вы используете дистрибутив RedHat / CentOS. Другие Unix и дистрибутивы потребуют аналогичных шагов - но детали будут другими.


Начните с тестирования (обратите внимание, что это очень похоже на ответ @ Peter. Я предполагаю следующее:

  • eno0 isp0 и имеет общий шлюз по умолчанию
  • eno1 isp1 и имеет IP / диапазон 192.168.1.2/24 со шлюзом 192.168.1.1

Команды следующие:

$ echo 200 isp1 >> /etc/iproute2/rt_tables
$ ip rule add from eno1 table isp1
$ ip route add default via 192.168.1.1 dev eno1 table isp1

Брандмауэр никак не задействован. Ответные пакеты всегда отправлялись с правильного IP-адреса, но ранее отправлялись через неправильный интерфейс. Теперь эти пакеты с правильного IP будут отправлены через правильный интерфейс.


Предполагая, что вышесказанное сработало, теперь вы можете сделать правило и изменения маршрута постоянными. Это зависит от того, какую версию Unix вы используете. Как и прежде, я предполагаю, что дистрибутив Linux основан на RH / CentOS.

$ echo "from eno1 table isp1" > /etc/sysconfig/network-scripts/rule-eno1
$ echo "default via 192.168.1.1 dev eno1 table isp1" > /etc/sysconfig/network-scripts/route-eno1

Проверьте, что изменение сети является постоянным:

$ ifdown eno1 ; ifup eno1

Если это не сработало, в более поздних версиях RH / CentOS вам также нужно выбрать один из двух вариантов:

  • Не используйте по умолчанию NetworkManager.service ; Вместо этого используйте network.service . Я не исследовал точные шаги, необходимые для этого. Я полагаю, что для включения / выключения служб используются стандартные команды chkconfig или systemctl .
  • Установите пакет NetworkManager-dispatcher-routing-rules

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

$ yum install NetworkManager-dispatcher-routing-rules

Еще одна сильная рекомендация - включить фильтрацию arp, поскольку это предотвращает другие связанные с двойной сетью проблемы. С помощью RH / CentOS добавьте следующее содержимое в файл /etc/sysctl.conf:

net.ipv4.conf.default.arp_filter=1
net.ipv4.conf.all.arp_filter=1
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.