ファイアウォール(パケットフィルタリング)
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 . . .