iptablesの設定

さくらのVPSを使っています。

さくらのVPSだとデフォルトでiptablesがフルオープンになっているらしいという話なので、これはまずいのではと思い、改めてiptablesについて勉強したことをまとめてみました。

環境:CentOS 6.4

iptablesとは

iptablesとはパケットフィルタリングやNAT(ネットワークアドレス変換)の機能を持ち、ファイアウォールやルータの機能として利用されます。

iptablesはテーブルにチェインを定義して構成します。
テーブルはフィルタリングの対象を示し、チェインはフィルタリングを行う実行条件を示します。

テーブル機能
filterパケットの出入り自体を制御する
パケットフィルタリング
natパケットの中身を書き換えることを制御する
IPアドレスの変換

テーブルには下記表の様ににチェインが指定できます。

テーブルチェイン実行条件
filterINPUTパケットが入ってくるときに利用する
OUTPUTパケットが出ていくときに利用する
FORWARDインターフェース間をまたぐときに利用する
natPREROUTINGパケットが入ってくるときに利用(ルーティング前)
POSTROUTINGパケットが出ていくときに利用(ルーティング後、FORWARDの後)

図解すると以下の様な感じです。

iptables

チェインにはルールが設定できます。ルールにはチェインに入ってきたパケットの条件と処理のターゲットを指定します。ターゲットにはたくさんの種類がありますが、代表的なものには以下のものがあります。

ターゲット処理
ACCEPTパケットを受け取る
DROPパケットを破棄する
REJECTパケットを破棄し、エラーパケットを返す
DNAT送信先IPアドレスを変更する
MASQUERADE複数の送信元IPアドレスを変更(マスカレード)する
SNAT送信元IPアドレスを変更する
LOGログを出力する

テーブルチェインでどのタイミングで設定し、ルールでどのパケットをどのように処理をするのかを指定するのがiptablesです。

実際にiptablesを設定してみる

では実際にiptablesを設定してみましょう。iptablesを設定するには「iptables」コマンドを使用します。

iptables [-t table] COMMAND [chain] [option]
構文 オプション 詳細
[-t table] - テーブル名を指定します。省略した場合は「filter」が指定されたことになります。
COMMAND -A, --append チェイン ルール詳細
選択されたチェインにルールを追加します。
-D, --delete チェイン ルール詳細,ルール番号
チェインからルール詳細もしくはルール番号を指定してルールを削除します。
-I, --insert チェイン [ルール番号] ルール詳細
ルール番号を指定してチェインにルールを追加します。ルール番号が1の場合はチェインの先頭に追加されます。ルール番号を省略した場合はチェインの先頭に追加されます。
-R, --replace チェイン ルール番号 ルールの詳細
選択されたチェインでルールを置換します。
-L, --list [チェイン]
選択されたチェインのルールを表示します。チェインが省略された場合はすべてのチェインのルールを一覧表示します。
-F, --flush [チェイン]
選択されたチェインの内容を消去します。チェインが省略された場合はすべてのチェインの内容が消去されます。
-Z, --zero [チェイン]
すべてのチェインのパケットカウンタとバイトカウンタをゼロにします。
-N, --new-chain チェイン
指定した名前でユーザー定義チェインを作成します。
-X, --delete-chain [チェイン]
指定したユーザー定義チェインを削除します。チェインを参照しているルールが存在すれば削除できません。チェインが省略された場合は削除可能なチェインがすべて削除されます。
-P, --policy チェイン ターゲット
チェインのポリシーを指定したターゲットに設定します。
-E, --rename-chain 旧チェイン名 新チェイン名
ユーザー定義チェインを指定した名前に変更します。
-h ヘルプを表示します。
[chain]
チェイン
- コマンドの内容によって適時チェインを指定します。
[option]
ルール詳細
-p, --protocol [!] protocol
プロトコルを指定します。 tcp,udp,icmp,allのうちいずれか一つ、もしくは数字で指定いします。
-s, --source [!] address [/mask ]
送信元をIPアドレスもしくはホスト名で指定します。
-d, --destination [!] address [/mask]
送信先をIPアドレスもしくはホスト名で指定します。
-j, --jump target
ルールのターゲットを指定します。
-i, --in-interface [!] name
パケットを受信するインターフェース名を指定します。INPUT,FORWARD,PREROUTINGチェインが対象になります。
-o, --out-interface [!] name
パケットを送信するインターフェース名を指定します。FORWARD,OUTPUT,POSTROUTINGチェインが対象になります。
--source-port,--sport [!]port[:port]
送信元のポート番号を指定します。「port:port」と指定することで範囲指定できます。このオプションは”–protocol tcp”が指定されたときに呼び出される拡張モジュールです。
--destination-port,
--dport
[!]port[:port]
宛先のポート番号を指定します。「port:port」と指定することで範囲指定できます。このオプションは”–protocol tcp”が指定されたときに呼び出される拡張モジュールです。

以上が基本的なiptablesコマンドの説明です。本当はもっとオプションがあるのですが、今は何ができるのかさえ押さえておけば大丈夫です。

では早速下記コマンドで現在のiptablesの設定を確認します。

# iptables -t filter -L
実行結果
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

この結果からfilterテーブルにはINPUT・FORWARD・OUTPUTが定義されている事がわかります。しかし、どのチェインにもルールが設定されていませんので、ガラ空き状態です。
そこでいったんssh(ポート番号:22)を許可するルールを追加します。

# iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
# iptables -t filter -L
実行結果
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT) target prot opt source destination

INPUTチェインの箇所に一行追加されました。これでsshからのアクセスが許可されたのですが、他のアクセスが制限されていませんので、依然状況は変わらずです。
次に他のアクセスを拒否する設定を行います。

# iptables -t filter -A INPUT -j REJECT
# iptables -t filter -L
実行結果
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

これでssh以外の接続は拒否されるはずです。httpやftp等のサービスが接続不可能になっている事を確認してください。
iptablesは上から順番に評価されますので、sshの接続であればそのままACCEPTになり、それ以外の接続は二つ目のルールが適用されて、REJECTされてしまうわけです。
しかし、このまま他のポートの許可ルールを追加しても二つ目のルールでREJECTされてしまいます。
そういう場合は -Iコマンドでルールを追加しましょう。

# iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT
# iptables -t filter -I INPUT -p tcp --dport 20:21 -j ACCEPT
実行結果
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp dpts:ftp-data:ftp
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

これでftp・http・ssh以外の接続は拒否することができました。
ポート番号を変更している場合は設定に応じて変更してください。特にsshを間違えて拒否してしまうとリモートからコマンド操作ができなくなってしまいますので注意しましょう。

iptablesの設定の保存

たとえば苦労してiptableの設定も、サーバーを再起動してしまったりすると初期化されてしまいます。
しかしiptablesの設定は下記コマンドで保存しておくことができます。

# service iptables save

iptablesの内容は「/etc/sysconfig/iptables」に保存されます。

# view /etc/sysconfig/iptables
ファイル内容

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [311:49515]
-A INPUT -p tcp -m tcp --dport 20:21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
COMMIT

「/etc/sysconfig/iptables」は再起動後にiptablesが立ち上がる際に読み込まれて有効になります。
また、下記コマンドで保存した内容を再読み込みすることも可能です。

/etc/init.d/iptables restart

ipv6無効化

ちなみにip6tablesというのもフルオープンになっているのですが、こちらは調べる気力が尽きたのでipv6自体を無効にする方法で対応したいと思います。

# vi /etc/sysctl.conf
下記行追加
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

sysctl.confの再読み込み
# sysctl -p

ネットワーク再起動(一応)
# /etc/init.d/network restart

ip6tables停止
# /etc/init.d/ip6tables stop 
自動起動off
# chkconfig ip6tables off 

参考サイト

http://fnya.cocolog-nifty.com/blog/2013/02/vps-iptables-0c.html
http://murayama.hatenablog.com/entry/20100206/1265444193
http://kazmax.zpp.jp/cmd/i/iptables.8.html
有難うございます。

コメントを残す