Рейтинг:0

почему перенаправление портов и DNAT не работают с vxlan

флаг jp

Мне нужно создать соединения VXLAN между двумя компьютерами A (в Debian с IP-адресом 192.168.30.1) и B (в Archlinux с IP-адресом 192.168.30.3) Для этого я сделал:

  • На:
  sudo ip link add vxlan1 type vxlan id 1 nolearning remote 192.168.30.3 dstport 33333 dev ens4
  sudo ip link set vxlan1 вверх
  sudo IP-адрес добавить 10.0.0.106/24 dev vxlan1
  • На Б:
  sudo ip link add vxlan2 type vxlan id 1 nolearning remote 111.111.111.111 dstport 33333 dev ens3
  sudo ip link set vxlan2 up
  sudo IP-адрес добавить 10.0.0.107/24 dev vxlan2

Более того, на ПК Б я создаю правило DNAT:

  sudo iptables -w -t nat -A OUTPUT -s 192.168.30.3 -d 111.111.111.111 -p udp --dport 33333 -j DNAT --назначение 192.168.30.1:33333

Затем я сделал:

  • На ПК А: пинг 10.0.0.107. Это работает, как и ожидалось, с ping ответы.
  • На ПК Б: пинг 10.0.0.106. Это работает, как и ожидалось, с ping ответы.
  • На ПК А: нк -у -лп 12345. На ПК Б: нк -у 10.0.0.106 12345. Я ожидал прочитать данные в приложении netcat на ПК A при отправке данных с помощью команды netcat с ПК B. Однако я ничего не прочитал.

Моя проблема тогда в последнем пункте. Почему мой прослушиватель netcat ничего не получает. Используя wireshark на ПК A, я получаю:

[дамп wireshark на ПК A1

Некоторая дополнительная информация

  • ПК A работает с «Linux debian 4.19.0-16-amd64 #1 SMP Debian 4.19.181-1 (2021-03-19) x86_64 GNU/Linux» (это результат uname -а команда)

  • ПК IP-адрес на ens4 — 192.168.30.1/24.

  • ПК B работает с «Linux archlinux 5.13.9-arch1-1 #1 SMP PREEMPT Sun, 08 августа 2021 г., 11:25:35 +0000 x86_64 GNU/Linux» (это результат uname -а команда)

  • IP-адрес ПК B на ens3: 192.168.30.3/24.

  • две машины - это виртуальные машины Qemu, запущенные с GNS3

  • nat и filter таблицы netfilter на ПК A пусты:

seb@debian:~$ sudo iptables -t nat -L ; sudo iptables -t фильтр -L
Цепь PREROUTING (политика ПРИНЯТЬ)
целевая защита выбор источника назначения         

Сеть INPUT (политика ACCEPT)
целевая защита выбор источника назначения         

Сеть POSTROUTING (правило ACCEPT)
целевая защита выбор источника назначения         

Цепочка OUTPUT (политика ACCEPT)
целевая защита выбор источника назначения         
Сеть INPUT (политика ACCEPT)
целевая защита выбор источника назначения         

Сеть FORWARD (политика ACCEPT)
целевая защита выбор источника назначения         

Цепочка OUTPUT (политика ACCEPT)
целевая защита выбор источника назначения    
  • На ПК B у меня есть только правило DNAT и правило отбрасывания ICMP-пакета типа «порт недоступен» (это правило я добавил для другой цели):
[seb@archlinux vxlan]$ sudo iptables -t nat -L -n ; sudo iptables -t фильтр -L -n
Цепь PREROUTING (политика ПРИНЯТЬ)
целевая защита выбор источника назначения         

Сеть INPUT (политика ACCEPT)
целевая защита выбор источника назначения         

Цепочка OUTPUT (политика ACCEPT)
целевая защита выбор источника назначения         
DNAT udp -- 192.168.30.3 111.111.111.111 udp dpt:33333 to:192.168.30.1:33333

Сеть POSTROUTING (правило ACCEPT)
целевая защита выбор источника назначения         
Сеть INPUT (политика ACCEPT)
целевая защита выбор источника назначения         

Сеть FORWARD (политика ACCEPT)
целевая защита выбор источника назначения         

Цепочка OUTPUT (политика ACCEPT)
целевая защита выбор источника назначения         
DROP icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 3
Michael Hampton avatar
флаг cz
Почему вы используете NAT, а не обычную маршрутизацию?
sebastien dontneedtoknowthat avatar
флаг jp
Почему я не могу использовать NAT вместо обычной маршрутизации? Конечно, использовать NAT здесь бесполезно, но на самом деле мой вопрос — это упрощенная версия того, что мне действительно нужно делать и где мне нужен NAT. По сути, в полном сценарии один из моих компьютеров находится за NAT (ящик моего интернет-провайдера). Таким образом, другой компьютер не может получить прямой доступ к первому, и я не могу изменить правила NAT на коробке. Поэтому я работаю над этой проблемой. На данный момент мне удается заставить пинг работать, только играя с синхронизацией моего ящика. В конце концов, я хочу использовать это для агрегации ссылок.
sebastien dontneedtoknowthat avatar
флаг jp
Я понимаю, что мой вопрос также может заключаться в следующем: как выполнить соединения VXLAN между двумя компьютерами A и B с двумя предположениями. Во-первых, каждый пакет, отправленный A, проходит через машину NAT, которая изменяет информацию об источнике пакета. Во-вторых, я не хочу модифицировать машину, выполняющую NAT (поэтому я не хочу добавлять на нее статические правила).Однако мне все еще любопытно, почему использование DNAT не работает с VXLAN.
A.B avatar
флаг cl
A.B
Хотя изначально я этого не понял, у меня возникла проблема. По наитию, это решило проблему: `ethtool --offload vxlan2 tx-checksum-ip-generic off` (и повторное включение возвращает проблему). Здесь нет действительно хорошего объяснения.
sebastien dontneedtoknowthat avatar
флаг jp
Это действительно работает и для меня. Я действительно не знаю, почему, так как я не вижу разницы между двумя пакетами, отправленными с tx-checksum-ip-generic и без него. Но на данный момент это лучший ответ, который у меня есть.
A.B avatar
флаг cl
A.B
Если вы посмотрите внимательно, Wireshark скажет, что *не* проверил контрольную сумму для инкапсулированного протокола. Я могу только предположить, что контрольная сумма неверна, и если бы он ее подтвердил, он бы сказал неправильную контрольную сумму.

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

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