Відповісти в тому ж інтерфейсі, що і вхідний?


51

У мене система з двома інтерфейсами. Обидва інтерфейсу підключені до Інтернету. Один з них встановлений як маршрут за замовчуванням; побічним ефектом цього є те, що якщо пакет надходить в інтерфейс маршруту, який не використовується за замовчуванням, відповідь надсилається назад через інтерфейс маршруту за замовчуванням. Чи є можливість використовувати 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вашим / і т.д. / мережі / інтерфейси за відповідним інтерфейсу.
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 адресою інтерфейсу маршруту, який не використовується за замовчуванням):

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 та дистрибуції потребують подібних кроків - але деталі будуть різними.


Почніть з тестування (зауважте, що це дуже схоже на відповідь @ Петра. Я припускаю наступне:

  • 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-диспетчер-маршрутизація

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

$ yum install NetworkManager-dispatcher-routing-rules

Ще однією наполегливою рекомендацією є включення фільтрування арп, оскільки це запобігає іншим пов'язаним проблемам з подвійною мережевою конфігурацією. За допомогою 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.