LINUX 中的非对称路由问题

LINUX 中的非对称路由问题

非对称路由问题让我发疯!

我正在尝试构建一个具有 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 的情况下通过策略路由来完成。

相关内容