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

iproute2+connmark

 , ,


0

1

Здравствуйте товарищи. Не могу разобраться с работой iproute + iptables.

Возьмем простую задачку.

Интерфейс: eth0

IP-адрес: 192.168.3.5

Маска: 255.255.255.0

Шлюз: 192.168.3.1

Издеваться будем с помощью пинга до узла 8.8.8.8

1. Ситуация(стандартная.)

trunk@ubuntu:~$ sudo ip r s
[sudo] password for trunk:
default via 192.168.3.1 dev eth0  metric 100
192.168.3.0/24 dev eth0  proto kernel  scope link  src 192.168.3.5

trunk@ubuntu:~$ sudo ip ru s
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default
Пинг естесственно проходит.

2я. Ситуация без шлюза по-умолчанию, и без iptables.

trunk@ubuntu:~$ sudo ip r d default
trunk@ubuntu:~$ sudo ip r s
192.168.3.0/24 dev eth0  proto kernel  scope link  src 192.168.3.5

trunk@ubuntu:~$ sudo ip ru a to 8.8.8.8 table test
trunk@ubuntu:~$ sudo ip ru s
0:      from all lookup local
32765:  from all to 8.8.8.8 lookup test
32766:  from all lookup main
32767:  from all lookup default

trunk@ubuntu:~$ sudo ip r a default via 192.168.3.1 dev eth0 table test
trunk@ubuntu:~$ ip r s t test
default via 192.168.3.1 dev eth0

trunk@ubuntu:~$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_req=1 ttl=50 time=37.2 ms
работает.

3я сиуация. Будем выставлять марку через iptables, а в ip rule проверять ее наличие. iptables чистая за исключением ниже прописанных правил(все ACCEPT).

trunk@ubuntu:~$ sudo ip ru d to 8.8.8.8
trunk@ubuntu:~$ sudo ip ru a fwmark 1 table test
trunk@ubuntu:~$ sudo ip ru s
0:      from all lookup local
32765:  from all fwmark 0x1 lookup test
32766:  from all lookup main
32767:  from all lookup default

trunk@ubuntu:~$ sudo iptables -t mangle -A OUTPUT -d 8.8.8.8 -j CONNMARK --set-mark 1

trunk@ubuntu:~$ sudo iptables -t mangle -Z
trunk@ubuntu:~$ ping 8.8.8.8
connect: Network is unreachable
trunk@ubuntu:~$ sudo iptables -t mangle -v
Chain OUTPUT (policy ACCEPT 51 packets, 5172 bytes)
 pkts bytes target     prot opt in     out     source               destination 
    0     0 CONNMARK   all  --  any    any     anywhere             google-public-dns-a.google.com CONNMARK set 0x1
Пакеты не ходят. Добавим ложный шлюз по умолчанию(ведь он поидее через него не должен идти, т.к. мы пускаем его через таблицу test)

trunk@ubuntu:~$ sudo ip r a default via 192.168.3.2 dev eth0
trunk@ubuntu:~$ sudo ip r s
default via 192.168.3.2 dev eth0
192.168.3.0/24 dev eth0  proto kernel  scope link  src 192.168.3.5
trunk@ubuntu:~$ sudo ip r s t test
default via 192.168.3.1 dev eth0

trunk@ubuntu:~$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
From 192.168.3.5 icmp_seq=1 Destination Host Unreachable
From 192.168.3.5 icmp_seq=2 Destination Host Unreachable
From 192.168.3.5 icmp_seq=3 Destination Host Unreachable

Chain OUTPUT (policy ACCEPT 260 packets, 25872 bytes)
 pkts bytes target     prot opt in     out     source               destination 
    5   420 CONNMARK   all  --  any    any     anywhere             google-public-dns-a.google.com CONNMARK set 0x1

Пакеты маркируются, но уходят(скорей всего) через 192.168.3.2.

В чем проблема, объясните пожалуйста?



Последнее исправление: TrUnK (всего исправлений: 1)

А вопрос в чем собсна? Если таблица test имеет дефолт роут, то яхз почему через него не ходит. Если же таблица test пустая, и маршрут в ней не найден, то просматривается следующее правило, а там уже есть маршрут по умолчанию.

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

В таблице test есть дефолтный роут, но по нему пакеты не ходят, если использовать iptables+Mark. Если туда перекидывать сразу из ip rule(например по IP адресу назначения), то все работает...

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

а в main есть дефолтроут? Недавно сам сталкнулся с тем, что iptables+fwmark не работает, если нету дефроута в мэйне.

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

без дефолта в main пакеты вообще не отсылаются. С дефолтом в main идет по указанному в main дефолту...

TrUnK
() автор топика
Ответ на: комментарий от TrUnK
root@debian:~# traceroute -n 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
 1  10.10.0.1  1.133 ms  1.006 ms  0.967 ms
 2  80.80.111.70  7.981 ms  10.441 ms  11.876 ms
 3  213.27.31.70  16.070 ms  16.018 ms  17.999 ms
 4  212.188.16.33  19.589 ms  21.824 ms  23.287 ms
 5  195.34.53.49  42.386 ms  43.899 ms  46.052 ms
 6  195.34.38.222  47.458 ms  49.202 ms  51.720 ms
 7  72.14.236.248  75.881 ms 209.85.240.102  77.532 ms 72.14.236.248  77.590 ms
 8  72.14.233.180  112.119 ms 209.85.249.40  109.249 ms 72.14.233.180  111.038 ms
 9  72.14.233.170  158.568 ms  108.698 ms 72.14.233.168  108.172 ms
10  216.239.49.165  110.540 ms 209.85.254.141  100.619 ms  101.317 ms
11  8.8.8.8  92.882 ms  94.584 ms  92.543 ms
root@debian:~# ip ru a fwmark 1 tab 10
root@debian:~# ip ro sh tab 10
default via 10.9.1.13 dev tun0 
root@debian:~# iptables -A OUTPUT -t mangle -d 8.8.8.8 -j MARK --set-mark 0x1
root@debian:~# iptables -A POSTROUTING -t nat -d 8.8.8.8 -j SNAT --to-source 10.9.1.14
root@debian:~# traceroute -n 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
 1  10.9.1.1  31.628 ms  107.485 ms  107.309 ms
 2  193.93.123.1  107.138 ms  106.989 ms  106.846 ms
 3  195.239.127.197  106.635 ms  106.508 ms  106.247 ms
 4  72.14.212.26  108.121 ms  105.314 ms  105.175 ms
 5  72.14.236.248  107.363 ms  169.059 ms 209.85.240.102  168.936 ms
 6  72.14.233.180  218.051 ms  204.153 ms 209.85.249.40  229.077 ms
 7  72.14.233.170  228.290 ms 72.14.233.168  228.351 ms  228.352 ms
 8  216.239.49.165  228.391 ms 209.85.254.141  228.807 ms  228.576 ms
 9  8.8.8.8  191.737 ms  225.801 ms  226.326 ms

connmark на mark поменяй, у меня все работает, я так понял что connmark помечает соединения для модуля conntrack, а mark помечает пакеты.

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

Благодарю. с Mark заработало так, как должно. Узнать бы точно разницу между CONNMARK и MARK ибо в интернете почти везде в примерах CONNMARK.

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

connmark отслеживает состояние пакетов. (кэп, да?)
к примеру, сделав -j MARK ты устанавливаешь метку, но она дальше хоста не уходит. и не передается related соединениям.
при этом connmark использует механизмы connection tracking (conntrack).
к примеру. используя -j MARK, можно в mangle OUTPUT\POSTROUTING выполнить -j CONNMARK --save-mark
и после в mangle PREROUTING -j CONNMARK --restore-mark - восстановить установленные метки.

fr_butch
()

в OUTPUT надо делать restore-mark для всех RELATED,ESTABLISHED пакетов или использовать MARK вместо CONNMARK

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