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

776
Christian Ehrig

В моей домашней сети (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 
2
Почему вы не соединяете два сетевых интерфейса? Вы отметили это ключевое слово в своем вопросе, но на самом деле вы этого не делаете. Избавьтесь от всех правил маршрутизации и соедините два интерфейса. Appleoddity 6 лет назад 0
Извините, я не упомянул, что когда я добавляю Wi-Fi-адаптер к мосту, ОС отвечает сообщением «Операция не поддерживается» (ip link set dev wlan0 master br0). Я буду исследовать это, так как «реальное» соединение должно быть способом ... Christian Ehrig 6 лет назад 0
Только для справки: я не видел ваш вопрос, поэтому я сделал почти то же самое [Нужен ли смешанный режим для proxy arp?] (Https://unix.stackexchange.com/q/446795/243074). Ingo 5 лет назад 0

1 ответ на вопрос

2
kasperd

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

Ни один из них не использует 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на проводной интерфейс на Pi.

Принтер может быть настроен на статический 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каким-то образом остается неизменным, иначе ваша запись в таблице маршрутизации станет неправильной.

У меня было точное решение для маршрутизации, но моей целью было оставаться в одном диапазоне адресов со всеми устройствами. Я еще раз проверю решение моста, но когда я проверил, чтобы добавить адаптер Wi-Fi к мосту ... "ip link set dev wlan0 master br0" ... он отвечает операцией не поддерживается. Я буду расследовать это. Christian Ehrig 6 лет назад 0
я думаю, что решение что-то вроде этого https://serverfault.com/a/554663/345934 Christian Ehrig 6 лет назад 0
@ChristianEhrig Похоже, это может сработать. Лично я всегда использовал подход маршрутизации для таких установок, поскольку я обнаружил, что его проще настроить, чем мостовое соединение по беспроводной сети. kasperd 6 лет назад 0
@ChristianEhrig Все Raspberry Pis не поддерживает * WDS *. Устройства, поддерживающие это, имеют поддерживаемую команду `set_wds_peer`. Вы не найдете его с помощью `sudo iw phy | grep set_wds_peer` на RasPi. Ingo 5 лет назад 0

Похожие вопросы