我想拦截所有离开 Tap1 的 UDP 流量。并可能回复例如 DNS 请求。为了实现这一点,我编写了一些 python 代码来监听 localhost 并使用iptables规则集如下:
Chain PREROUTING(策略接受2个数据包,333字节) pkts 字节目标 prot 选择输出源目标 0 0 DIVERT udp -- tap1 任何地方任何地方套接字 0 0 TPROXY udp -- tap1 任何地方 任何地方 TPROXY 重定向 127.0.0.1:5001 标记 0x1/0x1 链 DIVERT(1 条参考文献) pkts 字节目标 prot 选择输出源目标 0 0 MARK udp -- 任何任何地方任何地方 MARK 设置 0x1 0 0 接受 udp -- 任何任何地方任何地方
策略路由通过以下方式完成:
ip 规则添加 fwmark 1 查找 100 ip 路由添加本地 0.0.0.0/0 dev lo 表 100
此设置改编自内核的 Documentation/networking/tproxy.txt。对于使用 IP_TRANSPARENT 选项打开的 TCP 套接字来说,这可以完美地工作。
不幸的是,UDP 套接字似乎无法处理连接。例如,如果我执行此操作,ncat -u localhost 1234
套接字将接收数据但无法发回任何内容。 Wireshark 将准确显示三个数据包:
- 传入的 ncat 数据包(到 localhost:1234)
- 我的软件的传出数据包(至:5001)
- ICMP 端口无法访问(当然)
对于任意端口的工作,我想设置适当的 (S)NATting 规则是不可行的。
那么,要使其发挥作用,必要的设置是什么随意的传入端口?