Я занимаюсь разработкой сетевого приложения, основанного на вещании в подсетях.Я решил настроить контролируемую среду для тестирования и разработки на своем локальном компьютере, используя виртуальные интерфейсы Ethernet (veth
).Настройка проста:
ip link add veth0 type veth peer name veth1
ifconfig veth0 192.168.241.1 netmask 255.255.255.0 up
ifconfig veth1 192.168.241.2 netmask 255.255.255.0 up
ip link
подтверждает, что интерфейсы работают и установлены флаги широковещания:
8: veth1@veth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether 46:29:76:81:27:af brd ff:ff:ff:ff:ff:ff
9: veth0@veth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether 3a:ad:f9:cb:28:a8 brd ff:ff:ff:ff:ff:ff
Тривиальный тест в Python REPL показывает, что интерфейсыявляются функциональными.Это получатель:
>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>>> s.bind(('192.168.241.2', 48469))
>>> s.recvfrom(1000)
(b'abc', ('192.168.241.1', 45560))
И это отправитель:
>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>>> s.connect(('192.168.241.2', 48469))
>>> s.send(b'abc')
3
Хорошо работает для одноадресных пакетов.Однако широковещательные пакеты, по-видимому, молча отбрасываются.Для воспроизведения проблемы можно использовать следующий REPL на стороне отправителя:
>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>>> s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
>>> s.connect(('192.168.241.255', 48469))
>>> s.send(b'abc')
3
>>> s # For diagnostic purposes
<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=('192.168.241.1', 48065), raddr=('192.168.241.255', 48469)>
Сокет успешно настроен, но отправленные широковещательные пакеты никогда не попадают на другую сторону туннеля.Это не то поведение, которого я ожидал, особенно учитывая, что флаги интерфейса указывают, что интерфейсы поддерживают широковещательную передачу.Я запускаю эти тесты на Linux Mint 18 со стандартным ядром.Чего мне не хватает?