基本書式
組み込みチェイン(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号