- お知らせ -
  • 当wikiのプログラムコードの表示を直してみました(ついでに長い行があると全体が下にぶっ飛ぶのも修正)。不具合があればBBSまでご連絡下さい。

はじめに Edit

iptablesを利用した、ファイヤーウォール(ファイアーウォール?)の設定について。

Ubuntu 8.04から ufw という簡易Firewall設定機能が搭載されたようです。
(結局はiptablesのラッパーのようですが)
今ならufwで設定してもよいかもしれません。
ufwでのページも作ってみます

しかし、iptablesはいろいろな環境で使えるので、憶えておいて損はないです。

ufwについては、公式マニュアルを参照のこと→UbuntuFirewall - Ubuntu Wiki

動作確認環境は、

  • Ubuntu 8.04 LTS server i386

です。

ここでの指針 Edit

  • 外から来るのはふさぐ
  • 内側から通信はOK
  • 外から通信のうち必要なものだけ(サーバー周り)はあける
  • セッションが確立されたものは通す(=内側から始まった通信は外からも通す)
  • シェルスクリプトで書いて、一括実行

※このへんのセキュリティポリシー的なものはネットワーク管理者とも相談して決めてください

実際の作業 Edit

例えば以下のスクリプトを /usr/local/sbin/set_iptablesとして置く。

$ cd /usr/local/sbin/
$ sudo vi set_iptables
$ sudo chmod u+x set_iptables

などと、権限も変更しておこう

#!/bin/sh

#サービスを許可したい範囲を設定(例: 192.168.10.0/24)
trusthost='(許可したい範囲)'

# 一旦初期化
iptables -F

# デフォルトルール
iptables -P INPUT DROP    # 入ってくるのはダメ。DROP(=deny)はそのまま捨てる。rejectと違い返信しないのでよりセキュア
iptables -P OUTPUT ACCEPT # 出て行くのはOK
iptables -P FORWARD DROP  # 通すのはダメ

# 自分からのアクセスはOK
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 内部から始まった外部からの応答はOK
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#(以下に、ルールを追加)

以上を書いた後に、以下を、実行すると、iptablesに記録される。
(sshで接続してる場合は、上の設定だけだと、
切断されてログインできなくなるので注意。
後のssh用の設定も行うこと!)

sudo /usr/local/sbin/set_iptables

以下、説明。

trusthost='(届けるIPの範囲)'は、
サービスを開放するマシンの範囲を書く。
開放するマシンが一台の場合は、IP直指定で(例: 123.456.789.012)。
サブネット内にオープンするなら、サブネット指定で(例: 123.456.789.0/24)
全部に開放するなら、0.0.0.0/0。

#(ここに書いていく)

のところに、ソフトごとの設定を書いていきます。

とりあえず、
設定後、ping(ICMP)とか、w3m(Port:80)とかで外に出られるか試してみましょう。
例:

ping www.google.com
w3m www.google.com

その他アプリごとの設定 Edit

外からpingを受け付ける設定 Edit

# ICMP(ping)
iptables -A INPUT -p icmp -s $trusthost -j ACCEPT

$trusthostからのpingを受け付ける。

外からsshを受け付ける設定 Edit

ssh_port='22'

# 180秒間に5回以上、ssh接続をしてきたIPを自動で遮断(sshの総当り攻撃防止)
iptables -A INPUT -p tcp --dport $ssh_port -m state --state NEW -m recent --set --name ssh_attack
iptables -A INPUT -p tcp --dport $ssh_port -m state --state NEW -m recent --update --seconds 180 --hitcount 5 --rttl --name ssh_attack -j LOG --log-prefix 'SSH attack: '
iptables -A INPUT -p tcp --dport $ssh_port -m state --state NEW -m recent --update --seconds 180 --hitcount 5 --rttl --name ssh_attack -j DROP

# ssh
iptables -A INPUT -p tcp -s $trusthost --dport $ssh_port -j ACCEPT

$trusthost からのssh接続を受け付ける。sshポートは、$ssh_port で指定。

ついでに、短時間でのsshの総当り攻撃を防ぐ。
(うーん、しかし、どうもこれいれるとsshが切断されまくる現象に遭遇…)

外からsambaを受け付ける設定 Edit

# samba
iptables -A INPUT -p tcp -s $trusthost --dport 137:139 -j ACCEPT
iptables -A INPUT -p tcp -s $trusthost --dport 445 -j ACCEPT
iptables -A INPUT -p udp -s $trusthost --dport 137:138 -j ACCEPT
iptables -A INPUT -p udp -s $trusthost --dport 445 -j ACCEPT

$trusthost からのsamba接続を受け付ける。
上のように、tcpとudpを空ける必要がある。

DNSを受け付ける設定 Edit

DNSサーバーを建てていて、受け付ける設定

# DNS
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT

wwwを受け付ける設定 Edit

wwwサーバーを建てて(ry

www_port='80'
# www-server
iptables -A INPUT -p tcp -s $trusthost --dport $www_port -j ACCEPT
# SSL
iptables -A INPUT -p tcp -s $trusthost --dport 443 -j ACCEPT

SSLの設定は、SSLによるアクセスを使う場合です。

起動時の設定の復元と設定の保存方法 Edit

上記のスクリプトを実行して遮断、通過されるか確認しましょう。

ちなみに以下で設定が保存される

sudo iptables-save > /etc/iptables-rules

また以下で復元される

sudo iptables-restore < /etc/iptables-rules

なので起動時に自動復元するには、

sudo vi /etc/network/if-pre-up.d/iptables

として、中身を以下のように記述して、

#!/bin/sh
sudo /sbin/iptables-restore < /etc/iptables-rules

また、ネットワーク切断時に自動で保存されるように

sudo vi /etc/network/if-post-down.d/iptables

以下のように記述すればOKでしょう。

#!/bin/sh
sudo /sbin/iptables-save > /etc/iptables-rules

※OS終了時にこれが実行される、かと思いきや実はそんなことはない罠。ifdownを実行した時に実行されます。

……というようなことをやる一連のスクリプトを書いた(先に言え)

以下を /usr/local/sbin/setup_iptables などに置いて一度実行してください。必ず上記のiptablesの設定スクリプトのようにして、set_iptablesファイルを作って置いてください。

$ cd /usr/local/sbin/
$ sudo vi setup_iptables
$ chmod u+x setup_iptables
$ sudo ./setup_iptables    #実行!!

以下がセットアップスクリプトです。

#!/bin/sh

set_iptables='set_iptables'
cd /usr/local/sbin
# check setting file
if [ ! -f $set_iptables ]; then
        echo "ERROR: can not find file 'set_iptables'"
        exit
fi
# run iptables setting
chmod u+x $set_iptables
/bin/sh $set_iptables

# make restore script
cd /etc/network/if-pre-up.d/
cat > iptables <<EOT
#!/bin/sh
printf "restore iptables..."
sudo /sbin/iptables-restore < /etc/iptables-rules
echo "done!!"
EOT
chmod +x iptables

# make save script
cd /etc/network/if-post-down.d/
cat > iptables <<EOT
#!/bin/sh
printf "save iptables..."
sudo /sbin/iptables-save > /etc/iptables-rules
echo "done!!"
EOT
chmod +x iptables

# save current iptables
/etc/network/if-post-down.d/iptables

上手くいかない件……
上手くいきました。

後は、/usr/local/sbin/set_iptables を編集するたびに、/usr/local/sbin/setup_iptables を実行すればOK。

(ちょっと回りくどい。/etc/network/if-pre-up.d/ にset_iptablesのシンボリックリンクを張るのでもいいかもしれないです。ただその方法だと、以前samba用の穴があけられない現象に遭遇して困ってしまった)

さて、では再起動してみてsshなどちゃんとつなげられるか確認してみてください。

参考URL Edit

過去のメモ Edit




Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New Pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2010-07-01 Thu 21:02:20 JST (3001d)