![使用 iptables/ip route 进行基于 Linux 端口的路由](https://linux22.com/image/514207/%E4%BD%BF%E7%94%A8%20iptables%2Fip%20route%20%E8%BF%9B%E8%A1%8C%E5%9F%BA%E4%BA%8E%20Linux%20%E7%AB%AF%E5%8F%A3%E7%9A%84%E8%B7%AF%E7%94%B1.png)
我有以下设置:
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.linuxhorizon.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