SadServers#16 解説 "Tokyo":can't serve web file
問題概要
シナリオ
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
問題解決の方針
【表示する】
今回の問題では、通信が通らない原因を切り分ける力が求められています。
通信が通らない理由として、以下が考えられますね。
- HTTPサーバが正常に起動していない
- HTTPサーバは正常に起動しているが、通信が遮断されている
今回は、上のような想定で、原因を切り分けていきましょう。
解決の手順を表示する
-
curlコマンドを実行し、エラーメッセージが出たらエラーメッセージに沿って対応する - ポートの状態を確認する(HTTPサーバが正常に起動しているか確かめるため)
- ファイアウォールの状態を確認する(通信が遮断されていないか確かめるため)
- WEBサーバを構成しているサービスを特定し、再起動する
- ログを確認する(最後の手段)
ヒント
一部、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の問題に取り掛かってみてはいかがでしょうか。
問題一覧はこちら
Discussion