非对称路由问题让我发疯!
我正在尝试构建一个具有 3 个 NIC 的多宿主服务器。每个 NIC 连接到 3 个不同的子网:
eth0:局域网已连接,10.99.72.38;功能:管理流量
eth1:LAN已连接,10.99.70.150;功能:用户流量
eth2:WAN已连接,10.99.74.85;功能:用户流量
我使用的是 Amazon Linux 映像 (Linux 3.14.20-20.44.amzn1.x86_64 x86_64),但如果确实有影响,我可以切换到 CentOS。
我正在尝试实现的功能:
eth0:管理流量
- 地址:10.99.72.38
- 我希望这是一个“隔离”接口,仅接受和回复 10.0.0.0/8 中的地址
- 将此视为“仅从本地 LAN 进行 ssh”的 NIC。
- 只能通过 eth0 回复
- 所有其他目的地均被阻止,这意味着无法通过此接口到达其他目的地
- 不会使用 eth1 或 eth2 来回复到达 eth0 的流量。
eth1:进出 LAN 的用户流量
- 地址:10.99.70.150
- 接受从 LAN 到任何目的地的任何用户流量
- 通过 eth1 将数据包路由到目的地为 10.xxx 的流量
- 通过 eth2 将数据包路由到任何其他目的地(默认路由)
- 不会通过 eth0 路由传入数据包
eth2:进出 WAN 的用户流量
- 地址:10.99.74.85
- 接受来自 eth1 的任何用户流量,并将数据包从 eth2 发送到 10.xxx 之外的任何目的地
- 接受 eth2 上的回复数据包,并通过 eth1 路由任何发往 10.xxx 的流量
- 不会通过 eth0 路由传入数据包
我在 rt_tables 中创建了一个名为“mgmt”的 iproute2 表,并添加了基于策略的高优先级路由规则来尝试隔离此接口,但无论我尝试什么,主路由表似乎仍然被称为 eth0 是默认路由。问题包括:
- 来自 eth1 的传入数据包通过 eth0 路由(我不希望这样!)
- 从 eth2 发往 10.xxx 的传入数据包将通过 eth0 路由(我不希望这样!)
- 当我从 main 中删除默认 eth0 路由时,我完全失去了 eth0 功能,即使在 mgmt 表中存在路由,但 eth1 会正确回复。
从头开始,未修改的路由表(route -n):
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.99.72.1 0.0.0.0 UG 0 0 0 eth0
0.0.0.0 10.99.70.1 0.0.0.0 UG 10001 0 0 eth1
0.0.0.0 10.99.74.1 0.0.0.0 UG 10002 0 0 eth2
10.99.70.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
10.99.72.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.99.74.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
未修改的IP规则是:
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
任何有关正确制定特定路由规则、表和路由以及向我展示最终路由表和规则的帮助将不胜感激!
答案1
您应该删除eth0
和 的默认网关设置eth1
。如何完成取决于您的发行版。
您可能不需要策略路由。我想你想要的最好用 Netfilter / 来实现iptables
。
iptables -I INPUT 1 -i eth0 ! -s 10.99.72.0/24 -j DROP
iptables -I FORWARD 1 -i eth0 -j DROP
iptables -I FORWARD 2 -o eth0 -j DROP
iptables -I INPUT 2 -i eth1 ! -s 10.0.0.0/8 -j DROP
iptables -I FORWARD 3 -i eth1 -j ACCEPT
iptables -I INPUT 3 -i eth2 -m conntrack --ctstate NEW -j DROP
iptables -I FORWARD 4 -i eth2 -j ACCEPT
这或许可以在没有 Netfilter 的情况下通过策略路由来完成。