目次

STEP1
STEP2
STEP3
STEP4

第12回:もう怖くない!ファイアーウォール(iptables)

さぁ今回のテーマは「ファイアーウォール」です。しかし、あんずちゃん、その人の持ってるカバンには「DDoS」「XSS」「Exploit」「Rootkit」と、アヤしげなラベルが・・・。

ファイアーウォールは、ネットワークとネットワークの間で通信を制御することで、特定ネットワークの安全性を確保する技術です。ネットワーク通信を選別するようなイメージですね、問題のない通信だけを許可したり、悪影響を及ぼす通信を破棄したり。ファイアーウォールには、動作する通信のレイヤーに応じていろいろな製品があります。

今回扱うiptablesというツールは、Linuxで動作してパケットフィルタやNATの機能を実現するものです。他にも、例えばWindowsには「Windowsファイアウォール」と呼ばれるものが用意されていたりします。これもiptablesと同じようなパケットフィルタリングをすることもできますが、加えてOS上のプログラム毎に設定ができたり、グループポリシーと連携できたりといった、Windowsならではの機能があります。

ファイアーウォールには、他にもより大量のトラフィックを捌ける専用の商用製品があったり、最近はアプリケーションレイヤーで動作するものがあったりと、非常に多くの種類があります。オフィスでskypeなどのチャットツールが使えなかったりしませんか?それはファイアーウォールがブロックしているからだったりします。

iptablesとは

iptablesは、Linuxに実装されたNetfilterという機構を使用するツールで、主にTCP/IPレベル(OSI参照モデルのネットワーク層、トランスポート層)の条件でパケットフィルタリングやNATを行うものです(実際はもっとたくさんの機能やフィルタリング条件があり、正直筆者も全て把握していません・・・)。このパケットフィルタリングでサーバーへの通信を選別することで、ファイアーウォールの機能を実現しています。

iptablesは、最近のLinuxならばほぼインストールされているでしょう。ただ、CentOS7やFedora18以降ではfirewalldと言う、別のサービスが使われているので注意してください。

iptablesの設定は、OSのネットワーク通信全体に影響を与えます。設定の変更はrootで行います。また誤った設定変更をすると、通信ができなくなるなどの影響が出ますので、運用環境などで試す場合は注意してください。

物騒な一文を入れましたが、もし良ければVPSをもう一台契約してみませんか?安心して試せますよ。

■INPUTチェイン

さてそれでは、VPSにログインしてiptablesコマンドを実行してみましょう。(CentOS6.5での実行結果)

[root@conoha ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh 
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  

なにやらずらずらと出てきました。iptablesの-Lオプションはlistの事で、現在の設定を一覧表示するオプションです。では、上から見てみましょう。

Chain INPUT (policy ACCEPT)

Chain(チェイン)とは、パケットをフィルタするルールの入れ物のようなものだと思ってください。このINPUTチェインは、外部からサーバに対するパケットを扱います。次の(policy ACCEPT)は、すべてのルールにマッチしなかったパケットの扱い方法です。ACCEPTなので、通信を許可することになります。

target     prot opt source               destination 
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 

Chain行の次にヘッダー行が続き、ここからがルールになります。左のカラムから

 ・ターゲット

 ・プロトコル(TCP, UDP, ICMPなど)

 ・オプション

 ・パケットの送信元

 ・パケットの送信先

となっています。最後は、このルールに対するオプションです。パケットに対するより細かい条件を設定したり、接続元へ返すメッセージを指定したりします。

ターゲットとは、ルールにマッチしたパケットが、次にどのルールが適用されるかを指定するもので、パケットフィルタの場合はACCEPT, REJECT, DROPなどを指定し、NATを組む場合はSNAT, DNATなどを指定します。(他にもログを記録したり、パケットに印を付けたりいろいろできます。マニュアルを見てみてください)

このルールの場合、ACCEPTなのでルールにマッチした場合通信が許可され、プロトコルはallなのでどのプロコトルにもマッチし、送信元と送信先はanywhereなのでどのパケットもマッチします。条件の「state RELATED,ESTABLISHED」は、すでに確立した通信(established)と、そのパケットに関連したパケット(related)を許可するという意味です。

TCP接続では、接続確立の接続切断までに複数のパケットがやりとりされ、iptablesはその状態を管理しています。このルールでは一度確立した通信に対しては、以後のルールを適用しないようにしています。

ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh 

このルールのオプション部分は「新規のTCP接続(state NEW)で、パケットの宛先TCPポート番号(dpt)がsshである」と言う意味です(dptはdestination portの略)。第一カラムにACCEPTとあるので、このルールにマッチしたパケットは許可されます。つまり、このサーバに対してのSSH通信が許可されているわけです。SSHが通らないとリモートログインできないですからね。

REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

第一カラムにREJECTとあります。このルールにマッチしたパケットは拒否されることになります。オプションには「reject-with icmp-host-prohibited」とあります。これは拒否したことを接続元に通知するのに、icmp-host-prohibitedメッセージを返すということです。ICMPについては説明を省略しますが、IP通信において制御情報をやりとりするためのプロトコルくらいに考えておいてください。prohibited(禁止)という意味なので、接続元は「接続が拒否された」と判断することができます。

このルールのプロトコルはallで、送信元と送信先がanywhereなので全てのパケットがマッチします。つまり、このルールより上のルールにマッチしなかったパケットは全て拒否されることになります。一つ上にはSSH通信を許可するルールしかありませんでした。なので、このサーバへのSSH以外の通信は全て拒否されることになります。

ん?ちょっと待ってください。3つめのルールを見てみましょう。

ACCEPT     all  --  anywhere             anywhere 

ACCEPT all anywhereでオプションの設定もなく、これは全ての通信を許可(ACCEPT)するというルールです。これではファイアーウォールの機能をなしません。何故こんなルールがデフォルトで設定されているのでしょうか?

答えはiptables -L -vと実行するとわかります。-vはverboseで詳細を出力するという意味です。

[root@conoha ~]# iptables -L -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  522 41436 ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED 
    0     0 ACCEPT     icmp --  any    any     anywhere             anywhere            
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere            
    2   120 ACCEPT     tcp  --  any    any     anywhere             anywhere            state NEW tcp dpt:ssh 
  435  122K REJECT     all  --  any    any     anywhere             anywhere            reject-with icmp-host-prohibited 

(以下略)

第六カラム(inとなっている)を見てみてください、loとなっています。このカラムはルールを適用するネットワークインターフェイスを設定します。典型的にはeth0やeth1などです。つまりこのルールはローカルループバックアドレス(127.0.0.1)に対して適用されるのです。

このルールがないと、サーバへのローカル接続もiptablesのフィルタリング対象になってしまうのです。例えば、ローカルで立てているMySQLサーバや、Postfixメールサーバなどに接続するケースなどで問題が出ます。ローカル接続にはファイヤーウォールを適用する必要はないのです。

■FORWARDチェインとOUTPUTチェイン

以上がINPUTチェインの説明でした。他にもOUTPUTとFORWARDというチェインがありますが、INPUTチェインに比べればとてもシンプルです。

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 

FORWARDチェインは、パケットを別のホストに文字通り転送するためのチェインで、NATを実現するために使用したりします。ここでは全てREJECTの設定がされています。

OUTPUTチェインはサーバから外部への通信です。policyがACCEPTで、ルールは一つもありません。つまりサーバから外部への通信は全て許可されています。

ファイアーウォールの設定を変更する

ここまでで説明したようにCentOSでは、サーバに対する通信に強い制限をかけています。サーバを使っていくにあたり、iptablesの設定変更が必要になるケースもあり、実は前回のブログでもiptablesを使った設定変更を解説しています。

第11回:アナタだけに教えたい、Webサーバーのはじめの一歩

ConoHa VPSを使えば、最悪iptablesの設定ミスで全く通信ができなくなってしまっても、コントロールパネルからコンソールに接続できるので問題なく復旧できます。通常のレンタルサーバなどでは、SSHが接続できなくなってしまったらお手上げの場合が多いですからね。そんなiptablesの学習にも適した(?)ConoHa VPSで、いろいろ試してみてください。

問題は解決できましたか?

お役立ち情報

ConoHaではサポートコンテンツの他にも以下のようなお役立ち情報をご用意しております。ぜひご活用ください。