我在将流量从一个接口转发到另一个接口时遇到问题。似乎我的转发规则没有得到遵守。
sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
我的 IPtable 如下所示:
Chain INPUT (policy ACCEPT 60 packets, 8184 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
0 0 LOG all -- any any 192.168.0.0/24 anywhere LOG level warning
0 0 ACCEPT all -- eth0 tun0 192.168.0.0/24 anywhere ctstate NEW
Chain OUTPUT (policy ACCEPT 82 packets, 11632 bytes)
pkts bytes target prot opt in out source destination
我希望将来自 192.168.0.0/24 的任何内容转发到接口 tun0。并且我希望记录转发的流量。
现在,如果我继续并调整以下命令:
ping 10.8.0.2
PING 10.8.0.2 (10.8.0.2) 56(84) bytes of data.
64 bytes from 10.8.0.2: icmp_req=1 ttl=64 time=1974 ms
64 bytes from 10.8.0.2: icmp_req=2 ttl=64 time=1069 ms
64 bytes from 10.8.0.2: icmp_req=3 ttl=64 time=669 ms
64 bytes from 10.8.0.2: icmp_req=4 ttl=64 time=670 ms
但是,如果我这样做:
ping 10.8.0.2 -I eth0
PING 10.8.0.2 (10.8.0.2) from 192.168.0.10 eth0: 56(84) bytes of data.
From 192.168.0.10 icmp_seq=1 Destination Host Unreachable
From 192.168.0.10 icmp_seq=2 Destination Host Unreachable
From 192.168.0.10 icmp_seq=3 Destination Host Unreachable
流量未被转发。有什么想法吗?我是不是漏掉了什么?
答案1
Dadriel 提出了一个很好的观点,即本地流量不会通过链条FORWARD
,但你有一个更根本的问题:规则不是这样iptables
运作的。它们不会决定如何一个数据包应该被转发(至少不容易),他们决定无论它应该被转发。上述规则记录并允许NEW
来自192.168.0.0/24
和通过 离开的任何流量tun0
,但它们不会强制符合前一个标准的流量采用后一个路由。
这路由表决定如何转发流量,听起来你想要基于策略的路由(即,关于如何路由的选择基于目标 IP 地址以外的其他地址 - 在您的情况下为源 IP 地址)。
你应该调查iproute2
。
答案2
您无法像这样测试转发,因为来自您用作转发器的服务器的数据包永远不会遍历该链。
但真正的问题是,您只转发了新连接,这是错误的。这将导致该语句仅在您的服务器第一次看到连接时起作用。此后的所有内容都不再转发。