Telnet接続障害対応メモ
日記「Fedora環境をHyper-V上で構築&Telnetで接続まで メモ - oknknicの日記」で構築したサーバを再起動したところ、なぜか telnet 接続できなくなった。
ので、対応した際の手順をメモ。
対応
切り分け開始。
1. pingは通るか → 通る
2. サーバローカルでtelnet接続できるか → できる
ということで、 hosts.allow か iptables が怪しい。
3. hosts.allow にクライアントのホストが含まれているか → 含まれている
4. iptables に telnet の 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
→接続できるようになった。