🚫

SadServers解説#16 "Tokyo":can't serve web file

2024/05/07に公開

https://ja.wikipedia.org/wiki/東京

問題概要

シナリオ

WEBファイルを提供できません

問題詳細

ファイル「/var/www/html/index.html」を提供するWEBサーバーがあり、内容は「hello sadserver」です。しかし、curl 127.0.0.1:80を実行し、HTTPクライアントを使用してローカルで確認しようとしても、何も返されません。このシナリオは特定のWEBサーバーの設定に関するものではないため、WEBサーバーの動作に関する一般的な知識を持っていれば解決することが可能です。

解決判定

Check My Solutionボタンをクリックしてください。

解答が正解かどうか、コマンドプロンプト上で確認することも可能です。以下と同じ出力が得られた場合は正解です。

# curl 127.0.0.1:80
hello sadserver

 

問題解決の方針

【表示する】

今回の問題では、通信が通らない原因を切り分ける力が求められています。
通信が通らない理由として、以下が考えられますね。

  1. HTTPサーバが正常に起動していない
  2. HTTPサーバは正常に起動しているが、通信が遮断されている

今回は、上のような想定で、原因を切り分けていきましょう。

解決の手順を表示する
  1. curlコマンドを実行し、エラーメッセージが出たらエラーメッセージに沿って対応する
  2. ポートの状態を確認する(HTTPサーバが正常に起動しているか確かめるため)
  3. ファイアウォールの状態を確認する(通信が遮断されていないか確かめるため)
  4. WEBサーバを構成しているサービスを特定し、再起動する
  5. ログを確認する(最後の手段)

 

ヒント

一部、SadServers公式のヒントを改変しています。

ヒント1

まずは、curl 127.0.0.1:80を実行してみましょう。

実行コマンド
# curl 127.0.0.1:80
^C

残念ながら、エラーメッセージは出力されませんでした。手掛かりなしです。

ヒント2

curlコマンドでは、80番ポートにアクセスしていました。実際に80番ポートが開かれているのか確認しましょう。

実行コマンド

ポートを確認するコマンドはssコマンドです。

# ss -natu | grep :80
tcp   LISTEN   0      511                        *:80                         *:*
tcp   LISTEN   0      4096                       *:8080                       *:*
tcp   ESTAB    0      0      [::ffff:172.31.47.73]:8080  [::ffff:172.31.16.109]:49452

80番ポートは解放されているようです。

ヒント3

アクセスしようとしていた80番ポートは開かれているようなので、通信が遮断されていないかどうか確認します。
ファイアウォールの仕組みとして、CentOS6以前はiptablesが、CentOS7以降はFirewalldが採用されています。

まずはiptableの状態を見ます。
必要に応じてヘルプを見ながら、iptablesコマンドを実行しましょう。

実行コマンド

まずは、既存のiptableの状態を確認します。

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  anywhere             anywhere             tcp dpt:http

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   

INPUTのhttp通信が、DROP(無効化)されてしまっています。
iptableをリセットしてしまいましょう。

実行コマンド2
# iptables -F
# 
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   

これで、通信を遮断していたファイアウォールの設定を解除できたはずです。

ヒント

通信を遮断していたファイアウォールの設定を解除できたはずなので、もう一度curlコマンドを実行してみましょう。

# curl 127.0.0.1:80
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
<hr>
<address>Apache/2.4.52 (Ubuntu) Server at 127.0.0.1 Port 80</address>
</body></html>

一見ファイルが正しく表示されているように見えますが、よく見てみると403エラーが返ってきています。リソースにアクセスするためのパーミッションがないようです。
WEBファイルのパーミッションを見直し、問題がある場合は適切なパーミッションに変更しましょう。

実行コマンド
# ll /var/www/html/index.html 
-rw------- 1 root root 16 Aug  1  2022 /var/www/html/index.html
#
# chmod 644 /var/www/html/index.html 
#
# ll /var/www/html/index.html 
-rw-r--r-- 1 root root 16 Aug  1  2022 /var/www/html/index.html
#
# curl 127.0.0.1:80
hello sadserver

今度は、無事hello sadserverと表示されました!

 
「いきなり問題を解き始めても調べるばかりになってしまう…」 「やりたいことが分かっても、コマンドが分からない…」 という方は、下記の記事でLinuxのコマンドを復習してから、SadServersの問題に取り掛かってみてはいかがでしょうか。
https://zenn.dev/comf_nakamura/articles/linux_command

問題一覧はこちら

https://zenn.dev/comf_nakamura/articles/sadservers_sitemap

Discussion