iptablesの設定内容確認と設定例

公開日:2013/03/19 更新日:2013/03/19
iptablesの設定内容確認と設定例のサムネイル

iptablesの設定内容確認

iptablesの設定を行う前に現状の設定内容を確認するために下記のコマンドを実行します。

iptables --list

これを実行すると現状のフィルタリングルールを確認することができ、下記のように表示されると思います。(下記の表示結果はubuntu12.04の場合です)

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
target      port opt source      destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
target      port opt source      destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
target      port opt source      destination

上記のような結果が表示された場合は、policy ACCEPTと書かれていることから、全てのパケットに対して入ってくること、出ていくことが許可されている状態になります。なお、もしすでになにかしらルールが設定されている場合は、下記のコマンドを実行することで全てのルールを初期化(全削除)することができます。

iptables --flush

iptablesにルールを追加してそのルールの効果を確認する上では、一度初期化して随時ルールを追加していくと検証しやすいと思います。ただし、当然ながらルールを初期化すると全てのパケットを受け入れることになるためセキュリティを十分考慮した環境で行って下さい。ちなみに、iptablesの設定内容をより細かく確認したい場合は下記のコマンドを実行すると良いかもしれません。

iptables -nvL

上記のコマンドは、--numeric--verbose--listオプションそれぞれを略記形式で実行したコマンドであり、下記が実行結果になります。--listだけで表示した結果に比べて、pktsbytesinoutが追加表示されることが分かります。

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target      port opt in      out      source      destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target      port opt in      out      source      destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target      port opt in      out      source      destination

--numericは、数値で表示することを指示するオプションであり、--verboseはインタフェース、ルールオプションを表示することを指示するオプションです。詳細は下記URLのiptablesチュートリアルを参照して下さい。

iptablseチュートリアル

iptablesの設定例

以下にiptablesの簡単な設定例をいくつか載せます。

例1:特定のインタフェースに入ってくるパケットを全て廃棄する

eth0に入ってくるパケットを全て廃棄します。

iptables --table filter --append INPUT --in-interface eth0 --jump DROP

上記のコマンドは各コマンドの略記を使うことで下記のようにも表せます。

iptables -t filter -A INPUT -i eth0 -j DROP

以降では全て略記を使います。ちなみに、-tを使わずテーブルを指定しなかった場合は、デフォルトでfilterテーブルが指定されることになります。なので、filterテーブルを指定する場合は-t filterは無くても同じです。

例2:ホストマシンからの通信に対する相手の応答通信を許可する

eth0に入ってくるパケットのうち、ホストマシンに対する応答通信であるパケットは通過を許可します。 --match state --state ESTABLISHED,RELATEDの部分によって応答通信であるパケットに限定しています。 --matchはモジュール名を指定してモジュールを使うためのオプションです。--match stateにより、stateモジュールの使用を指定しています。stateモジュールを使用してESTABLISSED、RELATEDを指定することで、応答パケットに限定しています。

iptables -t filter -A INPUT -i eth0 --match state --state ESTABLISHED,RELATED -j ACCEPT

※iptablesの注意点

iptablesではルールに優先順位が存在します。具体的には、ルールは基本的にルールを追加した順に高い優先順位がつけられ、iptablesでは高い優先順位のルールから順番に処理されていきます。例えば、下記のコマンドを順番に実行してみます。

itables -t filhljsA INPUT -i eth0 -j DROP
iptables -t filter -A INPUT -i eth0 --match state --state ESTABLISHED,RELATED -j ACCEPT

実行後、iptables --listによってルール内容を確認すると、下記のようになります。

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
target      port opt source      destination
DROP        all  --  anywhere    anywhere
ACCEPT      all  --  anywhere    anywhere       state RELATED,ESTABLISHED

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
target      port opt source      destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
target      port opt source      destination

iptablesでは各チェインの一番上のルールから順番に適用していきます。そして上記の場合は、INPUTチェインの一番上のルールがDROPでありかつその対象が全パケットであるため、次のACCEPTが適用されることはありません。すなわち、iptablesでは、ルールの順番が重要であり、パケットの対象範囲が小さいルールから順番に適用されるようルールを記述することが重要になります。なお、ルールの順番は追加した順番と同じになりますが、--replace--insertなどのルール操作コマンドを使うことでルールの順番を操作できます。(iptablesの概要メモを参照)

例3:特定の送信元IPアドレスのパケットの宛先IPアドレスと宛先ポート番号を変換する

送信元IPアドレスが192.168.101.0/24でありかつ宛先ポート番号が80番であるパケットの宛先IPアドレスを192.168.101.101、宛先ポート番号を3128番に変換する

iptables -t nat -A PREROUTING -s 192.168.101.0/24 -p tcp --dport 80 -j DNAT --to 192.168.101.101:3128

例4:特定のインタフェースに入ってきたパケットの宛先ポート番号を変換する

インタフェースeth0に入ってきたパケットの内、宛先ポート番号が80番であるパケットの宛先ポート番号を3128番に変換する

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

iptablesの設定保存方法

これまでに設定したルールはiptablesが動作するホストマシンを再起動すると消えて無効になってしまいます。そこで、再起動後も設定したルールを継続して有効にするためにiptables-saveiptables-restoreコマンドを使う方法があります。 設定したルールを任意のファイルに書き出すコマンドとしてiptables-saveがあり、下記のようにファイル名を指定して使います。

iptables-save > ファイル名

iptables-saveによって設定を書き出しておき、ホストマシンを再起動後、書き出しておいたファイルを下記のコマンドにより再読み込みすると、書き出されたルールが改めて設定されます。

iptables-restore < ファイル名

2013/10/7 追記

良く使うiptablesの運用管理方法2つをメモにiptablesの運用管理方法として、iptables-save、iptables-restoreを使った方法とシェルスクリプトを使った方法の2つをメモしました。iptablesの運用管理についてはこちらの方が情報が多いと思うので、良ければご参照下さい。

開発アプリ

nanolog.app

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