公開日: 2012年8月10日 09:55:55
最終更新: 2012年8月10日 09:55:55

基本的なファイアウォール(iptables)

ファイアウォール(パケットフィルタリング)

iptables によってファイアウォール設定を行います。基本ルールは「すべてのパケットをDROP(破棄)」とし、接続を許可するポートを個別に指定していきます。

iptables.sh の作成

設定を変更するたびにコマンドをひとつひとつ打ち込むのは大変ですので、スクリプトファイルにまとめて bash に食わせることにします。

まずは家庭内 LAN の中と、自分(linux サーバ)自身からの通信のみ許可し、外部からの通信は全て遮断します。
※ 家庭内 LAN 側の NIC を eth0、インターネット側の NIC を ppp0 (linux で pppoe 接続)として記述してあります。ご自身の環境に合わせて適宜変更してみてください。

$ vi iptables.sh
#!/bin/bash

LIF=eth0
WIF=ppp0
LAN=192.168.1.0/24
LO=127.0.0.0/8

## デフォルトの設定を初期化
iptables -F
iptables -Z
iptables -X
iptables -t nat -F
iptables -t nat -Z
iptables -t nat -X

## デフォルトのポリシーをDROP(破棄)に設定
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

## LAN側・自機からの接続は全て許可する
iptables -A INPUT -s $LO -i lo -j ACCEPT
iptables -A INPUT -s $LAN -i $LIF -j ACCEPT

「:wq」で編集を保存したら、実行権限をつけて iptables.sh を実行します。

$ chmod +x iptables.sh
$ ./iptables.sh

エラーが出るようでしたらもう一度スクリプトを確認しましょう。
以下のコマンドで現在のファイアウォール設定を確認します。

$ iptables -L

Chain INPUT (policy DROP)
target	prot	opt	source		destination
ACCEPT	all	--	anywhere		anywhere
ACCEPT	all	--	192.168.1.0/24	anywhere

Chain FORWARD (policy DROP)
target	prot	opt	source		destination

Chain OUTPUT (policy ACCEPT)
target	prot	opt	source		destination

INPUT、FORWARD、OUTPUT それぞれのチェインの設定が表示されます。家庭 LAN とサーバ間では自由な通信が行えます。

ルータ機のアクセス制限

ここまでの設定では、外部からの侵入を防ぐことができますが、サーバからインターネットへ出て行くパケットは何も制限されていません。Netbios やブロードキャストパケットなど、LAN の外へ出すのは好ましくないパケットを破棄するルールを追加します。

## サーバ機から出て行くNetbios、smb パケットを制限
iptables -A INPUT -p tcp -m multiport --dport 135,137:139,445 -i $WIF -j DROP

# ブロードキャスト・マルチキャストパケットを制限
iptables -A INPUT -d 255.255.255.255 -j DROP
iptables -A INPUT -d 224.0.0.1 -j DROP

また、DNSによる名前解決を許可します。DNSのポートは UDP/53 ですが、512バイトを超える問い合わせの場合はTCPが使用されるため、TCP/UDP 共に開放しておきます。

## DNSサーバへの問い合わせを許可する
iptables -A OUTPUT -p udp --dport 53 -o $WIF -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -o $WIF -j ACCEPT

接続確立済みパケットを許可

出て行くパケット(接続要求,SYN) を許可しても、相手からの応答パケット(確認応答) を拒否してしまっては接続が成り立ちません。kernel に組み込まれているパケット追跡モジュールを利用して、 接続済み、もしくは応答パケットについては許可するよう設定します。

## 接続確立済み・関連するパケットを許可する。
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

確認用にブロックしたパケットのログを出力

LOG を使用すると、iptables のフィルタがうまく動作しているか、間違って正しいパケットを破棄していないかを確認することができます。iptables.sh の一番最後に以下の 3行を追加します。

$IPT -A INPUT -j LOG --log-prefix="iptables INPUT: "
$IPT -A FORWARD -j LOG --log-prefix="iptables FORWARD: "
$IPT -A OUTPUT -j LOG --log-prefix="iptables OUTPUT: "

iptables.sh を反映させるためにもう一度実行します。

$ ./iptables.sh

フィルタリングルールの保存

iptables-save で現在の設定を /etc/sysconfig/iptables に保存する。

# iptables-save > /etc/sysconfig/iptables

ログの確認

iptables のログは /var/log/messages に記録されます。tail コマンドで確認すれば、どこぞのボット PC や中国人がちょっかいをかけてくる様子がわかります。

$ tail -f /var/log/messages
Aug 10 09:41:32 localhost kernel: iptables INPUT: IN=ppp0 OUT= MAC= SRC=46.162.201.247 DST=***.***.***.*** LEN=60 TOS=0x00 PREC=0x00 TTL=45 ID=30074 DF PROTO=TCP SPT=3323 DPT=23 WINDOW=5840 RES=0x00 SYN URGP=0
Aug 10 09:41:45 localhost kernel: iptables INPUT: IN=ppp0 OUT= MAC= SRC=114.255.161.199 DST=***.***.***.*** LEN=40 TOS=0x00 PREC=0x00 TTL=107 ID=256 PROTO=TCP SPT=6000 DPT=1433 WINDOW=16384 RES=0x00 SYN URGP=0
.
.
.