・受信パケットは基本的にすべて破棄(1)
・送信パケットは基本的にすべて破棄(2)
・ループバックアドレスに関してはすべて許可(3)
・メンテナンスホストからのping、メンテナンスホストへのpingを許可(4)
・メンテナンスホストからのssh(TCP 22)を許可。ただしパケットのステートフル性が無効なものは破棄(5)
テンプレート1を基に、SSHサーバに対する接続をさらに厳密にします。特定のメンテナンスホストからのみSSH接続を許可し、さらにパケットのステートフル性を確認し、NEW・ESTABLISHED・RELATEDの状態にあるパケットだけを受け入れます。さらに新規接続を表すNEWに関しては、SYNパケットでないものは破棄します。
テンプレート3の内容を説明します。適宜、以下のリンクでリストを表示させるか、テンプレートをダウンロードしてください。
3、4行目のメンテナンスホスト($trusthost)とサーバ($myhost)のIPアドレス指定や9〜11行目で既存のiptablesの設定リセットについては、テンプレート1の解説を参考にしてください。
テンプレート1を基に36行目を修正し、新たに37行目を追加しています。36行目では元のオプションに加え「-m state --state NEW,ESTABLISHED,RELATED」を新たに付け加えています。
36 /sbin/iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -s $trusthost -d $myhost --dport 22 -j ACCEPT -p tcp プロトコルがTCP -m state stateモジュールを使用 --state NEW,ESTABLISHED,RELATED NEW・ESTABLISHED・RELATEDの状態にあるパケット -s $trusthost 送信元IPアドレスが$trusthost -d $myhost 送信先IPアドレスが$myhost --dport 22 送信先サービスポートが22 --sport 22 送信元サービスポートが22 -j ACCEPT ACCEPT(許可)する
コネクション追跡機能を有効にするため、「-m state」でstateモジュールを使用し、続いて「--state NEW,ESTABLISHED,RELATED」でNEW・ESTABLISHED・RELATEDの状態にあるパケットを受け入れ、(ACCEPT)の条件に加えます。
37行目では接続の最初のパケットであるにもかかわらずSYNでないパケット(つまり最初のパケットがSYN以外のパケット)を破棄(DROP)しています。
37 /sbin/iptables -A INPUT -p tcp ! --syn -m state --state NEW -s $trusthost -d $myhost --dport 22 -j DROP ! --syn SYNパケットでないもの
これでDoS攻撃やDDoS攻撃のようなサーバの利用停止を狙った攻撃を、一部防ぐことができます。ただし「SYN Flood」のように、SYNパケットを使った攻撃には無防備です。DoS攻撃対策については回を改めて解説します。
作成したスクリプトの実行と動作確認は、第1回「設定確認とリセット」を参考にします。
HTTPサービスでもパケットのステートフル性を確認できるよう、テンプレート2を基に修正を加えましょう。sshの場合、同様に次のように変更します。
テンプレート2の42行目を修正 (修正前) /sbin/iptables -A INPUT -p tcp -s $any -d $myhost --dport 80 -j ACCEPT
↓
(修正後) /sbin/iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -s $any -d $myhost --dport 80 -j ACCEPT /sbin/iptables -A INPUT -p tcp ! --syn -m state --state NEW -s $any -d $myhost --dport 80 -j DROP
Copyright © ITmedia, Inc. All Rights Reserved.