使用多宿主伺服器丟棄 IP 流量
(在詳細介紹之前,我以 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
您還可以使用特定的介面名稱而不是全部,並且還有一個預設值,這會影響新創建的介面。
從:
反向路徑過濾器;檢查是否對於到達介面的數據包,發送到原始數據包源地址的數據包將在該介面上發送出去;如果不是,則丟棄到達的數據包。它可以被認為是檢測帶有欺騙源地址的數據包的嘗試。