Linux

使用多宿主伺服器丟棄 IP 流量

  • January 15, 2019

(在詳細介紹之前,我以 Apache 和 SSH 為例來介紹這個問題,但這並不特定於 TCP 流量,它與基於 TCP 和 UDP 的協議的問題相同。)

我有一個執行 Ubuntu 9.04 的多連結、多宿主伺服器,eth0 連接到外部網路,eth1 連接到內部網路。外部網路呈現給“世界其他地方”,內部網路包含所有開發人員工作站和主力伺服器。有防火牆阻止從“世界其他地方”到內部網路的流量,但不阻止傳出請求。

$ /sbin/ifconfig
eth0  Link encap:Ethernet  HWaddr 00:30:18:a5:62:63  
     inet addr:xxx.yyy.159.36  Bcast:xxx.yyy.159.47  Mask:255.255.255.240
     [snip]

eth1  Link encap:Ethernet  HWaddr 00:02:b3:bd:03:29  
     inet addr:xxx.zzz.109.65  Bcast:xxx.zzz.109.255  Mask:255.255.255.0
     [snip]

$ route -n 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
xxx.yyy.159.32  0.0.0.0         255.255.255.240 U     0      0        0 eth0
xxx.zzz.109.0   0.0.0.0         255.255.255.0   U     0      0        0 eth1
0.0.0.0         xxx.yyy.159.33  0.0.0.0         UG    100    0        0 eth0

Apache 監聽 80 埠,sshd 監聽 22:

$ netstat --tcp -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 *:www                   *:*                     LISTEN     
tcp        0      0 *:ssh                   *:*                     LISTEN     
[snip]

從我在裡面的開發機器,xxx.zzz.109.40,我可以連接到裡面的地址,一切都很好。從外部我可以連接到外部地址,一切正常。

但是對於某些類型的測試,我想從我的開發機器連接到外部地址,但伺服器拒絕連接請求。我猜它正在查看它的路由表,並且由於傳入的數據來自一個應該在 eth1 上但到達 eth0 的地址,所以它正在丟棄它,這可能是出於安全預防措施。

有什麼辦法可以放寬這個限制嗎?

奇怪的是,這曾經在 8.04 上工作,但在 8.10 或 9.04 上不起作用,所以在去年的某個時候,核心正在做一些額外的檢查。為了使連接正常工作,返迴路徑需要與源路徑相同,這意味著來自我的開發機器到達 eth0 的消息必須返回到 eth0 才能路由回我的機器。


這是一個圖表,任何地方都沒有 NAT。

圖表

假設您沒有任何 iptables 規則可以阻止這種情況,您需要禁用返迴路徑過濾。您可以使用以下方法執行此操作:

# echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter

您還可以使用特定的介面名稱而不是全部,並且還有一個預設值,這會影響新創建的介面。

從:

反向路徑過濾器;檢查是否對於到達介面的數據包,發送到原始數據包源地址的數據包將在該介面上發送出去;如果不是,則丟棄到達的數據包。它可以被認為是檢測帶有欺騙源地址的數據包的嘗試。

引用自:https://serverfault.com/questions/35764