跳转到主要内容

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'

要求

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 (11.8 kB 查看哈希值)

上传时间: 源代码

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面