ipchainsの設定
作成 : 2002/07/04
※ファイアウォールについては、ipchainsからiptablesに移行した。
ファイアウォール
ADSLルータにはファイアウォール機能がついているので、デフォルトでは外部からのパケットをすべて遮断する。 ルータ内部にインターネットサーバを設置する場合は、ルータが受信した特定ポート宛パケットを、内部の指定したサーバに転送するよう設定する(ポートフォワーディング)。
インターネットサーバが受信するパケットは、WEBサーバやメールサーバが受け取るべきパケットだけになるので、サーバにファイアウォール機能を持たせる必要はないかもしれない。 が、練習のため設定してみる。
RedHat Linuxには、ipchainsとiptablesという2種類のファイアウォールソフトがある。 設定が楽だといわれている、ipchainsのほうを使用してみる。
デフォルトのipchains設定
ipchainsによるファイアウォールの設定を確認する。 確認するには、ipchainsコマンドに--listオプションをつけて実行する。
# ipchains --list
Chain input (policy ACCEPT):
target prot opt source destination ports
ACCEPT udp ------ ns5.wakwak.com anywhere domain -> any
ACCEPT udp ------ ns7.wakwak.com anywhere domain -> any
ACCEPT all ------ anywhere anywhere n/a
REJECT tcp -y---- anywhere anywhere any -> any
REJECT udp ------ anywhere anywhere any -> any
Chain forward (policy ACCEPT):
Chain output (policy ACCEPT):
INPUT(入力)・FORWARD(転送)・OUTPUT(出力)の3つのチェインにわかれている。 それぞれのチェインごとに、ルールは上からチェックされる。 マッチしない場合は、下のルールが検査される。 どのルールにもマッチしない場合は、デフォルトではACCEPT(受容)される。
・INPUTチェインの1行目と2行目は、DNSサーバからのudpパケットをACCEPT(受容)する設定。 portsの「domain -> any」は、DNSサーバの53番ポートからのパケットのみ受容するという意味。 このエントリがないと、DNSサーバからの返答パケットを受け取ることができないため、DNSを使った名前解決ができない。
・INPUTチェインの3行目は、ループバックアドレスからのパケットをすべてACCEPT(受容)する設定。 つまり、自分から自分へパケットは、すべて受け取る。 このエントリがなくても、特に困ることはない(はず)。
・INPUTチェインの4行目は、tcpパケットをREJECT(拒絶)する設定。 opt(オプション)の「y」はSYNパケットが対象となることを示す。 SYNパケットは通信のリモートからの接続要求となるパケットなので、ACCEPT されたポート以外にこのパケットが届く必要はない。 しかし、SYN パケット以外のパケットは受け取らなければ、tcp 通信ができなくなってしまう。 yオプションを忘れると、すべてのtcpパケットをREJECTしてしまうので、注意する。 sourceが「anywhere」となっているので、すべてのリモートからのパケットが対象となる。
・INPUTチェインの5行目は、すべてのudpパケットをREJECT(拒絶)する設定。
サーバにはNICを1枚しか搭載していないため、FORWARDチェインは設定しない。 また、サーバからの送信パケットは規制しないので、OUTPUTチェインも設定しない。
ipchainsコマンドによる設定
INPUTチェインにルールを追加するには、ipchainsコマンドに-Aオプションをつけて実行する。
# ipchains -A input -p プロトコル -s ソース ポート -d デスティネーション ポート -j 処理 オプション
プロトコル: 「tcp」、「udp」、「icmp」を記述する。 すべてを対象とするには、「any」を記述する。
ソース、デスティネーション: FQDN(polaris.as.wakwak.ne.jp)、ネットワークアドレス(192.168.1.0/24または192.168.1.0/255.255.255.0)、IPアドレス(192.168.1.1(/32))を記述することができる。
ポート: ソースまたはデスティネーションアドレスに続いて、対象とする単一ポートまたはポート範囲を記述できる。 指定しない場合は、すべてのポートが対象となる。 httpポートを指定する場合は「80」、予約ポートすべてを指定する場合は「:1023」、予約ポート以外であれば「1024:」と記述する。
処理: 条件にマッチした場合の処理を記述する。 許容するなら「ACCEPT」、拒絶するなら「REJECT」、発信元にエラーを返さず拒否するなら「DENY」を記述する。
その他のオプション(-y): SYNパケットのみ対象とする場合は、「-y」を記述する。 「-y」の対象プロトコルは「tcp」のみ。
その他のオプション(-l): 「-l」を記述すると、そのルールが適用されたときにログを残す。 ログファイルは、/etc/syslog.confで設定される。 Redhat 7.2では、デフォルトで/var/log/messages。
INPUTチェインからルールを削除するには、ipchainsコマンドに-Dオプションをつけて実行する。
# ipchains -D ルール
ipchainsコマンドでルールの追加・削除をした場合は、次のコマンドによりルールを保存しなければならない。 忘れてしまうと、サービスを停止したとき、変更した設定が失われてしまう。
# /etc/init.d/ipchains save
/etc/sysconfig/ipchainsファイル編集による設定
/etc/sysconfig/ipchainsファイルを編集することにより、ファイアウォールの設定を変更することができる。 ファイルへの記述形式は、ipchainsコマンドと同じ。
:input ACCEPT :forward ACCEPT :output ACCEPT -A input -p udp -s 211.9.226.5 53 -d 0/0 -j ACCEPT -A input -p udp -s 211.9.226.69 53 -d 0/0 -j ACCEPT -A input -s 0/0 -d 0/0 -i lo -j ACCEPT -A input -p tcp -s 0/0 -d 0/0 -y -j REJECT -A input -p udp -s 0/0 -d 0/0 -j REJECT
ipchainsを起動時開始サービスに追加
いまのところ、ipchainsサービスはサーバ起動時に開始されるように設定されていない。 ntsysvコマンドなどで設定しておく。
ipchainsサービスの起動
起動時開始サービスに追加しただけでは、サーバを再起動するまでipchainsサービスは開始されない。 すぐにipchainsサービスを開始するには、次のコマンドを実行する。
# /etc/init.d/ipchains start