題 iptables在loopback上拒絕tcp-reset


我試圖檢查一個軟件如果出現網絡故障將如何表現。那個軟件正在使用tcp send() 和 recv() 溝通。

以前我通過將它們放在局域網上的2台不同機器上來進行軟件通信。因此,為了模擬網絡故障,我使用了以下規則。

sudo iptables -A INPUT -p tcp -s 10.100.52.234 -j REJECT --reject-with tcp-reset

讓我們假設 10.100.52.234 是其中一個系統的IP。這導致了瞬間的失敗。一切都很好。


現在,我試圖使用環回地址在一台機器上模擬這個 127.0.0.1。一切都像以前的設置一樣工作,但上面的命令不起作用。它沒有失敗網絡連接,軟件只是掛起。沒有通信發生但它也沒有失敗。

我用過這個命令

sudo iptables -A INPUT -p tcp -s 127.0.0.1 -j REJECT --reject-with tcp-reset

sudo iptables -A INPUT -p tcp -i lo -j REJECT --reject-with tcp-reset

兩者都不起作用。該軟件需要很長時間才能失敗。

是否有不同的方法可以立即使環回地址連接失敗?


3
2018-06-28 22:55


起源


怎麼樣 --reject-with icmp-host-unreachable 要么 --reject-with icmp-port-unreachable ? - guest-vm
@guest嘗試了所有這些選項。相同的行為仍然存在。 - Haris
只是一個瘋狂的猜測,糾正我,如果我錯了:既然客戶端和服務器都有相同的環回IP,響應客戶端的任何拒絕消息同樣會被iptables規則阻止。你可以用規則中的端口號來區分這兩者嗎? - guest-vm
奇怪,您是否試圖模擬環回接口失敗?環回接口的目的是允許您在網絡確實失敗時仍然訪問在本地計算機上運行的服務嗎? (如果網絡出現故障,您可能會通過數據中心內的控制台訪問此服務,而且您也是唯一一個...) - NotAdmin Dave


答案:


我重現了你的結果(嘗試SSH連接嘗試 127.0.0.1 而我的 sshd 正在聽)。這個軟件確實掛起了。

我認為軟件等待響應或錯誤消息,但錯誤消息屬於同一規則並被拒絕。我不知道是否有一些錯誤信息的連鎖反應 - 我沒有調查那麼遠。我可能首先弄錯了,所以如果有人有更好的解釋,我會很樂意閱讀它。


這是我的Debian中可用的解決方案:

你應該連接到 127.0.0.2 (這裡解釋並製定如下規則:

sudo iptables -I INPUT 1 -p tcp -d 127.0.0.2 -j REJECT --reject-with tcp-reset

請注意 -I INPUT 1 片段,確保在第一個位置插入規則,使其優先於任何一個 ACCEPT 您可能已經在loopback接口上擁有的規則(就像我在Debian中一樣)。

我重複測試(使用SSH連接嘗試,這次是 127.0.0.2)。它立即失敗了

Connection refused

我認為它可以按你的意願工作,因為現在錯誤信息注定了 127.0.0.1因此,沒有被拒絕規則捕獲並且能夠通過。


3
2017-07-04 08:33