iptablesを使う

iptablesを使ってパケットフィルタリングを行います。

LinkIconiptablesルール設定の基本形
LinkIconテーブル
LinkIcon組み込みチェイン
LinkIconチェイン操作オプション
LinkIconルール関連オプション
LinkIconターゲット
LinkIconポリシーチェインの設定
LinkIconNATの設定例
LinkIconFORWARDチェインの設定例
LinkIconINPUT/OUTPUTチェインの設定例

milk_btn_pagetop.png


 

iptablesルール設定の基本形

iptablesでルールを設定するときの基本形は次のようになります。

iptables [-t <テーブル>] <チェイン操作オプション> <チェイン> <ルール> [<オプション>]

  • -t オプション
    • 対象とするテーブルを指定します。
    • 省略した場合はfilterテーブルを指定したものされます。
    • LinkIconテーブル
  • <チェイン操作オプション>
  • <チェイン>
    • 利用するチェインを指定します。
    • 組み込みチェインは大文字で指定します。
    • LinkIcon組み込みチェイン
  • <ルール>
  • <オプション>
    • パケットを入出力するネットワークインターフェースやターゲットを指定します。
    • LinkIconターゲット

milk_btn_pagetop.png

 

テーブル

テーブルは役割に応じたルールを設定する場所です。iptablesには、filter、nat、mangleの3つのテーブルが用意されています。テーブルによって使用できるチェインが異なります。

filter
パケットフィルタリングで参照するテーブルを指定します。
パケットフィルタリングの設定はすべてfilterテーブルに対して行われます。
INPUT、FORWARD、OUTPUT
nat
新しい接続を開くパケットが参照するテーブルを指定します
NAT、IPマスカレードの設定やパケットのリダイレクトなどの設定をnatテーブルに対して行います。
PREROUTING、OUTPUT、POSTROUTING
mangle
特別なパケットが参照するテーブルを指定します。
パケット自体を直接操作する場合に利用されます。
PREROUTING、OUTPUT

milk_btn_pagetop.png


 

組み込みチェイン

チェインはパケットを検査するルールのリストです。それぞれのチェインでルールに適合するかを調べ、次のチェインにパケットを渡します。
このチェインのルールを変更、追加することでfilterテーブルやnatテーブルの設定が行われます。

INPUT
ローカルプロセス宛のパケットに対して適用されます。
OUTPUT
ローカルプロセスからネットワークインターフェースにパケットが出力されるときに適用されます。
FORWARD
ネットワークインターフェースから渡されたパケットをどのように転送するかを設定します。
PREROUTING
ネットワークインターフェースから渡されたパケットに対してアドレス変換するときに適用されます。
POSTROUTING
ネットワークインターフェースに出力されるパケットに対してアドレス変換を行うときに適用されます。

milk_btn_pagetop.png


 

チェイン操作オプション

チェイン操作オプションはチェインの操作を行うときに使用されます。

  • -A <chain>
    • <chain>にルールを新規に追加します。
    • --append
  • -D <chain> [<number>]
    • <chain>から<number>で指定したルールを削除します。
    • --delete
  • -E <old-chain> <new-chain>
    • <old-chain>で指定したチェインを<new-chain>で指定したチェインに変更します。
    • --rename-chain
  • -F [<chain>]
    • <chain>からすべてのルールを削除します。
    • <chain>を省略した場合はすべてのチェインが対象になります。
    • --flush
  • -I <chain> [<number>]
    • <chain>の<number>で指定される位置にルールを新規に挿入します。
    • --insert
  • -L [<chain>]
    • <chain>のルール一覧を出力します。
    • <chain>を省略した場合はすべてのチェインの一覧が出力されます。
    • --list
  • -N <new-chain>
    • 新しいユーザ定義チェイン<new-chain>を作成します。
    • --new-chain
  • -P <chain> <target>
    • <chain>に対するポリシーを<target>に設定します。
    • --policy
  • -R <chain> <number>
    • <chian>の<number>の位置るーるを置き換えます。
    • --replace
  • -X <chain>
    • ユーザ定義チェイン<chain>を削除します。
    • --delete-chain
  • -Z [<chain>]
    • <chain>のパケットカウンタとバイトカウンタをゼロにリセットします。
    • <chain>を省略した場合はすべてのチェインが対象になります。
    • --zero

milk_btn_pagetop.png


 

ルール関連オプション

ルール関連オプションはチェイン内のルールを指定するのに使用されます。

  • -p (--protocol) [!] プロコトル
    • ルールで使うプロトコルを指定します。
    • tcp、udp、icmp、all
  • -s (--source) [!] IPアドレス[/mask]
    • 送信元アドレスを指定します。
    • IPアドレスのほかにホスト名などでも指定できます。
  • -d (--destination) [!] IPアドレス[/mask]
    • 送信先アドレスを指定します。
    • IPアドレスのほかにホスト名などでも指定できます。
  • -i (--in-interface) [!] デバイス
    • パケットが入ってくるインターフェイスを指定します。
    • eth0、eth1、ppp0
  • -o (--out-interface) [!] デバイス
    • パケットが出ていくインターフェイスを指定します。
    • eth0、eth1、ppp0
  • -j (--jump) ターゲット
    • パケットがマッチしたときのアクション(ターゲット)を指定します。
  • -t (--table) テーブル
    • テーブルを指定します。
    • filter、nat、mangle
  • --sport (--source-port) [!] [<start>[:<end>]]
    • パケットの送信元ポートを指定します。
    • <start>と<stop>でポートの範囲を指定します。
  • --dport (--destination-port) [!] [<start>[:<end>]]
    • パケットの送信先ポートを指定します。
    • <start>と<stop>でポートの範囲を指定します。
  • --icmp-type [!] typename
    • typenameにはICMPのタイプ(echo-requestやecho-replyなど)を指定します。
    • パラメータ設定で -p icmp を指定したときに使用します。
  • --mac-source
    • 送信元MACアドレスを指定します。

! を付けと否定の意味になります。

milk_btn_pagetop.png


 

ターゲット

ルールにマッチしたパケットが何を行うかを指定します。

ACCEPT
パケットの通過を許可します。
DROP
パケットを破棄します。
REJECT
エラーパケットをICMPを使って送信後、パケットを破棄します。
MASQUERRADE
パケットの送信元アドレスを変更します。
DNAT
パケットの送信先アドレスを変更します。
SNAT
パケットの送信元アドレスを変更します。
REDIRECT
特定ポートにリダイレクトします。
QUEUE
パケットをキューに登録します。
RETURN
チェイン内のルールに対するパケットのチェックを修了します。
LOG
マッチしたパケットをログに記録します。
TOS
Type of Serviceフィールドを設定します。
  • SNAT --to(--to-source) <ipaddr>[-<ipaddr>][:port-port]
    • パケットの送信元アドレスを変換します。
    • natテーブルとPOSTROUTINGチェインでのみ有効です。
    • ポートを指定すると、変換されたアドレスの指定されたポートで接続することになります。
    • IPアドレス、ポート共にレンジ指定ができます。
  • DNAT --to(--to-destination) <ipaddr>[-<ipaddr>][:port-port]
    • パケットの送信先アドレスを変換します。
    • natテーブルとPREROUTING、OUTPUTチェインと、これらのチェインから呼び出されるユーザ定義チェインのみで有効です。
    • ポートを指定すると、変換されたアドレスの指定されたポート宛に接続することになります。
    • IPアドレス、ポート共にレンジ指定ができます。

milk_btn_pagetop.png

 

ポリシーチェインの設定

iptablesはポリシー(-P)を使用してデフォルトのルールを作成します。多くの場合、ポリシーとしてすべてのパケットをドロップして、状況に応じて特定のパケットを許可する方法がとられます。

すべての着信、発信パケット、フォワードされたパケットをブロックします。
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

ポリシーチェインを設定したら、セキュリティに必要な新しいルールを作成するようにします。

milk_btn_pagetop.png


 

NATの設定例

NATの動作

外部のホストから内部のサーバに接続する場合、まずファイアウォールの外側のインターフェイス(eth0)に割り当てられたグローバルアドレスに対してアクセスしてきます。
ファイアウォールを介して接続を許可するルールが存在しても、そのままのDestinationアドレスではサーバにはアクセスすることはできません。
そこで、ファイアウォールでDestinationアドレスをグローバルアドレスから実IPアドレスに変換してやる必要があります。

iptablesの記述方法

Webサーバ宛パケットのDestinationアドレスを1.2.3.4(Webサーバのグローバルアドレス)から192.168.10.10(Webサーバの実IPアドレス)に変換するには、次のような記述になります。

Destinationアドレスの変換を行いますから、PREROUTINGチェインにルールを追加します。

# /sbin/iptables -t nat -A PREROUTING -d 1.2.3.4 -i eth0 -j DNAT --to 192.168.10.10

Destinationアドレス変換ルール

-t nat   natテーブルの使用を指定
-A PREROUTING PREROUTINGチェインにルールを追加
-d 1.2.3.4 変換前Destinationアドレス 1.2.3.4
-j DNAT --to 192.168.10.10 変換後のアドレス192.168.10.10を指定
-i eth0 パケットを受け取るインターフェイスがeth0であることを指定

(注)
接続要求に対しては、それに対する応答パケットを返します。応答のパケットもファイアウォールを通過するわけですが、NATに関しては特に定義する必要はありません。接続してきたパケットの送信元アドレスは変換させていないからです。応答パケットはファイアウォールを通過した後、もともと接続要求のあったアドレス1.2.3.4でクライアントに戻ります。

milk_btn_pagetop.png


 

FORWARDチェインの設定例

FORWARDチェインの役目は、必要なパケットだけに目的のホストやサービスへアクセスを許可することです。
FORWARDチェインの基本ポリシーはDROP(パケットを破棄)とします。そして、許可するアクセスのみ「穴をあける」設定を行います。

基本ポリシーの設定

FORWARDチェインのポリシーをDROPに設定します。

# /sbin/iptables -P FORWARD DROP
-Pオプションは、指定したチェインに対して基本ポリシーを設定するオプションです。
ファイアウォールを通過してホストへ到達できる経路はすべて絶たれたことになります。

ルールの設定

<想定ルール>
インターネット上のホストからWebサーバ(192.168.10.10)に対するHTTP(80/TCP)のアクセスのみを許可します。

<Webサーバへのアクセス許可>
インターネット上のホストから、Webサーバへのアクセスを許可するには次のコマンドを実行します。
# /sbin/iptables -A FORWARD -p tcp --dport 80 -d 192.168.10.10 -j ACCEPT

-A FORWARDチェインに追加
-p tcp ルールで使用するプロトコル
--dport 80 送信先ポート
-d 192.168.10.10 送信先アドレス
-j ACCEPT パケットの通過を許可

<Webサーバからインターネット ホストへの応答パケットの許可>
Webサーバからインターネット上のホストへの応答パケットを許可するルールを設定します。
# /sbin/iptables -A FORWARD -p tcp ! --syn -m state --state ESTABLISHED --sport 80 -s 192.168.10.10 -j ACCEPT

-A FORWARDチェインに追加
-p tcp ルールで使用するプロトコル
! --syn  SYNビットがクリアされACKとFINビットがセットされているTCPパケット
--sport 80 送信元ポート
-s 192.168.10.10 送信元アドレス
-m state --state ESTABLISHED ESTABLISHEDなセッション(双方向接続のパケット)
-j ACCEPT パケットの通過を許可

milk_btn_pagetop.png


 

INPUT/OUTPUTチェインの設定例

メンテナンス用ホスト(192.168.64.10)から、ファイアウォールの外側のインターフェイスeth2(192.168.64.1)に対する22/TCP(ssh)による接続を許可します。

INPUTチェインには外部からホストへ入ってくるためのルールを、OUTPUTチェインにはホストから外部へ出ていくためのルールを追加します。

# /sbin/iptables -A INPUT -p tcp -s 192.168.64.10 --dport 22 -d 192.168.64.1 -i eth2 -j ACCEPT

# /sbin/iptables -A OUTPUT -p tcp ! --syn -m state --state ESTABLISHED --sport 22 -s 192.168.64.10 -d 192.168.64.1

ICMPの処理の例
生存確認のためメンテナンス用のホスト(192.168.64.10)から、Webサーバ(192.168.10.10)に対するEcho Requestと、その応答のためのEcho Replyを許可します。

# /sbin/iptables -A FORWARD -p icmp -s 192.168.64.10 --icmp-type 8 -d 192.168.10.10 -i eth2 -j ACCEPT

# /sbin/iptables -A FORWARD -p icmp --icmp-type 0 -s 192.168.10.10 -d 192.168.64.10 -o eth2 -j ACCEPT

<ICMP Typeフィールド >
0 Echo Reply
3 Destination Unreachable
4 Source Quench
5 Redirect
8 Echo Request
11 Time Exceeded
12 Parameter Problem
13 Timestamp Request
14 Timestamp Reply
15 Information Request
16 Information Reply
17 Address Mask Request
18 Address Mask Reply

milk_btn_pagetop.png

変更 2014.04.16
変更 2010.09.29
2008.07.30