モヒカンは正義

渋谷で働く怪しいWebエンジニアの生きた証と備忘録

firewalldの設定をサボっていたらいつの間にかブログが見えない状態になっていた

f:id:pinkumohikan:20170611141938p:plain

ブログのサーバ構築して、WordPressを設置 & 初期設定を済ませた後、しばらくして自分のブログを訪れてみたらconnection refusedが返ってきてアクセスできない状態になっていた。 同じようなことをやってしまう人が世界70億人もいればもう一人ぐらい居ると思うので、その時の対応記録をメモっときます。

3行まとめ

  1. Connection refusedの原因は、http/httpsアクセスを firewalld で許可していなかったため
  2. ConoHa のCentOS7.2は初期状態でFirewalldが有効、SELinuxが無効
  3. tryは「サボらず最初(アプリ構築時)からファイアウォールの設定をする」

調査

経験的に Connection refused の場合、原因は下記のいずれかであることが多い

  • Webサーバ関連のミドルウェア (nginx, php-fpm) が死んでいる
  • firewallの設定が不十分で、外部からの接続を受け付けないようになっている
  • SELinuxの設定が不十分で、ミドルウェアの実行がブロックされている

上から順に調べていく

nginx

h-shinoda@marlin:~
$ sudo systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since ...

問題なし

php-fpm

h-shinoda@marlin:~
$ sudo systemctl status php-fpm
● php-fpm.service - The PHP 7 FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
   Active: active (running) since ...

問題なし

サーバローカルから疎通できるか

h-shinoda@marlin:~
$ curl localhost -I
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 30 Dec 2016 11:24:29 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive

問題なし ここまでで、Webサーバ関連のミドルウェアのせいではないことが確定

firewalld

firewalld = CentOS7以降から採用されているファイアウォールミドルウェア

ConoHaはfirewalldを使っているが、IaaSベンダーによってfirewalldではなくiptablesを使うようにイジられている場合もあるのでちょっと注意

h-shinoda@marlin:~
$ sudo systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since ...

h-shinoda@marlin:~
$ sudo firewall-cmd --list-services --zone=public
dhcpv6-client ssh

なるほど(O_O)

httpアクセスを受けるときに必要な httphttps に対して通信許可設定がされていない もしSELinuxが既に無効状態であればこれが原因っぽいので、そうなら許可してあげれば問題は解決しそう

SELinux

h-shinoda@marlin:~
$ getenforce
Disabled

Disabled = 無効状態なので今回の原因ではなさそう)

SELinuxはサーバのセキュリティ向上のためのミドルウェアだが、有効なせいで動くはずのものが動かなかったりして大変なので(ちゃんと設定すれば動くようになるが、結構設定が大変)、自分は無効にしてしまうことが多い

が、今回はSELinuxを無効にした覚えはないので ConoHaはデフォルトでSELinuxを無効にしている 模様 (自分が書いたインフラ構築スクリプト中のどこかで無効化している可能性は微レ存)

対処

1. 暫定対処

h-shinoda@marlin:~
$ sudo firewall-cmd --add-service=http --zone=public
success
h-shinoda@marlin:~
$ sudo firewall-cmd --add-service=https --zone=public
success
h-shinoda@marlin:~
$ sudo firewall-cmd --reload
success

上記の設定によって、Webサイトがアクセス可能になったことを確認 firewallの設定不足によってconnection refusedになっていた、と言う原因でFA

2. 恒久対処

h-shinoda@marlin:~
$ sudo firewall-cmd --add-service=http --zone=public --permanent
success
h-shinoda@marlin:~
$ sudo firewall-cmd --add-service=https --zone=public --permanent
success
  • --permanent オプションをつけないと、firewalldがrestartしたときにリセットされる

3. 確認

h-shinoda@marlin:~
$ sudo firewall-cmd --list-services --zone=public --permanent
dhcpv6-client http https ssh
h-shinoda@marlin:~
$ sudo firewall-cmd --reload
success

ブラウザから、アクセスできることを確認

振り返り

真の原因

最初のWordPressの構築時に、とあえずWPを動かすことを最優先に考えて、ファイアウォールを一時的に無効にした状態でWordPressを構築する、っていう手順をとった

その後、ファイアウォールの設定を忘れたままサーバをrebootしたので、firewalldが自動起動してデフォルト設定のファイアウォールが有効な状態になり、外部からのアクセスを受け付けない状態になった

Try

サボらず最初(アプリ構築時)からファイアウォールの設定をする

「一時的に」っていう何かには本当に気をつけたい… 一時的 is 悪。

余談

この記事を書くために何度かこの手順を繰り返していたら、

  1. sudo firewall-cmd --reload しても、疎通できない
  2. add-serviceしたあとremove-serviceしても、疎通しちゃう

みたいなことがあった

マジ謎

特に深く調べる気力はなかったので sudo firewall-cmd --reload ではなく sudo systemctl reload firewalld したら変更が適用された (白目)

さらにちなみに、 reloadしまくったら、何度かfirewalldが死んだ (白目) そっちも原因究明する気力はないのでだれか..

参考にしたサイト

  1. CentOS7 firewalldの設定