LINUX.ORG.RU
решено ФорумAdmin

Как перекинуть пакеты с одного интерфейса на другой и вернуть обратно

 


1

3

Добрый день!

Дано:

  • одна машина с линуксом
  • два интерфейса:
    • eth1 192.168.1.2, роут наружу через 192.168.1.1
    • eth2 10.8.0.2, роут наружу через 10.8.0.1
  • роут по умолчанию 192.168.1.1 (т.е. по умолчанию - всё через eth1)
  • на 192.168.1.2:80 слушает какое-то приложение

Задача. Соединения и пакеты идущие на 10.8.0.2:80 перебрасывать на 192.168.1.2:80, при этом:

  1. ответы от 192.168.1.2:80 для соединений с 10.8.0.2:80 должны идти обратно через eth2
  2. соединения и пакеты идущие снаружи через eth1 на 192.168.1.2:80 должны обрабатываться как обычно
  3. адрес источника соединения должен оставаться исходным (т.е. приложение должно видеть исходный src ip)

Подскажите, возможно есть готовое решение? Или в какую сторону копать?

Что я не понимаю - как вернуть пакеты обратно через корректный интерфейс.

Решение, которое на первый взгляд работает - CONNMARK save-mark/restore-mark.

В mangle ставим и сохраняем необходимые метки на PREROUTING, а на OUTPUT восстанавливаем метки; в nat делаем DNAT на адрес-порт приложения; роутим в корректный интерфейс на основе метки с помощью iproute2.

  1. добавить таблицу маршрутов /etc/iproute2/rt_tables
  2. добавить для таблицы маршрут по умолчанию через 10.8.0.1
    %> ip route add default via 10.8.0.1 table myrtable
    
  3. добавить правило маршрутизации по метке:
    %> ip rule add from all fwmark 1 table myrtable
    
  4. Добавить правила iptables:
    %> iptables -t mangle -A PREROUTING -d 10.8.0.2/32 -p tcp -m tcp --dport 80 -j MARK --set-mark 1
    %> iptables -t mangle -A PREROUTING -j CONNMARK --save-mark
    %> iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark
    %> iptables -t nat -A PREROUTING -i eth2 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.2:80
    
IPFreely ★★
() автор топика