Telnet接続障害対応メモ

日記「Fedora環境をHyper-V上で構築&Telnetで接続まで メモ - oknknicの日記」で構築したサーバを再起動したところ、なぜか telnet 接続できなくなった。
ので、対応した際の手順をメモ。

対応

切り分け開始。

1. pingは通るか → 通る
2. サーバローカルでtelnet接続できるか → できる

ということで、 hosts.allow か iptables が怪しい。

3. hosts.allow にクライアントのホストが含まれているか → 含まれている
4. iptablestelnet の ALLOW ルールが含まれているか → 含まれている

・・・どつぼにはまった。。
ということで、パケットレベルで動作を確認する。

5.
 5-1. サーバ側で tcpdump を実行
 5-2. クライアント側から telnet でサーバ側に接続を試みる
 5-3. tcpdump の出力内容を確認

すると・・・

11:00:00.000000 IP 192.168.30.1.49507 > 192.168.30.2.telnet: Flags [S], seq 3961042292, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
11:00:00.000000 IP 192.168.30.2 > 192.168.30.1: ICMP host 192.168.30.2 unreachable - admin prohibited, length 60

リジェクトされている。

iptables に現在登録されているルールを再度確認する。

iptables -L

Chain INPUT に REJECT all anywhere の設定があり、icmp-host-prohibited との記載が。
上記のリジェクトはこのルールが原因っぽい。

念のため iptables の man を確認すると・・

   REJECT
       マ ッチしたパケットの応答としてエラーパケットを送信するために使われる。エラーパケットを送らなければ、 DROP
       と同じであり、TARGET を終了し、ルールの検討を終了する。このターゲットは、 INPUT, FORWARD, OUTPUT チェイ ン
       と、これらのチェインから呼ばれるユーザー定義チェインだけで有効である。以下のオプションは、返されるエラーパ
       ケットの特性を制御する。

       --reject-with type
              type として指定可能なものは
               icmp-net-unreachable
               icmp-host-unreachable
               icmp-port-unreachable
               icmp-proto-unreachable
               icmp-net-prohibited
               icmp-host-prohibited or
               icmp-admin-prohibited (*)
              であり、適切な ICMP エラーメッセージを返す (port-unreachable がデフォルトである)。

なるほど。整理すると以下の通り。

  • Chain INPUT に、リジェクトしてエラーパケット icmp-port-unreachable を返すルールが登録されている
  • Chain INPUT のリジェクト設定が、telnet のアクセプト設定より上側にある
  • ルールは上から順に評価されるため、リジェクトルールにマッチした時点でリジェクトされてしまっている

なぜ再起動しただけでルールの順番が入れ替わってるんだ・・??

とりあえず、対応を続行する。
リジェクト設定とアクセプト設定の順番を入れ替える。

#現在の設定をエクスポート
iptables-save > iptables.txt.bak

#コピー&編集(順番入れ替え)
cp iptables.txt.bak iptables.txt
vi iptables.txt

#インポート
iptables-restore < iptables.txt

→うまくいかず。。
(そもそも、なぜか iptables-save をリダイレクトできていない。(リダイレクトファイルは作成されるが、0byte)標準出力のコピペでファイルを作成したが、今度は iptables-restore が沈黙)

代替策として、素直に、リジェクトルールを削除して、アクセプトルールの後に登録しなおす。

iptables -D INPUT -j REJECT --reject-with icmp-host-prohibited
iptables -I INPUT 6 -j REJECT --reject-with icmp-host-prohibited

→接続できるようになった。