iptablesを使ってサーバにパーソナルファイアウォールを実装してみましょう。
RedHatの場合、バージョンによってモジュールが、ipchains か iptables かが違うので、ipchains だった場合、下記のモジュール切り替え作業が必要です。
まず lsmod でモジュールを確認します。
# lsmod
Module Size Used by
autofs 11584 0 (autoclean) (unused)
8139too 13120 1
ipchains 39392 0
usb-uhci 21696 0 (unused)
usbcore 51808 1 [usb-uhci]
ext3 62480 2
jbd 41056 2 [ext3]
|
ipchains が組み込み済みのようです。下記のスクリプトを実行し、ipchains を無効にします。
# /etc/rc.d/init.d/ipchains stop
|
次に、iptables を使用するために、ipchainsを除去します。
iptables を組み込みます。
# /sbin/insmod ip_tables
Using /lib/modules/2.4.9-13/kernel/net/ipv4/netfilter/ip_tables.o
|
ftp 接続の為のモジュールを挿入します。(カーネル直組み込みの場合は不要)
# /sbin/modprobe ip_nat_ftp
# /sbin/modprobe ip_conntrack_ftp
|
ここまでは前準備です。
以下は必要なルールを組み合わせてください。
# loopback アダプタからのパケットを受け付けます。
iptables -A INPUT -i lo -s 127.0.0.0/8 -d 127.0.0.0/8 -j ACCEPT
|
# 自ホストからのパケットを受け付けます。
iptables -A INPUT -i eth0 -s 192.168.0.1/24 -d 0.0.0.0/0 -j ACCEPT
|
# 内部から発生した接続に関連するパケットを、受け付けます。いわゆるステートフルインスペクションのようなものです。
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
|
# DNSサーバを構築する場合、domain(DNS)パケットを受け付けます。
iptables -A INPUT -p tcp -i eth0 -d 0.0.0.0/0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 -d 0.0.0.0/0 --dport 53 -j ACCEPT
|
# domain(DNS)問い合わせに対する応答パケットを受け付けます。
iptables -A INPUT -p udp -i eth0 -s 0.0.0.0/0 --sport 53 -d 0.0.0.0/0 --dport 1024: -j ACCEPT
|
# ftpサーバを構築する場合、ftp パケットを受け付けます。
iptables -A INPUT -p tcp -i eth0 -d 0.0.0.0/0 --dport 21 -j ACCEPT
|
# メールサーバを構築する場合、smtp/pop3 パケットを受け付けます。
iptables -A INPUT -p tcp -i eth0 -d 0.0.0.0/0 --dport 25 -j ACCEPT
iptables -A INPUT -p tcp -i eth0 -d 0.0.0.0/0 --dport 110 -j ACCEPT
|
# Webサーバを構築する場合、http(&https)パケットを受け付けます。
iptables -A INPUT -p tcp -i eth0 -d 0.0.0.0/0 --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -i eth0 -d 0.0.0.0/0 --dport 443 -j ACCEPT
|
# ssh 接続を受け付ける場合。
iptables -A INPUT -p tcp -i eth0 -d 0.0.0.0/0 --dport 22 -j ACCEPT
|
# NTPサーバを構築する場合、ntp パケットを受け付けます。
iptables -A INPUT -p tcp -i eth0 -d 0.0.0.0/0 --dport 123 -j ACCEPT
iptables -A INPUT -p udp -i eth0 -d 0.0.0.0/0 --dport 123 -j ACCEPT
|
# DHCPサーバを構築する場合、dhcp パケットを受け付けます。
iptables -A INPUT -p udp -i eth0 -d 0.0.0.0/0 --dport 68 -j ACCEPT
|
# 全てのICMPパケットを受け付ける場合。
iptables -A INPUT -p icmp -i eth0 -d 0.0.0.0/0 -j ACCEPT
|
# 必要な ICMP パケットのみを受け付ける場合。
# echo-reply は ping に必要です。
iptables -A INPUT -p icmp -s 0/0 --icmp-type 0 -d 0/0 -j ACCEPT
|
# echo-requestは ping に必要です。
iptables -A INPUT -p icmp -s 0/0 --icmp-type 8 -d 0/0 -j ACCEPT
|
# destination-unreachable は 全ての tcp/udp トラフィックに必要です。
iptables -A INPUT -p icmp -s 0/0 --icmp-type 3 -d 0/0 -j ACCEPT
|
# time-exceeded は traceroute に必要です。
iptables -A INPUT -p icmp -s 0/0 --icmp-type 11 -d 0/0 -j ACCEPT
|
# LOGを取る場合の設定です。
iptables -A INPUT -p tcp -i eth0 -j LOG
iptables -A INPUT -p tcp -i eth0 -j DROP
iptables -A INPUT -p udp -i eth0 -j LOG
iptables -A INPUT -p udp -i eth0 -j DROP
iptables -A INPUT -p icmp -i eth0 -j LOG
iptables -A INPUT -p icmp -i eth0 -j DROP
|
ログを取るために全パケットを破棄する設定を追加しています。
ログは、/var/log/messagesに出力されます。
最後にポリシーを設定します。本当は最初にポリシーを設定するべきですが、リモートで設定する場合、接続が切れてしまうため最後にしています。
# FILTERING POLICY
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
|
それでは設定内容を見てみましょう。
# /sbin/iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 127.0.0.0/8 127.0.0.0/8
ACCEPT all -- 192.168.0.1/24 anywhere
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:domain
ACCEPT udp -- anywhere anywhere udp dpt:domain
ACCEPT udp -- anywhere anywhere udp spt:domain dpts:1024:65535
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp
ACCEPT tcp -- anywhere anywhere tcp dpt:smtp
ACCEPT tcp -- anywhere anywhere tcp dpt:pop3
ACCEPT tcp -- anywhere anywhere tcp dpt:http
ACCEPT tcp -- anywhere anywhere tcp dpt:https
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:ntp
ACCEPT udp -- anywhere anywhere udp dpt:ntp
ACCEPT udp -- anywhere anywhere udp dpt:bootpc
ACCEPT icmp -- anywhere anywhere icmp echo-reply
ACCEPT icmp -- anywhere anywhere icmp echo-request
ACCEPT icmp -- anywhere anywhere icmp destination-unreachable
ACCEPT icmp -- anywhere anywhere icmp time-exceeded
LOG tcp -- anywhere anywhere LOG level warning
DROP tcp -- anywhere anywhere
LOG udp -- anywhere anywhere LOG level warning
DROP udp -- anywhere anywhere
LOG icmp -- anywhere anywhere LOG level warning
DROP icmp -- anywhere anywhere
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
|
これで良ければ、起動スクリプトの設定とフィルタリングルールを保存します。これにより、次回起動時もルールが有効になります。
/etc/sysconfig/iptables ファイルに保存されます。
# chkconfig --level 2345 ipchains off
# chkconfig --level 2345 iptables on
# /etc/rc.d/init.d/iptables save
|