LINUX.ORG.RU
ФорумAdmin

Не делает SNAT после DNAT iptables.

 , , ,


0

1

Всем привет

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

Постараюсь нарисовать как я себе это вижу и что не работает.

Вот такая схема работает:

iptables -t nat -A PREROUTING -p tcp --dport 8000 -j DNAT --to 192.168.1.20 
iptables -t nat -A POSTROUTING -o ppp0 -j SNAT --to [Public IP]

Client      -> Router              -> Server
Internet       [192.168.1.1]          [192.168.1.20]
[to:Public IP] [DNAT->192.168.1.20]
               [From:ExternalClientIP]

Тут «внешний» клиент ломится на внешний публичный адрес роутера на порт 8000 и роутер его DNATтит в сеть, там сервер видит «внешний» адрес клиента и через MASQUERADE ему получается ответить. Это проблем не вызывает.

Теперь этот же клиент делает то же самое но будучи внутри этой самой сети как локальный.
Client      -> Router              -> Server
Internet       [192.168.1.1]          [192.168.1.20]
[to:Public IP] [DNAT->192.168.1.20]
               [From:LocalClientIP]


В таком случае пакеты на адрес 192.168.1.20 идут с адреса LocalClientIP (например 192.168.1.2) и сервер сопоставляя одно с другим не видит необходимости направлять трафик на свой шлюз и отвечает клиенту на прямую, что клиент конечно же не ожидает и ничего не работает. Это как бы тоже очевидно.

добавляю правило
iptables -t nat -I POSTROUTING -p tcp --dport 8000 -d 192.168.1.20 -j SNAT --to 192.168.1.1


ожидаю, что роутер сменит адрес отправителя после DNAT на свой, и сервер 192.168.1.20 уже ответит ему.
Да я понимаю, что это двойной трафик в сети. Да я понимаю что это приведёт к лишней нагрузке на роутер. Но сейчас это за скобкой.

Так вот это правило SNAT не обрабатывается (счётчик не увеличивается). Если верить tcpdump пакеты всё ещё уходят с адресом отправителя равным Клиентскому (да и сервер 192.168.1.20 их видит таковыми)

Так вот вопрос: почему не работает SNAT? Потому что нет как такового перекладывания из интерфейса в интерфейс? Можно как-то принудить к этому?

Помню был подобный случай только с REDIRECT когда напрявлял в locahost, там был sysctl ключик net.ipv4.conf.all.route_localnet. Я даже попробовал его в этом применении - непомогает :(



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

У тебя по идее должно быть одно правило в INPUT с редиректом на хост:порт внутри сети, потому что для роутера это входящий трафик, он в цепочку filter идёт, а не в nat. Только для локальной сети надо добавить SNAT на внутренний адрес роутера, чтобы ответ правильно ушёл.

По крайней мере на домашних устройствах так сделано.

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

Должен работать DNAT + SNAT
iptables -t nat -nvxL хорошо было бы посмотреть.
Вдруг где опечатка...

Если ничего не помогает, то добавляй правило

iptables -t raw -A PREROUTING -p tcp --dport 8000 -s 192.168.1.2 -j TRACE
Делай коннект с 192.168.1.2 и смотри логи.

В теме Как сделать сервер маршрутизации? (комментарий) есть перловый скрипт который упрощает чтение логов от TRACE

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

Спасибо за информацию. Я оперировал действием -j LOG
И не попадает в POSTROUTING под него ничего. А вот TRACE че то подзабыл... завтра попробую глянуть что там.

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

Ну сделал я TRACE и вопросов добавилось :))

С вашего позволения я пропущу на мой взгляд не значимые строки TRACE в которых очевидно, что пакет идёт по правилам и они никак на него не влияют.
Первая строка собственно «вход» пакета в систему.
В центре строка маркировки соединения - это уже я маркировал в поисках истины, но оставлю строку тут чтобы понимать что появилась маркировка.
И последняя она же последняя строка трассировки. Это строка соответствует DNAT правилу.

Вопрос. Пакет дальше типа не пошёл? Или надо ещё раз промаркировать его где-то как новую цепочку?

TRACE: raw:PREROUTING:rule:3 IN=br-lan OUT= PHYSIN=eth0 MAC=00:d0:b4:02:84:6a:fa:19:87:f0:44:2a:08:00 SRC=192.168.1.2 DST=192.168.1.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=24484 DF PROTO=TCP SPT=60378 DPT=8000 SEQ=2508694540 ACK=0 WINDOW=65535 RES=0x00 SYN URGP=0 OPT (020405B40402080A34066BD1000000000103030A)

...

TRACE: mangle:PREROUTING:rule:2 IN=br-lan OUT= PHYSIN=eth0 MAC=00:d0:b4:02:84:6a:fa:19:87:f0:44:2a:08:00 SRC=192.168.1.2 DST=192.168.1.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=24484 DF PROTO=TCP SPT=60378 DPT=8000 SEQ=2508694540 ACK=0 WINDOW=65535 RES=0x00 SYN URGP=0 OPT (020405B40402080A34066BD1000000000103030A) MARK=0x3f00

...

TRACE: nat:PREROUTING:rule:2 IN=br-lan OUT= PHYSIN=eth0 MAC=00:d0:b4:02:84:6a:fa:19:87:f0:44:2a:08:00 SRC=192.168.1.2 DST=192.168.1.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=24486 DF PROTO=TCP SPT=60378 DPT=8000 SEQ=2508694540 ACK=0 WINDOW=65535 RES=0x00 SYN URGP=0 OPT (020405B40402080A3406779F000000000103030A) MARK=0x3f00


Можно на это взглянуть из tcpdump (Это не прям эта же попытка сессия, но эквивалентная)
tcpdump -i any -n port 8000
tcpdump: data link type LINUX_SLL2
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes

17:50:42.353685 eth0  P   IP 192.168.1.2.57132 > 192.168.1.1.8000: Flags [S], seq 3505131552, win 65535, options [mss 1460,sackOK,TS val 873934940 ecr 0,nop,wscale 10], length 0
17:50:42.409810 br-lan Out IP 192.168.1.2.57132 > 192.168.1.20.8000: Flags [S], seq 3505131552, win 65535, options [mss 1460,sackOK,TS val 873934940 ecr 0,nop,wscale 10], length 0

Spider55
() автор топика
Последнее исправление: Spider55 (всего исправлений: 1)
Ответ на: комментарий от Spider55

Гм. Дык у тебя еще и бридж есть?! Теоретически это может немного усложнять процесс если включен bridge-nf-call-iptables и nf_call_iptables.

Без полной трассировки не вижу смысла дальше говорить. Кто-то что-то не договаривает.

Смотреть лог вручную очень тяжко. Чтобы упростить задачу, нужно чтобы правило TRACE сработало всего 1-2 раза на коннект.
(Например добавить в него "--syn")

Лог лучше смотреть после скрипта который удаляет параметры которые не изменились.
Если на роутере нет перла, то перекинуть вывод dmesg в файл на машине где есть перл и указать скрипту имя этого файла.

В трассировке не видно изменение ip-адреса после SNAT в nat/POSTROUTING :(

#!/usr/bin/env perl
use strict;

my @R;
open(F,$ARGV[0] ? '<'.$ARGV[0] : "dmesg|") || die;
while(<F>) {
        next if !/TRACE:/;
        chomp; s/^\[\s+/[/;
        push @R,[grep !/^(TOS=|PREC=|MAC=|TRACE:)/, split /\s+/];
}
close(F);

my $LL = $R[$#R];
die if !$LL;
die $LL->[0] if $LL->[0] !~ /^\[\s*(\d+)\.\d+\]$/;
my $st = 0;
my @PX;
foreach my $L (@R) {
        next if !$st && $L->[1] !~ /^raw/;
        $st = 1;
        @PX = () if $L->[1] =~ /^raw/;
        my @t = splice(@$L,0,2);
        foreach my $i (@$L) {
                my $x = 0; map {$x = 1 if $i eq $_} @PX;
                if(!$x) {
                        push @PX,$i; push @t,$i;
                }
        }
        print join(" ",@t),"\n";
}
Рабочие правила: c 10.200.2.252 на 10.200.2.11:8022 перенаправляем на 10.200.2.2:22
# Generated by iptables-save v1.8.10 on Thu Mar  6 15:54:57 2025
*raw
:PREROUTING ACCEPT [405699954:431951238193]
:OUTPUT ACCEPT [7093:1386970]
-A PREROUTING -s 10.200.2.252/32 -p tcp -m tcp --dport 8022 --tcp-flags FIN,SYN,RST,ACK SYN -j TRACE
COMMIT
*nat
:PREROUTING ACCEPT [12995886:1826359846]
:INPUT ACCEPT [11231:3249909]
:OUTPUT ACCEPT [56:3795]
:POSTROUTING ACCEPT [3469884:388479430]
-A PREROUTING -s 10.200.2.252/32 -p tcp -m tcp --dport 8022 -j DNAT --to-destination 10.200.2.2:22
-A POSTROUTING -s 10.200.2.252/32 -d 10.200.2.2/32 -j SNAT --to-source 10.200.2.11
COMMIT
*filter
:INPUT ACCEPT [100940:18331163]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [87750:29098658]
-A FORWARD -s 10.200.2.0/24 -d 10.200.2.0/24 -j ACCEPT
COMMIT
Трассировка выглядит
[13684.134473] raw:PREROUTING:policy:3 IN=vlan0022 OUT= SRC=10.200.2.252 DST=10.200.2.11 LEN=60 TTL=64 ID=47815 DF PROTO=TCP SPT=50934 DPT=8022 SEQ=3472755009 ACK=0 WINDOW=64240 RES=0x00 SYN URGP=0 OPT (020405B40402080A774E41420000000001030307)
[13684.134491] nat:PREROUTING:rule:1
[13684.134531] filter:FORWARD:rule:1 OUT=vlan0022 DST=10.200.2.2 TTL=63 DPT=22
[13684.134538] nat:POSTROUTING:rule:1

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

Поддержу vel, что мост может влиять. Попробуйте потренироваться на обычной машине, наверное в вашей локалке найдётся рабочий комп с линуксом. Чтобы моста не было и iptables пустые.

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

Не вижу сложности в чтении логов TRACE. По мне так все очевидно.
То то и оно, что не доходит дело до SNAT. Цепочка обрывается на DNAT правиле.
Хотя в tcpdump все же видно пакет после DNAT, в TRACE этот пакет уже не попал.

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

Цепочка обрывается на DNAT правиле

Есть замечательная картинка. А у тебя цепочки INPUT хоть какие-нибудь есть?
Я бы на время выключил бы bridge-nf-call-iptables и/или nf_call_iptables.

C tcpdump-ом все тоже не совсем просто. Но той картинке видно где af_packet получает пакеты.
Обрати внимание, что первым tcpdump показал входящий (?) на eth0, а исходящий ушел через br-lan.

А в бридже еще кто-то есть?

ip li && ip a посмотреть бы...

А policy routing у тебя часом не используется?

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

Поднял из говна и палок тестовую машину в сети на Debian (именно с iptables legacy, не nft).
Попробовал кучу разных кейсов. Вывод один - виноват bridge.
Без моста всё работает и TRACE всё видит. С мостом, картина выще. т.е. пакет доходит до DNAT правила и на этом из TRACE пропадает, при этом по факту вылетает.
bridge-nf-call-* на поведение не влияют.

примет TARCE чистой машины:

[  816.762316] TRACE: raw:PREROUTING:policy:2 IN=br0 OUT= MAC=7e:68:03:29:70:f2:fa:19:87:f0:44:2a:08:00 SRC=192.168.1.192 DST=192.168.1.222 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=11576 DF PROTO=TCP SPT=51312 DPT=38001 SEQ=2831246876 ACK=0 WINDOW=65535 RES=0x00 SYN URGP=0 OPT (020405B40402080A14172701000000000103030A)
[  816.762392] TRACE: nat:PREROUTING:rule:1(DNAT) IN=br0 OUT= MAC=7e:68:03:29:70:f2:fa:19:87:f0:44:2a:08:00 SRC=192.168.1.192 DST=192.168.1.222 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=11576 DF PROTO=TCP SPT=51312 DPT=38001 SEQ=2831246876 ACK=0 WINDOW=65535 RES=0x00 SYN URGP=0 OPT (020405B40402080A14172701000000000103030A)

Да! Всего 2 строки.
(я ещё стал менять и порт 38001 -> 8000, не думаю что это влияет, мне так удобнее фильтровать в сети и наблюдать было)
12:55:43.822099 enp4s0 P   IP 192.168.1.192.48830 > 192.168.1.222.38001: Flags [S], seq 555012627, win 65535, options [mss 1460,sackOK,TS val 337399707 ecr 0,nop,wscale 10], length 0
12:55:43.822099 br0   In  IP 192.168.1.192.48830 > 192.168.1.222.38001: Flags [S], seq 555012627, win 65535, options [mss 1460,sackOK,TS val 337399707 ecr 0,nop,wscale 10], length 0


# Generated by iptables-save v1.8.7 on Tue Mar 11 12:57:02 2025
*nat
:PREROUTING ACCEPT [1498:466577]
:INPUT ACCEPT [249:21311]
:OUTPUT ACCEPT [70:6729]
:POSTROUTING ACCEPT [70:6729]
-A PREROUTING -p tcp -m tcp --dport 38001 -j DNAT --to-destination 192.168.1.20:8000
COMMIT
# Completed on Tue Mar 11 12:57:02 2025
# Generated by iptables-save v1.8.7 on Tue Mar 11 12:57:02 2025
*raw
:PREROUTING ACCEPT [4035:783765]
:OUTPUT ACCEPT [1466:590167]
-A PREROUTING -p tcp -m tcp --dport 38001 -j TRACE
COMMIT
# Completed on Tue Mar 11 12:57:02 2025
# Generated by iptables-save v1.8.7 on Tue Mar 11 12:57:02 2025
*filter
:INPUT ACCEPT [2344:199726]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1602:604491]
COMMIT
# Completed on Tue Mar 11 12:57:02 2025

# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.7e68032970f2       no              enp4s0


и вот оно же без моста
[1734420.054199] TRACE: raw:PREROUTING:policy:2 IN=enp4s0 OUT= MAC=74:56:3c:7c:d7:e0:fa:19:87:f0:44:2a:08:00 SRC=192.168.1.192 DST=192.168.1.222 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=14177 DF PROTO=TCP SPT=33128 DPT=38001 SEQ=536342288 ACK=0 WINDOW=65535 RES=0x00 SYN URGP=0 OPT (020405B40402080A140849BD000000000103030A)
[1734420.054228] TRACE: nat:PREROUTING:rule:1 IN=enp4s0 OUT= MAC=74:56:3c:7c:d7:e0:fa:19:87:f0:44:2a:08:00 SRC=192.168.1.192 DST=192.168.1.222 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=14177 DF PROTO=TCP SPT=33128 DPT=38001 SEQ=536342288 ACK=0 WINDOW=65535 RES=0x00 SYN URGP=0 OPT (020405B40402080A140849BD000000000103030A)
[1734420.054262] TRACE: filter:FORWARD:policy:1 IN=enp4s0 OUT=enp4s0 MAC=74:56:3c:7c:d7:e0:fa:19:87:f0:44:2a:08:00 SRC=192.168.1.192 DST=192.168.1.20 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=14177 DF PROTO=TCP SPT=33128 DPT=8000 SEQ=536342288 ACK=0 WINDOW=65535 RES=0x00 SYN URGP=0 OPT (020405B40402080A140849BD000000000103030A)
[1734420.054270] TRACE: nat:POSTROUTING:policy:1 IN=enp4s0 OUT=enp4s0 MAC=74:56:3c:7c:d7:e0:fa:19:87:f0:44:2a:08:00 SRC=192.168.1.192 DST=192.168.1.20 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=14177 DF PROTO=TCP SPT=33128 DPT=8000 SEQ=536342288 ACK=0 WINDOW=65535 RES=0x00 SYN URGP=0 OPT (020405B40402080A140849BD000000000103030A)
[1734421.081849] TRACE: raw:PREROUTING:policy:2 IN=enp4s0 OUT= MAC=74:56:3c:7c:d7:e0:fa:19:87:f0:44:2a:08:00 SRC=192.168.1.192 DST=192.168.1.222 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=14178 DF PROTO=TCP SPT=33128 DPT=38001 SEQ=536342288 ACK=0 WINDOW=65535 RES=0x00 SYN URGP=0 OPT (020405B40402080A14084DC7000000000103030A)
[1734421.081910] TRACE: filter:FORWARD:policy:1 IN=enp4s0 OUT=enp4s0 MAC=74:56:3c:7c:d7:e0:fa:19:87:f0:44:2a:08:00 SRC=192.168.1.192 DST=192.168.1.20 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=14178 DF PROTO=TCP SPT=33128 DPT=8000 SEQ=536342288 ACK=0 WINDOW=65535 RES=0x00 SYN URGP=0 OPT (020405B40402080A14084DC7000000000103030A)
[1734423.093696] TRACE: raw:PREROUTING:policy:2 IN=enp4s0 OUT= MAC=74:56:3c:7c:d7:e0:fa:19:87:f0:44:2a:08:00 SRC=192.168.1.192 DST=192.168.1.222 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=14179 DF PROTO=TCP SPT=33128 DPT=38001 SEQ=536342288 ACK=0 WINDOW=65535 RES=0x00 SYN URGP=0 OPT (020405B40402080A140855A7000000000103030A)
[1734423.093843] TRACE: filter:FORWARD:policy:1 IN=enp4s0 OUT=enp4s0 MAC=74:56:3c:7c:d7:e0:fa:19:87:f0:44:2a:08:00 SRC=192.168.1.192 DST=192.168.1.20 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=14179 DF PROTO=TCP SPT=33128 DPT=8000 SEQ=536342288 ACK=0 WINDOW=65535 RES=0x00 SYN URGP=0 OPT (020405B40402080A140855A7000000000103030A)

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

Не знаю костыль ли это... Я считаю костылём, но я решил проблему на базе знаний полученных тут: В чем принципиальное отличие от bridge с набором vlan интерфейсов от bridge c vlan
а именно, я объявил мост тэгируемым, и единственный (в тестовом стенде) интерфейс моста протегировал vlan=1, а далее создал интерфейс моста br0.1 (как бы разтегирование vlan 1) и уже с ним работаю как с локальным мостом.
В таком случае DNAT и SNAT работают как ожидалось. т.е. всё работает.
Пока до меня не дошло, как это возможно сделать без VLAN...

Spider55
() автор топика
Последнее исправление: Spider55 (всего исправлений: 1)
Ответ на: комментарий от Spider55

Какие интересные подробности.

я объявил мост тэгируемым, и единственный (в тестовом стенде) интерфейс моста протегировал vlan=1, а далее создал интерфейс моста br0.1 (как бы разтегирование vlan 1) и уже с ним работаю как с локальным мостом.

Мой парсер сломался на первой фразе: «объявил мост тэгируемым»
Это как?!

Для начала, у тебя мост с vlan_filtering=1 ? Посмотреть тожно через ip -d li sh br0

Может у тебя в сети vlan1 тегированный? Легко проверяется «tcpdump -nei enp4s0 vlan 1»

уже с ним работаю как с локальным мостом.

Это как? Куда еще мост?

Ты бы написал команды с помощью которых настраивался мост и vlan или результат ip li; ip a; brigde vlan показал бы.

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

Это как?!
Для начала, у тебя мост с vlan_filtering=1 ?

Именно это и имел ввиду. До этого он таковым не был.
`ip link set dev br0 type bridge vlan_filtering 1`

3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 7e:68:03:29:70:f2 brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 68 maxmtu 65535
    bridge forward_delay 1500 hello_time 200 max_age 2000 ageing_time 30000 stp_state 0 priority 32768 vlan_filtering 0 vlan_protocol 802.1Q bridge_id 8000.7e:68:3:29:70:f2 designated_root 8000.7e:68:3:29:70:f2 root_port 0 root_path_cost 0 topology_change 0 topology_change_detected 0 hello_timer    0.00 tcn_timer    0.00 topology_change_timer    0.00 gc_timer   22.54 vlan_default_pvid 1 vlan_stats_enabled 0 vlan_stats_per_port 0 group_fwd_mask 0 group_address 01:80:c2:00:00:00 mcast_snooping 1 mcast_router 1 mcast_query_use_ifaddr 0 mcast_querier 0 mcast_hash_elasticity 16 mcast_hash_max 4096 mcast_last_member_count 2 mcast_startup_query_count 2 mcast_last_member_interval 100 mcast_membership_interval 26000 mcast_querier_interval 25500 mcast_query_interval 12500 mcast_query_response_interval 1000 mcast_startup_query_interval 3125 mcast_stats_enabled 0 mcast_igmp_version 2 mcast_mld_version 1 nf_call_iptables 0 nf_call_ip6tables 0 nf_call_arptables 0 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 64000 gso_max_segs 64

Может у тебя в сети vlan1 тегированный? Легко проверяется «tcpdump -nei enp4s0 vlan 1»

Нет. Простой трафик без VLANов.

Это как? Куда еще мост?
Ты бы написал команды с помощью которых настраивался мост и vlan

ip link set dev enp4s0 up master br0
bridge vlan add vid 1 dev enp4s0 pvid untagged
ip link add link br0 name br0.1 up type vlan id 1


результат ip li; ip a; brigde vlan показал бы.

# ip li
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP mode DEFAULT group default qlen 1000
    link/ether 74:56:3c:7c:d7:e0 brd ff:ff:ff:ff:ff:ff
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 7e:68:03:29:70:f2 brd ff:ff:ff:ff:ff:ff
4: br0.1@br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 7e:68:03:29:70:f2 brd ff:ff:ff:ff:ff:ff


# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    link/ether 74:56:3c:7c:d7:e0 brd ff:ff:ff:ff:ff:ff
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 7e:68:03:29:70:f2 brd ff:ff:ff:ff:ff:ff
4: br0.1@br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 7e:68:03:29:70:f2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.233/24 brd 192.168.1.255 scope global br0.1
       valid_lft forever preferred_lft forever

# bridge vlan show
port              vlan-id
enp4s0            1 PVID Egress Untagged
br0               1 PVID Egress Untagged

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

Повторил эксперимент

Твоя проблема легко воспроизводится при условии echo 1 >/sys/class/net/br0/bridge/nf_call_iptables
Если nf_call_iptables == 0, то всё работает.
Другой, менее тривиальный вариант решения проблемы ip li set br0 promisc on, но тут нужно на arp-filter смотеть.

Зависимость работоспособности правил iptables от nf_call_iptables это скорее всего баг, но вот понять причину будет непросто.

vlan_filtering при этом не влияет на результат.

10.14.140.7->10.14.140.14:22 перенаправляем на 10.14.140.13:22

  ip li add br0 type bridge vlan_filtering 1
  echo 0 >/sys/class/net/br0/bridge/nf_call_iptables
  ip link set dev eth3 up master br0
  ip addr add  10.14.140.14/24 brd + dev br0
  ip link set dev br0 up
  iptables -t nat -A PREROUTING -s 10.14.140.7 -d 10.14.140.14 -p tcp --dport 22 -j DNAT --to-destination 10.14.140.13
  iptables -t nat -A POSTROUTING -d 10.14.140.13 -p tcp --dport 22 -j SNAT --to-source 10.14.140.14
  iptables -t raw -A PREROUTING -s 10.14.140.7 -d 10.14.140.14 -p tcp --dport 22 --syn -j TRACE

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