ステートフルパケットフィルタを使ったサービスの公開:習うより慣れろ! iptablesテンプレート集(1)(4/6 ページ)
初心者にとって、iptablesは設定が最も困難な機能の1つである。そこで、学習の第1歩としてテンプレートを自分の環境に合わせて修正することから始めよう。(編集部)
テンプレート3
ssh接続のステートフル性を確認(テンプレート1の改良)
・外部からの接続パケットは基本的にすべて破棄
・内部からの接続パケットは基本的にすべて破棄
・ループバックアドレスに関してはすべて許可
・メンテナンスホストからのping、メンテナンスホストへのpingを許可
・メンテナンスホストからのssh(TCP 22)を許可
・ただし、最初の接続時にSYNで始まらない接続パケットは破棄
・サーバからメンテナンスホストへのsshは許可しない
iptablesの特徴であるステートフルパケットフィルタを使用し、より厳密なチェックを行います。ステートフルパケットフィルタとは、パケットの時間的な前後関係まで判断し、接続状態の追跡を行うパケット制限です。受信したパケットが既存の接続の一部なのか、新しい接続の最初のパケットなのかを見極めることができます。
テンプレート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.