接続を拒否されたレジ
ポートは、機器の中の一つのプログラムを指す番号です。例えば、ウェブサーバーは80番で待ちます。ポートとウェブの返事を読むと、接続が失敗した理由が正確にわかります。
店のレジに、赤い文字で「接続を拒否されました」と出ます。カードリーダーの電源は入っていて、ケーブルも問題ありません。
このメッセージは、正確なことを言っています。レジは機器までたどり着き、その機器では、その扉で待っているものが無かったのです。
今日は、機器の扉の読み方と、ウェブサーバーの返事の読み方を学びます。
このレッスンのゴール
メモ
機器がどのポートで待っているかを調べ、ウェブの返事を読める。
重要な言葉
| ことば | いみ | れい |
|---|---|---|
| ポート | 機器の中の扉を一つ指す番号 | 80 |
| 待ち受け | ポートで接続が来るのを待っていること | |
| HTTP | ウェブのリクエストと返事の言葉 | |
| ステータスコード | リクエストの結果を表す3桁の番号 | 200 |
| ヘッダー | リクエストや返事にある、追加情報の行 |
学生が入力するセルは、このプレビューでは空白です。
ポートは機器の扉
アドレスは機器を見つけます。ポートは、その機器の中のプログラムを見つけます。ウェブサーバーはポート80で待ち、別のプログラムは別のポートで待ちます。
ポートで待っているプログラムは待ち受けをしています。ss -ltn は、待ち受け中のポートをすべて並べます。l は待ち受け、t はTCP、n は数字のままの表示です。
LANの機器が待っているものを並べる
sudo ip netns exec lan ss -ltnここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
外のサーバーが待っているものを並べる
sudo ip netns exec srv ss -ltnここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ポートをノックして、誰が答えるか見る
別の機器から nc -zv を使うと、何も送らずにポートをノックします。z は確かめるだけ、v は何が起きたかを言うという意味です。
結果は三通りのどれかです。下の表が、それぞれの意味を示します。
開いているポートをノックする
sudo ip netns exec gw nc -zv -w 2 10.0.0.2 80ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
誰も待っていないポートをノックする
sudo ip netns exec gw nc -zv -w 2 10.0.0.2 9999ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: ノックの結果の意味
| ncの出力 | 意味 | 次に見る場所 |
|---|---|---|
| succeeded | プログラムが待っている | そのプログラム自身 |
| Connection refused | 機器は答えたが、そこで待つものが無い | プログラムは動いているか、どのポートか |
| timed out | 返事がまったく戻らない | ファイアウォール、または失敗する経路 |
学生が入力するセルは、このプレビューでは空白です。
ウェブの返事は三つの部分
ウェブのリクエストは、ふつうの文字列です。返事もそうで、ステータスコードの行、ヘッダー、そして本文の三つの部分があります。
ステータスコードは、結果を表します。最初の数字が仲間を示します。2は成功、3は移動です。4は頼んだ側の間違い、5はサーバー側の間違いです。
ヘッダーから始まる返事全体を読む
sudo ip netns exec gw curl --noproxy '*' -s -i -m 3 http://10.0.0.2/ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ステータスコードだけを出す
sudo ip netns exec gw curl --noproxy '*' -s -o /dev/null -w '%{http_code}\n' http://10.0.0.2:8081/ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: ステータスコードの仲間
| コード | 仲間 | やさしく言うと |
|---|---|---|
| 200 | 2xx | うまくいった。ページはこれです |
| 301 | 3xx | 移った。こちらの別のアドレスへ |
| 404 | 4xx | そのパスには何も無い |
| 503 | 5xx | サーバーは今は処理できない |
学生が入力するセルは、このプレビューでは空白です。
リクエストを手で送る
printf 'GET /hello HTTP/1.0\r\n\r\n' | sudo ip netns exec gw nc -w 2 10.0.0.2 80ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
「ポート80はウェブで、ほかのポートはウェブになれない」と考える人が多いのですが、違います。ポートは誰かが決めた番号で、80はHTTPの慣れた選び方にすぎません。外のサーバーは、ポート8000でHTTPを話します。まず何が待っているかを調べ、それから質問しましょう。
発展: プロセスを見つける
sudo ip netns exec lan ss -ltnp を実行し、各行の最後の列を読みます。そのポートを持っているプログラムの名前が出ます。
ポート80で待っているのはどのプログラムですか。8081を持つのと同じプロセスですか。ポートがすでに使われているとき、これが役に立つのはなぜでしょう。