LINUX.ORG.RU
ФорумAdmin

продвинутый роутинг (iproute2 и iptables -j ROUTE) и локальные адреса


0

0

Есть два интерфейса с разными IP'шниками. Пусть будет eth1 (1.1.1.1 и шлюз 1.1.1.254) и eth2 (2.2.2.2 и шлюз 2.2.2.254)

Требуется для локальных сокетов рулить исходящим IP'шником через iptables. Иначе говоря, у меня стоит route add default gw 2.2.2.254 но для некоторых адресов и портов я хочу направлять соединения через другой интерфейс. Пишу:

iptables -t mangle -A OUTPUT --dport 22 -j ROUTE --gw 1.1.1.254

и пакеты отлично уходят через eth1 НО с исходящим адресом интерфейса eth2 (2.2.2.2), а нужно чтобы уходили, разумеется, с адресом 1.1.1.1

В доке на netfilter сказано:

The NF_IP_LOCAL_OUT [5] hook is called for locally generated packets. Here You can see that routing occurs after this hook is called: in fact, the routing code is called first (to figure out the source IP address and some IP options), and called again if the packet is altered.

Т.е. в каких-то случаях можно повторно запустить routing code, чтобы правильный локальный адрес выбрался? Как это сделать?


Забыл ещё момент (потому у меня в сабже про iproute2 упоминается)

пишу другое правило:

iptables -t mangle -A OUTPUT --dport 22 -j MARK --set-mark 1

оно вообще нифига не действует :( Именно для локальных сокетов. Пакеты пришедшие с других компов отлично роутятся так, как я хочу...

Роутинг настроен так:

ip rule add from 1.1.1.1 table t1 ip rule add fwmark 1 table t1 ip route add default via 1.1.1.254 table t1

ip rule add from 2.2.2.2 table t2 ip rule add fwmark 2 table t2 ip route add defaul via 2.2.2.254 table t2

ip route add default via 2.2.2.254

snp
() автор топика

>Иначе говоря, у меня стоит route add default gw 2.2.2.254 но для некоторых адресов и портов я хочу направлять соединения через другой интерфейс.

Для этого достаточно ip, iptables можно не ковырять :) Создаешь таблицу, указыавешь соотв. марштут `ip route add default via 2.2.2.254 table MEGA_SUPER_TABLE и 'ip rule add to 217.76.32.61 lookup MEGA_SUPER_TABLE`

Все, по идее, `ip route flush cache` и на ЛОР ты ходишь по другому маршруту.

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

А если я, например, хочу весь исходящий SSH (т,е. tcp port 22) пустить по eth1? Вот тут грабли и начинаются. Локальный процесс берёт исходящий адрес из таблицы роутинга, а там он от eth2.

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

>Локальный процесс берёт исходящий адрес из таблицы роутинга, а там он от eth2.

Из какой еще таблицы роутинга? А мы что настраиваем тогда?

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

Вообще, я в исходном сообщении написал всё... Переформулирую иначе: я хочу чтобы ssh blabla ходил через eth1 а ftp blabla ходил через eth2 без указания в командной строке или конфиге, какой именно локальный адрес использовать.

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

Я видел, что ты написал :) И спрашиваю, почему не подходит мой способ. Ты пробовал? Если да, покажи команды

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

> почему не подходит мой способ
Потому что человеку нужно маршрутизировать все, идущее, например, на порт 22, а в ip rule порт указывать негде. fwmark-и здесь тоже не прокатывают, т.к. маркировка идет firewall-ом, а туда пакет будет передан, когда в нем уже будет задан src адрес.

Предлагаю такое:
iptables -t mangle -A POSTROUTING --dport 22 -j ROUTE --gw 1.1.1.254 --oif eth1
iptables -t nat -A POSTROUTING -s ! 1.1.1.1 -o eth1 -j SNAT --to-source 1.1.1.1

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

> Я видел, что ты написал :) И спрашиваю, почему не подходит мой способ. Ты пробовал? Если да, покажи команды


Я пробовал то же самое, команды привёл, но они склеились в одну строку ( вместо lookup у меня было table, но это синонимы):

ip rule add from 1.1.1.1 table t1
ip rule add fwmark 1 table t1
ip route add default via 1.1.1.254 table t1

ip rule add from 2.2.2.2 table t2
ip rule add fwmark 2 table t2
ip route add defaul via 2.2.2.254 table t2

ip route add default via 2.2.2.254 

Не устраивает тем, что нужно рулить не по хостам, а по портам. Только через iproute2 это нельзя делать, надо маркировать пакеты, либо использовать target "-j ROUTE" в iptables, что собственно я и хочу сделать, но получается фигня с исходящими адресами...

snp
() автор топика
Ответ на: комментарий от spirit

А почему у меня тогда выходит? :) Вот, только что проверил - работает (если я нигде не туплю :)

Конечно, я имел ввиду fwmark (не относящиеся к делу куски вырезаны):

root@gw:~# ip ru ls
0: from all lookup local
109: from all fwmark 0x29 lookup eth0_table
32766: from all lookup main
32767: from all lookup default

root@gw:~# iptables -t mangle -nL PREROUTING
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
MARK tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 MARK set 0x29

Все, что идет на 80 порт щас у меня идет через eth0, все остальное - через положенный eth1, судя по iptraf.

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

> Предлагаю такое: > iptables -t mangle -A POSTROUTING --dport 22 -j ROUTE --gw 1.1.1.254 --oif eth1 > iptables -t nat -A POSTROUTING -s ! 1.1.1.1 -o eth1 -j SNAT --to-source 1.1.1.1

Через POSTROUTING не проходят локально созданные пакеты :(

Фигня какая-то, видно придётся самому писать target (или похачить ROUTE)...

snp
() автор топика
Ответ на: комментарий от fagot

> Все, что идет на 80 порт щас у меня идет через eth0, все остальное - через положенный eth1, судя по iptraf.

Трафик на 80 порт роутится, или создаётся локально? Есть принципиальная разница. Если роутится, то у меня тоже всё нормально. А вот с локальными такая *опа :(

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

> Через POSTROUTING не проходят локально созданные пакеты :(
Очень интересная фигня вылезла. Если пишу так:

iptables -t mangle -A POSTROUTING -p tcp --dport 9900 -j ROUTE --gw 1.1.1.254
iptables -t mangle -A POSTROUTING -p tcp --dport 9900 -j LOG
iptables -t nat    -A POSTROUTING -p tcp --dport 9900 -j LOG

то ни одно правило "-j LOG" не срабатывает (и -j SNAT тоже не срабатывает).

Если убираю строку с "-j ROUTE", то начинают срабатывать ОБА правила "-j LOG". То ли я чего-то не понимаю, то ли это бага...

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

> iptables -t mangle -A POSTROUTING -p tcp --dport 9900 -j ROUTE --gw 1.1.1.254
Ошибся. Не POSTROUTING, а OUTPUT, конечно же

snp
() автор топика
Ответ на: комментарий от fagot

> А если использовать OUTPUT mangle? А та же фигня. Похоже, ROUTE сразу уносит пакет на интерфейс и ни одно правило уже не срабатывает, ни в одном chain'е.

snp
() автор топика
Ответ на: комментарий от fagot

> Только что проверил: работает (с локально созданным трафиком)

Версия ядра какая? У меня 2.6.12

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

Я сомневаюсь, что это как-то зависит от верси ядра.

Linux gw 2.4.29-ow1

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

> Через POSTROUTING не проходят локально созданные пакеты :(
Не правда ! Читайте здесь: http://opennet.ru/docs/RUS/iptables/index.html#TRAVERSINGOFTABLES

> Похоже, ROUTE сразу уносит пакет на интерфейс и ни одно правило уже не срабатывает, ни в одном chain'е.
Попробуйте "... -j ROUTE ... --continue"

2 fagot: хм, интересно :-) а можно увидеть содержимое eth0_table ?

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

>2 fagot: хм, интересно :-) а можно увидеть содержимое eth0_table ?

Да нету там ничего особенного :)

root@gw:~# ip r ls table eth0_table
default via 212.х.х.97 dev eth0

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

И что, локально сгенерированные пакеты (TCP, с dst_port=80) сразу же идут через eth0 и в качестве исходящего адреса имеют адрес eth0 ?

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

> Не правда ! Читайте здесь: http://opennet.ru/docs/RUS/iptables/index.html#TRAVERSINGOFTABLES
О! Я эту доку не видел ещё (даже в английском варианте).

> Попробуйте "... -j ROUTE ... --continue"
Помогло.

 Но похоже, теперь оно nat'ится криво. Вижу в tcpdump, что приходит ACK, но он куда-то девается и ответ на него не создаётся...

snp
() автор топика
Ответ на: комментарий от spirit

Кажись да :)

1) Начинаем, все в норме

root@gw:~# ip ru ls
0: from all lookup local
109: from all fwmark 0x29 lookup eth0_table
32766: from all lookup main
32767: from all lookup default

root@gw:~# iptables -t mangle -nL OUTPUT
Chain OUTPUT (policy ACCEPT)
target prot opt source destination

1.1) Проверяем

root@gw:~# tcpdump -vvn -i eth1|grep 217.76.32.61
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes

и идем в links на другой консили на ЛОР:

root@gw:~# links linux.org.ru

Видим:

root@gw:~# tcpdump -vvn -i eth1|grep 217.76.32.61
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
16:20:55.521911 IP (tos 0x0, ttl 64, id 30462, offset 0, flags [DF], length: 60) 81.x.x.90.60570 > 217.76.32.61.80: S [tcp sum ok] 3979226056:3979226056(0) win 5840 <mss 1460,sackOK,timestamp 632970550 0,nop,wscale 0>
16:20:56.434942 IP (tos 0x38, ttl 49, id 0, offset 0, flags [DF], length: 60) 217.76.32.61.80 > 81.x.x.90.60570: S [tcp sum ok] 1782315924:1782315924(0) ack 3979226057 win 5792 <mss 1460,sackOK,timestamp 653381005 632970550,nop,wscale 2>
16:20:56.434978 IP (tos 0x38, ttl 64, id 0, offset 0, flags [DF], length: 40) 81.x.x.90.60570 > 217.76.32.61.80: R [tcp sum ok] 3979226057:3979226057(0) win 0

прерываем. На tcpdump -vvn -i eth0|grep 217.76.32.61 в это время ничего нет.

2) Продолжаем смотреть на tcpdump -vvn -i eth0|grep 217.76.32.61 и добавляем

root@gw:~# iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 0x29

root@gw:~# iptables -t mangle -nL OUTPUT
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
MARK tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 MARK set 0x29

2.1) Идем на ЛОР, видим

root@gw:~# tcpdump -vvn -i eth0|grep 217.76.32.61
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
16:23:14.989821 IP (tos 0x0, ttl 64, id 52201, offset 0, flags [DF], length: 60) 212.x.x.99.60575 > 217.76.32.61.80: S [tcp sum ok] 4146944088:4146944088(0) win 5840 <mss 1460,sackOK,timestamp 632984497 0,nop,wscale 0>
16:23:15.590142 IP (tos 0x0, ttl 52, id 0, offset 0, flags [DF], length: 60) 217.76.32.61.80 > 212.x.x.99.60575: S [tcp sum ok] 1940214884:1940214884(0) ack 4146944089 win 5792 <mss 1460,sackOK,timestamp 653415885 632984497,nop,wscale 2>
16:23:15.590221 IP (tos 0x0, ttl 64, id 52202, offset 0, flags [DF], length: 52) 212.x.x.99.60575 > 217.76.32.61.80: . [tcp sum ok] 1:1(0) ack 1 win 5840 <nop,nop,timestamp 632984557 653415885>
16:23:15.590812 IP (tos 0x0, ttl 64, id 52203, offset 0, flags [DF], length: 580) 212.x.x.99.60575 > 217.76.32.61.80: P 1:529(528) ack 1 win 5840 <nop,nop,timestamp 632984557 653415885>
16:23:16.118654 IP (tos 0x0, ttl 52, id 521, offset 0, flags [DF], length: 52) 217.76.32.61.80 > 212.x.x.99.60575: . [tcp sum ok] 1:1(0) ack 529 win 1716 <nop,nop,timestamp 653416048 632984557>

прерываем, смотрим на tcpdump -vvn -i eth1|grep 217.76.32.61 и идем на ЛОР:

глухо, ничего нет.

Ага, пожалуй работает :) И я так вижу, IP меняется соотвествующим образом, как и должно быть (с 81,х,х,90 на 212,х,х,99)

Если что - пиши мне на kalinovka.net, это будет быстрее, чем аська :)))

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

>Вижу в tcpdump, что приходит ACK, но он куда-то девается и ответ на него не создаётся

Вообще-то, на ACK-пакеты ответов нету, они сами по себе ответы :) Или что имеется ввиду?

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

Странно, у меня как раз такое было, когда пробовал одним routing-ом
сделать (команда ip), без -j ROUTE.
В данный момент у меня работает "переключатель" почты, который
в натуре РАБОТАЕТ:
iptables -t mangle -A OUTPUT -d ! 192.168.0.0/255.255.0.0 -o eth0 -p tcp --dport 25 -m condition --condition "mail-only-through-prov1" -j MARK --set-mark 0x25
iptables -t mangle -A POSTROUTING -m mark --mark 0x25 -j ROUTE --oif eth1 --gw $gw_prov1_IP --continue
iptables -t nat -A POSTROUTING -m mark --mark 0x25 -j SNAT --to-source $my_IP_from_prov1

После echo "1" > .../mail-only-through-prov1 почта, которая хотела
уйти по eth0, сразу начинает ходить через eth1.
tcpdump после этого уже не ловит почтовые пакеты на eth0.
NAT работает нормально.

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

Сделал так же, получаю фигню:

22:47:42.267305 IP 1.1.1.1.18646 > x.x.x.x.22: S 2094086481:2094086481(0) win 5808 <mss 1452,sackOK,timestamp 262914147 0,nop,wscale 1>
22:47:42.279758 IP x.x.x.x.22 > 1.1.1.1.18646: S 1538620268:1538620268(0) ack 2094086482 win 5792 <mss 1460,sackOK,timestamp 64540802 262914147,nop,wscale 0>
22:47:45.266129 IP 1.1.1.1.18646 > x.x.x.x.22: S 2094086481:2094086481(0) win 5808 <mss 1452,sackOK,timestamp 262917147 0,nop,wscale 1>
22:47:45.275520 IP x.x.x.x.22 > 1.1.1.1.18646: S 1538620268:1538620268(0) ack 2094086482 win 5792 <mss 1460,sackOK,timestamp 64541102 262914147,nop,wscale 0>
22:47:45.360933 IP x.x.x.x.22 > 1.1.1.1.18646: S 1538620268:1538620268(0) ack 2094086482 win 5792 <mss 1460,sackOK,timestamp 64541111 262914147,nop,wscale 0>
22:47:51.264118 IP 1.1.1.1.18646 > x.x.x.x.22: S 2094086481:2094086481(0) win 5808 <mss 1452,sackOK,timestamp 262923147 0,nop,wscale 1>
22:47:51.272023 IP x.x.x.x.22 > 1.1.1.1.18646: S 1538620268:1538620268(0) ack 2094086482 win 5792 <mss 1460,sackOK,timestamp 64541702 262914147,nop,wscale 0>
22:47:51.363150 IP x.x.x.x.22 > 1.1.1.1.18646: S 1538620268:1538620268(0) ack 2094086482 win 5792 <mss 1460,sackOK,timestamp 64541711 262914147,nop,wscale 0>
22:47:58.762580 IP x.x.x.x.22 > 1.1.1.1.18645: S 1444553415:1444553415(0) ack 2020446928 win 5792 <mss 1460,sackOK,timestamp 64542451 262836052,nop,wscale 0>
22:48:03.259893 IP 1.1.1.1.18646 > x.x.x.x.22: S 2094086481:2094086481(0) win 5808 <mss 1452,sackOK,timestamp 262935147 0,nop,wscale 1>
22:48:03.269430 IP x.x.x.x.22 > 1.1.1.1.18646: S 1538620268:1538620268(0) ack 2094086482 win 5792 <mss 1460,sackOK,timestamp 64542901 262914147,nop,wscale 0>
22:48:03.563744 IP x.x.x.x.22 > 1.1.1.1.18646: S 1538620268:1538620268(0) ack 2094086482 win 5792 <mss 1460,sackOK,timestamp 64542931 262914147,nop,wscale 0>
22:48:27.251543 IP 1.1.1.1.18646 > x.x.x.x.22: S 2094086481:2094086481(0) win 5808 <mss 1452,sackOK,timestamp 262959147 0,nop,wscale 1>
22:48:27.264520 IP x.x.x.x.22 > 1.1.1.1.18646: S 1538620268:1538620268(0) ack 2094086482 win 5792 <mss 1460,sackOK,timestamp 64545300 262914147,nop,wscale 0>
22:48:27.566889 IP x.x.x.x.22 > 1.1.1.1.18646: S 1538620268:1538620268(0) ack 2094086482 win 5792 <mss 1460,sackOK,timestamp 64545331 262914147,nop,wscale 0>

Нифига не коннектится... Ничего не понимаю :(

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