クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

ポートとウェブリクエストを一歩ずつ

このレッスンのあとで: 機器がどのポートで待っているかを調べ、ウェブの返事を読める。

55分のレッスンコマンド7件NAT ゲートウェイのラボ:nftables でマスカレードとポート転送をブラウザーで学ぶ

接続を拒否されたレジ

ポートは、機器の中の一つのプログラムを指す番号です。例えば、ウェブサーバーは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/

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

例: ステータスコードの仲間

コード仲間やさしく言うと
2002xxうまくいった。ページはこれです
3013xx移った。こちらの別のアドレスへ
4044xxそのパスには何も無い
5035xxサーバーは今は処理できない

学生が入力するセルは、このプレビューでは空白です。

リクエストを手で送る

コマンド
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を持つのと同じプロセスですか。ポートがすでに使われているとき、これが役に立つのはなぜでしょう。

このラボとソースについて: NAT ゲートウェイのラボ:nftables でマスカレードとポート転送をブラウザーで学ぶ

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。