scapy的驱动程序,允许通过Linux NFLOG接口捕获数据包
项目描述
scapy-nflog-capture
用于scapy网络操作工具的驱动程序,允许通过Linux NFLOG接口捕获数据包。
安装
这是一个Python 2.7(不是3.X)的常规包。
使用pip是最佳方式
% pip install scapy-nflog-capture
如果您没有它,使用
% easy_install pip % pip install scapy-nflog-capture
或者(另请参阅)
% curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python % pip install scapy-nflog-capture
或者,如果您绝对必须
% easy_install scapy-nflog-capture
但是,您真的不应该这样做。
当前git版本可以按以下方式安装
% pip install 'git+https://github.com/mk-fg/scapy-nflog-capture.git#egg=scapy-nflog-capture'
要求
带有ctypes支持的Python 2.7
CFFI(用于libnetfilter_log绑定)
CFFI使用C编译器生成绑定,因此如果模块是从源代码构建或从检出树中使用的,则应该可用gcc(或其他编译器)。
用法
安装了两个Python模块:scapy_nflog和nflog_ctypes。
scapy_nflog具有NFLOGListenSocket类(实现SuperSocket),可以像这样安装为默认L2监听器
>>> import scapy_nflog >>> scapy_nflog.install_nflog_listener()
上述install_nflog_listener是一个单行函数,执行conf.L2listen = NFLOGListenSocket,因此如果您在scapy上构建自定义模块,则可以直接将NFLOGListenSocket类传递给scapy内部,而不必将其设置为默认监听器。
可以从实例初始化(int或int的列表)中通过传递可选的“queues”关键字控制从NFLOG队列中获取数据包的ID,或者通过在子类中覆盖默认的“queues”类属性并将其作为监听器类来设置。
请注意,NFLOG实际上返回L3数据包,因此尽管监听器被安装为L2,但它将始终返回IP类的实例,而不是Ether或其他。
Linux NFLOG
NFLOG是Linux netfilter子系统的目标,类似于旧的和简单的LOG目标,它将每个数据包的信息输出到kmsg,但使用特殊的netlink队列将匹配的netfilter(思考iptables规则)数据包导出到用户空间。
通过nflog导出所有发送/接收的数据包
iptables -t raw -I PREROUTING -j NFLOG iptables -t raw -I OUTPUT -j NFLOG
当然,可以添加任何任意过滤器,只丢弃匹配特定协议、端口或任何其他任意netfilter匹配器的数据包 - 请参阅iptables手册页(或iptables-extensions(8))以获取主要Linux内核中提供的列表/信息。
请注意,添加上述捕获所有规则是安全的,因为没有监听器(没有任何东西查询nflog这些数据包),它们将被丢弃,无论这些规则如何,也不会浪费很多内存、CPU等。
用户空间读取器(如本模块)可以订阅以接收这些数据包,设置内核中缓冲这些数据包的字节数(可选的“nlbufsiz”关键字到nflog_generator),其余部分将直接丢弃(默认情况下产生Python日志警告,除非传递handle_overflows=False)直到用户空间赶上。
NFLOG本身可以通过参数如–nflog-group和–nflog-range进行配置(参见iptables-extensions(8)),允许为不同的应用程序拥有多个nflog队列,并且不需要传递大量的无用的L7数据。
性能 - 尤其是与内核中的噪声过滤和数据包截断相结合 - 似乎比使用AF_PACKET/SOCK_RAW套接字等简单方法更有效,但不管怎样,在scapy之上它不太可能成为瓶颈。
与libpcap相比的一个有趣的优势是能够捕获解密后的隧道数据包(来自ipsec、pptp、openvpn、ssh等)或转换(剥离ipip包装、netlink重新注入等)。
nflog_cffi
scapy_nflog基于nflog_cffi模块,可以从任何Python代码(包括scapy shell)中使用。
from nflog_cffi import NFLOG # without extra_attrs just packet payload (possibly truncated) is returned nflog = NFLOG().generator(0, extra_attrs=['len', 'ts'], nlbufsiz=2*2**20) fd = next(nflog) # netlink fd to do select/poll on, if necessary # pkt_len is the *real* length, before nflog-truncation (if any) # pkt_ts is the packet timestamp, as reported by kernel/lib pkt, pkt_len, pkt_ts = next(nflog) print('Got packet, len: {}, ts: {}'.format(pkt_len, pkt_ts)) for pkt, pkt_len, pkt_ts in nflog: # do stuff with each captured packet
模块通过CFFI使用libnetfilter_log。
NFLOG生成器具有控制传递给libnetfilter_log的netlink套接字参数的关键字,有关这些参数的更详细描述,请参阅libnetfilter_log文档。
并非所有libnetfilter_log公开的属性都通过绑定公开。
项目详细信息
下载文件
下载适用于您平台的文件。如果您不确定该选择哪一个,请了解有关安装包的更多信息。
源代码分发
scapy-nflog-capture-13.05.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 701f8516d3692d1f392520ac657a8a534b933f5acc55c1d7d945afc091327419 |
|
MD5 | 10563dae4c675949f13c38273d3fef58 |
|
BLAKE2b-256 | b5e7439e83f394369bc66a54590b823f8458276317f1d5ca55551bc5236f9dcc |