使用 iptables/ip route 进行基于 Linux 端口的路由

使用 iptables/ip route 进行基于 Linux 端口的路由

我有以下设置:

192.168.0.4        192.168.0.6      192.168.0.1
+-----------+      +---------+      +----------+
|WORKSTATION|------|  LINUX  |------| GATEWAY  |
+-----------+      +---------+      +----------+
                   192.168.150.10
                        |
                   192.168.150.9
                   +---------+
                   |   VPN   |
                   +---------+
                   192.168.150.1

WORKSTATION 的默认路由为 192.168.0.6 LINUX 的默认路由为 192.168.0.1

我正在尝试使用网关作为默认路由,但通过 VPN 路由端口 80 流量。根据我在http://www.linuxhorizo​​n.ro/iproute2.html我尝试过这个:

echo "1 VPN" >> /etc/iproute2/rt_tables
sysctl net.ipv4.conf.eth0.rp_filter = 0
sysctl net.ipv4.conf.tun0.rp_filter = 0
sysctl net.ipv4.conf.all.rp_filter = 0

iptables -A PREROUTING -t mangle -i eth0 -p tcp --dport 80 -j MARK --set-mark 0x1
ip route add default via 192.168.150.9 dev tun0 table VPN
ip rule add from all fwmark 0x1 table VPN

当我在 LINUX 上运行“tcpdump -i eth0 port 80”并在 WORKSTATION 上打开网页时,我根本看不到流量经过 LINUX。当我从 WORKSTATION 运行 ping 时,我从一些数据包中得到了以下信息:

92 bytes from 192.168.0.6: Redirect Host(New addr: 192.168.0.1)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 0054 de91   0 0000  3f  01 4ed3 192.168.0.4  139.134.2.18

这就是我的路由不起作用的原因吗?我是否需要将 GATEWAY 和 LINUX 放在不同的子网上,以防止 WORKSTATION 被重定向到 GATEWAY?我是否需要使用 NAT,或者我可以单独使用路由来做到这一点(这是我想要的)?

答案1

“LINUX” 告诉“WORKSTATION” 使用“GATEWAY” 而不是它自己,因为它们似乎位于同一子网中。这只有在您在“LINUX”上设置了桥接(参见 brctl(8))时才有效,如果您这样做了,“WORKSTATION” 应该在其默认路由中使用“GATEWAY”。

确保每个广播域都使用一个子网,广播数据包永远不会被路由,因此您需要在“LINUX”的所有 3 个接口上使用不同的子网(您可以使用 /30s,但我建议坚持使用 /24s 以适应增长)。或者让它桥接它们。您可能还应该为 VPN 本身配置一个单独的子网。

接下来,将 VPN 子网添加到 VPN 表,例如:

ip route add 192.168.150.0/24 dev tun0 scope link table VPN proto static

为了使用该表,请添加如下路由规则:

ip rule add fwmark 1 lookup VPN priority 500

在添加任何 fwmark 规则之前,请查看是否可以通过“VPN”和“GATEWAY”路由数据包,以防万一。

而且我认为禁用反向路径过滤器没有什么好处。

答案2

我发现这个问题已经很老了,但我想补充一点,希望它能帮助到遇到同样问题的人。虽然最好按照 Henk 的建议将设备分成不同的网络段,但如果这不可行,也可以采用其他解决方法。

通过对 Linux 服务器上的 /etc/sysctl.conf 文件进行以下更改,可以禁用 Linux(192.168.0.6)告诉工作站(192.168.0.4)使用网关(192.168.0.1)所发生的重定向:

net.ipv4.conf.all.send_redirects = 1

相关内容