LINUX.ORG.RU
ФорумAdmin

подружить бриджи и iptables NAT

 , ,


1

1

Есть хост-система с несколькими виртуалками. На ней подняты два бриджа:

  • в br0 включён внешний интерфейс (eth0) и виртуальные интерфейсы виртуалок, которые напрямую используют внешние адреса;
  • в br1 включён dummy интерфейс (host-only network) и виртуальные интерфейсы виртуалок, которые используют внутренние адреса (в пределах рассматриваемой хост-системы), а доступ извне к их сервисам и доступ к Интернет обеспечивается через DNAT+SNAT в iptables.

Всё бы ничего, но есть необходимость доступа с любых машин к почтовому серверу, который включён в br1, а необходимые порты (25 и др.) в него с целью экономии проброшены с IP-адреса, который одновременно используется хост-системой. MX запись доменов, соответственно, указывает на внешний адрес хост-системы.

В зависимости от состояния net.bridge.bridge-nf-call-iptables наблюдаются следующие ситуации. Для наглядности привожу краткие логи из tcpdump, слушавшего виртуальные интерфейсы проверяемых машин. Внешний адрес хост-системы обозначен как host-system, vm-on-br0 - произвольная виртуалка, включённая в br0, vm-on-br1 - произвольная виртуалка, включённая в br1, mailserver-vm - внутренний адрес почтового сервера.

При net.bridge.bridge-nf-call-iptables = 1

Попытка подключиться с vm-on-br0 к host-system: подключение на первый взгляд устанавливается, но не работает - траффик не ходит (сразу же обрывается?).

IP vm-on-br0.34978 > host-system.25: Flags [S], seq 1849458227, win 14600, options [mss 1460,sackOK,TS val 368978 ecr 0,nop,wscale 4], length 0
IP host-system.25 > vm-on-br0.34978: Flags [S.], seq 1081576981, ack 1849458228, win 14480, options [mss 1460,sackOK,TS val 205318642 ecr 368978,nop,wscale 4], length 0
IP vm-on-br0.34978 > host-system.25: Flags [.], ack 1, win 913, options [nop,nop,TS val 368978 ecr 205318642], length 0
IP vm-on-br0.34978 > host-system.25: Flags [P.], seq 1:2, ack 1, win 913, options [nop,nop,TS val 369195 ecr 205318642], length 1
IP host-system.25 > vm-on-br0.34978: Flags [R], seq 1081576982, win 0, length 0

Попытка подключиться с vm-on-br1 к host-system: подключение устанавливается.

IP vm-on-br1.57407 > host-system.25: Flags [S], seq 385890268, win 14600, options [mss 1460,sackOK,TS val 205342014 ecr 0,nop,wscale 4], length 0
IP host-system.25 > vm-on-br1.57407: Flags [S.], seq 1331471692, ack 385890269, win 14480, options [mss 1460,sackOK,TS val 205348051 ecr 205342014,nop,wscale 4], length 0
IP vm-on-br1.57407 > host-system.25: Flags [.], ack 1, win 913, options [nop,nop,TS val 205342014 ecr 205348051], length 0
IP host-system.25 > vm-on-br1.57407: Flags [P.], seq 1:20, ack 1, win 905, options [nop,nop,TS val 205348063 ecr 205342014], length 19
IP vm-on-br1.57407 > host-system.25: Flags [.], ack 20, win 913, options [nop,nop,TS val 205342025 ecr 205348063], length 0
IP vm-on-br1.57407 > host-system.25: Flags [F.], seq 1, ack 20, win 913, options [nop,nop,TS val 205342602 ecr 205348063], length 0
IP host-system.25 > vm-on-br1.57407: Flags [F.], seq 20, ack 2, win 905, options [nop,nop,TS val 205348640 ecr 205342602], length 0
IP vm-on-br1.57407 > host-system.25: Flags [.], ack 21, win 913, options [nop,nop,TS val 205342602 ecr 205348640], length 0

При net.bridge.bridge-nf-call-iptables = 0

Попытка подключиться с vm-on-br0 к host-system: подключение устанавливается.

IP vm-on-br0.34992 > host-system.25: Flags [S], seq 328034242, win 14600, options [mss 1460,sackOK,TS val 432621 ecr 0,nop,wscale 4], length 0
IP host-system.25 > vm-on-br0.34992: Flags [S.], seq 225042229, ack 328034243, win 14480, options [mss 1460,sackOK,TS val 205382285 ecr 432621,nop,wscale 4], length 0
IP vm-on-br0.34992 > host-system.25: Flags [.], ack 1, win 913, options [nop,nop,TS val 432621 ecr 205382285], length 0
IP host-system.25 > vm-on-br0.34992: Flags [P.], seq 1:20, ack 1, win 905, options [nop,nop,TS val 205382285 ecr 432621], length 19
IP vm-on-br0.34992 > host-system.25: Flags [.], ack 20, win 913, options [nop,nop,TS val 432621 ecr 205382285], length 0
IP vm-on-br0.34992 > host-system.25: Flags [F.], seq 1, ack 20, win 913, options [nop,nop,TS val 432800 ecr 205382285], length 0
IP host-system.25 > vm-on-br0.34992: Flags [F.], seq 20, ack 2, win 905, options [nop,nop,TS val 205382464 ecr 432800], length 0
IP vm-on-br0.34992 > host-system.25: Flags [.], ack 21, win 913, options [nop,nop,TS val 432800 ecr 205382464], length 0

Попытка подключиться с vm-on-br1 к host-system: подключение не устанавливается - ответы от хоста приходят в обход NAT, в итоге имеем connection timed out.

IP vm-on-br1.57408 > host-system.25: Flags [S], seq 3460236042, win 14600, options [mss 1460,sackOK,TS val 205385318 ecr 0,nop,wscale 4], length 0
IP mailserver-vm.25 > vm-on-br1.57408: Flags [S.], seq 3875201270, ack 3460236043, win 14480, options [mss 1460,sackOK,TS val 205391356 ecr 205385318,nop,wscale 4], length 0
IP vm-on-br1.57408 > mailserver-vm.25: Flags [R], seq 3460236043, win 0, length 0
IP vm-on-br1.57408 > host-system.25: Flags [S], seq 3460236042, win 14600, options [mss 1460,sackOK,TS val 205385568 ecr 0,nop,wscale 4], length 0
IP mailserver-vm.25 > vm-on-br1.57408: Flags [S.], seq 3890788609, ack 3460236043, win 14480, options [mss 1460,sackOK,TS val 205391605 ecr 205385568,nop,wscale 4], length 0
IP vm-on-br1.57408 > mailserver-vm.25: Flags [R], seq 3460236043, win 0, length 0
IP vm-on-br1.57408 > host-system.25: Flags [S], seq 3460236042, win 14600, options [mss 1460,sackOK,TS val 205386069 ecr 0,nop,wscale 4], length 0
IP mailserver-vm.25 > vm-on-br1.57408: Flags [S.], seq 3922100458, ack 3460236043, win 14480, options [mss 1460,sackOK,TS val 205392106 ecr 205386069,nop,wscale 4], length 0
IP vm-on-br1.57408 > mailserver-vm.25: Flags [R], seq 3460236043, win 0, length 0
IP vm-on-br1.57408 > host-system.25: Flags [S], seq 3460236042, win 14600, options [mss 1460,sackOK,TS val 205387072 ecr 0,nop,wscale 4], length 0
IP mailserver-vm.25 > vm-on-br1.57408: Flags [S.], seq 3984788496, ack 3460236043, win 14480, options [mss 1460,sackOK,TS val 205393109 ecr 205387072,nop,wscale 4], length 0
IP vm-on-br1.57408 > mailserver-vm.25: Flags [R], seq 3460236043, win 0, length 0
IP vm-on-br1.57408 > host-system.25: Flags [S], seq 3460236042, win 14600, options [mss 1460,sackOK,TS val 205389076 ecr 0,nop,wscale 4], length 0
IP mailserver-vm.25 > vm-on-br1.57408: Flags [S.], seq 4110038680, ack 3460236043, win 14480, options [mss 1460,sackOK,TS val 205395113 ecr 205389076,nop,wscale 4], length 0
IP vm-on-br1.57408 > mailserver-vm.25: Flags [R], seq 3460236043, win 0, length 0
IP vm-on-br1.57408 > host-system.25: Flags [S], seq 3460236042, win 14600, options [mss 1460,sackOK,TS val 205393088 ecr 0,nop,wscale 4], length 0
IP mailserver-vm.25 > vm-on-br1.57408: Flags [S.], seq 65821133, ack 3460236043, win 14480, options [mss 1460,sackOK,TS val 205399125 ecr 205393088,nop,wscale 4], length 0
IP vm-on-br1.57408 > mailserver-vm.25: Flags [R], seq 3460236043, win 0, length 0

Полагаю, нужно всё-таки курить конфигурацию с net.bridge.bridge-nf-call-iptables = 1 (кроме того, будет полезно для нужд фильтрации траффика всех виртуалок), но почему подключение в первом случае сразу же заканчивается TCP RST - ума не приложу.

Смущает reset после установки соединения - imho это "-j REJECT --reject-with tcp-reset" где-то в iptables.

Не надо iptables & bridge пытаться связать вместе.

Мосты отдельно, роутинг/нат отдельно

net.bridge.bridge-nf-call-iptables без надобности. т.е. должен быть 0.

Есть простой вариант - сделать отдельную сеть для этого почтовика и не будет проблем с NAT-от

Работоспособность NAT достигается только при симметричной маршрутизацией, т.е. когда пакеты туда и обратно идут через транслятор адресов.

Можно через dns/view разрулить.

Все локальные машины должны ходить на внутренний адрес почтовика без NAT, а все остальные на внешний адрес хост-системы и дальше через DNAT.

vel ★★★★★ ()

Коллега frozen_twilight, здравствуйте!

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

У меня была такая же тема с петлями в NAT, правда не на GNU/Linux, а на Mikrotik Router OS, помогла вот эта ссылка про Hairpin NAT на сайте Mikrotik Wiki.

Похоже, и на этот раз тема про петли NAT, правда добавлено усложнение с bridge.

Там хорошо описана теория, наверняка и вам поможет. Мне помогла. К тому же, между Mikrotik Router OS и GNU/Linux много общего: обе реализованы на базе ядра linux, а следовательно должны использовать один и тот же файрвол — netfilter.

Infra_HDC ★★★★★ ()
Последнее исправление: Infra_HDC (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.