コンテンツにスキップ

IPTABLES入門

Debian lenny
本記事は 2010 年 8 月に旧サイト(オンプレミス環境)で公開した記録の復元です。内容は当時のまま掲載しています。

基本書式

組み込みチェイン(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パケットを廃棄してエラーパケットを送信する(自分で指定する必要あり)
LOGsyslogに保存(破棄する場合は別途DROPが必要)
ULOGulogに保存(破棄する場合は別途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号

Amazonアソシエイトリンク