LINUX.ORG.RU
ФорумAdmin

iproute и iptables -t mangle -A OUTPUT


0

0

Есть сервер, два канала в нет, ppp0 и ppp1 такие правила

root@server / # ip rule
0: from all lookup local
32765: from all fwmark 0x5 lookup T1
32766: from all lookup main
32767: from all lookup default

root@server / # ip route list table T1
default via 10.6.6.6 dev ppp1

iptables -t mangle -A PREROUTING -s 192.168.1.5 -j MARK --set-mark 5

Это работает как нужно, а вот как сделать например что бы с сервера определённые юзеры ходили через этот маршрут, например squid, вроде как должно быть так

iptables -t mangle -A OUTPUT -m owner --uid-owner 13 -j MARK --set-mark 5

не не работает, смотрел traceroute от юзера squid,

traceroute to 74.125.87.104 (74.125.87.104), 30 hops max, 60 byte packets
1 * * *
2 * * *
3 * * *
и т.д

а в это время tcpdump -i ppp1 -n -nnn

16:54:03.912801 IP 86.57.152.131.47617 > 74.125.87.104.33434: UDP, length 32
16:54:03.913851 IP айпишник_интерфейса_ppp0.38990 > 74.125.87.104.33435: UDP, length 32
16:54:03.913911 IP айпишник_интерфейса_ppp0.38674 > 74.125.87.104.33436: UDP, length 32
16:54:03.913939 IP айпишник_интерфейса_ppp0.46701 > 74.125.87.104.33437: UDP, length 32
16:54:03.913964 IP айпишник_интерфейса_ppp0.50603 > 74.125.87.104.33438: UDP, length 32
16:54:03.913990 IP айпишник_интерфейса_ppp0.52476 > 74.125.87.104.33439: UDP, length 32

Откуда там берётся адрес с ppp0 в чём ошибка?

Проблема в том, что исходящий адрес выбирается по таблице main, без учета policy-based routing. Делай SNAT.

Например, так

iptables -t nat -A POSTROUTING -m mark --mark 5 -s айпишник_интерфейса_ppp0 -j SNAT --to-source айпишник_интерфейса_ppp1

anonymous ()
Ответ на: комментарий от anonymous

Спасибо, работает, tcpdump всё правильно показывает, но как сделать что бы оно работало когда соединение ppp0 отсутствует?

bsd_user ()
Ответ на: комментарий от bsd_user

Тогда все плохо.
К сожалению, ядро linux является нагромождением костылей, в частности, плакат с надписью policy-based routing (iproute2) очень криво натянут на древнюю систему статической маршрутизации. Как я уже говорил выше, исходящий адрес для соединения до сих пор выбирается _только_ по таблице main, без учета каких-либо правил. Если же подходящей записи в этой таблице не находится, ядро посылает нахрен и говорит, что сети нет.

Мораль: придется делать костыль, который при падении ppp0 прописывает ppp1 дефолтным шлюзом в main. Иначе никак.

nnz ★★★★ ()
Ответ на: комментарий от bsd_user

Да. У них исходящий адрес какбэ уже определен :)
Выбор исходящего адреса производится только для соединений, инициируемых самим хостом.

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