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 的情況下透過策略路由來完成。

相關內容