jessie向けの新ページを作成しました。こちらからどうぞ

2.iptables(ファイアウォール)のセットアップ - RaspberryPiで各種サーバー作り! - ある阪大生の物置小屋

RaspberryPiをもし自宅用サーバーにするつもりでも、24時間運用するサーバーにすることを考えればある程度のセキュリティは必要でしょう。
ここでは、基本的なセキュリティ対策としてiptablesについての基本的な説明します。
ただし、詳しい説明をするとキリが無いので、詳しい説明は参考サイトの方を参照してもらうとして、
このページではiptablesの概要と設定例を述べます。

2.1.テーブルについて

まず、テーブルの説明から始めます。
iptablesにはテーブルと呼ばれるパケットの行き先を変えたり、パケットを無視・拒否したりするリストの集まりがあります。
テーブルには何種類かあり、行き先変更用・パケット改変用・フィルタリング用等々テーブルが分けられています。
ここでは、フィルタリング担当のfilterテーブルについて説明します。
(その他のテーブルについては下記の参考サイトを参照)
ここで、ひとつ重要なことは、許可(ACCEPT)のルールがあった時点で、パケットは次のテーブルに廻され、
無視(DROP)・拒否(REJECT)のルールがあった時点で、パケットは次のテーブルに廻される以前に遮断されるという点です。
(ACCEPT・DROP・REJECT以外のルールでは、ルールが適用された後も、そのまま同じテーブルのルールを適用するものもあります。)

2.2.チェーンについて

チェーンとは、一つ一つの通信ルールを一繋ぎにしてリスト化したものです。
filterテーブルにはデフォルトで、

の3つのチェーンが用意されています。
パケットは、各テーブルのチェーンの上から下にルールに照らし合わされながら通っていきます。
チェーンの最後まで行き着いたパケットはチェーンに設定されているポリシー(デフォルトルールとも言うべきかもしれない)に則って処理されます。
また、複数のチェーンで使いたいルールがあれば、新しく独自のチェーンを作って、デフォルトチェーンから参照させることで使いまわすことができます。
この場合、独自チェーンの最後まで届いたパケットはデフォルトチェーンの「独自チェーンを参照するように記載されたルール」の次のルールから続いて処理されます。

2.3.ルールについて

ルールには、「「こういう」パケットを「こうして」欲しい」という指令が記載されています。
こう言ってしまえば単純なのですが、iptablesの用語では、「「マッチ(match)する」パケットを「ターゲット(target)」の通りにして欲しい」と言い換えられます。
まず、「マッチ」と言うのは、「「あて先が・・・である」とか、「送信ポートが・・・である」とか、「プロトコルが・・・である」とかの組み合わせで指定されている処理したいパケットと合致すること」を指し、
「ターゲット」と言うのは、「処理の内容」を指します。
「マッチ」にはいろいろありますが、あまり凝らない場合「TCPマッチ」・「UDPマッチ」・「ICMPマッチ」・「Stateマッチ」あたりを覚えておけば十分ではないかと思います。
(各マッチの詳細については以下の参考サイトを参照してください。)
また、「ターゲット」は、filterテーブルで用いられる分で言えば、「ACCEPT(許可)ターゲット」・「DROP(無視)ターゲット」・「REJECT(拒否)ターゲット」・「LOG(ログを採る)ターゲット」辺りをメインで使います。
ここで、「「DROP」・「REJECT」の違いってなんだ?」と思われるかもしれませんが、「DROPはただただ無視、REJECTは拒否するが送り主に「そのパケットは無理!」と伝える。」という違いがあります。
大抵は「DROP」で事足りることが多いですが、例外も多々あるのでこれのフォローについては、後のサーバーの立て方等でフォローしようと思います。
(各ターゲットの詳細については以下の参考サイトを参照してください。)

2.4.iptablesの設定法について

セキュリティ的に言えば基本的に「DROP」してしまうのがベターです。
しかし、なんでもかんでも拒否してしまうのは難があるので、外部から始まる通信のないクライアントの場合、とりあえず以下のようにしておくのが良いでしょう。

#INPUTチェーン
#IPスプーフィング対策
sudo iptables -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset

#セッションハイジャック対策
sudo iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

#不正なパケット拒否
sudo iptables -A INPUT -m state --state INVALID -j DROP

#内部から通信を始めた場合のパケットは許可
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

#ループバックからの通信は通す
sudo iptables -A INPUT -i lo -j ACCEPT

#DHCPクライアントとしてDHCPに必要な通信は通す
sudo iptables -A INPUT -p udp --dport 67 --sport 68 -j ACCEPT

#一般的に必要であろうICMPパケットは許可
sudo iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT


#OUTPUTチェーン
#ループバックへの通信は通す
sudo iptables -A OUTPUT -o lo -j ACCEPT

#ICMP応答のパケットは通す
sudo iptables -A OUTPUT -p icmp -m state --state RELATED,ESTABLISHED -j ACCEPT

#tcp-resetの通信は通す
sudo iptables -A OUTPUT -p tcp --tcp-flags FIN,SYN,RST RST -m state --state RELATED,ESTABLISHED -j ACCEPT

#DHCPクライアントとしてDHCPに必要な通信は通す
sudo iptables -A OUTPUT -p udp --dport 68 --sport 67 -j ACCEPT

#ユーザrootが発したパケットは許可
sudo iptables -A OUTPUT -m owner --uid-owner 0 -j ACCEPT

#ユーザpiが発したパケットは許可
sudo iptables -A OUTPUT -m owner --uid-owner 1000 -j ACCEPT

#各チェーンのポリシーはDROPにセット
sudo iptables -P INPUT DROP
sudo iptables -P FOWARD DROP
sudo iptables -P OUTPUT DROP

ここで、「あれ?テーブルの指定してなくない?」という疑問が湧くかもしれませんが、これはデフォルトでfilterテーブルが指定されているからで、明示的に指定したい場合は「-t (テーブル名)」で指定します。
なお、上記の設定はクライアントとして動作させるにしても結構がちがちに制限をかけているので、ましてやサーバーとしてはろくに動きません。
サーバーとして動作させる際に開けるべきポートについては後のサーバーの立て方でフォローします。
「そんなにがちがちで無くてもいいよ。」・「むしろトラブルが起こった」という方は、

sudo iptables -P OUTPUT DROP
↓
sudo iptables -P OUTPUT ACCEPT

でも良いでしょう。
(詳しい設定法については以下の参考サイトを参照してください。)

2.5.「iptables-persistent」のインストール

「iptables-persistent」はDebian系でiptablesの設定を保持しておくためのパッケージです。
実は、「iptables」の設定はシャットダウンすると消えてしまいます。
従って、このようなパッケージをインストールしておく必要があるのです。
これをインストールするには以下のようなコマンドでOKです。

sudo apt-get install iptables-persistent

インストールの際、質問が出てくるので「yes」を選択すると、「/etc/iptables/rules.v4」に記録されます。
これが、起動の時に毎回呼び出されiptablesにセットされます。
インストール後に「iptables」の設定を変えた場合は、以下のコマンドで「/etc/iptables/rules.v4」に記録し直しておきます。

sudo iptables-save | sudo tee /etc/iptables/rules.v4

(なお、「/etc/iptables/rules.v6」はIPv6用のファイルで必要に応じてセットします。)

2.参考サイト

iptablesについて詳しく知りたい場合は、

を参照。

IPスプーフィング・セッションハイジャックについては、

を参照。

製品紹介(Amazonアフィリエイト)



2014/10/5 一部説明の修正・フォントの変更
2014/10/7 一部説明の修正(特に「2.1.テーブルについて」の説明がまずかったことに対する修正)
2016/06/20 tcp-reset透過用ルールを追加