Closed6
新規構築したサーバーでlocalhostのHTTPアクセスで失敗するときの切り分け
普段は運用で構築済みサーバーばかり触っていて忘れるのでメモ。AWSのACLやSecurity Groupの設定方法ではなくて、基本的な考え方と自宅サーバーで遊ぶときに使えるメモ。
トラブル例:
- /var/www/html/index.htmlにコンテンツを配置しているWebサーバーがある
- Apacheを利用している
-
$ curl 127.0.0.1:80
HTTPクライアントでローカルに確認すると何も返ってこない - OS: ubuntu
基本的にOSI参照モデル, TCP/IPのレイヤーの低いところから確認していく。
- アプリケーション層
- トランスポート層
- インターネット層
- ネットワークインターフェース層
設定を変えてみる度に
$ curl 127.0.0.1:80
を叩いてApacheのログを確認する。
Apacheのログを見る
$ sudo tail -f /var/log/httpd/error.log
$ sudo tail -f /var/log/httpd/access.log
ログに何も出てこなかったらアプリケーション層より下の問題だとわかる。(Nginxなどを使っている場合も同じ)
pingは通るのか見る
pingは返ってくるのにcurlは返ってこない場合はネットワークインターフェース層では問題がない。(pingすら通らないときでもネットワークインターフェース層でに問題があることは少ない&問題があっても対応できないことが多い)
怪しいのはだいたいインターネット層とトランスポート層なので、下記を確認する。
- iptablesで弾かれていないか
- ポートが閉じられていないか
トランスポート層〜インターネット層の確認
iptablesの設定を確認する
# 現状のルール設定を確認する
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- anywhere anywhere tcp dpt:http # <-ここがDROPになっていておかしい
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
↑の場合TCPがDROPされているので設定ファイルを探して修正する。
# /etc/iptables/あたりにルールを記載したファイルがある(CentOSだと/etc/sysconfig/あたり)
# DROPをACCEPTにするなど修正する
$ sudo view /etc/iptables/iptables.rules
# Generated by iptables-save v1.8.7 on Mon Aug 1 01:29:33 2022
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p tcp -m tcp --dport 80 -j DROP
COMMIT
# Completed on Mon Aug 1 01:29:33 2022
# 設定ファイルを編集してsaveする
$ sudo vim /etc/iptables/iptables.rules
$ sudo /sbin/iptables-save -c > /etc/iptables.rules
# 設定を確認する
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:http # <-ここが変わっている
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
# 変更がうまく反映されない/即時に反映させたいときはiptablesを再起動する
$ sudo systemctl restart iptables
参考:
- https://www.ymdlb.net/linux/?Ubuntu/Ubuntuでiptablesを設定する
- https://qiita.com/hitobb/items/3ca7f47f7904f88c47be
- https://atmarkit.itmedia.co.jp/ait/articles/1008/23/news100.html
ufwの設定を確認する
ファイアーウォールで80番ポートが閉じられていないか確認する。
# inactiveになっていたらファイアーウォールは入っていない
$ sudo ufw status
Status: inactiveufw status
$ sudo ufw status
Status: active
To Action From
-- ------ ----
22 ALLOW Anywhere
22 (v6) ALLOW Anywhere (v6)
## 22番ポート(ssh)しか空いていない
## apacheを使いたいので80番ポートを開ける
$ sudo ufw allow 80
$ sudo ufw reload
$ sudo ufw status
Status: active
To Action From
-- ------ ----
22 ALLOW Anywhere
22 (v6) ALLOW Anywhere (v6)
80 ALLOW Anywhere
80 (v6) ALLOW Anywhere (v6)
# ファイアーウォールを一時的に停止する場合
$ sudo ufw disable
$ sudo ufw status
Status: inactiveufw status
$ sudo ufw enable
/etc/hosts.allowと/etc/hosts.dennyを確認する
一応確認しておく。TCP WrapperなのでApacheサーバーで設定されている可能性は低い(Apacheのセキュリティ向上という点では意味がないので)。コメントアウトされていて特に設定が有効化されていなければそのままでOK
$ sudo cat /etc/hosts.allow
$ sudo cat /etc/hosts.denny
参考:
アプリケーション層の確認
Apacheの設定ファイルを確認する
# 設定ファイルを探して確認する(/etc/httpdあたり)
$ view /etc/httpd/apache.conf
## 実行ユーザーは何になっているか?
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
...
## ポート80をListenしているか?
Listen 80
...
## ドキュメントルートの設定は正しいか?
DocumentRoot /var/www/html
...
## ディレクトリへのアクセス許可/制限設定は正しいか?
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
ドキュメントルートにあたるディレクトリのパーミッションを確認する
/var/www/html/ディレクトリのパーミッションがApacheの実行ユーザーがアクセスできる設定になっているか確認する。
$ ls -lth /var/
...
drwxrwxrwt 7 root root 4.0K Dec 22 01:32 www
...
$ ls -lth /var/www/
drwxr-xr-x 2 root root 4.0K Dec 9 05:08 html
# Apacheの実行グループ/ユーザーがwww-dataである場合
$ sudo chown -R www-data:www-data /var/www
$ ls -lth /var/
...
drwxrwxrwt 7 www-data www-data 4.0K Dec 22 01:32 www
...
$ ls -lth /var/www/
drwxr-xr-x 2 www-data www-data 4.0K Dec 9 05:08 html
このスクラップは2023/05/10にクローズされました