Linux-мост моего собственного изготовления: запрос arp никогда не завершается успешно

Я написал мост (переключатель уровня 2), используя расширение Boost.Asio. Мы можем легко создавать дополнительные сокеты, конечные точки и протоколы, соответствующие их требованиям к типу. И мое расширение использует пакетный сокет linux с AF_PACKET, SOCK_RAW и htons(ETH_P_ALL) (см. man 7 packet для получения дополнительной информации о пакетном сокете).

Вот пример для объяснения того, как работает мой мост:

[PC1] <----> IF1[PC2]IF2 <----> [PC3]

Мост соединяет сетевые интерфейсы (например, eth0) IF1 и IF2, поэтому ПК1 может взаимодействовать с ПК3 через мост, работающий на ПК2. Способ подключения интерфейсов — отправка пакетов, полученных с IF1 на IF2 (и наоборот)

Мой мост работает с проводными соединениями, как и ожидалось, но не работает с беспроводными соединениями. Поэтому я попытался найти причину этой проблемы и обнаружил, что запрос ARP так и не был выполнен.

Фактическая среда, которая вызывает эту проблему:

[PC1] <--wired--> eth0[PC2]wlan0 <--wireless(802.11g)--> [router1]

Например, в приведенной выше среде ПК1 пытается отправить пакет ping (ICMP) на маршрутизатор 1. Чтобы отправить его на ПК3, ПК1 должен знать MAC-адрес маршрутизатора 1, поэтому ПК1 отправляет запрос ARP на FF:FF:FF:FF:FF:FF И мой мост, работающий на ПК2, получает его от eth0 и отправляет на wlan0, но маршрутизатор 1 никогда не отправляет ответ arp на ПК1.

Примечание. Пакеты SOCK_RAW передаются в драйвер устройства и из него без каких-либо изменений в данных пакета. (цитата из справочной страницы пакета)

Что нужно сделать, чтобы компьютер PC1 мог обмениваться данными с маршрутизатором Route1?
Спасибо.

Изменить:
Вот мое расширение Boost.Asio.
github: pfpacket/libarex
И это мой мост, использующий выше.
libarex/example /layer2_switch/interface_bridge.cpp


person xps_l502    schedule 26.10.2012    source источник
comment
Вы уверены, что ваши вещи правильно работают с беспроводным интерфейсом? Можете ли вы запустить анализатор пакетов на маршрутизаторе? Поскольку многие беспроводные чипсеты (или, по крайней мере, их драйверы) не поддерживают отправку необработанных пакетов с поддельными MAC-адресами, что вам нужно сделать для коммутаторов уровня 2 (частая причина ошибки «Операция не разрешена/поддерживается» при попытке соединения). вместе беспроводной и проводной интерфейсы).   -  person Jonas Schäfer    schedule 26.10.2012
comment
Вы пытались сделать то же самое, используя brctl и/или только проводные интерфейсы?   -  person Jonas Schäfer    schedule 26.10.2012
comment
Я запустил brctl от имени пользователя root, и brctl сказал, что не может добавить wlan0 к мосту vbr0: операция не поддерживается. Мой беспроводной драйвер может не поддерживать это. Но прослушивающий wlan0 wireshark отобразил запрос arp, который мой мост отправил на router1. Спасибо за ваши кометы.   -  person xps_l502    schedule 26.10.2012
comment
Да, а запрос ARP приходит на роутер? Возможно, wireshark видит пакеты, которые, я думаю, не будут передаваться на физическом уровне. Если brctl говорит, что это невозможно, вам действительно следует проверить на стороне маршрутизатора. Опять же, попробуйте свой код с проводными интерфейсами только для того, чтобы убедиться, что он работает за рамками проблем с беспроводным драйвером. (Примечание: я один из тех, кого сильно раздражает отсутствие возможности легко соединить Wi-Fi и проводное соединение на моем ноутбуке, поэтому я сочувствую вам, если это не сработает)   -  person Jonas Schäfer    schedule 26.10.2012
comment
Я не знаю, как проверить, приходит ли запрос arp на router1...   -  person xps_l502    schedule 26.10.2012
comment
Можете ли вы попробовать сделать Ad-Hoc Wi-Fi на другой машине (вместо маршрутизатора и без него) и пропинговать его по мосту с ПК1?   -  person Jonas Schäfer    schedule 26.10.2012
comment
Я настраиваю режим Ad-hoc, увидев Как настроить беспроводную сеть Ad-Hoc? и моя другая машина может найти сигнал Ad-hoc, но не может обмениваться данными через Ad-hoc. Есть ли другие способы проверить приход arp-запроса. Извините...   -  person xps_l502    schedule 26.10.2012
comment
Вы настроили статические IP-адреса в сети Ad-hoc? Помните, что другая ваша машина не будет транслировать DHCP, поэтому вам необходимо настроить статические IP-адреса (предпочтительно 192.168.0.xx или 10.xx.yy.zz) на всех задействованных машинах (т. е. также ПК1). Чтобы убедиться, что это в основном работает, сначала попробуйте выполнить эхо-запрос с ПК2 (мост) на ПК3 (другой одноранговый компьютер). Если это не поможет, есть ли способ запустить tcpdump или что-то подобное на маршрутизаторе?   -  person Jonas Schäfer    schedule 26.10.2012
comment
Вы можете попробовать запустить tcpdump на другом клиенте в беспроводной сети. Если его беспроводная карта находится в неразборчивом режиме (tcpdump переводит ее в этот режим), вы должны увидеть трафик всех других клиентов, находящихся в пределах досягаемости. Если вы видите там запрос arp, вы можете быть уверены, что он был передан беспроводной картой вашего моста. Однако, если вы этого не сделаете, это не является окончательным доказательством того, что он не был передан, поскольку вы могли просто пропустить пакет из-за плохого качества эфира или по другим причинам.   -  person Leon Weber    schedule 26.10.2012
comment
@LeonWeber, это работает в произвольных зашифрованных беспроводных сетях?   -  person Jonas Schäfer    schedule 26.10.2012
comment
@JonasWielicki, он должен работать с Wi-Fi-сетями, зашифрованными с предварительным общим ключом; он не будет работать с персонализированными ключами шифрования.   -  person Leon Weber    schedule 26.10.2012
comment
@JonasWielicki Да, я устанавливаю статические IP-адреса в сети Ad-hoc. (я использую 192.168.2.х)   -  person xps_l502    schedule 26.10.2012
comment
@LeonWeber Спасибо за комментарий. Я попробовал это на другой машине, используя свой USB-WLAN. Но tcpdump на другой моей машине не отображал запрос arp от ПК1. (разумеется, мой мост прослушивает пакеты в неразборчивом режиме) Я застрял.   -  person xps_l502    schedule 26.10.2012
comment
@ xps_l502 На самом деле это звучит так, как будто ваш адаптер Wi-Fi не может выполнять мостовое соединение, даже если вы пишете пакеты в необработанном режиме. Вы проверяли работу своего кода, пытаясь соединить два проводных интерфейса вместо соединения Wi-Fi и проводного соединения вместе?   -  person Jonas Schäfer    schedule 26.10.2012
comment
@JonasWielicki Надеюсь, что нет. Мой код моста точно работает при проводных соединениях. Я обновил свой вопрос. Смотрите также, пожалуйста.   -  person xps_l502    schedule 26.10.2012
comment
@ xps_l502 Тогда я не могу представить ничего, кроме глючного драйвера/чипсета. Извините, что говорю это :/   -  person Jonas Schäfer    schedule 26.10.2012


Ответы (2)


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

Это общая проблема, что беспроводное соединение проблематично (по крайней мере, под Linux, я не знать для других). Исследование показало, что, скорее всего, драйвер беспроводной сети или набор микросхем оборудования, используемого в качестве моста, не может выполнять операции моста (brctl сбой подтверждает это предположение).

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

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

person Jonas Schäfer    schedule 26.10.2012
comment
Сначала я предположил, что проблемы были вызваны различиями в обмене данными на канальном уровне между проводными и беспроводными соединениями. Но проблемы могут быть вызваны моим драйвером. Я попробую еще немного. Спасибо за помощь. - person xps_l502; 27.10.2012
comment
Как вы упомянули, режим AP предназначен для подключения к eth0, проводным интерфейсам. Но это не для соединения wlan, и это часть физического дизайна — пожалуйста, прочтите: linuxquestions.org/questions/debian-26/ для более глубокого понимания. - person Peter Teoh; 10.11.2015
comment
Следует выделить WDS, как указано в ссылке выше, что необходимо, если вы хотите подключить интерфейс WIFI. - person Peter Teoh; 10.11.2015

Вы должны соединить свои интерфейсы, используя bridge-utils, что-то вроде:

# brctl addbr mybridge0
# brctl addif mybridge0 eth0
# brctl addif mybridge0 wlan0

(on PC2;)

person F. Hauri    schedule 26.10.2012
comment
ОП хотел сделать это сам, без brctl, в программном обеспечении. - person Jonas Schäfer; 26.10.2012
comment
Попробуйте выполнить задание, используя brctl, чтобы убедиться в концепции, а затем взгляните на исходники bridge-utils. - person F. Hauri; 26.10.2012
comment
brctl говорит, что не может добавить wlan0 к мосту vbr0: операция не поддерживается при добавлении wlan0 к интерфейсу моста, созданному brctl, и я хочу сделать это сам. Спасибо за ответ. - person xps_l502; 26.10.2012