routing issue (iproute2 and DNAT)
Здравствуйте!
Схема следующая:
1. На сервере слушает приложение, допустим на адресе 1.1.1.1:10080
2. К серверу подключены 2 линка, по одному из них он доступен как
2.2.2.2 (interface eth0), по другому 3.3.3.3 (interface tun0).
80-е порты внеших адресов 2.2.2.2 и 3.3.3.3 DNAT'ятся на 1.1.1.1:10080
следующим образом:
/sbin/iptables -t nat -A PREROUTING -p tcp -d 2.2.2.2 --dport 80 -j DNAT --to-destination 1.1.1.1:10080
/sbin/iptables -t nat -A PREROUTING -p tcp -d 3.3.3.3 --dport 80 -j DNAT --to-destination 1.1.1.1:10080
3. Есть следующие правила iproute2:
0: from all lookup local
32765: from 3.3.3.3 lookup tun0_net
32766: from all lookup main
32767: from all lookup default
Ну и ip route list table tun0_net:
default dev tun0 scope link
То есть, пакеты приходящие на dst-ip 3.3.3.3 (без DNAT'а) получают ответ
от сервера в интерфейс tun0. Все остальное - по дефолту в eth0.
Но когда в дело включается DNAT - начинаются проблемы. Насколько я
понимаю, routing decision происходит _до_ DNAT'а. Соотственно, пакеты от
1.1.1.1:10080 раутятся в eth0 в любом случае. DNAT потом переписывает src-ip на
3.3.3.3, если пакет пришел через tun0, но поезд ушел, маршрут уже определен. Получается некрасивая
ассиметрия.
Какие есть пути решения этой проблемы? Я нашел ROUTE target в iptables,
по идее это можно использовать, но, насколько я понимаю, для этого нужны
патчи. А хотелось бы обойтись стандартными механизмами.
Или ROUTE на уровне iptables единственный вариант?
--
WBR,
Alexander Burnos
Reply to: