動かし続ける

INPUT · スライド

自分の住所を確かめる

01 / 08

1台の中から外へ

ここまでの12章は、全部1台の機械の中の話だったね。

ファイル・権限・プロセス・スクリプト・時刻・記録

ここから残りのレッスンは、機械と機械のあいだの話だよ。

最初にやることは、住所の確かめ方。

~ $ ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 …    inet 127.0.0.1/8 scope host lo

この 127.0.0.1あなたの住所だよ。

正直に言っておくことがあるんだ。

> この Linux は外のインターネットにつながっていない

ブラウザの中で動いているので、外に出るには別の中継役が必要で、この教材はそれを持っていないんだ。

ping 127.0.0.1    返ってくる(自分自身)ping 8.8.8.8      返ってこない(外のサーバー)

壊れているのではなく、そういう作りにしてあるんだよ。

でも、それでも学べることがたくさんあるんだ。

住所の読み方(127.0.0.1/8 の /8 は何?)名前と住所の対応(/etc/hosts)道があるかどうか(ip route)つながらないときの切り分け

とくに最後が大事だよ。現場で「つながりません」と言われたとき、どこまでは大丈夫でどこから駄目かを切り分けられる人は強いんだ。この回でその読み方を覚えよう。

そしてこの章の最後には、この1台の中に自分で Web サーバーを立てて、自分でつなぐところまでいくよ。外に出なくても、ネットワークの仕組みは体験できるんだ。

02 / 08

ip addr を読む

まず全部を出してみるよ。

~ $ ip addr show lo1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo    inet6 ::1/128 scope host

記号が多いけれど、読むところは少ないよ。

lo                  この口の名前<… UP …>            いま使える状態mtu 65536           1回に運べる大きさinet 127.0.0.1/8    IPv4 の住所inet6 ::1/128       IPv6 の住所

lo は loopback(ループバック)の略で、自分自身に戻ってくる口だよ。手紙を自分の家に出すようなものだね。

どの機械にも必ずあって、住所は決まって 127.0.0.1 なんだ。

127.0.0.1     どの機械でも「自分自身」localhost     その名前(/etc/hosts に書いてある)

/8 は何かというと、住所のうち何桁が町の名前かを表しているよ。

127.0.0.1/8         └─ 前の 8 ビットが町、残りが家
/8    127.*.*.*        が同じ町(とても広い)/24   192.168.1.*      が同じ町(よく見る大きさ)/32   その1つだけ

数が大きいほど町が狭くなるんだ。127 で始まる住所は全部が自分自身という決まりなので、こんなに広いんだよ。

ping 127.0.0.1     自分ping 127.0.1.1     これも自分!ping 127.9.9.9     これも自分!

1600万個ぜんぶ自分なんだ。ぜいたくでしょう。

03 / 08

口・住所・道の3つ

ネットワークを見るときは、この3つを順に確かめるんだ。

見るものコマンド意味
ip link通信する口があるか、使える状態か
住所ip addrその口に住所が付いているか
ip routeそこから外へ出る道があるか

下から順に積み上がっているんだ。口が無ければ住所は付かないし、住所が無ければ道も使えないでしょう。

この環境で見てみようね。

~ $ ip link1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 …2: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN …

口が2つあるね。loUP(使える)、sit0DOWN(使えない)だよ。sit0 はふだん使わない特別な口なので、気にしなくていいんだ。

~ $ ip addr show lo… inet 127.0.0.1/8 …

住所は付いているでしょう。

~ $ ip route(何も出ない)

道が1本も無いんだ! これがこの環境で外に出られない理由だよ。

ふつうの機械なら、こう出るんだ。

default via 192.168.1.1 dev eth0192.168.1.0/24 dev eth0 scope link
default via …   「知らない住所は、ここに渡してね」という道

これが外に出るための道(デフォルトゲートウェイ)だね。この環境にはそれが無いので、127.* 以外にはどこにも行けないんだ。

覚えておくと現場で役に立つよ。

つながらない!  ↓ ip link    口は UP?  ↓ ip addr    住所は付いている?  ↓ ip route   default の道はある?

下から順に確かめると、どこで切れているかが分かるでしょう。

04 / 08

名前と住所

住所は数字だけれど、ふだん使うのは名前でしょう。

~ $ ping localhostPING localhost (127.0.0.1): 56 data bytes

localhost127.0.0.1 に変わったね。この変換を名前解決と呼ぶよ。

どこを見て変換しているかというと、この環境ではファイル1枚だよ。

~ $ cat /etc/hosts127.0.0.1       localhost127.0.1.1       fulfledge

名前と住所の対応表だね。左が住所、右が名前だよ。

~ $ ping fulfledgePING fulfledge (127.0.1.1): 56 data bytes

表に書いてあるので引けたでしょう。

ふつうの機械では、この表に無い名前は DNS(名前を引く係)に聞きに行くんだ。

1. /etc/hosts を見る2. 無ければ DNS に聞く(相手は /etc/resolv.conf に書く)

でもこの環境には /etc/resolv.conf が無いので、2つめができないんだ。

~ $ ping example.comping: bad address 'example.com'

住所が分からないと言っているね。「つながらない」ではなく「名前が引けない」でしょう。ここが読み分けの練習になるよ。

メッセージ意味
bad address名前が引けない(表にも DNS にも無い)
Network unreachable住所は分かったが、行く道が無い
Destination Host Unreachable道はあるが、相手が見つからない
(何も返らない)届いているが返事が来ない

メッセージが違えば、原因が違うんだ。現場では /etc/hosts に1行足して切り分けることもあるよ。

192.168.1.50   shinsaba

名前でつなげるようになるでしょう。ただしその機械の中だけの話で、他の機械には効かないよ。

05 / 08

古い言い方も知っておく

同じことを2通りで書ける道具があるんだ。

~ $ ifconfig lolo        Link encap:Local Loopback          inet addr:127.0.0.1  Mask:255.0.0.0          UP LOOPBACK RUNNING  MTU:65536  Metric:1

ip addr と同じことが出ているでしょう。

ip     新しい言い方(いまはこちら)ifconfig  古い言い方(まだよく見る)

対応を並べておくね。

古い新しい
ifconfigip addr
route -nip route
arp -aip neigh
netstatss(この環境には無い)

なぜ両方あるのかというと、古いものが長く使われすぎたからだよ。新しいほうが多機能なので、いまから覚えるなら ip がいいね。

でも古い言い方も読めるようにしておいてね。ネットで見つかる古い記事や、長く動いているサーバーの手順書には ifconfig で書かれているんだ。

ifconfig の書き方でおもしろいのは、住所の見せ方だよ。

ip:        127.0.0.1/8ifconfig:  inet addr:127.0.0.1  Mask:255.0.0.0

同じことを2通りで書いているんだ。

/8  =  255.0.0.0/24 =  255.255.255.0

前の何ビットが町か、を数で書くか長い形で書くかの違いだね。章6で chmodu+x755 の2通りで書いたのと似ているでしょう。同じことを別の書き方で表すのは、Unix によくある話なんだ。

通信の量を見る場所もあるよ。

~ $ grep lo: /proc/net/dev    lo: 1426  18 0 0 0 0 0 0 1426  18 0 0 0 0 0 0

章9でやった /proc だね。ファイルの形をした、いまの状態でしょう。受け取ったバイト数とパケット数が入っているんだ。

06 / 08

住所は勝手に変えられない

住所を足すこともできるんだ。

~ $ ip addr add 127.0.0.2/8 dev loip: RTNETLINK answers: Operation not permitted

断られたね。章6・章7でやった権限の話だよ。

読む      誰でもできる(ip addr / ip link / ip route)変える    root だけ(ip addr add / ip link set)

当たり前でしょう。誰でも住所を変えられたら、他の人の通信を横取りできてしまうからね。

お前の手紙は全部おれの家に届けろ

こう宣言できたら困るよね。だから変えるのは管理者だけなんだ。

章7で覚えた su を使えば、root になって変えられるよ。でもこの回ではやらないでおこう。ネットワークの設定を触ると、自分の足を撃つことがあるからだね。

ip link set lo down  ↓ 自分自身への通信が全部止まる

本物のサーバーでこれを遠くから打つと、その場で自分が切られて二度と入れなくなるんだ。有名な事故だよ。

覚えておいてほしい作法があるよ。

> ネットワークの設定は、切られても戻れる用意をしてから触る

現場ではこういう手を打つんだ。

1. 別の入り口を用意しておく(画面の前に人を置く)2. 10分後に元に戻す仕掛けを cron で入れておく3. 一時的な変更にして、再起動で元に戻るようにする

2つめは今日までに覚えた道具でできるでしょう!

at now + 10 minutes …    (この環境には無い)*/10 * * * * /root/moto-ni-modosu.sh

保険をかけてから触るんだ。読むだけなら怖くないので、この回は読むほうに集中しようね。

07 / 08

切り分けの順番

この回でいちばん持ち帰ってほしいのは、道具の名前ではなく順番だよ。

「つながりません」と言われたら、下から順に確かめるんだ。

1. 口はある?          ip link2. 住所は付いている?   ip addr3. 道はある?          ip route4. 自分に届く?         ping 127.0.0.15. 相手に届く?         ping 相手6. 名前は引ける?       ping 名前7. その扉は開いている?  次のレッスンの netstat

下が駄目なら、上は必ず駄目でしょう。だから下から順に見るんだ。上から見ると、原因が下にあるときに遠回りになるんだよ。

この環境でやってみると、こうなるね。

1. ip link      lo は UP        ○2. ip addr      127.0.0.1 あり  ○3. ip route     空!            ×  ← ここで切れている4. ping 127.0.0.1  返る         ○(道が要らないので)5. ping 8.8.8.8    返らない     ×(3 のせい)

3 が原因で 5 が駄目だと分かるでしょう。ping が返らないのを見て「サーバーが落ちている」と早合点しないで済むんだ。

現場で聞かれる質問に答えられるようになるよ。

Q「サーバーが落ちてる?」A「いえ、こちらから出る道が無いです」

原因の場所を言えるのが値打ちだね。

もう1つ、順番と同じくらい大事なことを言っておくよ。

> メッセージをそのまま読む

bad address            名前が引けないNetwork unreachable    道が無いConnection refused     届いたが断られた(扉が閉まっている)(無反応)              届いているか分からない

4つとも原因が違うでしょう。「つながらない」で片づけずに、どの言葉で断られたかを見るんだ。ここが読めると、調べる時間が何倍も短くなるよ。

08 / 08

さあ、打ってみよう

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

ip addr              住所を見るip addr show lo      口を選んで見るip -o addr           1行にまとめて出す(awk 向き)ip link              口とその状態ip route             外へ出る道hostname             自分の名前cat /etc/hosts       名前と住所の対応表ifconfig lo          古い言い方grep lo: /proc/net/dev   通信の量

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

1. 127.0.0.1 はどの機械でも「自分自身」2. 口 → 住所 → 道 の順に確かめる3. メッセージが違えば、原因が違う

そして今日の結論。

> つながらない理由は、切り分けられる

「なんとなくつながらない」で止まらずに、どこまでは動いているかを1つずつ確かめる。これはネットワークだけでなく、プログラムを直すときの考え方そのものだよ。

この回は読むだけなので、壊れる心配は無いよ。安心して打ってみてね。

次のレッスンでは pingnetstat をやるよ。届くかどうかを試して、いまどの扉が開いているかを見るんだ。そして最後に、自分で扉を開ける(サーバーを立てる)ところまでいくよ。では打ってみよう。