我正在做一个项目,如果数据包的目的地是 LAN 网络上的多个 IP 之一,则验证每个数据包的来源。我对 LAN IP 感兴趣,而不是 WAN。
我尝试创建许多类似以下的匹配,但没有任何效果。
iptables -t nat -d <list of IPs> -A FORWARD -j NFQUEUE --queue-num 1
我使用以下规则在我的树莓派中启用路由
sudo iptables -F
sudo iptables -t nat -F
sudo iptables -t nat -A POSTROUTING -o $eth -j MASQUERADE
sudo iptables -A FORWARD -i $eth -o $wlan -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i $wlan -o $eth -j ACCEPT
问题是我应该把 NFQUEUE 规则放在哪里?
-编辑-
我被告知要启用 proxy_arp,这样 Raspberry Pi 路由器就可以响应任何本地请求。我想我必须在 Raspberry Pi 内部设置路由表,不是吗?
任何想法都将受到赞赏。
不幸的是,代理 ARP 无法帮助我实现对网络内 ARP 数据包的期望控制。无论如何。我已经看到了一个解决方案(OpenVPN 客户端到客户端),但我还没有实现它,我会回到这个问题来发布它是否有效。
答案1
使用时netfilter
,你必须了解数据包在内核中的流动方式,即连锁店(类似于“道路检查站”),以及它会访问哪些类型的加工它进入每个链(用术语桌子)。处理和链条如图所示此插图,每个框的下部都有链,上部有处理类型。(您必须关注网络层。)根据数据包路径,只涉及链的子集:流经您的树莓派的数据包只会经过PREROUTING
、FORWARD
和POSTROUTING
。
拥有FORWARD
链,并不意味着它会路由数据包。您必须使用命令sysctl -w net.ipv4.ip_forward=1
(非持久性)启用它。
而且,如图所示,链nat
中没有任何处理FORWARD
,只有mangle
和filter
,因此命令
iptables -t nat -d <list of IPs> -A FORWARD -j NFQUEUE --queue-num 1
是不正确的。
每个表/链的数据包处理实际上由您使用命令定义的有序规则列表(表)驱动iptables
。每条规则由匹配标准和取决于表类型的操作组成(nfqueue
仅允许在filter
表中、masquerade
在nat
表中等)
现在,谈到nfqueue
。当需要在内核之外通过您自己创建的程序对某些数据包进行进一步处理时,我们会使用此类操作(请参阅python 示例在这里例如,在入侵检测系统中。数据包被放入队列(用 16 位数字标识),处理后返回内核以在下一个表/链中恢复其流动。(它们也可以在用户空间中被丢弃)。在常见情况下,您通常希望仅将已接受的数据包发送到用户空间(在内核级别忽略已过滤的数据包)。您必须注意您的确切需求,这些需求尚不清楚。我将尝试举一个例子来解释它如何使用您的场景:
sudo iptables -F
sudo iptables -t nat -F
sudo iptables -t nat -A POSTROUTING -o $eth -j MASQUERADE
sudo iptables -A FORWARD -i $eth -o $wlan -m state --state RELATED,ESTABLISHED -j NFQUEUE --queue-num 1
sudo iptables -A FORWARD -i $wlan -o $eth -j NFQUEUE --queue-num 1
这意味着在$eth
和之间流动的数据包$wlan
将被放入同一个队列。您必须确保某个程序正在处理队列 1 并准备好处理数据包。