Невозможно понять, как направить пакет через многосетевой сетевой адаптер

Невозможно понять, как направить пакет через многосетевой сетевой адаптер

По большей части среда представляет собой FreeBSD и выглядит следующим образом:

HOST_A <-> ROUTER <-> LOKI <-> HOST_B

Как минимум, мне бы хотелось иметь возможность пинговать ROUTER с HOST_B.

  • МАРШРУТИЗАТОРУ назначен IP 10.0.0.1
  • LOKI — это многосетевая машина, которой назначены IP-адреса 10.0.0.2 и 192.168.200.1.
  • HOST_B назначен IP 192.168.200.3
  • HOST_A назначен IP 10.0.0.3

Я настроил сеть, как указано выше, и добавил gateway_enable="YES" в rc.conf loki.

netstat -r на LOKI выдает:

Routing tables
Internet:
Destination        Gateway            Flags      Netif Expire
default            10.0.0.1           UGS         em0
10.0.0.0           link#1             U           em0
10.0.0.2           link#1             UHS         lo0
loki               link#2             UH          lo0
192.168.200.0      link#3             U           ue0
192.168.200.1      link#3             UHS         lo0

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

netstat -r на HOST_B выдает:

Routing tables
Internet:
Destination        Gateway            Flags      Netif Expire
default            192.168.200.1      UGS         em0
hostb              link#2             UH          lo0
192.168.200.0      link#1             U           em0
192.168.200.3      link#1             UHS         lo0

что выглядит как еще одна хорошая таблица маршрутизации, но она видит только LOKI.

В итоге:

  • LOKI может пинговать HOST_A, HOST_B и ROUTER
  • HOST_B может пинговать LOKI, но не ROUTER или HOST_A

Некоторые дополнительные заметки: от HOST_B

ping 10.0.0.1 100% packet loss

В Wireshark на LOKI при пинге 10.0.0.1 с HOST_B:

120 40.549564000    192.168.200.3   10.0.0.1    ICMP    98  Echo (ping) request  id=0x5a0e, seq=92/23552, ttl=63 (no response found!)

Мне кажется, что ничего не маршрутизируется из LOKI в ROUTER. Что я упускаю?

Я подтвердил, что переадресация IP происходит, закомментировав gateway_enable="YES" в /etc/rc.conf и перезагрузив компьютер.

Затем я выполнил следующие команды на loki:

sudo tcpdump -i em0 -nS
sudo tcpdump -i ue0 -nS

для мониторинга активности на двух сетевых картах.

с hostb я запустил:

ping 10.0.0.1

интерфейс ue0 на 192.168.200.1 сообщил:

14:44:21.870865 IP 192.168.200.3 > 10.0.0.1: ICMP echo request, id 21509, seq 0, length 64

Ничего не сообщалось об интерфейсе em0 на 10.0.0.2.

Затем я побежал:

sudo sysctl -w net.inet.ip.forwarding=1

и конечно же, em0 сообщил:

14:58:14.745369 IP 192.168.200.3 > 10.0.0.1: ICMP echo request, id 25861, seq 0, length 64

Но нет, ответ такой, какой я получаю с ping loki от hostb:

14:44:15.724200 IP 192.168.200.3 > 192.168.200.1: ICMP echo request, id 21253, seq 4, length 64
14:44:15.724207 IP 192.168.200.1 > 192.168.200.3: ICMP echo reply, id 21253, seq 4, length 64

Если я пингую маршрутизатор из loki, все в порядке:

15:04:55.637839 IP 10.0.0.2 > 10.0.0.1: ICMP echo request, id 46852, seq 3, length 64
15:04:55.638324 IP 10.0.0.1 > 10.0.0.2: ICMP echo reply, id 46852, seq 3, length 64

Есть идеи, как найти ответ?

решение1

Почему LOKI и HOST_A соединены маршрутизатором, когда они находятся в одной подсети? Это действительно маршрутизатор или просто коммутатор? (Из ваших последующих комментариев следует, что хотя устройство и является маршрутизатором, оно просто действует как коммутатор между LOKI и HOST_A).

Какая таблица маршрутизации на HOST_A и ROUTER? Если он пытается достичь 192.168.200.1, почему он должен использовать LOKI в качестве пункта назначения?

Если таблица маршрутизации на этих устройствах не знает, что нужно использовать LOKI для подсети 192, они будут просто пересылать пакеты на шлюз по умолчанию.

В качестве альтернативы вы можете рассмотреть установку NAT на LOKI. Для многих служб он может инкапсулировать трафик от HOST_B как трафик от LOKI. Поскольку другие машины могут попасть туда, он может получать трафик и пересылать его обратно на HOST_B.

решение2

Мне кажется, что LOKI делает именно то, что вы ожидаете. Он получил pingпакет запроса на ue0и ретранслирует его на em0. Если бы он получил pingответ на em0, он бы ретранслировал его на ue0.

Проблема в МАРШРУТИЗАТОРЕ. Он получает pingзапрос от 192.168.200.3на своей стороне LAN (но это не имеет значения). Когда он отправляет pingответ на 192.168.200.3, он просматривает свою таблицу маршрутизации. Сторона LAN 10.0.0.0/24(или подобная), поэтому пакет ответа отправляется на шлюз по умолчанию МАРШРУТИЗАТОРА, который является стороной WAN в общедоступном Интернете.

МАРШРУТИЗАТОР использует трансляцию сетевых адресов (NAT) для подделки 10.0.0.0/24сети за вашим единственным истинным публичным IP-адресом (назначенным WAN-стороне МАРШРУТИЗАТОРА вашим интернет-провайдером). Адреса RFC1918 являются частными и не могут быть открыты для публичного Интернета, и всегда будут находиться за NAT.

Вы можете поместить статический маршрут в ROUTER, чтобы ваш pingэксперимент сработал, но он все равно будет изолирован от публичного Интернета. Вы можете включить NAT на LOKI, в этом случае у вас будет двойной NAT для Интернета (который работает нормально, но довольно бессмысленно). Если вам просто нужен брандмауэр второго уровня, вы можете рассмотреть возможность сделать LOKI мостовым брандмауэром и запустить его 10.0.0.0/24на обоих сетевых картах. Если вы хотите размещать службы, выходящие в Интернет, и у вас есть только один публичный IP-адрес, вы вынуждены использовать правила переадресации портов на ROUTER.

решение3

Что-то должно быть настроено для пересылки пакетов из сети A в сеть B. Loki, будучи двухдомным, может это сделать, но это не автоматически. При этом вы настроите Loki как маршрутизатор и должны использовать Loki как шлюз по умолчанию для хоста B. Другой вариант — установить постоянный маршрут в таблице маршрутизации хоста B, указав Loki как пункт назначения для трафика 10.xxx.

Связанный контент