Closed6

新規構築したサーバーでlocalhostのHTTPアクセスで失敗するときの切り分け

mom0tomomom0tomo

普段は運用で構築済みサーバーばかり触っていて忘れるのでメモ。AWSのACLやSecurity Groupの設定方法ではなくて、基本的な考え方と自宅サーバーで遊ぶときに使えるメモ。

トラブル例:

  • /var/www/html/index.htmlにコンテンツを配置しているWebサーバーがある
    • Apacheを利用している
  • $ curl 127.0.0.1:80 HTTPクライアントでローカルに確認すると何も返ってこない
  • OS: ubuntu
mom0tomomom0tomo

基本的にOSI参照モデル, TCP/IPのレイヤーの低いところから確認していく。

  • アプリケーション層
  • トランスポート層
  • インターネット層
  • ネットワークインターフェース層

設定を変えてみる度に

$ curl 127.0.0.1:80

を叩いてApacheのログを確認する。

mom0tomomom0tomo

Apacheのログを見る

$ sudo tail -f /var/log/httpd/error.log
$ sudo tail -f /var/log/httpd/access.log

ログに何も出てこなかったらアプリケーション層より下の問題だとわかる。(Nginxなどを使っている場合も同じ)

pingは通るのか見る

pingは返ってくるのにcurlは返ってこない場合はネットワークインターフェース層では問題がない。(pingすら通らないときでもネットワークインターフェース層でに問題があることは少ない&問題があっても対応できないことが多い)
怪しいのはだいたいインターネット層とトランスポート層なので、下記を確認する。

  • iptablesで弾かれていないか
  • ポートが閉じられていないか
mom0tomomom0tomo

トランスポート層〜インターネット層の確認

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

参考:

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
mom0tomomom0tomo

/etc/hosts.allowと/etc/hosts.dennyを確認する

一応確認しておく。TCP WrapperなのでApacheサーバーで設定されている可能性は低い(Apacheのセキュリティ向上という点では意味がないので)。コメントアウトされていて特に設定が有効化されていなければそのままでOK

$ sudo cat /etc/hosts.allow
$ sudo cat /etc/hosts.denny

参考:

mom0tomomom0tomo

アプリケーション層の確認

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にクローズされました