iptablesでパケットフィルタリングするための設定

iptablesとはパケットフィルタリング, IPアドレスの変換, IPヘッダの書き換えの機能をもつソフトウェア. 設定ファイルでは機能(テーブル)毎に, 対象(チェイン)のパケットに対する処理(ルール)を定義していく.

このページは, 以下のページを大いに参考にして書かれている.


目次

用語の説明(テーブル, チェイン, ルール)はざっと眺め, 例の解説をメインに読むのが分かりやすいと思う.

  1. テーブル
  2. チェイン
  3. ルール
  4. その他

テーブル

iptablesの機能毎にテーブル名が定義されている. 設定ファイルではそれぞれのテーブル名の下に設定を記述していく.

機能 テーブル名
パケットフィルタリング *filter
IPアドレスの変換 *nat
IPヘッダの書き換え *mangle

チェイン

対象のパケット毎にルールをまとめたもの. 該当するチェインのみ適用される. filterテーブルで使用するのは下の3つ.

チェイン 対象
INPUT 送信先がローカルホストなパケット
OUTPUT 送信元がローカルホストなパケット
FORWARD ローカルホストを経由するパケット

※ 他にもPREROUTING, POSTROUTINGがある.


ルール

特定のIPアドレスやプロトコルを条件に, パケットに対して適用する処理.

基本書式
-A チェイン名 マッチング条件 -j ターゲット

ここでターゲットとはパケットをどう処理するかの指定で, ACCEPT(許可), DROP(破棄), REJECT(拒否), ユーザ定義チェーンなどが記述される.

マッチング条件の例
指定子 別名 条件 備考
-i –in-interface 受信インターフェイス INPUT/FORWARDチェインで使用
-o –out-interface 送信インターフェイス OUTPUT/FORWARDチェインで使用
-p –protocol プロトコルまたはプロトコル番号 指定できるプロトコルはtcp/udp/icmp/all
-s –source, –src 送信元アドレス “192.168.0.1″,”192.168.0.0/24″,”192.168.0.0/255.255.255.0″のように指定
-d –destination, –dst 送信先アドレス “192.168.0.1″,”192.168.0.0/24″,”192.168.0.0/255.255.255.0″のように指定
拡張されたマッチングの例
指定子 条件 備考
-m tcp –sport TCP送信元ポート “0:1023″のように指定
-m tcp –dport TCP送信先ポート “0:1023″のように指定
-m udp –sport UDP送信元ポート “0:1023″のように指定
-m udp –dport UDP送信先ポート “0:1023″のように指定
-m state –state 接続状態 NEW/ESTABLISHED/RELATED/INVALID
–icmp-type ICMPタイプ 指定できるICMPタイプは”iptables -p icmp -h”で確認

/etc/sysconfig/iptablesに記述する.

# テーブル名
*filter

# チェインの定義
# :チェイン名 デフォルトポリシー [パケットカウント:バイトカウント]
# デフォルトポリシーがACCEPTだと, ルールに明示されないパケットは許可. DROPだと破棄.
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# ユーザ定義チェイン
:RH-Firewall-1-INPUT - [0:0]

# ローカルホスト宛のパケットはRH-Firewall-1-INPUTで処理
-A INPUT -j RH-Firewall-1-INPUT
# ローカルホスト経由のパケットはRH-Firewall-1-INPUTで処理
-A FORWARD -j RH-Firewall-1-INPUT
# 受信インターフェイスがループバック(lo)なら許可
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
# プロトコルがicpmなら許可
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
# プロトコル番号が50(ESP)なら許可
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
# プロトコル番号が51(AH)なら許可
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
# プロトコルがudpかつ, 送信先ポートが5353(Multicast DNS)かつ, 送信先IPアドレスが224.0.0.251なら許可
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
# プロトコルがudp/tcpかつ, 送信先ポートが631(Internet Printing Protocol)なら許可
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
# すでに接続されている通信なら許可(この行が無いと通信できない)
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 新規の接続かつ, プロトコルがtcpかつ, 送信先ポートが22(ssh)なら許可
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
# 新規の接続かつ, プロトコルがtcpかつ, 送信先ポートが80(http)なら許可
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

ここまでで許可されなかったパケットはicmp-host-prohibitedを返して拒否
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

# 以上を登録
COMMIT

その他

# 起動
sudo service iptables start

# 再起動
sudo service iptables restart

# 現在の設定を確認
sudo iptables -L

# OS起動時にiptablesを起動するように
sudo chkconfig iptables on