ACK フラグなしの iptables 拒否 - tcp リセット付き

ACK フラグなしの iptables 拒否 - tcp リセット付き

ルールを作成しました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

ご参考までに:

URL:https://networkengineering.stackexchange.com/questions/2012/why-do-i-see-a-rst-ack-packet-instead-of-a-rst-packet

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 セッションを終了する際の通常の応答ではありませんが、必ずしも問題を示すものでもありません。

関連情報