LINUX.ORG.RU
ФорумAdmin

Странности маршрутизации


0

0

Есть 2 подключения к разным провайдерам. На шлюзе пытаюсь сделать multipath routing:
eth1 смотрит в сторону первого провайдера, в сторону второго через openvpn сделан tun0.
Добавляю маршрут:
ip route add default scope global \
nexthop via шлюз_к_прову_1 dev eth1 weight 1 \
nexthop dev tun0 weight 1

После этого наблюдаю такую картину:
все, что определяется (маршрутизационным кодом) через eth1, работает нормально, а вот через tun0 - пакеты почему-то идут с src адресом не tun0 (192.168.0.1), а eth1:
$ ip route get 1.1.1.1
1.1.1.1 dev tun0 src 192.168.0.1 (<-- правильный src !)
...
В то же время после ping/traceroute -I 1.1.1.1 "tcpdump -ni tun0 host 1.1.1.1" показывает ICMP пакеты с исходящим адресом eth1. Хотя ping 192.168.0.2 (это IP на другом конце туннеля) идет с правильным src адресом.

Да, все это пробовал с полностью чистым firewall-ом, без дополнительных ip rule и routing tables, правил только default маршрут в таблице main, "ip route flush cache" делать не забывал.

Пробовал сделать
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
не работает ! пакеты идут с тем же неверным src (хотя SNAT с явно заданным адресом исправляет IP).

Если в default маршруте поменять местами nexthop-ы:
ip route add default scope global \
nexthop dev tun0 weight 1 \
nexthop via шлюз_к_прову_1 dev eth1 weight 1
тогда и остальное тоже меняется местами: все, что через tun0, - работает идеально, а идущее через eth1 идет с src адресом tun0 (192.168.0.1).
И точно такой же "-o eth1 -j MASQUERADE" снова не работает.
Т.е. по каким-то причинам ядро выбирает src адрес не с того интерфейса.

Если использовать не туннель (он идет через eth0), а eth0:
ip route add default scope global \
nexthop via шлюз_к_прову_1 dev eth1 weight 1 \
nexthop via шлюз_к_прову_2 dev eth0 weight 1
тогда все везде работает отлично, но хочется сделать именно через туннель, причем без SNAT-ов.

Вопрос: почему ядро берет не тот IP ? Как это можно исправить ? (SNAT не предлагать)

★★★★★

а что будет, если вместо

ip route add default scope global \
nexthop via шлюз_к_прову_1 dev eth1 weight 1 \
nexthop dev tun0 weight 1

сделать

ip route add default scope global \
nexthop via шлюз_к_прову_1 dev eth1 weight 1 \
nexthop via УДАЛЕННЫЙ_IP_НА_TUN src 192.168.0.1 dev tun0 weight 1

(как я понял 192.168.0.1 - IP на твоем конце туннеля)

samson ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.