Рейтинг:0

Странно модифицированные исходящие пакеты Stunnel

флаг es

У меня есть коробка с двумя сетевыми адаптерами, настроенными как мост. 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 г.

Любые идеи, как я мог бы продолжать с этим?

A.B avatar
флаг cl
A.B
Похоже, этот другой вопрос устарел? https://serverfault.com/questions/1083810/iptables-modify-output-flow
флаг es
Нет, другой вопрос сосредоточен на возможностях обхода с помощью iptables.
Nikita Kipriyanov avatar
флаг za
Согласно [потоку пакетов] (https://upload.wikimedia.org/wikipedia/commons/3/37/Netfilter-packet-flow.svg), любой внешний пакет, отправленный в маршрутизацию из `broute`, должен выполнить правило `nat PREROUTING` (один раз, потому что таблица nat просматривается только для новых подключений), но локально сгенерированный пакет не может выполнить это правило, поэтому поведение, которое вы видите, ожидаемо.
флаг es
Нет, это не так, поскольку пакеты, которые, кажется, получают DNAT, — это те, которые генерируются локально и, следовательно, проходят только через цепочку OUTPUT.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.