
我建立了iptables
規則:
iptables -I INPUT -p tcp --tcp-flags SYN,RST,ACK,FIN SYN --dport 10000 -j REJECT --reject-with tcp-reset
但實際上,這樣做是拒絕所有帶有RST
和ACK
標誌的資料包。
只有在設定標誌的情況下才可以拒絕嗎RST
?
我知道在正常環境中這沒有任何意義,但我有一個實驗室,我需要完全按照描述進行。
答案1
我在中國,所以在我這樣做之前dig +tcp twiter.com @1.1.1.1
,我需要執行以下兩行:
sudo iptables -A INPUT -p tcp -s 1.1.1.1/32 --tcp-flags ALL RST,ACK -j DROP
sudo iptables -A INPUT -p tcp -s 1.1.1.1/32 --tcp-flags ALL RST -j DROP
然後我會得到正確的答案:
;; ANSWER SECTION:
twitter.com. 204 IN A 104.244.42.65
如果我只執行第一個iptables
命令,我的挖掘就會失敗:
";; communications error to 1.1.1.1#53: connection reset"
中國的防火牆很奇怪...
答案2
若要丟棄入站 RST 封包,
iptables -I INPUT -p tcp --tcp-flags ALL RST,ACK --dport 10000 -j DROP
要丟棄出站 RST 封包,
iptables -I OUTPUT -p tcp --tcp-flags ALL RST,ACK --dport 10000 -j DROP
前幾年:
RST/ACK 不是 RST 的確認,就像 SYN/ACK 不完全是 SYN 的確認。 TCP 建立實際上是一個四向程序:發起主機向接收主機發送 SYN,接收主機發送該 SYN 的 ACK。接收主機向發起主機發送 SYN,發起主機傳回 ACK。這建立了狀態通訊。
SYN -->
<-- ACK
<-- SYN
ACK -->
為了提高效率,接收主機可以確認 SYN,並在同一個資料包中發送自己的 SYN,從而創建我們習慣看到的三向過程。
SYN -->
<-- SYN/ACK
ACK -->
在 RST/ACK 的情況下,裝置透過 ACK 確認序列中先前資料包中發送的任何數據,然後透過 RST 通知發送方連接已關閉。設備只是將兩個資料包合併為一個資料包,就像 SYN/ACK 一樣。 RST/ACK 通常不是關閉 TCP 會話的正常回應,但它也不一定表示有問題。