こんにちは 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 で開きます。
開いた画面は以下です。
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 等活用しながら) 自分で解決できる方、ぜひうちで働きませんか? 詳細は以下のページへ!