Linuxでファイヤーウォール(iptables)が必要な理由

ネットワーク初心者の僕が、iptablesやポートの開放について勘違いしていたことをまとめる。

ネットワークやLinux関連の本やサイトでは必ず、「サーバーを立てるときはiptablesファイヤーウォール)を設定しましょう」書いている。そして、iptablesの設定で必要ないポートは全部閉じることが推奨されている。

ここで、まずひとつ目の勘違い。

Q: iptablesを設定しなければ、すべてのポートが開放されている状態になり、どのポートも攻撃の対象になってしまう?

A: いいえ。iptablesが起動していなくても、すべてのポートが開放されている状態にはならない。ポートは、アプリケーションから利用されて初めて開かれた状態になる。なので、極端な話、外部と通信するアプリケーションをひとつも起動していない状態では、ポートはすべて閉じていることになり、外部からの攻撃で問題が出ることはない。

ポートが開いているかどうかは、nmapというツール*1で確かめることができる。以下の例のサーバーは、さくらインターネットVPS。OSはCentOS。初期状態なので、WEBサーバー(Apache)すらも起動していない。このとき、開かれているポートはSSHSMTPの2つのみ。

[user@server ~]$ sudo /etc/rc.d/init.d/iptables stop # iptabelsのサービスを停止(後でstartで戻しておくこと。)
...
[user@server ~]$ nmap localhost # 自分自身(localhost)のポートの状態を調べる
Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2011-11-08 20:42 JST
Interesting ports on localhost.localdomain (127.0.0.1):
Not shown: 1678 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
25/tcp open  smtp

Nmap finished: 1 IP address (1 host up) scanned in 0.138 seconds

ここでApache*2を起動すると、80のポートも開かれている状態になる。

[user@server ~]$ sudo apachectl start
[user@server ~]$ nmap localhost
Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2011-11-08 21:31 JST
Interesting ports on localhost.localdomain (127.0.0.1):
Not shown: 1677 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
25/tcp open  smtp
80/tcp open  http

Nmap finished: 1 IP address (1 host up) scanned in 0.149 seconds

次に、ふたつ目の勘違い。

Q: アプリケーションを起動するまでポートが開かれないのなら、必要なアプリケーションだけ起動するように気をつければよく、わざわざiptablesでブロックする必要はないのでは?

A: いいえ。セキュリティは二重、三重にかけておいた方がよい。iptablesを使うメリットは以下の通り。

  1. 管理者が知らないうちにポートが使われることを防ぐ
  2. 細かくパケットをフィルタリングする
  3. ネットワークアドレスを変換する

1.は、アプリケーションはiptablesで許可されていないポートを使うことができないということ。サーバーのログインユーザーが、外部と通信するアプリケーションを勝手にインストールするなどして、管理者が知らないうちにポートが使われてしまうことを防げる。
2.は、たとえば、特定のIPアドレスから入ってきたパケットを破棄することができるということ。
3.は、特定のパケットのIPアドレスやポート番号を書き換えることができるということ。

そして、3つ目の勘違い。

Q: iptablesを使えばポートを閉じることができるよね?

A: いいえ。iptablesはポートそのものを閉じるツールではない。ポートは開いた状態のままで、ポートに入ってくるパケットを破棄することはできる。

まとめると、iptablesのメリットは、アプリケーションに到達する前のカーネルのレベル*3でパケットをフィルタリングできることである。

参考URL:
iptables - Wikipedia
パケットフィルタリングとポートの開閉

*1:nmapインストール方法は、「nmapの運用」のページを参考にさせていただいた。

*2:Apacheのインストール方法は、「さくらVPS設定その2 Apache+MySQL+WordPress」のページを参考にさせていただいた。

*3:Linuxカーネルとは - IT Pro