iptablesで久しぶりにハマった

これまで、/etc/sysconfig/iptablesを直に編集してサービスをrestartする方法で設定変更してたのだけど、iptables -A コマンドを使うようになって、ハマッた。

iptablesで

# iptables -A INPUT何がし -p tcp --dport 80 -j ACCEPT

ということで、192.168.0.2(仮名)のhttpのportを開けたはずなのに

# telnet 192.168.0.2 80
Trying 192.168.0.2...
telnet: connect to address 192.168.0.2: No route to host

とか言われる。

で、tcpdumpでモニタしつつ別のサーバからもう一度port 80にtelnetしてみたら、

# tcpdump host 192.168.0.2
(中略)
18:09:38.683204 IP 192.168.0.3.wfremotertm > 192.168.0.2.http: S 4123505778:4123505778(0) win 5840 
18:09:38.689310 IP 192.168.0.2 > 192.168.0.3: ICMP host 192.168.0.2 unreachable - admin prohibited, length 68

といわれた。

で、/etc/sysconfig/iptables を見てみると、

 -A INPUT何がし -s 192.168.0.0/255.255.255.0 -p tcp -m tcp --dport 80 -j ACCEPT

の前に

 -A INPUT何がし -j REJECT --reject-with icmp-host-prohibited

が鎮座ましましておりまして、、、こいつがパケット撥ねてたらしい..orz..
(icmp-host-prohibitedってのは、エラーのタイプを指定しているだけで、このルールまで、どの行のルールにもマッチしなければ問答無用にREJECTなのだ。つまり、この下にある行は無意味)
もともとこの行はデフォルトの設定の最後の行なのだけれど、
2008/4/20追記:
icmp-host-prohibitedとかのエラータイプはICMP(pingとかのプロトコル:RFC792)で規定されてる。

iptables -A INPUT何がし xxxルール

とかiptablesコマンドで設定してやると、このルールの後にくっついちゃう。そりゃそうだ、-Aって、、APPENDだもん...
それまでは、自分のサーバからのアクセスでしか試していなかったので、気づかなかったよ。デフォルトで空いているポートは、ずっと前にあったわけだし...
アホすぎ>自分
今後はiptalbes -Iとするのが安全かな。。。