Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
广播数据包不会通过Linux veth隧道传播_Linux_Broadcast_Broadcasting_Virtual Network_Virtual Network Interface - Fatal编程技术网

广播数据包不会通过Linux veth隧道传播

广播数据包不会通过Linux veth隧道传播,linux,broadcast,broadcasting,virtual-network,virtual-network-interface,Linux,Broadcast,Broadcasting,Virtual Network,Virtual Network Interface,我正在开发一个依赖子网广播的网络应用程序。我决定使用虚拟以太网接口(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

我正在开发一个依赖子网广播的网络应用程序。我决定使用虚拟以太网接口(
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
这是发件人:

>>> 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)>
导入套接字 >>>s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) >>>s.setsockopt(socket.SOL_socket,socket.SO_广播,1) >>>s.connect(('192.168.241.255',48469)) >>>s.send(b'abc') 3. >>>s#用于诊断目的
套接字已成功配置,但发出的广播数据包从未到达隧道的另一侧。这不是我期望的行为,特别是考虑到接口标志指示接口支持广播。我在LinuxMint18上运行这些测试,使用的是一个股票内核。我错过了什么?

隧道很好。

问题是Linux丢弃所有传入的广播流量,除非套接字绑定到
INADDR\u ANY
。如果按如下方式更新接收方REPL,则一切正常:

>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>>> s.bind(('', 48469))  # Bind to INADDR_ANY to accept broadcast packets
>>> s.recvfrom(1000)
(b'abc', ('192.168.241.1', 45560))
在Windows上,行为不同(与隧道无关):将套接字绑定到特定接口不会拒绝广播流量

Man 7 IP表示应设置
SO_广播
,以便接收广播数据报;但是,我在接收端观察到的行为似乎与描述不符:

只有在设置SO_广播套接字标志时,才能发送或接收广播地址的数据报

广播数据报始终可以通过
INADDR__ANY
接收;如果套接字绑定到特定接口,则从不使用。无论
s.setsockopt(socket.SOL\u socket,socket.SO\u BROADCAST,1)
如何,这两条语句都有效

>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>>> s.bind(('', 48469))  # Bind to INADDR_ANY to accept broadcast packets
>>> s.recvfrom(1000)
(b'abc', ('192.168.241.1', 45560))