iptables: 2006年5月アーカイブ

iptableのルールを削除、復旧させる

|

■Chainがまるごと吹っ飛んでしまった場合。

# iptables -F RH-Firewall-1-INPUT
-Fオプションは"Flush Chain"であり、チェイン内のルールをすべて吹っ飛ばす設定です。

# iptables -L -n --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    RH-Firewall-1-INPUT  all  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT) num target prot opt source destination 1 RH-Firewall-1-INPUT all -- 0.0.0.0/0 0.0.0.0/0

Chain OUTPUT (policy ACCEPT) num target prot opt source destination

Chain RH-Firewall-1-INPUT (2 references) num target prot opt source destination

でも、大丈夫。
# iptables-restore
の出番です。
# iptables-restore < iptables
# iptables -L RH-Firewall-1-INPUT -n --line-number
Chain RH-Firewall-1-INPUT (2 references)
num  target     prot opt source   destination
1    ACCEPT     all  --  0.0.0.0/0  0.0.0.0/0
2    ACCEPT     all  --  0.0.0.0/0  0.0.0.0/0
3    ACCEPT     icmp --  0.0.0.0/0 0.0.0.0/0 icmp type 255
4    ACCEPT     esp  --  0.0.0.0/0 0.0.0.0/0
5    ACCEPT     ah   --  0.0.0.0/0  0.0.0.0/0
6    ACCEPT     udp  --  0.0.0.0/0  224.0.0.251 udp dpt:5353
7    ACCEPT     udp  --  0.0.0.0/0  0.0.0.0/0   udp dpt:631
8    ACCEPT     all  --  0.0.0.0/0   0.0.0.0/0  state RELATED,ESTABLISHED
9    ACCEPT     tcp  --  0.0.0.0/0  0.0.0.0/0   state NEW tcp dpt:53
10   ACCEPT     tcp  --  0.0.0.0/0  0.0.0.0/0   state NEW tcp dpt:22
11   ACCEPT     tcp  --  0.0.0.0/0  0.0.0.0/0   state NEW tcp dpt:25
12   ACCEPT     tcp  --  0.0.0.0/0  0.0.0.0/0   state NEW tcp dpt:80
13   ACCEPT     tcp  --  0.0.0.0/0  0.0.0.0/0   state NEW tcp dpt:443
14   REJECT     all  --  0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
■ルールを一本間違えて消してしまった場合。 ※ルールを一本だけ消すには、-Dオプションを使います。
# iptables -D RH-Firewall-1-INPUT 12
これも
# iptables-restore < /etc/sysconfig/iptables
で元通りです。

iptableのルールを追加する

|
■まずは設定を見る。
# iptables -L RH-Firewall-1-INPUT -n --line-number
Chain RH-Firewall-1-INPUT (2 references)
num  target     prot opt source    destination
1    ACCEPT     all  --  0.0.0.0/0 0.0.0.0/0
2    ACCEPT     all  --  0.0.0.0/0 0.0.0.0/0
3    ACCEPT     icmp --  0.0.0.0/0 0.0.0.0/0 icmp type 255
4    ACCEPT     esp  --  0.0.0.0/0 0.0.0.0/0
5    ACCEPT     ah   --  0.0.0.0/0 0.0.0.0/0
6    ACCEPT     udp  --  0.0.0.0/0 224.0.0.251         udp dpt:5353
7    ACCEPT     udp  --  0.0.0.0/0 0.0.0.0/0 udp dpt:631
8    ACCEPT     all  --  0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
9    ACCEPT     tcp  --  0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:53
10   ACCEPT     tcp  --  0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
11   ACCEPT     tcp  --  0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:25
12   ACCEPT     tcp  --  0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
13   ACCEPT     tcp  --  0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:443
14   REJECT     all  --  0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
■RH-Firewall-1-INPUTの9と10の間にUDP53はACCEPTとしてやりたい。
# iptables -I RH-Firewall-1-INPUT 9 -p udp --dport 53 -s 0.0.0.0/0 -d 0.0.0.0/0 -j ACCEPT
※ちなみに順番を無視して設定を後ろに追加するなら、-Iオプションでな、-Aオプションでよいです。
# iptables -A RH-Firewall-1-INPUT -p udp ...
 しかしRH-Firewall-1-INPUTでは一番最後の行はall Rejectになっているので、途中の行に足さなければなりません。 ※また、すでにある行を編集するには、
# iptables -R RH-Firewall-1-INPUT 9 ...
とします。 そして、また設定をみてみよう。
# iptables -L RH-Firewall-1-INPUT -n --line-number
Chain RH-Firewall-1-INPUT (2 references)
num  target     prot opt source    destination
1    ACCEPT     all  --  0.0.0.0/0 0.0.0.0/0
2    ACCEPT     all  --  0.0.0.0/0 0.0.0.0/0
3    ACCEPT     icmp --  0.0.0.0/0 0.0.0.0/0 icmp type 255
4    ACCEPT     esp  --  0.0.0.0/0 0.0.0.0/0
5    ACCEPT     ah   --  0.0.0.0/0 0.0.0.0/0
6    ACCEPT     udp  --  0.0.0.0/0 224.0.0.251         udp dpt:5353
7    ACCEPT     udp  --  0.0.0.0/0 0.0.0.0/0 udp dpt:631
8    ACCEPT     all  --  0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
9    ACCEPT     udp  --  0.0.0.0/0 0.0.0.0/0 udp dpt:53
10   ACCEPT     tcp  --  0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:53
11   ACCEPT     tcp  --  0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
12   ACCEPT     tcp  --  0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:25
13   ACCEPT     tcp  --  0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
14   ACCEPT     tcp  --  0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:443
15   REJECT     all  --  0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
しかし、設定ファイルのほうはまだ反映されていない。
# cat /etc/sysconfig/iptables
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -i eth0 -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
■設定ファイルに保存する。
# iptables-save > /etc/sysconfig/iptables
となります。

iptablesのChainとTarget

|

■"Chain"とはルールをグループ化したものです。

■最初から組み込んであるChain
INPUT・・・interfaceから、ローカルプロセスにパケットが流れるときに適用される
OUTPUT・・・ローカルプロセスから、interfaceにパケットが流れるときに適用される
FORWARD・・・interfaceから、パケットを転送するときに適用される
の3種類があります。
そのほか、IPマスカレードに使う"POSTROUTING"があります。

■ユーザー定義でもChainは作れます。 RedHat系のOSの場合、インストールのときにファイアウォールを構成すると、 RH-Firewall-1-INPUT というChainが作られます。 そして、組み込みのINPUTとFORWARDのChainに、TargetとしてRH-Firewall-1-INPUTを適用しています。 そのほかに自分でchainを新しく作るには
# iptables -N mychain
とします。


■"Target"とはルールにマッチしたときのファイアウォールの動作です。
基本的にはACCEPTとREJECT(か、DROP)を使います。

ACCEPT   パケットを通過させる
DROP   パケットを破棄し、相手にはなにも返答しない
REJECT  パケットを破棄し、相手にはICMPを使って破棄したことを通知する
REDIRECT port   パケットを指定したポートにリダイレクトする
RETURN  チェイン内のルール評価を終了させる
そのほか、POSTROUTINGチェインで使う、"SNAT"や"MASQUERADE"があります。


■RH-Firewall-1-INPUTがある場合
RH-Firewall-1-INPUTがある場合は、
あまりINPUT、OUTPUT、FORWARDに手を加えると混乱の元になるので、

・デフォルトの設定を活用して、Chain"RH-Firewall-1-INPUT"にルールを足し引きする
 CUIの# setupコマンドからはいる「ファイアウォールの設定」から設定すると自然とこうなります。

# iptables -F RH-Firewall-1-INPUT
# iptables -X RH-Firewall-1-INPUT
とやって、RH-Firewall-1-INPUTを削除してから新しいチェインやルールを足していく

という方針がいいでしょう。

iptablesの設定を確認する

|
# iptables -L -n --line-numbers
を使います。 -nオプションをつけると名前解決せずにアドレスで表示します。 --line-numbersオプションをつけると、ルール番号を表示してくれます。

# iptables -L -n --line-numbers
# INPUTのChain
# interfaceからローカルプロセスにパケットが流れるときに適用される
Chain INPUT (policy ACCEPT)
num  target            prot opt source  destination
1    RH-Firewall-1-INPUT  all  --  0.0.0.0/0 0.0.0.0/0

# ForwardのChain # interfaceから渡されたパケットを転送するときに適用されます Chain FORWARD (policy ACCEPT) num target prot opt source  destination 1 RH-Firewall-1-INPUT all -- 0.0.0.0/0 0.0.0.0/0

# OUTPUTのChain # ローカルプロセスからinterfaceにパケットを送信するときに適用されます。 # 下記の場合、とくに何も設定されていません。 Chain OUTPUT (policy ACCEPT) num target prot opt source destination

# Chain RH-Firewall-1-INPUT # RedHatが最初にこしらえてくれるChain # 名前"RH-Firewall-1-INPUT"のとおり、 # INPUT時に適用することを想定してあります。 # 一通り、サービスを提供するためのACCEPTを設定したあと、 # 一番最後の行の"REJECT"で、それ以外を撥ねてます。 Chain RH-Firewall-1-INPUT (2 references) num target prot opt source  destination 1 ACCEPT all -- 0.0.0.0/0  0.0.0.0/0 2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 255 3 ACCEPT esp -- 0.0.0.0/0 0.0.0.0/0 4 ACCEPT ah -- 0.0.0.0/0 0.0.0.0/0 5 ACCEPT udp -- 0.0.0.0/0 224.0.0.251 udp dpt:5353 6 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:631 7 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 8 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 9 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80 10 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:21 11 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:25 12 REJECT all -- 0.0.0.0/0 0.0.0.0/0  reject-with icmp-host-prohibited

■設定ファイルで確認したい場合。 RedHatの場合は ○/etc/sysconfig/iptables   ルールやチェインの設定が書かれている ○/etc/sysconfig/iptables-config   なんかよくわからない大人の設定が書いてある。
IPTABLES_MODULES=""
IPTABLES_MODULES_UNLOAD="yes"
IPTABLES_SAVE_ON_STOP="no"
IPTABLES_SAVE_ON_RESTART="no"
IPTABLES_SAVE_COUNTER="no"
IPTABLES_STATUS_NUMERIC="yes"

○Debianの場合はさらにたちが悪い。 まず、なにもない。

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

○しょうがないから起動スクリプトを作った。

# cd /usr/share/doc/iptables/examples/
# zcat oldinitdscript.gz > /etc/init.d/iptables
# cd /etc/init.d
# chmod 755 iptables
# update-rc.d iptables defaults
 Adding system startup for /etc/init.d/iptables ...
   /etc/rc0.d/K20iptables -> ../init.d/iptables
   /etc/rc1.d/K20iptables -> ../init.d/iptables
   /etc/rc6.d/K20iptables -> ../init.d/iptables
   /etc/rc2.d/S20iptables -> ../init.d/iptables
   /etc/rc3.d/S20iptables -> ../init.d/iptables
   /etc/rc4.d/S20iptables -> ../init.d/iptables
   /etc/rc5.d/S20iptables -> ../init.d/iptables
# /etc/init.d/iptables start
Aborting iptables load: unknown ruleset, "active".

/etc/init.d/iptables options: start|restart|reload|force-reload load the "active" ruleset save save the current ruleset load load a ruleset stop load the "inactive" ruleset clear remove all rules and user-defined chains, set default policy to ACCEPT halt remove all rules and user-defined chains, set default policy to DROP

Saved ruleset locations: /var/lib/iptables/ and /var/lib/ip6tables/

Please read: /etc/init.d/iptables

どうやら設定ファイルは/var/lib/iptables/の中にあるらしい。 しかし、そんなとこにはなにもなかった。 しょうがないので、自分でiptablesというディレクトリを作って、iptablesというファイルをおいた。 中身はRedHatの丸写しだ。
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -i eth0 -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
のだが、動かなかった。 (以下、続く)

(続き)
というのは、上記の方法でdebianの/etc/init.d/iptablesをつくると、
/var/lib/iptables/にあるactiveとinactiveのファイルしかよみこまなくなる。

そこで、まずはこのデフォルトの何も書いていない奴を

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

inactiveに登録しよう。

最初にまずは/var/lib/iptables/active と inactive をtouchコマンドでつくっておく
# cd /var/lib/iptables
# touch active
# touch inactive
そしたら現在のルールをinactiveに登録する
# /etc/init.d/iptables save inactive

avtiveのほうには、RedHatなどで動いている生きのいいフィルターを
そのままactiveに書き写して、手直しすればよいだろう。

そして、
# /etc/init.d/iptables start
# /etc/init.d/iptables stop
が正しく動作するようになる。

このアーカイブについて

このページには、2006年5月以降に書かれたブログ記事のうちiptablesカテゴリに属しているものが含まれています。

次のアーカイブはiptables: 2006年6月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

iptables: 2006年5月: 月別アーカイブ

Powered by Movable Type 4.1