问题标签 [netfilter]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
12653 浏览

c - 使用 sk_buff 添加以太网帧头

我有一个捕获传出 Internet 流量的内核模块(Netfilter 钩子:LOCAL_OUT) 在这个钩子上,仍然没有以太网标头。

我构建了以太网标头并可以使用,但是如何将其附加到skb以便我可以将整个 skb 结构发送到dev_queue_xmit()

是否有任何关于如何操作 sk_buff 数据的指南,您可以提供给我以获取更多信息?

作为示例,我尝试对所有 ECHO ICMP 流量做我想做的事情;这是我的代码。但是当在另一台机器上检查 Wireshark 时,我得到了一个正常工作的以太网报头,但是一个 EMPTY IP 数据包......怎么会?

编辑:是的,我正在硬编码我自己的 MAC 并广播帧,只是为了简单起见。

EDIT2: 所以我给这个函数原始的 sk_buff 由 net_filter 和适当的 net_device 我试着按照你说的去做,并阅读了一些关于 sK_buff 函数的指南。尽管如此,当我 dev_queue_xmit() 这个函数返回的 sk_buff 时,我得到一个完整的内核崩溃。

编辑3:

这就是崩溃后的内核日志结果。

EDIT4: 为了让事情更清楚,这是实际调用我的 set_skb() 的代码部分

0 投票
2 回答
4246 浏览

c - 在不使用环回网络的情况下将数据包转发到同一主机中的服务

我有这个 libnetfilter_queue 应用程序,它根据一些 iptables 规则从内核接收数据包。在直接解决我的问题之前,我提供了一个示例可行的代码和其他工具来设置测试环境,以便我们的问题定义和可能的解决方案可以更加准确和健壮。

以下代码描述了应用程序的核心功能:

请注意,在回调函数中,对 my_mangling_fun() 的两次调用被注释掉了。这是我处理传入和传出数据包的地方。我认为这段代码足以描述我的情况。如果需要进一步澄清,请询问,我将发布更多详细信息。

可以说随附的 iptables 规则如下:

让我们编译并启动 udp 的东西。

现在我们可以通过 netcat 客户端和服务器模式将垃圾 udp 有效负载提供给这个东西

这将在标准输出中打印来自我的 netfilter_queue 应用程序的数据包。现在开发环境已经设置好了,我们可以进行下一步了。

我们正在努力实现的目标如下:

我们的服务器正在监听 5000 端口。现在所有发往 udp 端口​​ 5000 的传入数据包都将由内核排队。这个队列的句柄将交给我们之前列出的用户应用程序。这个队列机制是这样工作的:当一个数据包可用时,回调函数(我们代码中的 cb())被调用。处理后,回调函数调用nfq_set_verdict()。返回判决后,下一个数据包将从队列中弹出。请注意,如果之前的数据包没有被发出判决,则该数据包不会从队列中弹出。这个判断值是 NF_ACCEPT 用于接受数据包,NF_DROP 用于丢弃数据包。

现在,如果我想在不接触客户端和服务器端代码的情况下连接传入和传出数据包的 udp 有效负载怎么办?

如果我想从我们的应用程序这个应用程序连接 udp 有效负载,那么我们需要手头有多个数据包。但是我们已经看到,在对前一个数据包发出判决之前,数据包不会从队列中弹出。

那么如何做到这一点呢?

一种可能的解决方案是向每个数据包发出 NF_DROP 并将这些数据包保存在中间数据结构中。假设我们已经做到了。但是这个数据包怎么能被传递到监听 5000 端口的服务呢?

我们不能使用网络堆栈来传递数据包,因为如果我们这样做,那么数据包将再次进入 NFQUEUE。

另一个问题是,服务器完全不知道这个应用程序。这意味着它不应该在数据包中看到任何差异。它应该看到数据包,就好像它来自原始客户端一样。

我听说应用程序可以通过编写一些文件,在不使用网络层(ip,端口)的情况下将数据发送到同一主机中的服务器。我不知道这个说法的有效性。但是,如果有人对此有所了解,那就太好了。

我可能会因为过于冗长而被否决。但我认为这可能是一个有趣的会议。我们可以一起找到解决方案:)

0 投票
2 回答
4642 浏览

c++ - 如何在 netfilter 中重新计算 IP 校验和?

我正在开发一个 netfilter 内核模块,我需要在其中重新计算 IP 校验和。我使用这个函数来计算 IP 校验和(在互联网上的某个地方找到):

通过查看wireshark,我可以看到传入的数据包已成功接收,但对于传出的数据包,wireshark 显示不正确的IP 校验和。这是我的钩子函数:

这是主要的,我已经将相同的钩子函数绑定到 PRE_ROUTING 和 POST_ROUTING

为什么传出数据包的 IP 校验和损坏???

在wireshark中显示的错误:

0 投票
1 回答
5082 浏览

firewall - 从 netfilter 接受用户空间中的数据包

我想捕获端口 80 上的所有 tcp 数据包,这些数据包将发送到转发地址,并将它们传递给用户空间程序进行修改。我知道如何使用 IPtables 规则来做到这一点,例如

但我似乎找不到任何例子,而且有时间限制,所以我不能只筛选wireshark代码。我正在寻找例子,甚至是一个开始的地方。我可以使用插座吗?或者是否有一个内核数据结构可用于将数据包从堆栈中弹出,一旦完成,如何将数据包传递回 netfilter?

0 投票
2 回答
1522 浏览

c++ - 包在 libnetfilter_queue 中永远循环

我想为 TCP/UDP 流量实现网络延迟模型,如Linux libnetfilter_queue 延迟数据包问题中所述。我已经按照安迪那里的建议,将整个数据包复制到我的程序中并将其放置在优先级队列中。随着时间的推移,优先队列中的数据包将被删除并使用 RAW 套接字进行分派。

我面临的问题是:libnetfilter_queue 对数据包的初始捕获是通过匹配端口来完成的(sudo iptables -A OUTPUT -p udp --dport 8000 -j NFQUEUE --queue-num 0)。当这些数据包被 RAW 套接字重新注入时,它们会再次被 libnetfilter_queue 拾取(因为端口保持不变),因此会一直循环下去。

我真的很迷茫,想不出出路。请帮我。

0 投票
2 回答
4804 浏览

c - 标记数据包以通过原始套接字发送

我有以下函数通过原始套接字发送数据包。

现在我从 libnetfilter_queue 的 nfq_set_verdict2() 设置标记:http: //www.netfilter.org/projects/libnetfilter_queue/doxygen/group__Queue.html

当我收到来自 netfilter_queue 的数据包时,我会执行以下操作:

此 process_packet() 调用 send_packet_raw()。

相关的 iptable 规则:

我还设置了一些 -j LOG 规则来查看数据包是否实际上匹配。但似乎没有数据包出去或进入,因为没有显示日志条目。无法理解如何在这里找到问题。

0 投票
1 回答
559 浏览

dns - 为 DNS 请求编写 linux conntrack 模块

我设置了一个 netfilter 规则,使用统计模块的随机模式和一些 NAT 规则来平衡 DNS 请求。该部分运行良好,但是当 DNS 客户端从同一源端口发送其所有请求时,所有 DNS 请求都被平衡到同​​一后端服务器。

我假设发生这种情况是因为连接跟踪将所有 UDP 数据包识别为同一 UDP 连接的一部分。我找不到一个简单的解决方法,有吗?

在没有的情况下,我将不得不编写一些代码来让事情按照我的意愿行事。这样做的正确方法是什么?

我的第一个想法是创建类似于 ip_conntrack_ftp 的东西,它使用 ip source/dest 以及 DNS 序列号来识别 DNS​​ 连接。

0 投票
1 回答
429 浏览

linux - 记录使用 nfq_set_verdict2(NF_DROP) 丢弃的数据包

在我的应用程序中,我使用 NFQUEU 将数据包从 netfilter 带到用户空间,然后将其与我的标准进行比较,并通过 nfq_set_verdict2 函数中的 NF_DROP 或 NF_ACCEPT 丢弃或接受数据包。我想以常规 iptables 日志格​​式记录丢弃的数据包。如何我能做到这一点吗?

0 投票
2 回答
287 浏览

linux - 如何为 IPtable 创建 URL 链

我想为 Iptable 创建链,它返回 URL 并从所有数据包中发布和获取。

0 投票
1 回答
1614 浏览

netfilter - 使用 libnetfilter_queue,重新注入的数据包不会影响更改,但是数据包的注入副本成功。为什么?

我在 libnetfilter_queue 库中使用。

我需要更改数据包中的 dest ip。我更改 dest ip 并重新注入数据包: nfq_set_verdict(qh, id, NF_ACCEPT,size, originalPacket);

但改变没有生效。

但是,如果我更改数据包,请将其复制到新的 char 数组并调用以使用复制的数组设置判决,而不是更改生效。

难道我做错了什么?

谢谢