Routing

LINUX 中的非對稱路由問題

  • November 19, 2014

不對稱路由問題讓我發瘋!

我正在嘗試建構具有 3 個 NIC 的多宿主伺服器。每個 NIC 連接到 3 個不同的子網:

eth0:區域網路連接,10.99.72.38;功能:管理流量

eth1:區域網路連接,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”網卡。
  • 只能通過 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  

對於正確制定特定路由規則、表和路由以及向我展示最終路由表和規則的外觀的任何幫助,我們將不勝感激!

您應該擺脫 和 的預設網關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 而是用策略路由來完成。

引用自:https://unix.stackexchange.com/questions/168144