微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。