Я написал мост (переключатель уровня 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
brctl
и/или только проводные интерфейсы? - person Jonas Schäfer   schedule 26.10.2012brctl
говорит, что это невозможно, вам действительно следует проверить на стороне маршрутизатора. Опять же, попробуйте свой код с проводными интерфейсами только для того, чтобы убедиться, что он работает за рамками проблем с беспроводным драйвером. (Примечание: я один из тех, кого сильно раздражает отсутствие возможности легко соединить Wi-Fi и проводное соединение на моем ноутбуке, поэтому я сочувствую вам, если это не сработает) - person Jonas Schäfer   schedule 26.10.2012192.168.0.xx
или10.xx.yy.zz
) на всех задействованных машинах (т. е. также ПК1). Чтобы убедиться, что это в основном работает, сначала попробуйте выполнить эхо-запрос с ПК2 (мост) на ПК3 (другой одноранговый компьютер). Если это не поможет, есть ли способ запуститьtcpdump
или что-то подобное на маршрутизаторе? - person Jonas Schäfer   schedule 26.10.2012tcpdump
на другом клиенте в беспроводной сети. Если его беспроводная карта находится в неразборчивом режиме (tcpdump
переводит ее в этот режим), вы должны увидеть трафик всех других клиентов, находящихся в пределах досягаемости. Если вы видите там запрос arp, вы можете быть уверены, что он был передан беспроводной картой вашего моста. Однако, если вы этого не сделаете, это не является окончательным доказательством того, что он не был передан, поскольку вы могли просто пропустить пакет из-за плохого качества эфира или по другим причинам. - person Leon Weber   schedule 26.10.2012