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 | パケットを廃棄してエラーパケットを送信する(自分で指定する必要あり) |
| 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号