連載
» 2005年03月18日 00時00分 公開

習うより慣れろ! iptablesテンプレート集(1):ステートフルパケットフィルタを使ったサービスの公開 (4/6)

[鶴長鎮一,@IT]

テンプレート3
ssh接続のステートフル性を確認(テンプレート1の改良)

・外部からの接続パケットは基本的にすべて破棄
・内部からの接続パケットは基本的にすべて破棄
・ループバックアドレスに関してはすべて許可
・メンテナンスホストからのping、メンテナンスホストへのpingを許可
・メンテナンスホストからのssh(TCP 22)を許可
・ただし、最初の接続時にSYNで始まらない接続パケットは破棄
・サーバからメンテナンスホストへのsshは許可しない

 iptablesの特徴であるステートフルパケットフィルタを使用し、より厳密なチェックを行います。ステートフルパケットフィルタとは、パケットの時間的な前後関係まで判断し、接続状態の追跡を行うパケット制限です。受信したパケットが既存の接続の一部なのか、新しい接続の最初のパケットなのかを見極めることができます。

図 3ウェイハンドシェイク 図 3ウェイハンドシェイク

 テンプレート3の想定環境においては、メンテナンスホストからサーバにsshで接続することはあっても、サーバからほかのホストへsshで接続する必要はありません。すると、接続の最初のパケットであるにもかかわらず、TCP接続の3ウェイハンドシェイクの状態であるSYN、SYN/ACK、ACKのうち、SYNでない状態「! --syn」が無効であることが自明となります。

 

テンプレート3の解説

 そこで、36行目では接続の最初のパケットであるにもかかわらずSYNでないパケット(つまり最初のパケットがSYN以外のパケット)を破棄しています。次の37行目で、パケットの状態が、

  • 新規(NEW)
  • 接続済み(ESTABLISHED)
  • 関連性(RELATED)

のもの(つまりINVALID:無効でないもの)で、メンテナンスホストから来たパケットを許可します。

36  iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
37  iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -s $trusthost -d $myhost --dport 22 -j ACCEPT

! --sync パケットにSYNフラグがない(「!」は否定を表す)
-m state --state NEW 新たな接続を開始するパケットか否かのチェック

 OUTPUTチェインは、そのままです。

38  iptables -A OUTPUT -p tcp -s $myhost --sport 22 -d $trusthost -j ACCEPT

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。