it-swarm-ru.tech

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

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

54
Shawn J. Goff
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-му интерфейсу, в качестве адреса источника (от) в исходящем пакете.

64
Peter

Следующие команды создают альтернативную таблицу маршрутизации через 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 мог их отслеживать.

6
Gilles 'SO- stop being evil'

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

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
5
Héctor Sánchez

Я предполагаю, что вы используете 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
3
zaTricky