動かし続ける

INPUT · スライド

開いている扉を見る

01 / 08

住所の先には扉がある

前のレッスンの最後に、こんな話をしたね。

ping は返る → でもサイトが見られない

その答えがだよ。

1つの機械には、たくさんの扉が付いているんだ。

住所 127.0.0.1 の建物  ├ 扉 22   … 遠くから入る口  ├ 扉 80   … Web  ├ 扉 3306 … データベース  └ 扉 8080 … 自分で立てたもの

この番号をポートと呼ぶよ。

住所   どの建物かポート  その建物のどの扉か

両方揃わないと届かないんだ。マンションの住所だけ分かっても、部屋番号が無いと荷物が渡せないでしょう。

書くときはこう並べるよ。

127.0.0.1:8080└───┬──┘ └┬┘  住所    扉

URL でも同じだよ。

http://127.0.0.1:8080/https://example.com/     ← 443 が省略されているhttp://example.com/      ← 80 が省略されている

ふだんは書かないだけで、必ず扉の番号が使われているんだ。

そして肝心なのはここだよ。

> 扉は、誰かが内側で待っていないと開かない

機械が生きていても、そこに待つ人が居なければ入れないでしょう。ping が返るのに使えない、というのはこの状態なんだ。

それを一覧で見るのが netstat だよ。

02 / 08

待っている扉の一覧

netstat に4つの印を付けた形を覚えてしまおう。

~ $ netstat -tulnActive Internet connections (only servers)Proto Recv-Q Send-Q Local Address  Foreign Address  Statetcp   0      0      :::8080        :::*             LISTEN

印の意味はこうだよ。

意味
-tTCP を見る
-uUDP を見る
-l待っているものだけ
-n名前に直さず番号で出す

-tuln は4つで1つの呪文として覚えるといいよ。現場でもこの形がいちばん打たれるんだ。

-n を付ける理由も言っておくね。

-n なし   :::http    (名前に直そうとする)-n あり   :::80      (番号のまま出る)

名前に直そうとすると遅くなることがあるんだ(DNS に聞きに行くからね)。番号のほうが確実で速いでしょう。

読む列は3つだけで足りるよ。

Proto           tcp か udp かLocal Address   自分のどの扉かState           いまどうなっているか

Recv-QSend-Q は溜まっている量だよ。ふだんは 0 で、0 でないときは処理が追いついていないという合図なんだ。困ったときだけ見ればいいよ。

03 / 08

LISTEN は「待っています」

State の欄に出る言葉は、そのまま状態を表しているよ。

言葉意味
LISTEN待っている(誰も来ていない)
ESTABLISHEDいま話している
TIME_WAIT話し終えて片づけ中
CLOSE_WAIT相手は切ったが、こちらが閉じていない

LISTEN があるかどうかが最初に見るところだよ。

LISTEN がある   → 誰かが待っている(入れる可能性がある)LISTEN が無い   → 誰も待っていない(絶対に入れない)

「サービスが動いていない」の一番確かな証拠がこれなんだ。

Local Address の書き方にも意味があるよ。

:::8080          どの住所からでも受ける0.0.0.0:8080     同じ意味(IPv4 の書き方)127.0.0.1:8080   自分自身からしか受けない!

3つめが大事だよ。

127.0.0.1:3306 で待っている同じ機械の中からは入れる他の機械からは入れない

これは事故でも設計でもあるんだ。データベースは「同じ機械からだけ」にしておくのが安全でしょう。逆に「外から入れるはずなのに入れない」ときは、ここが 127.0.0.1 になっていることがとても多いんだよ。

外から繋がらない → まず Local Address を見る

住所の欄で、誰を受けるかが決まっていると覚えておいてね。

04 / 08

閉まっている扉をたたくと

待っていない扉に行くと、こう返ってくるよ。

~ $ wget http://127.0.0.1:8080/wget: can't connect to remote host (127.0.0.1): Connection refused

Connection refused「そこに誰も居ません」という返事だよ。

前のレッスンで4種類のメッセージを並べたね。ここに5つめが入るんだ。

メッセージどこで止まったか
bad address名前が引けない
Network unreachable出る道が無い
Connection refused届いた。でも扉に誰も居ない
(無反応)届いたかどうかも分からない

refused は届いている証なのがおもしろいでしょう。

届いていない  → 返事すら来ない届いている    → 「居ません」と返事が来る

だから refused が出たら、ネットワークは正常なんだ。疑うのは相手のアプリだよ。

refused    → アプリが落ちている / 扉の番号が違う無反応     → 途中で落とされている / 相手が隠れている

この2つを混ぜないでね。直す場所がまったく違うんだ。

新人がよくやる間違いを1つ紹介しておくよ。

「refused が出ました。ファイアウォールですかね?」

ふつうのファイアウォールは黙って捨てるので、無反応になるんだ。refused が返るのは、そこまで届いて相手の OS が答えたということでしょう。

refused が出た → まず ps と netstat を見る

自分の側のアプリが動いているかを先に確かめるんだよ。

05 / 08

扉の番号には決まりがある

有名な扉の番号は覚えておくと得だよ。

番号何の扉か
22ssh(遠くから入る)
25メールの送信
53DNS(名前を引く)
80Web(http
443Web(https
3306MySQL
5432PostgreSQL
6379Redis

番号を見れば何のサービスか分かるでしょう。逆に、開いてはいけない番号が開いていたら危ないんだ。

番号には大きな境目が1つあるよ。

0 〜 1023      特権ポート(root だけが開ける)1024 〜 65535  誰でも開けられる

だから練習では 8080 を使うんだ。

~ $ httpd -p 80httpd: bind: Permission denied~ $ httpd -p 8080(開けられる)

なぜ 1024 未満を守るのかというと、なりすましを防ぐためだよ。

誰でも 443 を開けられたら?  → 偽の https サーバーを立てられる

有名な番号は信用に関わるでしょう。だから管理者だけが開けるようにしてあるんだ。

8080 が Web の練習でよく使われるのは、80 に似ていて覚えやすいからだよ。3000 や 5173 もよく使われるね(開発の道具が使う番号だよ)。

1つ豆知識を渡しておくね。/etc/services というファイルに、番号と名前の対応表が入っていることがあるんだ。netstat から -n を外すと、この表を使って名前に直してくれるんだよ。

06 / 08

netstat の顔はいくつもある

netstat は1つのコマンドで何種類もの表を出せるんだ。

打ち方出るもの
netstat -tuln待っている扉
netstat -tunいま話している相手
netstat -an待っているもの + 話しているもの
netstat -x機械の中だけの通り道
netstat -r経路表(ip route と同じ)

-l を付けるか付けないかで、まったく別の表になるのが分かりにくいところだよ。

-l あり   待っているものだけ-l なし   話しているものだけ-a        両方

-x の UNIX ソケットは、ぜひ一度見ておいてほしいよ。

unix  3  [ ]  DGRAM  CONNECTED  34 /dev/log

/dev/log が見えるでしょう。前のレッスンの logger が話していた相手だよ。

logger → /dev/log → syslogd → /var/log/messages

ネットワークを通らず、機械の中だけで話す通り道なんだ。同じ機械の中なら、こちらのほうが速くて安全でしょう。データベースへの接続でも使われることがあるよ。

-r は前のレッスンの ip route と同じ中身だよ。

netstat -r    古い言い方ip route      新しい言い方

古い道具は、いろいろな顔を1つに詰め込んでいるね。ip はそれをきれいに分けたんだ。だから新しく覚えるなら ip と、扉を見るときだけ netstat(または ss)がいいよ。

この環境には ss が入っていないけれど、netstat -tulnss -tuln に書き換えるだけでほぼ同じだから、覚え直しは要らないからね。

07 / 08

扉を開ける道具を1つだけ借りる

この回は「見る」練習だけれど、見るには誰かが待っていないといけないでしょう。

だから扉を開ける道具を1つだけ先に借りるよ。

~ $ httpd -p 8080 -h /home/learner~ $

何も出ずに戻ってきたね。失敗ではないよ

-p 8080              8080 番の扉を開ける-h /home/learner    見せる場所(この中のファイルを配る)

すぐ戻ってくるのは、裏に回って動き続けるからだよ。章8でやった & の話に似ているけれど、こちらは自分で裏に回るんだ。こういうものをデーモンと呼ぶよ。

ふつうのコマンド   終わるまで画面が返らないデーモン           すぐ返って、裏で動き続ける

動いているかどうかは、章8で覚えた ps で確かめられるね。止めるのも同じだよ。

ps | grep httpd     動いているか見るkillall httpd       止める

新しい道具が要らないでしょう。httpd の詳しい話は次のレッスンでやるので、この回では「扉を開ける係」として使うだけにしておくね。

1つだけ約束してほしいことがあるよ。

> 開けた扉は、練習が終わったら閉める

開けっぱなしは、家の鍵を開けたまま出かけるのと同じでしょう。この回の問題では、最後に killall httpd で閉める形を何度も打ってもらうよ。開けたら閉めるが身につくようにね。

08 / 08

さあ、打ってみよう

この回で使う形をまとめておくね。

netstat -tuln              待っている扉netstat -an                待っている + 話しているnetstat -x                 機械の中の通り道netstat -r                 経路表httpd -p 8080 -h /home/learner   扉を開けるkillall httpd              閉めるwget -q -O - URL           たたいてみる

読むところも並べておくよ。

LISTEN         待っているESTABLISHED    いま話しているTIME_WAIT      話し終えて片づけ中:::8080        どの住所からでも受ける127.0.0.1:8080 自分からしか受けない

今日いちばん覚えてほしいことは3つだよ。

1. LISTEN が無ければ、絶対に入れない2. Connection refused は「届いている」証3. 1024 未満の扉は root だけが開けられる

そして今日の結論。

> 機械が生きていることと、扉が開いていることは別

前のレッスンの ping は1段め、この回の netstat は2段め。次のレッスンの wget が3段めだよ。

1. ping     機械は生きている?2. netstat  扉は開いている?3. wget     中身は返ってくる?

3段そろうと、原因の場所をほぼ言い当てられるようになるんだ。

最後の2問では、扉が開いているかを見張って記録に残す道具を作るよ。章11と前の2本が全部つながるからね。では打ってみよう。