LINUX.ORG.RU

Почему не работает NAT Loopback с raspbian?

 ,


0

2

Есть локальная сеть, в которой болтается малинка 4 на последнем raspbian.
В инет сеть идёт через zyxel keenetic ultra 2 на последней прошивке (где давно есть nat loopback)
На малину и соседнюю вин-машину совершенно одинаково проброшены порты (ессно внешние - разные) и из инета всё работает как надо, а вот из самой сети я по внешнему адресу вижу только вин-машину, а малина прикидывается полностью недоступной (по локальному адресу все норм ессно)
Куда копать? Долго тыкал палкой в кинетик, думая что лупбэк вообще не работает, но проверил вин-машинку и с ней всё ок т.е. лупбэк нормально разворачивает пакеты, оба два устройства в самом кинетике в одном сегменте одной и той-же сети и физически подключены одинаково (больше узлов между ними нет), на малине полный дефолт изкаробочного распбиан-минимал

★★★★

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

Тебе нужно на шлюзе для запросов на внешний ИП малины делать snat на ip адрес шлюза.

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

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

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

Я не знаю что и как у тебя работает на Windows и почему не работает на Linux и как у тебя настроен проброс портов на шлюзе.

Но при обмене пакетами по протоколу TCP/IP в пакете есть следующие поля:

  • IP адрес отправителя
  • MAC адрес отправителя
  • IP адрес получателя
  • MAC адрес получателя

Разберём две ситуации:

  • обмен пакетами между адресами в одном адресном пространстве (сети)
  • обмен пакетами между адресами в разных адресных пространствах (сетях)

1 ситуация, одна сеть.

Компьютер отправитель, пусть у него будет адрес NET1_IP1 хочет отправить пакет компьютеру NET1_IP2. Для этого он делает следующее:

  • перебирает таблицу маршрутизации и накладывая маску сети на IP адрес получателя определяет маршрут до этого адреса и находится ли IP адрес получаетя в одной с ним сети;
  • если находится, то он отправляет ARP запрос на определение MAC адреса компьютера получателя;
  • получив ответ запоминает его и начинает заполнять поля IP пакета

SRC_IP: NET1_IP1 SRC_MAC MAC_NET1_IP1 DST_IP: NET1_IP2 DST_MAC: MAC_DST_IP2

После чего отправляет пакет в сеть.

Пакет доходит до компьютера с MAC адресом указанным в поле DST_MAC, после чего компьютер получатель отправляет подтверждение получения. Но перед этим он узнает MAC_NET1_IP1 соответствующий IP адресу NET1_IP1, заполняет поля:

SRC_IP: NET1_IP2 SRC_MAC MAC_NET2_IP2 DST_IP: NET1_IP1 DST_MAC: MAC_DST_IP1

и отправляет пакет.

2 Ситуация,разные сети.

Компьютер NET1_IP1 хочет отправить пакет в другую сеть, получателю с адресом NET2_IP2. Пусть шлюз будет NET1_GW

  • перебирает таблицу маршрутизации и накладывая маску сети на IP адрес получателя определяет маршрут до этого адреса и находится ли IP адрес получаетя в одной с ним сети;
  • видит, что NET2_IP2 в другом адресном пространстве, находит маршрут определяет IP адрес шлюза в другую сеть
  • определяет MAC адрес шлюза, для этого отправляет ARP запрос на определение MAC адреса компьютера получателя;
  • получив ответ запоминает его и начинает заполнять поля IP пакета

SRC_IP: NET1_IP1 SRC_MAC MAC_NET1_IP1 DST_IP: NET1_IP2 DST_MAC: MAC_NET1_GW

Для того, чтобы пакет попал на шлюз в качестве MAC адреса получателя указывается MAC адрес шлюза, остальные поля, IP адрес отправителя, MAC адрес отправителя и IP адрес получателя заполнены как и в первом случае.

Пакет дойдёт в начале на шлюз, а потом получателю.

Но при ответе получатель будет видеть в качестве IP адреса отправителя IP адрес NET1_IP1.

И если как в твоём случае получатель будет иметь маршрут до сети отправителя, то он увидев в своей таблице маршрутизации что у него есть прямой маршрут до NET1_IP1 отправит ответный пакет не на шлюз, который преобразует IP адрес NET1_IP2 во внешний IP, а отправит напрямую отправителю на адрес NET1_IP1.

И такой пакет NET1_IP1 отбросит.

Поэтому и нужно делать на шлюзе SNAT.

anonymous
()
Ответ на: комментарий от rukez

Что бы понять тебе нужно запустить пакетные сниферы, tcpdump на Linux и wireshark на Windows и смотреть какие пакеты приходят при обращении на внешние адреса.

Посмотри какие поля указаны в IP пакете.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.