首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将数据包从桥接网络接口路由到本地主机?

如何将数据包从桥接网络接口路由到本地主机?
EN

Server Fault用户
提问于 2019-06-21 10:11:01
回答 1查看 1.5K关注 0票数 1

我正在设置一个Orange Pi来连接两个网络接口。其中一个连接到网关,另一个连接到热接收打印机的网络接口。我想捕获从网络发送的数据包,这些数据包的目的地是9100端口上的打印机,这样我就可以在将它们发送到打印机之前修改它们。

我的硬件设置如下:eth1连接到网关,eth2连接到带有静态ip 192.168.0.20的热收据打印机。

在我的Orange pi上,我运行Linux4.18.7,使用OpenEmbedded板支持包从Yocto构建。

我采取以下步骤使一座桥梁无效:

代码语言:javascript
复制
brctl addbr kc_bridge
brctl addif kc_bridge eth1
brctl addif kc_bridge eth2
ifconfig kc_bridge up

此时,我可以从同一网络中的任何设备上平移打印机,并将其发送到打印(例如,echo "Hello World" | nc 192.168.0.20 9100)。

然后,我启用到本地主机的路由、启用ip转发和MOD探针br_netfilter来启用桥接器上的路由:

代码语言:javascript
复制
echo 1 > /proc/sys/net/ipv4/conf/all/route_localnet
echo 1 > /proc/sys/net/ipv4/ip_forward
modprobe br_netfilter

接下来,我添加了iptables规则,它应该将目的地地址更改为端口9100上的打印机的任何数据包的本地主机,然后我开始监听这个端口:

代码语言:javascript
复制
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,我可以看到数据包没有路由到本地主机,而且似乎没有启动连接:

代码语言:javascript
复制
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规则:

代码语言:javascript
复制
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   

所有端口都接受数据包:

代码语言:javascript
复制
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -p tcp -m tcp --dport 9100 -j ACCEPT
EN

回答 1

Server Fault用户

发布于 2019-06-21 10:23:57

  1. 使用DNAT命令检查iptables-save -c -t nat规则的计数器。不应该是零。
  2. 此外,您还应该允许该端口的传入数据包。
代码语言:javascript
复制
iptables -A INPUT -p tcp --dport 9100 -j ACCEPT
  1. 使用连接跟踪工具列出连接跟踪表。您可以使用conntrack -E实时监视连接跟踪事件。
  2. 检查ip route get 127.0.0.1 from 192.168.0.50 iif kc_bridge命令的输出。
票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/972380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档