OS をアップデートしたら HTTP でつながらなくなったので調べてみた

こんにちは masm11 です。 私は社内向け某サービスを開発・運用しています。

先日、そのステージングで OS をアップデートしたところ、HTTP/HTTPS で つながらなくなってしまいまい、原因を調べました。今日はその件について 書きたいと思います。

やったこと

OS は Amazon Linux 2 です。

sudo yum update

して、EC2 ダッシュボードから再起動し、アプリをデプロイしただけです。

ブラウザから動作確認したところ、つながらなくなっていました…

調べる

とりあえず curl で試してみます。

まずはサーバの外からグローバル IP アドレスで接続してみます。

$ curl http://global-ip-address/
curl: (52) Empty reply from server
$ curl https://global-ip-address/
curl: (7) Failed to connect to global-ip-address port 443: Connection refused

次にサーバ内でプライベート IP アドレスで接続してみたところ、 こちらは正常でした。つまり、nginx で受けて unicorn への流れは問題なさそうです。

問題は、そこより外側、つまり AWS の NAT とか、そのへんにありそうだと感じます。 security group も確認しましたが、ssh だけの制限で、HTTP/HTTPS は制限していませんでした。

トラフィックの様子を見てみましょうか。

sudo tcpdump -n -vv -i eth0 port 80

この状態で接続してみましたが、よく解りません。やっぱり tcpdump の出力は難解です… wireshark にしましょう。

一旦キャプチャします。

sudo tcpdump -n -s 0 -w cap.dat -i eth0

念のため、port 80 は外しました。デフォルトでは大きいパケットは途中で切り捨てられるので、それを防ぐために -s 0 を付けています。-w cap.dat で cap.dat に保存します。

この状態でアクセスした後、ctrl+c で止めます。cap.dat を手元の PC にコピーした後、 wireshark で開きます。

開いた画面は以下です。

f:id:masm11:20210403184718p:plain

SYN パケットの直後に Destination unreachable (Host administratively prohibited) という ICMP パケットが 飛んでますね。このせいでしょう。

これでぐぐったところ、ファイアウォール等が原因のようです。

fail2ban を導入してます。それが誤動作してるのでしょうか? 状況を確認します。

[ec2-user@ip-172-31-9-10 ~]$ sudo iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
   44  3080 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
    1    88 INPUT_direct  all  --  *      *       0.0.0.0/0            0.0.0.0/0
    1    88 INPUT_ZONES_SOURCE  all  --  *      *       0.0.0.0/0            0.0.0.0/0
    1    88 INPUT_ZONES  all  --  *      *       0.0.0.0/0            0.0.0.0/0
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate INVALID
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
(以下略)

最後が icmp-host-prohibited で REJECT になってます。すごく怪しいです。 そして INPUT_direct やら INPUT_ZONES_SOURCE やら、見慣れない chain があります。 この chain 名でぐぐったところ、firewalld が作るもののようです。

[ec2-user@ip-172-31-9-10 ~]$ sudo systemctl list-unit-files | grep firewall
firewalld.service                             enabled

enable になってる… 止めます。

sudo systemctl stop firewalld

sudo iptables -L -v -n すると、これらの chain がなくなっていました。

curl やブラウザからアクセスして、問題ないことが確認できました。

まとめ

OS のアップデートしただけだったのに、大きく挙動が変わってしまい、困りました。 yum update ではそんなことにならないと思ってたのですが。

そもそも、

[ec2-user@ip-172-31-9-10 ~]$ sudo systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead) since 土 2021-04-03 18:34:39 JST; 2s ago
     Docs: man:firewalld(1)
  Process: 24320 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS)
 Main PID: 24320 (code=exited, status=0/SUCCESS)

見えますか? vendor preset: enabled になってますね。だからインストールされた時にすぐ enable になったのでしょう。 余計なことをしてくれます…

ちなみに、fail2ban も停止してしまっていました。 こういったツールが2つ以上同時に動くのは危険なので、仕方ないのは解りますが、ほんと余計なことしてくれる…

インゲージではエンジニアを募集しています。 こういうことが (Google 等活用しながら) 自分で解決できる方、ぜひうちで働きませんか? 詳細は以下のページへ!

https://ingage.co.jp/recruit/