Linuxでもファイアウォールを設定したいことは多々ある。
むしろ企業でサーバーとして利用されることから、パーソナルコンピュータよりも気をつかいたいところだ。
このページでは、Linuxでファイアウォールを設定するiptablesについてお伝えする。
目次
ファイアウォールとは?
一般的には「防火壁」という意味だ。火事の炎を遮断して延焼を防ぐことになぞらえている。
コンピュータネットワーク関連では、ホスト自身やネットワークとネットワークの間に設置され、許可されてないパケットなどを遮断しセキュリティ向上を図るものだ。
最も一般的な例を挙げるとWindowsファイアウォールや、ルーターに内蔵されているパケットフィルタなどである。
今回Linuxで一般的に使われているパケットフィルタiptablesを紹介する。
iptablesとは?
iptablesとは一般的なLinuxに搭載されているパケットフィルタの事だ。
パケットとは、スマホのパケット通信費などでよく出てくるように、ネットワーク上を流れるデータの事だ。パケットフィルタとは、このパケットを選別して、通すものと通さないものを分けるということを意味している。
iptablesは商用製品に匹敵する、とても高機能かつ高性能なパケットフィルタだ。無料で使えることを感謝しよう。
サーバ自身を守ることはもちろん、パケット転送などにも対応しているため、ネットワークアダプタを二つ搭載したマシンの上で動作させパケット転送制御を行うことで、ネットワーク型ファイアウォールとしても使用可能である。
Snortなどと組み合わせるとUTM(統合脅威管理システム)としても使用できる。またパケットの状態を把握するステートフル機能やログ機能を備えている。
なにやら難しくなってきたが、このページではiptablesの基礎を解説してゆく。
iptables の設定確認と解説
通常iptablesコマンドを実行すると、自動的にロードされ使用可能になる。
設定を適応したフィルタルールを表示するには以下のコマンドを打つ。「-L」オプションを付けて実行すると、現在設定されているポリシーとここのルールのリストが表示される。
以降の作業はroot権限で行うこと。
iptables -L
下記のような表示が出るはずだ。
1 2 3 4 5 6 7 8 9 10 11 |
Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED LOG all -- anywhere anywhere LOG level warning prefix "drop_packet: " Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination |
今回のはあくまで一例で、すでにある程度設定が施されているときの表示を出している。
同じ設定を施すスクリプトをこのページの最後に記述してある。興味がある方は参考にしてみてほしい。
これを読めるようにして、その設定がかけるようになるのがこのページのゴールだ。
一つずつ説明していこう。
Chain
ネットワークから受け取ったパケットは、次のような手順で処理される。
このINPUT、OUTPUT、FORWARDという3つの経路に対して、それぞれ通過させるパケットのルールを設定する。この3つの経路を「チェイン」と呼ぶ。
上記の例でも3つ確認できるはずだ。
- Chain INPUT (policy DROP)
- Chain FORWARD (policy DROP)
- Chain OUTPUT (policy ACCEPT)
これらはそれぞれ基本ポリシーだ。どのルールにも当てはまらない場合、これらが基本設定ですよ、というルールになっている。
policy DROPとなっているのはルールが指定されていない場合には、すべて拒否するという意味になる。ACCEPTとしてある場合、全て許可だ。
それぞれの項目
Chainの下にある次の部分がルールだ。
1 |
target prot opt source destination |
上の例だと、Chain input以外、なにも設定が入っていない。次のような意味になる
target
targetに関しては許可するのか拒否するのかログをとるのか?など。条件にマッチするパケットの処理の行き先をどうしますか?という意味だ。
prot
protはプロトコルの種類になる。
opt
optはオプションが記述される。(今回の例では記述されていない)
source
sourceはどこから来たのか?
destination
destination はどこへ向うか?
最後
最後は備考ととらえていいだろう。
ALL?
だが下記の設定を見ると、ACCEPT allとなっている部分が2箇所もあり、全部セキュリティなしで通ってしまいそうだ。
1 2 3 4 |
target prot opt source destination ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED LOG all -- anywhere anywhere LOG level warning prefix "drop_packet: " |
そこで以下の結果を見てほしい。
-v オプションを付けるとより詳細な情報が出力される。「-t filter」はつけてもつけなくてもいい。コマンドのデフォルト設定と同じだ。
iptables -L -v -t filter
1 2 3 4 5 6 7 8 9 10 11 |
Chain INPUT (policy DROP 532 packets, 38457 bytes) pkts bytes target prot opt in out source destination 4 240 ACCEPT all -- lo any anywhere anywhere 180K 320M ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED 532 38457 LOG all -- any any anywhere anywhere LOG level warning prefix "drop_packet: " Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 139K packets, 14M bytes) pkts bytes target prot opt in out source destination |
下記の部分に注目してほしい。
1 2 |
pkts bytes target prot opt in out source destination 4 240 ACCEPT all -- lo any anywhere anywhere |
とある。
loはローカルループバックを意味している。自分自身ということだ。自分自身のアクセスは全部通しますよ、としないとアクセスができなくなってしまうので、この設定になっている。
iptablesの適応順番
iptablesは上から順番にルールを適応する。例えば、下記のこの項目を真っ先に設定すると全てのパケットログがとられてしまうので気をつける必要がある。
1 |
LOG all -- anywhere anywhere LOG level warning prefix "drop_packet: " |
iptablesファイアウォールの設定方法
最も一般的なフィルタリングテーブル
何も設定されていないときは次のようなフィルターが表示される。
iptables -L
1 2 3 4 5 6 7 8 |
Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination |
見ての通り何も設定されていない。また、すべてACCEPTになっているのがわかるだろう。
これに対して設定を追加していくのだが、基本的には次のような設定にする。
チェイン | ターゲット(どうするか?) |
INPUT | DROP |
FOWARD | DROP |
OUTPUT | ACCETP |
これは「全ての通信を遮断した上で必要な通信だけ許可する」のがセキュリティ上の基本だからだ。
クライアントマシンではChain FORWARD (policy ACCEPT)は使用しないことが多い、なのでpolicyをDROPにすることが殆どだろう。ネットワーク仲介役のルーターなどを構築するときはChain FORWARDに関して調節する必要がある。
またサーバなどは決めうちしたサービスだけを提供するため、出入りする情報の種類が限られている。そして、入ってくる情報だけでなく、出ていく情報も制御するためにChain OUTPUT (policy ACCEPT)の項目もDROPに設定し、適切な設定を施すことも多くなってきている。
「INPUT」「OUTPUT」「FORWARD」が基本だが、POSTROUTING、PREROUTINGなどの項目もある。覚えておく必要はないが、3種類以外も設定できるというのは知っておいて損はない。
iptablesの書式
iptablesの書式は次の通りだ。
iptables 〈テーブル〉〈コマンド〉 〈マッチ〉〈ターゲット〉
設定例を上げると
iptables -t filter -A INPUT -p tcp -j ACCEPT
となる。このとき-t filterを省略した場合デフォルトとしてfilterテーブルが適応される。つまり
iptables -A INPUT -p tcp -j ACCEPT
は同じである。
INPUTに対してプロトコルがtcpのものを許可する設定だ。
主なテーブルとコマンド
すべてではないが、よく使うもの、重要なものをご紹介していこう。
テーブルに関して
- filter 一般的なフィルタテーブル
- nat マスカレードなどを記述するテーブル
- mangle このテーブルを使うとQuality of Serviceなどが設定可能だ。
チェインに関して
- INPUT 入ってくるパケットに関して
- OUTPUT 出てゆくパケットに関して
- FORWARD パケットの転送
- PREROUTING 受信時にアドレスを変換
- POSTROUTING 送信時にアドレスを変換
ターゲットに関して
- ACCEPT パケットを許可
- DROP パケットを拒否
- REJECT パケットを拒否して制御メッセージを送信
- LOG パケットのログを記録
コマンドに関して
- -F 何も指定されてない場合すべてのフィルタルールを削除する。
- -X 何も指定されてない場合デフォルト以外のすべてのチェインを削除する。
- -A ルールの追加
- -D ルールの削除
- -P ポリシーの指定
ほかユーザ定義チェインを作成する-Nなどがある。
そのほかパラメータ
- -s パケットの送信元
- -d パケットの送信先
- -p パケットのプロトコル指定
- -i 入ってくるインターフェイス指定 eth0など
- -o 出てゆくインターフェイス指定
- -j ターゲットの指定
拡張パラメータ
上記のパラメータのほかに詳細な拡張パラメータが多数存在する、主によく使われるものを列挙する。
-m state –state について
- NEW 新しい接続
- ESTABLEISHED すでに許可されている接続
- RELATED 新しくかつ許可された接続
- INVALID 無効な接続
これらはカンマで複数指定可能だ。
-p について
- --sport 送信側のポート指定
- --dport 受信側のポート指定
- --tcp-flags SYN、ACK、FINなどカンマで区切り複数指定可能
スクリプトによるiptablesの設定例
ざっとマニュアル的な説明をしたがここで実際に設定例を挙げてみる。
iptablesの設定を行なうときiptablesコマンドを頻繁に打ちこむことになる。ミスも起こりやすくなるし、視認性も悪い。
なのでスクリプトを組んでまとめて設定するほうが一般的だ。
以下bashシェルスクリプトだ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#!/bin/bash # 設定をクリア iptables -F iptables -X # ポリシー設定 iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # ほかACCEPTやDROPなどユーザによる設定 #ローカルループバックの接続を許可する。 iptables -A INPUT -i lo -j ACCEPT #こちらから求めたパケットは許可する。 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #それ以外はログを残す。 iptables -A INPUT -j LOG --log-prefix "drop_packet:" |
以上のようにiptablesコマンドを上から順に実行するスクリプトである。
これをfirewall.shとして保存chmod 700 firewall.shとして実行権限を付与./firewall.shとするとフィルタが適応される。
なお実行に際してroot権限で行うことと、sshで接続している場合、sshを許可する設定記述することに気をつけていただきたい。
今回sshを許可する場合
iptables -A INPUT -m state NEW -m tcp -p tcp -dport 22 -j ACCEPT
とする。
今回の設定はこちらからローカルループバックと許可したパケット以外は拒否し、ログを残すという、単純な設定だ。
設定保存
iptablesの設定適応方法はディストリビューションによってことなる。
一般的には、
- iptables-saveコマンドを使い、標準出力されるものをリダイレクトで保存
- iptables-restoreコマンドを使い、リダイレクトから読み込み
となる。
例としては
(以下root権限での実行)
iptables-save > /etc/myiptables-set
で保存。
iptables-restore < /etc/myiptables-set
で復元。
これを起動時にスクリプトとして起動するように設定するパターンが多い。
まとめ
このページではLinuxのファイアウォールとして、iptables設定の確認および設定の方法についてお伝えしてきた。
iptablesはLinuxを活用する上で必須のコマンドだ。理解して使いこなせるようにしておこう。
誤記:protがpropになっています
こちらご指摘箇所修正いたしました。
教えていただきありがとうございます。
引き続きご愛読の程よろしくお願いいたします。