
ルールを作成しました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
次の 2 行を実行する必要があります。
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
コマンドだけを実行すると、dig は失敗します。
";; 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 の確立は実際には 4 方向のプロセスです。開始ホストは SYN を受信ホストに送信し、受信ホストはその SYN に対する ACK を送信します。受信ホストは開始ホストに SYN を送信し、開始ホストは ACK を返します。これにより、ステートフル通信が確立されます。
SYN -->
<-- ACK
<-- SYN
ACK -->
これをより効率的にするために、受信側ホストは SYN を ACK し、同じパケットで独自の SYN を送信して、私たちがよく目にする 3 方向のプロセスを作成できます。
SYN -->
<-- SYN/ACK
ACK -->
RST/ACK の場合、デバイスはシーケンス内の前のパケットで送信されたデータを ACK で確認し、送信者に RST で接続が終了したことを通知します。デバイスは、SYN/ACK と同様に、2 つのパケットを 1 つに結合するだけです。RST/ACK は通常、TCP セッションを終了する際の通常の応答ではありませんが、必ずしも問題を示すものでもありません。