IPTABLES入門

投稿者: | 2010年8月8日
Pocket

基本書式

組み込みチェイン(INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING)を使用する場合

【書式】

・標準ターゲット

iptables -P [チェイン] [ターゲット]

・ルール

iptables -A [チェイン] -t [テーブル] [マッチングオプション] -j [ターゲット]

【チェイン】

INPUT パケット入力のルールを定義
OUTPUT パケット出力のルールを定義
FORWARD パケットを転送するルールを定義
PREROUTING 入力前にパケットを変換
POSTROUTING 出力前にパケットを変換

【テーブルの種類】

テーブル 目的 利用できるチェイン
filter 目的のパケットをフィルタリングする(デフォルト動作) INPUT, OUTPUT, FORWARD
nat 送信元・宛先アドレスの変換を行う OUTPUT, PREROUTING, POSTROUTING
mangle パケットヘッダの改変を行う INPUT, OUTPUT, PREROUTING, POSTROUTING

【マッチングオプション】

-p プロトコル tcp/udp/icmp/allから選択(デフォルトはall)
-d 宛先アドレス 宛先IPアドレスを指定
-s 送信元アドレス 送信元IPアドレスを指定
–dport ポート 宛先ポート番号を指定(-p tcp、-p udpと合わせて使用)
–sport ポート 送信元ポート番号を指定(-p tcp、-p udpと合わせて使用)
-i インタフェース パケット入力インタフェースを指定
-o インタフェース パケット出力インタフェースを指定
–log-level ファシリティ変更
–log-prefix ログ記録時に文字列を追加
-t テーブル 利用するテーブルを指定(詳細は別途)

【ターゲット】

ACCEPT パケットを通す
DROP パケットを破棄する
REJECT パケットを廃棄してエラーパケットを送信する(自分で指定する必要あり)
LOG syslogに保存(破棄する場合は別途DROPが必要)
ULOG ulogに保存(破棄する場合は別途DROPが必要)
QUEUE パケットをユーザ空間に通す
RETURN チェインを終了する(チェイン呼び出し元に戻る)
DNAT 宛先変換
SNAT 送信元変換

【例1】フィルタ

iptables -P INPUT DROP
iptables -A INPUT -t filter -p TCP -d 192.168.0.1 --dport 22 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -t filter -p TCP -d 192.168.0.1 --dport 53 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -t filter -p TCP -d 192.168.0.1 --dport 80 -s 192.168.1.0/24 -j ACCEPT

→192.168.1.0/24(送信元)から192.168.0.1(宛先)へのTCP(SSH,DNS,HTTP)通信を許可しその他は破棄します。

【例2】NAT

iptables -P FORWARD DROP
iptables -A FORWARD -p TCP -i eth0 -o eth1 --dport 80 -j ACCEPT
iptables -A FORWARD -p TCP -i eth1 -o eth0 --sport 80 -j ACCEPT
iptables -A PREROUTING -t nat -p TCP -i eth0 -d 192.168.1.7 --dport 80 -j DNAT --to-destination 172.16.0.1:80
iptables -A POSTROUTING -t nat -p TCP -o eth0 -s 172.16.0.1 --sport 80 -j SNAT --to-source 192.168.1.7:80

→eth0から入ってきた192.168.1.7(宛先)へのHTTP通信の宛先を172.16.0.1に変換。

eth0から出て行く172.16.0.1(送信元)からのHTTP通信の送信元を192.168.1.7に変換。

■独自チェインの書式

【書式】

・独自チェインの作成

iptables -N [独自チェイン名]
iptables -A [独自チェイン名] -t [テーブル] [マッチングオプション] -j [ターゲット]

・ルール

iptables -A [チェイン] -t [テーブル] [マッチングオプション] -j [独自チェイン]

→独自チェインを使用する場合、標準ターゲット指定がありませんので、最後のルールでALL DENYするなどの考慮が必要になります。

【例】

・独自チェインの作成

iptables -N tcp_in
iptables -A tcp_in -p TCP --dport 22 -j ACCEPT
iptables -A tcp_in -p TCP --dport 80 -j ACCEPT
iptables -A tcp_in -j DROP
iptables -N tcp_out
iptables -A tcp_out -p TCP --sport 22 -j ACCEPT
iptables -A tcp_out -p TCP --sport 80 -j ACCEPT
iptables -A tcp_out -j DROP

・ルール

iptables -A INPUT -p TCP -i eth0 -d 192.168.0.1 -j tcp_in

→eth0から入力された192.168.0.1/24(宛先)へのTCP(SSH,DNS,HTTP)通信を許可しその他は破棄します。

iptables -A INPUT -p TCP -o eth0 -s 192.168.0.1 -j tcp_out

→eth0から出力された192.168.0.1/24(送信元)からのTCP(SSH,DNS,HTTP)通信を許可しその他は破棄する。

■実際の使い方

Debian lennyでは/etc/network/if-pre-up.d/にスクリプトを入れておくと、IF起動前に適用されます。また、/etc/network/if-post-down.d/にスクリプトを入れておくと、IF停止後に適用されます。

・初期設定

# iptables -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

・IF起動前に適用されるスクリプト

#!/bin/bash

# ルーティング機能を使用する場合
echo 1 > /proc/sys/net/ipv4/ip_forward

# テーブル内の全てのチェインの内容を全消去する。
iptables -F
iptables -t nat -F
iptables -t mangle -F

# 独自チェインを全て削除する。
iptables -X
iptables -t nat -X
iptables -t mangle -X

# カウンターのリセット
iptables -Z
iptables -t nat -Z
iptables -t mangle -Z

# 標準ターゲットの指定
iptables -P INPUT   DROP
iptables -P OUTPUT  DROP
iptables -P FORWARD DROP


~~~ ここに作成するルールを記載 ~~~


・IF停止後に適用されるスクリプト

#!/bin/bash

# ルーティング機能を使用する場合
echo 0 > /proc/sys/net/ipv4/ip_forward

# テーブル内の全てのチェインの内容を全消去する。
iptables -F
iptables -t nat -F
iptables -t mangle -F

# 独自チェインを全て削除する。
iptables -X
iptables -t nat -X
iptables -t mangle -X

# カウンターのリセット
iptables -Z
iptables -t nat -Z
iptables -t mangle -Z

# 標準ターゲットの指定
iptables -P INPUT ACCEPT
iptables -P OUTPUT  ACCEPT
iptables -P FORWARD ACCEPT

・適用状況の確認コマンド

# iptables -nL -v

Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
   30  2740 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
  911 52760 ACCEPT     all  --  *      *       192.168.0.0/24      0.0.0.0/0
  329 69179 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
    0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:113 reject-with tcp-reset
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:53 limit: up to 5/min burst 20 mode srcip htable-expire 120000
    0     0 LOG        tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:53 LOG flags 0 level 7 prefix `[IPTABLES_TCP_DNS_DROP] : '
    0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:53
    1    69 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:53 limit: up to 5/min burst 20 mode srcip htable-expire 120000
    0     0 LOG        udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:53 LOG flags 0 level 7 prefix `[IPTABLES_UDP_DNS_DROP] : '
    0     0 DROP       udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:53
    0     0 LOG        tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:25 LOG flags 0 level 7 prefix `[IPTABLES_MAIL_ACCEPT] : '
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:25
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80
    0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           limit: avg 1/sec burst 5 LOG flags 0 level 7 prefix `[IPTABLES INPUT] : '
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           limit: avg 1/sec burst 5 LOG flags 0 level 7 prefix `[IPTABLES FORWARD] : '
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain OUTPUT (policy ACCEPT 1464 packets, 761K bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DROP       tcp  --  *      *       0.0.0.0/0           !192.168.0.0/24     multiport sports 135,137,138,139,445
    0     0 DROP       udp  --  *      *       0.0.0.0/0           !192.168.0.0/24     multiport sports 135,137,138,139,445

Chain LOG_PINGDEATH (1 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           limit: avg 1/sec burst 4
    0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           LOG flags 0 level 7 prefix `[IPTABLES PINGDEATH] : '
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0

それでは次の記事にて、実際にフィルタを作成して動作させてみたいと思います。

参考文献

Software Design 2009/6号

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です