iptablesとはパケットフィルタリング, IPアドレスの変換, IPヘッダの書き換えの機能をもつソフトウェア. 設定ファイルでは機能(テーブル)毎に, 対象(チェイン)のパケットに対する処理(ルール)を定義していく.
このページは, 以下のページを大いに参考にして書かれている.
目次
用語の説明(テーブル, チェイン, ルール)はざっと眺め, 例の解説をメインに読むのが分かりやすいと思う.
- テーブル
- チェイン
- ルール
- 例
- その他
テーブル
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