BPF过滤器是否可以在Docker容器中工作?

问题描述

我有一些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 (将#修改为@)