繁体   English   中英

使用Python / iptables拦截通过Linux Bridge的UDP数据包

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM