Пакеты netfilter Iptables с политикой маршрутизации
У меня есть вопросы о порядке событий в конвейере маршрутизации /iptables. Сначала я объясню свою настройку. Вопросы в конце этого поста.
Я использую политику маршрутизации и iptables в Linux 4.4.
У меня есть два интерфейса: wan0 (к моему провайдеру) и vpn-crypto (устройство настройки к провайдеру vpn)
Я хочу, чтобы выборочно направить некоторый трафик в VPN, все остальное через wan0
Я реализую политику маршрутизации следующим образом:
В таблице ВЫХОДА mangle я установил отметку 0xC для НОВОГО трафика, который соответствует некоторому шаблону. Для целей тестирования я отмечаю трафик, направленный на определенный IP-адрес (37.9.239.33). Конечно, у меня есть и другие вещи iptables, такие как MASQUEARADE, но это не имеет отношения к этому вопросу.
У меня есть правило iproute2, которое отправляет все "помеченные" пакеты в vpn:
0: from all lookup local 190: from all fwmark 0x4/0x4 lookup vpn 400: from all fwmark 0x8/0x8 oif wan0 unreachable 32766: from all lookup main 32767: from all lookup default
Таблица vpn содержит только одно правило и отправляет все через vpn:
default via 10.33.0.1 dev vpn-crypto proto static src 10.33.148.125
Я тестирую с помощью команды ping -c3 37.9.239.33
где 37.9.239.33 - IP-адрес, помеченный для vpn. Два сеанса tcpdump, подключенные к wan0 и vpn-crypto, показывают, что пакет эффективно выходит и возвращается через vpn-crypto, как и ожидалось! Пока все хорошо, все работает.
Однако я наблюдаю странное поведение, которое я не понимаю, когда протоколируемые пакеты проходят через iptables: я вставляю журнальные трассировки в таблицу FILTER.OUTPUT и в таблицу MANGLE.POSTROUTING.
Я наблюдаю эту последовательность событий:
FILTER.OUTPUT: IN= OUT=wan0 SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=26960 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=1 MARK=0xc
MANGLE.POSTROUTING: IN= OUT=vpn-crypto SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=26960 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=1 MARK=0xc
MANGLE.POSTROUTING: IN= OUT=wan0 SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=27049 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=2
FILTER.OUTPUT: IN= OUT=wan0 SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=27100 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=2 MARK=0xc
MANGLE.POSTROUTING: IN= OUT=vpn-crypto SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=27100 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=2 MARK=0xc
MANGLE.POSTROUTING: IN= OUT=wan0 SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=27193 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=3
FILTER.OUTPUT: IN= OUT=wan0 SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=27237 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=3 MARK=0xc
MANGLE.POSTROUTING: IN= OUT=vpn-crypto SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=27237 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=3 MARK=0xc
Я ожидаю, что решение о перенаправлении из-за отметки в MANGLE.OUTPUT произойдет до FILTER.OUTPUT, но, похоже, оно произойдет после! Фактически, все пакеты FILTER.OUTPUT все еще маршрутизируются через wan0, указывая, что решение о перенаправлении еще не было принято. Документация, доступная в Интернете, разделена на 50/50 по этому вопросу. Например:
https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html, глава 6, таблица 6-2, утверждает, что решение о перенаправлении должно быть принято до filter.output
http://www.aptalaska.net/~jclive/IPTablesFlowChart.pdf утверждает, что решение о повторной маршрутизации происходит после filter.output
Какой из двух является правильным? Может кто-то пролить свет на это?
В контексте 3 пингов, в таблице MANGLE.POSTROUTING я вижу 2 неожиданных пакета, маршрутизируемых через wan0, которые "не помечены " и кажутся дубликатами тех, которые маршрутизируются через vpn-crypto. Почему это? Также, согласно tcpdump, эти пакеты никогда не попадают в интерфейс (что правильно).
Может кто-то пролить свет на это поведение?