我正在设置一个 Orange Pi 来桥接两个网络接口。其中一个连接到网关,另一个连接到热敏收据打印机的网络接口。我想捕获从网络发送的发往端口 9100 上的打印机的数据包,以便在将它们发送到打印机之前对其进行修改。
我的硬件设置如下:eth1
连接到网关,eth2
连接到具有静态 IP 的热敏收据打印机192.168.0.20
。
在我的 Orange pi 上,我运行 Linux 4.18.7,使用 OpenEmbedded 板支持包从 Yocto 构建。
我采取以下步骤来初始化桥梁:
brctl addbr kc_bridge
brctl addif kc_bridge eth1
brctl addif kc_bridge eth2
ifconfig kc_bridge up
此时,我可以从同一网络中的任何设备 ping 打印机,并向其发送要打印的内容(例如echo "Hello World" | nc 192.168.0.20 9100
)
然后,我启用到本地主机的路由,启用 ip 转发并 modprobe br_netfilter 以启用网桥上的路由:
echo 1 > /proc/sys/net/ipv4/conf/all/route_localnet
echo 1 > /proc/sys/net/ipv4/ip_forward
modprobe br_netfilter
接下来我添加 iptables 规则,该规则应将发往端口 9100 上的打印机的任何数据包的目标地址更改为本地主机,然后我开始监听此端口:
iptables -t nat -A PREROUTING -d 192.168.0.20/32 -i kc_bridge -p tcp --dport 9100 -j DNAT --to-destination 127.0.0.1:9100
nc -l 9100
我希望这能显示路由到本地主机的任何数据,但是当我从同一网络上的另一台设备将数据发送到打印机时,它既不会显示在这里,也不会打印出来。
使用 tcpdump 我可以看到数据包没有路由到本地主机并且似乎没有发起连接:
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
09:31:14.821538 IP 192.168.0.50.43362 > 192.168.0.20.9100: Flags [S], seq 2236984100, win 64240, options [mss 1460,sackOK,TS val 3578716123 ecr 0,nop,wscale 7], length 0
09:31:15.839876 IP 192.168.0.50.43362 > 192.168.0.20.9100: Flags [S], seq 2236984100, win 64240, options [mss 1460,sackOK,TS val 3578717141 ecr 0,nop,wscale 7], length 0
09:31:17.856296 IP 192.168.0.50.43362 > 192.168.0.20.9100: Flags [S], seq 2236984100, win 64240, options [mss 1460,sackOK,TS val 3578719157 ecr 0,nop,wscale 7], length 0
09:31:22.020901 IP 192.168.0.50.43362 > 192.168.0.20.9100: Flags [S], seq 2236984100, win 64240, options [mss 1460,sackOK,TS val 3578723321 ecr 0,nop,wscale 7], length 0
为了将数据包从桥接网络接口路由到本地主机,我缺少什么?
更新
使用 iptables 命令我可以确认 iptables 规则已被命中:
iptables -t nat -L -n -v
Chain PREROUTING (policy ACCEPT 400 packets, 77939 bytes)
pkts bytes target prot opt in out source destination
6 360 DNAT tcp -- kc_bridge * 0.0.0.0/0 192.168.0.20 tcp dpt:9100 to:127.0.0.1:9100
Chain INPUT (policy ACCEPT 2 packets, 120 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 291 packets, 25966 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 405 packets, 49112 bytes)
pkts bytes target prot opt in out source destination
所有端口都接受数据包:
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -p tcp -m tcp --dport 9100 -j ACCEPT
答案1
DNAT
使用命令检查规则的计数器iptables-save -c -t nat
。它不应该为零。- 您还应该允许该端口的传入数据包。
iptables -A INPUT -p tcp --dport 9100 -j ACCEPT
- 使用 conntrack 工具列出 conntrack 表。您可以使用
conntrack -E
它来实时监控 conntrack 事件。 - 检查
ip route get 127.0.0.1 from 192.168.0.50 iif kc_bridge
命令的输出。