问题描述
我有一些Python代码可以打开套接字,并使用socket.setsockopt(...,SO_ATTACH_FILTER)
将BPF过滤器附加到该套接字。不幸的是,生成过滤器的代码与其他内容有点纠结,但是下面有一个可运行的大纲,说明了我要尝试做的事情。筛选器检查EthernetType字段为ETH_P_IP
,IP协议为IPPROTO_UDP
和目标端口为68-这应将数据包限制为仅DHCP响应。
每次在主机上用sudo python3 test.py
运行以下脚本都会导致超时,除非我在超时发生之前手动进行DHCP租约更新(或者在某些情况下会在网络上续订DHCP租约)。但是,如果我在具有主机模式网络的Docker容器中执行相同的操作,则几乎永远不会导致超时,总是会收到一个数据包,而且几乎永远不会是DHCP响应。
docker容器以--privileged --net=host
并以root用户身份运行。
是否需要做一些事情才能使数据包过滤器在容器内工作?还是不可能?
import ctypes
import struct
import socket
ETH_P_ALL = 0x0003
SO_ATTACH_FILTER = 26
filters = bytes([0x28,0x00,0x0c,0x15,0x08,0x00
0x00,0x30,0x17,0x06,0x11,0x28,0x14,0x45,0x04,0xff,0x1f,0xb1,0x0e,0x48,0x10,0x01,0x44,0xdc,0x05,0x00])
b = ctypes.create_string_buffer(filters)
mem_addr_of_filters = ctypes.addressof(b)
pf = struct.pack("HL",11,mem_addr_of_filters)
def main():
sock = socket.socket(socket.PF_PACKET,socket.soCK_RAW,socket.htons(ETH_P_ALL))
sock.bind(("eth0_bridge",ETH_P_ALL))
sock.settimeout(2)
sock.setsockopt(socket.soL_SOCKET,SO_ATTACH_FILTER,pf)
try:
data = sock.recv(1500)
except:
print('Timeout')
exit(-1)
print('No timeout')
main()
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)