【问题标题】:Intercept UDP packets passing through Linux Bridge with Python/iptables使用 Python/iptables 拦截通过 Linux Bridge 的 UDP 数据包
【发布时间】:2023-03-14 08:11:01
【问题描述】:

我正在尝试在运行 linux 的第 2 层网桥上使用 iptables 来获取从以太网端口传入并在 wlan0 接口上传出的 udp 数据包,并将它们重定向到 localhost 上的端口(例如,10000 )。

例如,如果 device1 (10.0.0.2) 通过以太网通过网桥 (10.0.0.1) 发送 udp 数据包,然后通过无线接口将该数据包传递到 device2 (10.0.0.3),您将如何重定向将这些数据包发送到 localhost(网桥),以便在网桥上运行的 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))

谢谢。

【问题讨论】:

    标签: python linux sockets networking iptables


    【解决方案1】:

    您建议的规则应稍作调整即可使用。尽管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
    

    第一个规则应该有效,但是根据this answer,第二个不会,需要您执行以下命令:

    sysctl -w net.ipv4.conf.all.route_localnet=1
    

    您可以将all 替换为您的特定界面。默认情况下,此值为 0,指示内核丢弃发往 127.0.0.0/8 的外部流量。这只是出于安全目的,因为这样的流量是不正常的。

    route_localnet - BOOLEAN

    路由时不要将环回地址视为火星源或目标。这样就可以将127/8 用于本地路由目的。
    默认为假

    请注意,此选项仅适用于 3.5 以上的内核(不包括在内)。

    【讨论】:

    • 谢谢!设置 route_localnet=1 并将协议更改为第一个参数有效。我非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 2013-11-21
    • 2012-03-19
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多