第5章 5-5 / 管理者の仕事

ネットワークを確認する

このページで叩くコマンドと到達点

前提:5-4が完了し、ホームディレクトリ(~)にいる状態から始めます。5-4で見た「世界中からのアクセス」がどんな経路でサーバーに届くのか、このページではネットワークの基本を手を動かして確認します。自分のサーバーの住所にあたるIPアドレス※1を調べるip a、相手に届くか確認するping、Webの中身を取得するcurl、そして今どのポート※2が開いているかを見るss。次の5-6でファイアウォールを設定する前提知識として、必ず押さえておきたい内容です。

このページではSET 1〜3、合計30行のコマンドを上から順に叩きます。手打ち推奨(コピーは確認用)です。

SET 1 ― 自分のIPアドレスを知る

ubuntu@lightsail: ~
  1. $hostname
  2. $hostname -I
  3. 172.26.14.203
  4. $ip a
  5. 2: eth0: ... inet 172.26.14.203/20 ...
  6. $ip a | grep inet
  7. $ip link
  8. $curl ifconfig.me
  9. 203.0.113.45
  10. $curl -s ifconfig.me
  11. $ping -c 4 google.com
  12. $ping -c 4 8.8.8.8
  13. $cd ~
解説 ― SET 1 で何をしたか

1行目のhostnameは、このサーバーに付けられた名前を表示します。2行目のhostname -I(大文字のI)で、このサーバー自身のIPアドレスを確認します。出力例の172.26.14.203のような値は、実はLightsail内部だけで通用するプライベートIPアドレス※3で、いわば「マンションの部屋番号」にあたります。

3行目のip a(address、旧来のifconfigにあたるコマンド)では、ネットワークインターフェースごとの詳細な設定を確認できます。出力例のようにinetの後ろにIPアドレスが表示されている行が、まさに2行目で見たアドレスと一致するはずです。4行目のようにgrepと組み合わせれば、IPアドレスの行だけに絞り込むこともできます。5行目のip linkは、IPアドレスの情報を含めず、ネットワークインターフェースの状態(有効/無効など)だけを見たいときに使います。

6行目のcurl ifconfig.meは少し変わったコマンドです。curl(1-4や3-3で名前だけ触れた、Web上のデータを取得する道具)を使って外部のサービスに問い合わせることで、インターネット全体から見たときの、あなたのサーバーの本当の住所(グローバルIPアドレス)を教えてもらっています。マンションの部屋番号(プライベートIP)に対して、こちらは「マンション全体の住所」(グローバルIP)にあたります。7行目のように-s(silent)を付けると、進捗表示を消してIPアドレスだけをすっきり表示できます。

8行目のping -c 4 google.comは、Googleのサーバーに向けて「聞こえてますか」という信号を4回(-c 4)送り、応答が返ってくるまでの時間を計測します。相手に到達できるかどうかのもっとも基本的な疎通確認で、インターネットにきちんとつながっているかを調べる第一歩として使われます。9行目のように名前の代わりにIPアドレス(8.8.8.8はGoogleが公開している代表的なDNSサーバーです)を直接指定してpingすることもできます。

POINT

プライベートIP(hostname -Iで見えるもの)とグローバルIP(curl ifconfig.meで見えるもの)は別物です。「自分のIPアドレスは?」と聞かれたときにどちらを答えるべきかは文脈次第、という点を覚えておいてください。

ゆみちゃん
ゆみ

マンションで例えると、プライベートIPは「あなたの部屋番号」、グローバルIPは「マンション自体の郵便番号付き住所」だよ! 宅配便(インターネットの通信)はまずマンションの住所に届いて、そこから部屋番号で仕分けされる、ってイメージすると腑に落ちるはず。

SET 2 ― curlとwgetでWebにアクセスする

ubuntu@lightsail: ~
  1. $curl -I https://transparently.jp
  2. HTTP/2 200
  3. server: nginx
  4. $curl -I https://transparently.jp | grep HTTP
  5. $curl https://transparently.jp | head -n 5
  6. $curl https://transparently.jp | wc -l
  7. $curl -o /dev/null -s -w '%{http_code}\n' https://transparently.jp
  8. $wget https://transparently.jp -O /tmp/test.html
  9. $ls -lh /tmp/test.html
  10. $head -n 5 /tmp/test.html
  11. $rm /tmp/test.html
  12. $cd ~
解説 ― SET 2 で何をしたか

1行目のcurl -I https://transparently.jp(大文字のI、Head)は、Webページの中身を丸ごと取得するのではなく、HTTPヘッダー※4だけを取得します。出力例のHTTP/2 200は「正常に応答が返ってきた」という意味のステータスコードで、server: nginxからは相手のサーバーがnginxというソフトで動いていることまでわかります。サイトの調子を軽く確認したいときに便利な使い方です。2行目のようにgrepと組み合わせれば、ステータスコードの行だけに絞り込むこともできます。

3行目のcurl https://transparently.jp | head -n 5では-Iを外し、実際のページの中身(HTML)を取得して、パイプで先頭5行だけに絞って見ています。curlは取得した内容をそのまま画面(標準出力)に流すのが基本の動きです。4行目のwc -lで、ページ全体のHTMLが何行あるかも確認できます。5行目は少し発展的な書き方で、-o /dev/nullで中身を捨てつつ-wでステータスコードだけを表示させる、監視スクリプトなどでよく使うテクニックです。

6行目のwget https://transparently.jp -O /tmp/test.htmlcurlとよく似た道具ですが、こちらは取得した内容をファイルに保存することを主な目的に設計されています。-O(大文字のO)で保存先のファイル名を指定します。78行目で、確かにファイルとして保存されたことを確認し、9行目のrmで練習用の一時ファイルを片付けます。

ざっくり使い分けるなら、画面で内容を確認したい・APIとやり取りしたいならcurl、ファイルとしてまるごと保存したいならwgetと覚えておくとよいでしょう。

POINT

curl -Iはサーバーが生きているかの軽い確認に便利です。7-1で自分のWebサーバーを公開したあと、同じようにcurl -Iで自分のサイトの応答を確認することになります。

SET 3 ― ポートの状態を見る

ubuntu@lightsail: ~
  1. $sudo ss -tlnp
  2. LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=612,fd=3))
  3. $ss -tln
  4. $ss -tlnp | grep 22
  5. $ss -tlnp | wc -l
  6. $ss -tu | head
  7. $ss -s
  8. $hostname -f
  9. $cat /etc/hostname
  10. $cat /etc/hosts
  11. $cd ~
解説 ― SET 3 で何をしたか

IPアドレスが「マンションの住所」だとすると、1行目のsudo ss -tlnpで確認するポートは「マンションの部屋番号」に相当します。同じサーバー(住所)の中でも、SSHは22番の部屋、Webサーバーは80番の部屋、というように、サービスごとに異なるポート番号で待ち受けています。ss(socket statisticsの略)は今どのポートが誰によって開かれているかを確認するコマンドで、-t(tcp)・-l(listen中のみ)・-n(名前解決せず数字のまま表示)・-p(プロセス名を表示)を組み合わせています。sudoが要るのは、-pで他のユーザーが実行しているプロセスの情報まで見るためです。

出力例のように、0.0.0.0:22という行にsshdというプロセス名が紐づいているのが確認できます。これは「22番の部屋(ポート)でsshdという従業員(5-2のサービス)が、どのIPアドレスからの来客でも(0.0.0.0)受け付けています」という意味です。あなたが今まさにこのポートを通ってサーバーに接続しています。

2行目のss -tln-pを外したもので、sudoを付けなくても実行できます(プロセス名までは見えません)。3行目のようにgrepと組み合わせれば、目的のポートだけに素早く絞り込めます。4行目のwc -lで、待ち受け中のポートがいくつあるかを数えます。

5行目のss -tuは接続中のTCP/UDP通信全体を見るオプションです。6行目のss -s(summary)を使うと、接続の総数などをまとめた統計情報を確認できます。7行目のhostname -f(fully qualified、完全修飾ドメイン名)で、より詳しいホスト名の形式を確認できます。89行目の/etc/hostname/etc/hostsは、サーバー自身の名前や名前解決の設定が書かれた基本ファイルで、内容を見るだけにとどめます。

ゆみちゃん
ゆみ

ポート番号の話、最初は「?」って感じだったけど、マンションの部屋番号でイメージしたら一気にわかりやすくなったよ。22番はSSH専用の部屋、80番はWeb専用の部屋、みたいに決まった番号がだいたい決まった用途に使われてるから、次のページのファイアウォールでも同じ考え方が出てくるよ!

POINT

ss -tlnpで「開いているはずのないポートが開いている」ことに気づけたら、それは不正なプログラムが動いているサインかもしれません。定期的に自分のサーバーで叩いて、見慣れたポート(22番など)以外が増えていないかを確認する習慣をつけておくと安心です。

まとめ

5-5では、IPアドレスとポートという2つの基本概念を軸に、自分のサーバーのネットワーク状態を確認する方法を体験しました。このページで叩けるようになったコマンドを一覧にまとめます。

コマンド何をするか覚え方
hostname -IサーバーのプライベートIPアドレスを表示する部屋番号を確認
ip aネットワークインターフェースの詳細を表示するaddress(住所詳細)
curl ifconfig.me自分のグローバルIPアドレスを調べるマンション全体の住所を聞く
ping -c 4 <宛先>相手への疎通を確認する聞こえてますか、を4回
curl -I <URL>HTTPヘッダーだけを取得するHead(頭だけ)
wget <URL> -O <保存先>Web上のファイルをダウンロードするファイルとして持ち帰る
sudo ss -tlnp待ち受け中のポートとプロセスを表示する部屋番号と住人の一覧

次のページ「5-6. ファイアウォールとSSH設定」では、今日確認した22番ポートを実際に守るために、ufwを使ったファイアウォールの設定を練習します。

脚注 ─ 用語解説
  1. IPアドレス … ネットワーク上の機器を識別するための番号。インターネット全体で通用するグローバルIPと、特定のネットワーク内だけで通用するプライベートIPがある。
  2. ポート … 同じIPアドレスの中で、どのサービス宛ての通信かを区別する番号。SSHは22番、Webは80番/443番が代表的。
  3. プライベートIPアドレス … 特定のネットワーク内(Lightsailの内部ネットワークなど)だけで通用するIPアドレス。インターネット全体からは直接見えない。
  4. HTTPヘッダー … Webのやり取りで、実際のページの中身とは別にやり取りされる付加情報。応答結果(ステータスコード)やサーバーの種類などが含まれる。