良く使うiptablesの運用管理方法2つをメモ

公開日:2013/10/06 更新日:2013/10/06
良く使うiptablesの運用管理方法2つをメモのサムネイル

Linuxをサーバとして使う場合、iptablesにルールを追加したり、削除したりして再設定する必要が出てくる場面が多いと思います。そしてこのような場面にiptablesのルールを自由に編集し、さらに編集したルールを自動設定させてiptablesを運用管理する方法として、iptables-saveとiptables-restoreを使う方法と、シェルスクリプトを使う方法の2つを良く使います。ここでは、この2つの運用管理方法についてメモします。 なお、以降のコマンドは全てroot権限で行います。また、実行環境はubuntu12.04になります。

iptables-save、iptables-restoreを使った運用管理方法

iptablesには、現状のルール設定をファイルに書き出す「iptables-save」と、ファイルに書き込まれたルールを読み込んでiptablesにルールを設定する「iptables-restore」というコマンドが用意されています。よって、まず「iptables-save」で現状のルール設定をファイルに書き出し(以降では、書き出したファイルをルールファイルと呼ぶことにします。)、そのルールファイルにルールを書き加えたり、削除したりして編集したルールファイルを「iptables-restore」で読み込むことで、iptablesのルールを編集することができます。さらにシェルスクリプトを使うことで編集したルールをPC起動と同時に自動設定させることができます。まとめると以下のような手順になります。

  1. iptables-saveで現状のルールをルールファイルとして書き出す
  2. ルールファイルを編集する
  3. 編集したルールファイルをiptables-restoreで読み込む
  4. iptablesのルールをPC起動と同時に自動設定させる
以降で各手順についてメモします。

1. iptables-saveで現状のルールをルールファイルとして書き出す

下記のようにiptables-saveとLinuxのリダイレクト「>」を組み合わせて出力先のファイルを指定し、ルール設定を書き出し保存することができます。以下の場合は、現在のディレクトリに「iptables_rule」というルールファイルが作成されます。Linuxのリダイレクトについては下に参考サイトを載せておきます。

$ iptables-save > iptables_rule

書き出しルールファイルの中身については後述します。なお、書き出したルールファイルを編集する前に、ルールファイルのコピーを取っておくことをお勧めします。コピーがあれば、間違って編集してしまった場合などに焦らずに済みます。よって私は以下のように、元ファイルに「.org」を付けてコピーを保存するようにしています。

$ cp iptables_rule iptables_rule.org

次はルールファイルを編集します。

参考サイト ITpro - リダイレクトとは

2. ルールファイルを編集する

iptables-saveでルール設定を書き出したルールファイル(iptables_rule)の中身は例えば以下のような内容になります。(以下のルールファイルの内容は、あくまで例として挙げるために用意したものであり、実際に運用して使える内容ではないのでそのまま使わないで下さい。)

# Generated by iptables-save v1.4.10 on Sat Sep 28 2013
*nat
:PREROUTING ACCEPT [148:13875]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [56:3126]
:POSTROUTING ACCEPT [47:2665]

-A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535 
-A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j MASQUERADE 
COMMIT
# Completed on Sat Sep 28 00:00:00 2013

# Generated by iptables-save v1.4.10 on Sat Sep 28 2013
*mangle
:PREROUTING ACCEPT [7559:10714910]
:INPUT ACCEPT [7559:10714910]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [4256:211987]
:POSTROUTING ACCEPT [4230:208749]
-A POSTROUTING -o virbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill 
COMMIT
# Completed on Sat Sep 28 00:00:00 2013

# Generated by iptables-save v1.4.10 on Sat Sep 28 2013
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [5:220]
-A INPUT -i eth0 -p udp -m udp --dport 53 -j ACCEPT 
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A FORWARD -d 192.168.1.0/24 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A FORWARD -s 192.168.1.0/24 -i eth0 -j ACCEPT 
-A OUTPUT -o lo -j ACCEPT 
COMMIT
# Completed on Sat Sep 28 00:00:00 2013

このファイルを見ると、「*nat」、「*mangle」、「*filter」とiptablesの3つのテーブル名が記述された行があり、この行以降に各フィルターのルールが記述されています。例えば、filterに関するルールを抽出すると、以下のようになっています。

# Generated by iptables-save v1.4.10 on Sat Sep 28 18:48:32 2013
*filter
:INPUT DROP [5:220]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:20]
-A INPUT -i eth0 -p udp -m udp --dport 53 -j ACCEPT 
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A FORWARD -d 192.168.1.0/24 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A FORWARD -s 192.168.1.0/24 -i eth0 -j ACCEPT 
-A OUTPUT -o lo -j ACCEPT 
COMMIT
# Completed on Sat Sep 28 00:00:00 2013

各行について順番に説明すると、以下のようになります。

  • 1行目: これはコメント部分になります。「#」から始まる部分は全てコメントになります。ここでは、iptables-saveによってこのファイルが作成された日時が記述されています
  • 2行目: 「*」にフィルター名が続き、ここから各フィルターに関するルールが記述されることを意味しています。ここでは、filterに関するルールの記述がここから始まることを意味しています。
  • 3行目-5行目: 「:チェイン名 ポリシー [バイトカウンタ:パケットカウンタ]」という形式で記述されています。バイトカウンタ、パケットカウンタはそれぞれ各チェインのルールに合致したバイト数、パケット数を表しています。例えば、上記の「:INPUT DROP [5:220]」は、INPUTチェインのポリシーはDROP(破棄)であり、そのバイトカウンタの値は5、パケットカウンタの値は220になります。
  • 6行目-10行目: iptablesのルールが記述されています。INPUT、FORWARD、OUTPUTの各チェインに関するルールが複数記述されていることが分かります。
  • 11行目: 実行命令になります
  • 12行目: 1行目と同様に実行日時です
以上がfilterに関するルールの記述部分に関する説明になります。そして、これはnat、mangleの各フィルターについても全く同じ形式で記述されています。 よって、iptables-saveで作成したルールファイル編集する場合は、各フィルター毎に記述されたルール部分(上記のfilter部分に関しては6行目ー10行目が該当)に新しいルールを追加、削除、編集することになります。ただし、新しいルールを追加する場合、そのルールを記述する場所、すなわちルールの順番が意味を持つので気をつけて下さい。ルールの順番が持つ意味については、iptablesの設定内容確認と設定例が参考になるかもしれませんので参照下さい。

ルールファイルの編集が完了したら、後はルールファイルをiptables-restoreで読み込めばiptablesのルール編集および設定は完了です。

3. 編集したルールファイルをiptables-restoreで読み込む

ルールファイルの編集が終わったら、後はiptables-restoreを使ってルールファイルをiptablesに読み込ませてルールを設定します。iptables-restoreは、以下のようにiptables-saveと同様、Linuxのリダイレクトを使用して、指定したルールファイルからルールを読み込んで設定します。ただし、iptables-saveの場合とはリダイレクトの向きが異なるので注意して下さい。

$ iptables-restore < iptables_rule

なお、iptables-restoreによってルールを設定しても、ubuntuを再起動すると、設定する前の状態に戻ってしまします。したがって、自分が作成したルールファイル通りのルールをubuntu起動時に自動設定させる必要があります。そしてそのためにはシェルスクリプトを利用します。そこで自動設定させる方法を次にメモします。

4. iptablesのルールをPC起動と同時に自動設定させる

以上でiptablesのルール編集と設定は完了ですが、自分が作成したルールファイル通りのルールをiptablesにubuntu起動時に自動設定させる必要があります。そしてそのためにはシェルスクリプトを利用します。具体的には、以下を記述したシェルスクリプト(ファイル名を「set_iptables.sh」とします)を作成して、そのシェルスクリプトを「/etc/network/if-pre-up.d/」に置きます。「if-pre-up.d」ディレクトリは、ubuntuが起動と同時に実行するシェルスクリプトを置く場所です。

#!/bin/sh
/sbin/iptables-restore < /etc/iptables_rule
exit 0

そしてset_iptables.shに実行権限を与えるために以下のコマンドを実行します。

$ chmod +x set_iptables.sh

あとはubuntuの起動と同時に自動設定されます。ただし、すでにfirestarterなどのファイアウォールソフトウェアが動作している場合は注意が必要です。この場合は、上記の処理によってiptablesへルールが自動設定されても、iptablesのルールが上書きされてしまい、結局firestarterのルールが設定されることになります。よって、上記の作業によってiptablesnの自動起動を行う場合は、firestarterが自動起動しないようにするか、アンインストールする必要があります。

以上がiptables-saveとiptables-restoreを使ってiptablesのルールを自由に編集し、さらに編集したルールをubuntuの起動と同時に自動設定させて運用する方法になります。

シェルスクリプトを使った運用管理方法

シェルスクリプトは、ターミナル上で実行するコマンドを複数まとめて記述したものであり、シェルスクリプトを実行することで記述された複数のコマンドを一度に実行できます。よって、iptablesのコマンドをシェルスクリプトとして記述して実行することで、iptablesのルールを設定することができます。シェルスクリプトの中身は、基本的にはiptablesのコマンドと同じものが記述されているだけになります。例えば、iptablesのルールを設定するシェルスクリプト (ファイル名を「iptables_script.sh」とします。) の中身は以下のようになります。(以下のシェルスクリプトはあくまで例として挙げるために用意したものであり、実際に運用して使える内容ではないのでそのまま使わないで下さい。実際に運用できるシェルスクリプトとして参考にしたサイトを後に載せていますので、そちらを参考にしてみると良いと思います。)

#!/bin/sh

# iptablesのパスを指定
PATH=/sbin:/usr/sbin:/bin:/usr/bin

# ポート番号の定義
# 以下のように適当な名前とポート番号を定義します
SSH=22

# ネットワークの定義
# 以下のようにIPアドレス範囲を指定してネットワークを定義します
LAN="192.168.1.0/24" 

# iptablesのルールを全て削除
iptables -F

# INPUT、FORWARDチェインのポリシーをDROP、OUTPUTのポリシーをACCEPTに設定
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD DROP

# ローカルホストへの通信は許可
# lo はローカルループバックのことで自分自身を意味します。
iptables -A INPUT -i lo -j ACCEPT

# ローカルネットワーク
iptables -A INPUT -p tcp -s $LAN -j ACCEPT

# 応答通信は許可
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

# ブロードキャストは破棄
iptables -A INPUT -d 192.168.1.255 -j DROP

# ssh (ポート番号22番)は許可
iptables -A INPUT -p tcp -s $LIMITED_LOCAL_NET -m multiport --dports $SSH -j ACCEPT 

一部だけですが、シェルスクリプトとしては以上のようにiptablesのコマンドがひたすら羅列するだけになります。スクリプトを使うと、ポート番号やネットワークの定義ができるため管理が楽になります。また、上のシェルスクリプトにはありませんが、if文を使用して条件分岐して処理させることもできます。このように、シェルスクリプトを使うとかなり自由度の高いルール設定を行うことができます。注意点としては、上でも述べたように、iptablesのルールの順番が意味を持つので注意して下さい。

なお、上記のiptablesのコマンドについて不明な点が多い場合は、iptablesの概要メモが参考になるかもしれませんので参照してみて下さい。

シェルスクリプトを作成したら、次にこのシェルスクリプトに以下のコマンドによって実行権限を与えます。

chmod +x iptables_rule.sh

そして実行権限を付与した後で以下のコマンドによってシェルスクリプトを実行すれば、シェルスクリプト内に記述されたルールがiptablesに設定されます。

./iptables_rule.sh

また、iptablesへのルールをPC起動と同時に設定するために、すでに説明したiptabes-save、iptables-restoreを使った方法と同様に、作成したシェルスクリプトを/etc/network/if-pre-up.dに置きます。これで作成したシェルスクリプトが自動実行されてiptablesにルールが設定されます。ただし、上でも説明したように他のファイアウォールソフトウェアが動作している場合は注意が必要です。

実際に運用するシェルスクリプトを作成する際に参考になったサイトを以下に載せておきます。大変参考になりました。ありがとうございます。

参考サイト Qiita-俺史上最強のiptablesをさらす

まとめ

iptablesのルールを編集して自動設定させて運用管理する方法2つをメモしました。個人的には、基本的にはシェルスクリプトを使った方法でiptablesを運用し、試したいルールがある場合などは、iptables-save、iptables-restoreを使って少しルールを編集してみるといったように使い分けるのが良いのかなと思っています。iptablesはLinuxをサーバ用途で使う場合には必須であり、まだまだ勉強不足な点が多いので少しづつ勉強してまたメモしていきたいと思います。

関連記事

開発アプリ

nanolog.app

毎日の小さな出来事をなんでも記録して、ログとして残すためのライフログアプリです。