LINUX.ORG.RU
ФорумAdmin

Mark routing в Linux, изменение маршрута по порту

 ,


0

1

Уже третий день бьюсь над проблемой отправки трафика через определенную таблицу на базе порта.

Проблема в том что для транзитного трафика все работает на ура, а вот как только пытаюсь сделать ping на сервер для которого в iptables указана маркировка, то болт.

Как это выглядит: есть таблица vpn101, в ней указан default route который отлично работает. Есть наборы правил:

ip rule add to 8.8.4.4 table vpn101 pref 101
делаю traceroute и все супер, трафик уходит через vpn101

Но мне надо сделать чтобы только 53 порт ходил через vpn101, беру в руки iptables

$IPTABLES -t mangle -A PREROUTING -d 8.8.4.4 -p udp  --dport 53 -j MARK --set-mark 0x21

ip rule add from fwmark 0x21 table vpn101 pref 102

И вот тут начинается самое интересное, если запрос посылает пользователь сети то все идет в тунель. Но если запрос посылает сам сервер, то болт.

Попытка отследить цепочку правил iptables при локальной отправке пакетов, приводит к след порядку:

IPTABLES_RAW_OUTPUT
IPTABLES_MANGLE_OUTPUT
IPTABLES_NAT_OUTPUT
IPTABLES_FILTER_OUTPUT
IPTABLES_MANGLE_POSTROUTING
IPTABLES_NAT_POSTROUTING
Согласно этой картинки, все правильно: http://stuffphilwrites.com/wp-content/uploads/2014/09/FW-IDS-iptables-Flowcha...

Но, вот что странно, как только пакет появляется в raw output он уже имеет OUT интерфейс на который смотрит default route самой системы. Дальше упоминание про маркировку пакета появляется в логе из таблицы MANGLE OUTPUT.

net.ipv4.tcp_fwmark_accept=1
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0

В общем прошу Вашей помощи, может кто-то знает решение данного вопроса.

Linux router 4.4.0-77-generic #98-Ubuntu SMP Wed Apr 26 08:34:02 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

Да, на Mikrotik такое работало, там требовалось добавить правило в mangle output, а вот Linux не взлетает, хотя помню что раньше еще во время 2.7 ядра все работало.



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

preroute не действует на локально отправляемыем пакеты, если верить http://inai.de/images/nf-packet-flow.svg

Но, вот что странно, как только пакет появляется в raw output он уже имеет OUT интерфейс на который смотрит default route самой системы

Все нормально - предварительно посмотрели куда его посылать, дальше в mangle/output можно рероутить если изменилась метка, tos, src или dst пакета.

А твоя картинка не совсем верна, т.к. рероутинг происходит сразу после mangle/output, а потом еще после nat/output. А вот после nat/postrouting рероутинг не происходит.

Если все так непонятно, то добавь в raw/OUTPUT "-j TRACE" для интересующих тебя пакетов.

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

Добавил -TRACE

May 27 12:18:17 router kernel: [61363.674685] TRACE: raw:OUTPUT:policy:5 IN= OUT=enp4s0 SRC=176.3.3.1 DST=8.8.4.4 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=37463 DF PROTO=ICMP TYPE=8 CODE=0 ID=4700 SEQ=1 UID=0 GID=0 MARK=0x21

May 27 12:18:17 router kernel: [61363.674711] TRACE: mangle:OUTPUT:rule:1 IN= OUT=enp4s0 SRC=176.3.3.1 DST=8.8.4.4 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=37463 DF PROTO=ICMP TYPE=8 CODE=0 ID=4700 SEQ=1 UID=0 GID=0 MARK=0x21

May 27 12:18:17 router kernel: [61363.674738] TRACE: mangle:OUTPUT:rule:2 IN= OUT=enp4s0 SRC=176.3.3.1 DST=8.8.4.4 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=37463 DF PROTO=ICMP TYPE=8 CODE=0 ID=4700 SEQ=1 UID=0 GID=0 MARK=0x21

May 27 12:18:17 router kernel: [61363.674752] TRACE: mangle:OUTPUT:policy:5 IN= OUT=enp4s0 SRC=176.3.3.1 DST=8.8.4.4 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=37463 DF PROTO=ICMP TYPE=8 CODE=0 ID=4700 SEQ=1 UID=0 GID=0 MARK=0x21

May 27 12:18:17 router kernel: [61363.674771] TRACE: nat:OUTPUT:rule:1 IN= OUT=enp4s0 SRC=176.3.3.1 DST=8.8.4.4 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=37463 DF PROTO=ICMP TYPE=8 CODE=0 ID=4700 SEQ=1 UID=0 GID=0 MARK=0x21

May 27 12:18:17 router kernel: [61363.674796] TRACE: nat:OUTPUT:policy:3 IN= OUT=enp4s0 SRC=176.3.3.1 DST=8.8.4.4 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=37463 DF PROTO=ICMP TYPE=8 CODE=0 ID=4700 SEQ=1 UID=0 GID=0 MARK=0x21

May 27 12:18:17 router kernel: [61363.674816] TRACE: filter:OUTPUT:rule:1 IN= OUT=enp4s0 SRC=176.3.3.1 DST=8.8.4.4 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=37463 DF PROTO=ICMP TYPE=8 CODE=0 ID=4700 SEQ=1 UID=0 GID=0 MARK=0x21

May 27 12:18:17 router kernel: [61363.674841] TRACE: filter:OUTPUT:policy:2 IN= OUT=enp4s0 SRC=176.3.3.1 DST=8.8.4.4 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=37463 DF PROTO=ICMP TYPE=8 CODE=0 ID=4700 SEQ=1 UID=0 GID=0 MARK=0x21

May 27 12:18:17 router kernel: [61363.674856] TRACE: mangle:POSTROUTING:rule:1 IN= OUT=enp4s0 SRC=176.3.3.1 DST=8.8.4.4 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=37463 DF PROTO=ICMP TYPE=8 CODE=0 ID=4700 SEQ=1 UID=0 GID=0 MARK=0x21

May 27 12:18:17 router kernel: [61363.674881] TRACE: mangle:POSTROUTING:rule:2 IN= OUT=enp4s0 SRC=176.3.3.1 DST=8.8.4.4 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=37463 DF PROTO=ICMP TYPE=8 CODE=0 ID=4700 SEQ=1 UID=0 GID=0 MARK=0x21

May 27 12:18:17 router kernel: [61363.674895] TRACE: mangle:POSTROUTING:policy:3 IN= OUT=enp4s0 SRC=176.3.3.1 DST=8.8.4.4 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=37463 DF PROTO=ICMP TYPE=8 CODE=0 ID=4700 SEQ=1 UID=0 GID=0 MARK=0x21

May 27 12:18:17 router kernel: [61363.674909] TRACE: nat:POSTROUTING:rule:1 IN= OUT=enp4s0 SRC=176.3.3.1 DST=8.8.4.4 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=37463 DF PROTO=ICMP TYPE=8 CODE=0 ID=4700 SEQ=1 UID=0 GID=0 MARK=0x21

May 27 12:18:17 router kernel: [61363.674934] TRACE: nat:POSTROUTING:rule:3 IN= OUT=enp4s0 SRC=176.3.3.1 DST=8.8.4.4 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=37463 DF PROTO=ICMP TYPE=8 CODE=0 ID=4700 SEQ=1 UID=0 GID=0 MARK=0x21

Собственно как видно, исходщий интерейс так и не меняется для локально отправленных пакетов.

Заодно посмотрел как работает транзитный трафик, там смена пути идет после nat PREROUTING и в MANGLE FORWARD пакет уже попадает с полностью правильным OUT интерфейсом.

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

чем-то напоминает классический случай ната сервера из локалки в сеть и обращение к этому же серверу из локалки через тот же шлюз/гейт/фаервол. т.е. у вас есть правила для транзита (которые заворачивают в vpn101), но правил для собсно шлюза/(локальной сети) у вас нет. субъективно.

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

Хрень какая-то!

А почему у тебя в raw/OUTPUT пакет уже имеет метку 0x21 ? Если в mangle/OUTPUT не будет изменения метки, то и процесса рероутинга не произойдет.

А с другой стороны - почему не срабатывает правило маршрутизации если есть метка ?

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

0x21 вероятней всего потому что я уже во все таблицы налепил, но это не должно играть роль. Сам пакет какого-то лешего не идет по нужному интерфейсу, только в случае если пакет отправляется напрямую от сервера и маркируется через iptables. Мне в обще вся ситуация кажется абсурдом, так как раньше работало как часы на старых системах.

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

Все замечательно работает. Нет никакого абсурда. Делать нужно все очень аккуратно.

В mangle/OUTPUT метим

В nat/POSTROUTING не забываем делать SNAT/MASQUERADE, если локальный адрес не роутится через ВПН.

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