iptables 转发被忽略

iptables 转发被忽略

我在将流量从一个接口转发到另一个接口时遇到问题。似乎我的转发规则没有得到遵守。

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

您无法像这样测试转发,因为来自您用作转发器的服务器的数据包永远不会遍历该链。

但真正的问题是,您只转发了新连接,这是错误的。这将导致该语句仅在您的服务器第一次看到连接时起作用。此后的所有内容都不再转发。

相关内容