こんばんわ。
ふと疑問に。。。。
よく、IPTABLESやルータの設定で、
INPUT DROP OUTPUT ACCEPT FORWARD DROP -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
とか見かけます。
「INPUT」、「OUTPUT」、「FORWARD」これはまだ分かる。
「INPUT」、「FORWARD」の状態オプション
「RELATED」・・・関連パケット
「ESTABLISHED」・・・接続済みパケット
これだけか無いように見えるけど、外部との通信は出来る。
アウトパケットはいいけど、インパケットは「接続済みしか許可されてない」はずなのになんで?
3Wayハンドシェイクの戻りパケットはどうなるの?
TCPで考えたら、
3ウェイハンドシェイクでやり取りするとき、
ローカル・・・SYN→・・・サーバ
ローカル・・・←SYNACK・・・サーバ
ローカル・・・ACK→・・・サーバ
これをクライアント目線で見ると、「SYN」は「OUTPUT ACCEPT」で良いとして、
サーバからの戻り「SYNACK」パケットについては「ESTABLISHED」に状態遷移する前だから
「INPUT DROP」されてしまうのではないか、と思ってた。
これを可能にしているのが、
ステートフルパケットインスペクション
(Web猫さんありがとうございました!!)
出ていくパケットと戻ってきたパケットを追跡、状態を保持しておくとことで
不正な戻りパケットではないよ、と内部で処理してくれる機能。
これのおかげでサーバからの「SYNACKパケット」は、「INPUT DROP」されずに、
「FORWARD」されてクライアントに届けられることになります。
特に、こういった機能が搭載されていると明記されているものがあまり見たことが無いですが、
IPTABLESやルータには実際の機能として搭載されています。
なので、
ESTABLISHED・・・接続済み
RELATED・・・関連パケットパケット
INVALID・・・無効パケット
をフィルタとして設定すれば良いことになります。
「NEW」(新規パケット)は、サーバを外部に公開するときなど
外部から内部にパケットを通すときに指定します。
[tegaki]すごく勉強になった![/tegaki]