Почему ARP Response только когда сетевой адаптер в случайном режиме?

В моей домашней сети (10.0.0.0/24) я хочу развернуть сетевой принтер, не прокладывая кабель от коммутатора к нему. Поэтому я использовал Raspberry Pi, который подключается через Wi-Fi к моей беспроводной сети и подключил его порт Ethernet к принтеру. Цель состояла в том, чтобы иметь что-то вроде моста Wifi-Ethernet здесь...

RPi Ethernet IP (eth0): 10.0.0.32
RPi Wifi IP (wlan0): 10.0.0.31
Printer IP: 10.0.0.30

После игры с tcpdump я узнал, что RPi отвечает на ARP-запросы от маршрутизатора (10.0.0.1), только когда у меня было

net.ipv4.ip_forward = 1
net.ipv4.conf.all.proxy_arp = 1

включен. Что-то, что я могу понять, читая man-страницы. Я проверил это с помощью простых пингов от маршрутизатора до IP-адреса принтера.

Теперь, когда я удалил ARP Cache на маршрутизаторе, не открыв tcpdump на RPi, ARP Responses перестали работать. Поэтому мне было интересно, почему он снова начинает работать, как только я запустил tcpdump на Pi. Оказалось, что tcpdump переводит интерфейс WiFi Raspberry Pi в беспорядочный режим. Для правильной работы я перевел интерфейс WiFi Pi в постоянный беспорядочный режим.

 ip link set wlan0 promisc on

и теперь все работает нормально, но так как у меня есть ощущение, что это решение "пахнет", я хотел бы знать, что здесь происходит и почему proxy_arp недостаточно?

Кроме того, поскольку у меня есть два сетевых интерфейса, работающих в одной подсети, я с помощью некоторых политик маршрутизации удостоверился, что через eth0 маршрутизируется только трафик к принтеру.

localhost ~ # ip rule show
0:      from all lookup local
32764:  not from all to 10.0.0.30 lookup main
32765:  from all to 10.0.0.30 lookup print
32766:  from all lookup main
32767:  from all lookup default


localhost ~ # ip route show table print
10.0.0.30 dev eth0  scope link

1 ответ

Решение

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

Ни один из них не использует proxy_arp, proxy_arp это хак, который вы можете использовать, если некоторые части вашей сети думают, что вы маршрутизируете, а другие - что вы соединяете. Это последнее средство, которое вы должны использовать, только если исключили все другие варианты.

Моя рекомендация заключается в том, что вам необходимо полностью понять решение по маршрутизации и мостовому соединению и понять, почему ни один из них не будет работать для вас, прежде чем вы прибегнете к proxy_arp,

Ваш случай использования не похож на один из тех, где proxy_arp будет необходимо.

Решение проблемы с мостовым соединением

WiFi использует MAC-адреса на двух уровнях стека. У вас будет пара MAC-адресов для конечных точек, как в проводном Ethernet. И у вас будет пара MAC-адресов, указывающих конечные точки беспроводного соединения.

К сожалению, исходный стандарт WiFi предполагал, что конкретная пара из этих четырех MAC-адресов всегда будет идентична, и это предположение неверно при соединении. Таким образом, новый стандарт под названием WDS был введен, чтобы исправить это.

Таким образом, для настройки мостового соединения необходимо убедиться, что оборудование на обоих концах вашего Wi-Fi-соединения поддерживает WDS и что оно включено. Далее вам нужно вернуть эти два sysctl изменения, которые вы сделали, потому что они не используются для соединения.

Наконец, вам нужно настроить мост на Pi, который объединяет проводной и беспроводной интерфейсы в мост. Если вы хотите, чтобы Pi также говорил по IP, вы настраиваете его на интерфейсе моста, а не на базовых физических интерфейсах.

Это куча вещей для настройки, и существует риск того, что WDS не поддерживается аппаратным обеспечением.

Решение проблемы с маршрутизацией

Если вы хотите сделать маршрутизацию, вам все равно нужно отменить proxy_arp установка. net.ipv4.ip_forward = 1 однако настройка верна для настройки маршрутизации.

На Пи нужно настроить два сетевых интерфейса с разными префиксами. Беспроводной, который вы уже настроили с 10.0.0.0/24 Вы, вероятно, можете оставить как есть, так как эта часть уже работает.

Однако проводной интерфейс необходимо настроить с другим префиксом. Возможный выбор 10.0.1.0/24, И вы можете назначить 10.0.1.1 в проводной интерфейс на пи.

Принтер может быть настроен на статический IP-адрес, такой как 10.0.1.2 или вы можете позволить ему настраиваться динамически, что требует установки DHCP-сервера на Pi, который раздает адреса в 10.0.1.1 префикс.

Наконец, вам нужно сообщить существующему маршрутизатору об этой новой сети, добавив запись в таблицу маршрутизации. В конфигурации на вашем существующем маршрутизаторе добавьте запись таблицы маршрутизации для префикса 10.0.1.0/24 (альтернативно написано как 10.0.1.0/255.255.255.0) с адресом шлюза 10.0.0.31, Вы должны убедиться, что адрес 10.0.0.31 каким-то образом остается статичным, иначе ваша запись в таблице маршрутизации станет неправильной.

Другие вопросы по тегам