我有一个嵌入式系统,有2个接口e0和m0,其ip分别是10.0.0.20和192.168.0.20。进入 e0 的传入数据包的 IP 为 10.0.0.10,应转发到 m0 接口到 IP 为 10.0.0.30 的外部服务器。此外,返回到 m0 的流量应返回到 e0。
我尝试使用以下命令转发数据包:
route add -net 10.0.0.0/16 dev m0
iptables -t nat -A PREROUTING -d 10.0.0.30 -j DNAT --to-destination 192.168.0.20
iptables -t nat -A POSTROUTING -s 10.0.0.0/16 -j SNAT --to-source 10.0.0.20
我在 m0 执行了 tcpdump 但没有看到任何结果。
你能告诉我我缺少什么吗?先感谢您。
1: lo: <LOOPBACK> mtu 65536 qdisc noop
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: e0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq qlen 1000
link/ether 00:a0:c9:00:00:00 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.20/24 brd 10.0.0.255 scope global e0
valid_lft forever preferred_lft forever
inet6 fe80::2a0:c9ff:fe00:0/64 scope link
valid_lft forever preferred_lft forever
3: m0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq qlen 1000
link/ether 00:aa:bb:cc:dd:44 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.20 brd 192.168.0.255 scope global m0
valid_lft forever preferred_lft forever
inet6 fe80::2aa:bbff:fecc:dd44/64 scope link
valid_lft forever preferred_lft forever
4: bcm: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq qlen 1000
link/ether 00:a0:c9:00:00:03 brd ff:ff:ff:ff:ff:ff
inet6 fe80::2a0:c9ff:fe00:3/64 scope link
valid_lft forever preferred_lft forever
5: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000
link/ether 80:3f:5d:09:7f:4b brd ff:ff:ff:ff:ff:ff
6: e0.1@e0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
link/ether 00:a0:c9:00:00:00 brd ff:ff:ff:ff:ff:ff
inet 127.3.0.254/24 brd 127.3.0.255 scope global e0.1
valid_lft forever preferred_lft forever
inet6 fe80::2a0:c9ff:fe00:0/64 scope link
valid_lft forever preferred_lft forever
[0.1.10] pad# ip rule show
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
[0.1.10] pad# ip ro show
default via 192.168.0.20 dev m0
10.0.0.0/24 dev m0
10.0.0.0/24 dev e0 src 10.0.0.20
127.3.0.0/24 dev e0.1 src 127.3.0.254
192.168.0.0/24 dev m0 src 192.168.0.20
0.1.10] pad# iptables -L -vn
Chain INPUT (policy ACCEPT 1480 packets, 186K bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 914 packets, 158K bytes)
pkts bytes target prot opt in out source destination
0.1.10] pad# iptables -t nat -L -vn
Chain PREROUTING (policy ACCEPT 258 packets, 51912 bytes)
pkts bytes target prot opt in out source destination
0 0 DNAT all -- * * 0.0.0.0/0 10.0.0.30 to:192.168.0.20
0 0 DNAT all -- * * 0.0.0.0/0 10.0.0.30 to:192.168.0.20
0 0 DNAT all -- * * 0.0.0.0/0 10.0.0.30 to:192.168.0.20
Chain INPUT (policy ACCEPT 258 packets, 51912 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 13 packets, 876 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 13 packets, 876 bytes)
pkts bytes target prot opt in out source destination
0 0 SNAT all -- * * 10.0.0.0/16 0.0.0.0/0 to:10.0.0.20
0 0 SNAT all -- * * 10.0.0.0/16 0.0.0.0/0 to:10.0.0.20
答案1
@Mike:刷新所有规则/表并从基础开始,以确保您可以在网络之间进行 nat。
echo 1 > /proc/sys/net/ipv4/ip_forward
route add -net 10.0.0.0/16 dev m0
iptables -t nat -A POSTROUTING -o m0 -j MASQUERADE
在我看来,无论 IP 寻址如何,这都应该将所有 10.0.xx 流量路由并伪装到 m0。如果成功,请根据您的网络需求在此基础上进行构建。
答案2
通过使用:
netstat -r
您将很容易发现您的 IP 地址归属方案无法按您的意愿工作。
更准确地说,你有:
Destination ... Netif
10.0.0.0/24 e0
10.0.0.0/16 m0
192.168.0.0/24 m0
并且10.0.0.20
,10.0.0.10
并且10.0.0.30
都属于10.0.0.0/24
。这意味着您想要在其之间进行路由的 2 个地址位于e0
路由器的同一网络侧 ( )(您的“嵌入式系统”在此处充当路由器)。
您无法m0
通过路由或桥接使它们到达另一端 ( )。因此,您无法制定任何转换流量的项目e0 → m0
。
首先,制定一个有效的 IP 地址方案,并使用以下命令进行检查:
netstat -r