У меня есть коробка с двумя сетевыми адаптерами, настроенными как мост. Ebtables перенаправляет http-трафик на iptables. IP-адрес br0 — 10.10.10.10. Stunnel настроен с прозрачным = источником. Он принимает соединения на 127.1.1.1:8080 и всегда подключается к одному и тому же IP-адресу (10.10.20.20) через порт 80.
У меня есть следующие правила iptables:
iptables -t nat -I PREROUTING -p tcp --dport 80 -i ens192 -j DNAT --to-destination 127.1.1.1:8080
iptables -t mangle -N DIVERT
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 1
iptables -t mangle -A DIVERT -j ПРИНЯТЬ
Маршрутизация тоже настроена.
Если клиент подключается к самой коробке по 80 порту все работает. Stunnel подключается к месту назначения (10.10.20.20). Но если у клиента другой адрес назначения, stunnel все равно пытается подключиться к 10.10.20.20, но не может.
Поэтому, когда я отслеживаю необработанные пакеты до 10.10.20.20, я вижу различное поведение.
Ожидаемый:
trace id 71a8325b ip raw ВЫХОДНОЙ пакет: oif "br0" ip saddr 10.10.10.10 ip saddr 10.10.20.20 ip dscp cs0 ip ecn not-ect ip ttl 64 ip id 28971 ip length 60 tcp sport 51408 tcp dport = synth flags 80 tcp TCP-окно 64240
trace id 71a8325b ip raw OUTPUT rule meta l4proto tcp ip saddr 10.10.20.20 counter пакетов 37 байт 3265 meta nftrace set 1 (продолжение вердикта)
trace id 71a8325b ip raw OUTPUT вердикт продолжить
идентификатор трассировки 71a8325b ip необработанная политика OUTPUT принимает
trace id 71a8325b ip filter ВЫХОДНОЙ пакет: oif "br0" ip saddr 10.10.10.10 ip saddr 10.10.20.20 ip dscp cs0 ip ecn not-ect ip ttl 64 ip id 28971 ip length 60 tcp sport 51408 tcp dport = synth flags 80 tcp TCP-окно 64240
trace id 71a8325b ip filter OUTPUT вердикт продолжить
идентификатор трассировки 71a8325b IP-фильтр OUTPUT policy accept
trace id 71a8325b выходной пакет фильтра inet: oif "br0" ip saddr 10.10.10.10 ip saddr 10.10.20.20 ip dscp cs0 ip ecn not-ect ip ttl 64 ip id 28971 ip протокол tcp ip length 60 tcp sport 51408 tcp dport flags 80 == окно синхронизации TCP 64240
трассировка id 71a8325b вывод вердикта фильтра inet продолжить
Идентификатор трассировки 71a8325b Принять политику вывода фильтра Интернета
И неожиданное, где stunnel не может подключиться:
trace id fd9543bc ip raw ВЫХОДНОЙ пакет: oif "br0" ip saddr 10.10.10.10 ip saddr 10.10.20.20 ip dscp cs0 ip ecn not-ect ip ttl 64 ip id 26448 ip length 60 tcp sport 34188 tcp dport 80 = tcp flags TCP-окно 64240
trace id fd9543bc ip raw OUTPUT rule meta l4proto tcp ip saddr 10.10.20.20 counter пакетов 52 байта 4540 meta nftrace set 1 (продолжение вердикта)
trace id fd9543bc ip raw OUTPUT вердикт продолжить
trace id fd9543bc ip raw OUTPUT policy accept
trace id fd9543bc ip filter ВЫХОДНОЙ пакет: oif "br0" ip saddr 10.10.10.10 ip saddr 127.1.1.1 ip dscp cs0 ip ecn not-ect ip ttl 64 ip id 26448 ip length 60 tcp sport 34188 tcp dport 8080 = tcp flags TCP-окно 64240
trace id fd9543bc ip filter OUTPUT вердикт продолжить
идентификатор трассировки fd9543bc IP-фильтр OUTPUT policy accept
идентификатор трассировки fd9543bc выходной пакет фильтра inet: oif "br0" ip saddr 10.10.10.10 ip saddr 127.1.1.1 ip dscp cs0 ip ecn not-ect ip ttl 64 ip id 26448 ip протокол tcp ip length 60 tcp sport 34188 tcp dport 8080 tcp flags == окно синхронизации TCP 64240
трассировка id fd9543bc вывод вердикта фильтра inet продолжить
Идентификатор трассировки fd9543bc Политика вывода фильтра inet принимает
Похоже, что адрес назначения получает адрес назначения. Но я не могу понять, почему и когда. Я только ДНАТ в физ таблице PREROUTING. Насколько я понимаю, этот пакет ни в коем случае не должен снова попасть под это правило.
И почему это происходит только тогда, когда исходным пунктом назначения не был собственный IP-адрес ящика?
Я думаю, что, может быть, stunnel сам меняет пакет?
Вот полный вывод iptables-save
# Сгенерировано iptables-save v1.8.7, четверг, 18 ноября, 22:40:01 2021 г.
*натуральный
: ПРЕДВАРИТЕЛЬНОЕ ПРИНЯТИЕ [14:1295]
:ВВОД ПРИНЯТЬ [14:1295]
: ВЫВОД ПРИНЯТ [2:196]
:ОТПРАВКА ПРИНЯТИЯ [4:316]
-A PREROUTING -i ens192 -p tcp -m tcp --dport 80 -j DNAT --to-destination 127.1.1.1:8080
СОВЕРШИТЬ
# Завершено в четверг, 18 ноября, 22:40:01 2021 г.
# Сгенерировано iptables-save v1.8.7, четверг, 18 ноября, 22:40:01 2021 г.
* калечить
: ПРЕДВАРИТЕЛЬНОЕ ПРИНЯТИЕ [15:1154]
:ВВОД ПРИНЯТЬ [172:24172]
:ВПЕРЕД ПРИНЯТЬ [0:0]
: ВЫВОД ПРИНЯТ [222:44999]
:ОТПРАВКА ПРИНЯТИЯ [222:44999]
:ПЕРЕВОД - [0:0]
-A ПРЕДВАРИТЕЛЬНАЯ МАРШРУТИЗАЦИЯ -p tcp -m socket -j DIVERT
-A DIVERT -j MARK --set-xmark 0x1/0xffffffff
-A ПЕРЕВОД -j ПРИНЯТЬ
СОВЕРШИТЬ
# Завершено в четверг, 18 ноября, 22:40:01 2021 г.
Любые идеи, как я мог бы продолжать с этим?