![](/img/trans.png)
[英]Python/iptables: Capturing all UDP packets and their original destination
[英]Intercept UDP packets passing through Linux Bridge with Python/iptables
我正在尝试在运行Linux的第2层网桥上使用iptables
来获取从以太网端口传入并在wlan0接口上输出的udp数据包,并将它们重定向到本地主机上的端口(例如10000)。
例如,如果device1(10.0.0.2)正在通过网桥(10.0.0.1)通过以太网发送udp数据包,然后通过无线接口将该数据包传递到device2(10.0.0.3),您将如何将这些数据包重定向到本地主机(网桥),以便在网桥上运行的python脚本可以处理它们?
我已经尝试过iptables -t nat -A PREROUTING -d 10.0.0.3 -p udp --dport 10000 -j REDIRECT --to-ports 10000
,但它似乎不起作用。 数据包永远不会重定向。
我也尝试过iptables -t nat -A PREROUTING -d 10.0.0.3 -p udp --dport 10000 -j DNAT --to-destination 127.0.0.1:10000
但也没有运气。
有没有办法用iptables
或其他方法做到这一点? 否则,还有另一种单独使用Python拦截数据包的方法吗? 当前,它只是通过以下方式监听UDP数据包:
socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket.bind(('', 10000))
谢谢。
您建议的规则应稍作调整。 尽管未在iptables
的手册页中进行记录,但您必须将协议指定为要匹配的第一个参数,如下所示:
iptables -t nat -A PREROUTING -p udp -d 10.0.0.3 --dport 10000 -j REDIRECT --to-ports 10000
iptables -t nat -A PREROUTING -p udp -d 10.0.0.3 --dport 10000 -j DNAT --to-destination 127.0.0.1:10000
第一条规则应该有效,但是根据此答案 ,第二条规则无效,这要求您执行以下命令:
sysctl -w net.ipv4.conf.all.route_localnet=1
您可以使用特定的界面替换all
。 默认情况下,此值为0,指示内核丢弃发往127.0.0.0/8
外部流量。 这仅出于安全目的,因为此类流量不正常。
route_localnet
-BOOLEAN
路由时,请勿将环回地址视为火星源或目的地。 这样就可以将
127/8
用于本地路由。
默认为FALSE
请注意,此选项仅适用于3.5以上的内核(已排除)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.