13.5 基本的なネットワークの調査
Linux Essentials Online Text | 2021/08/03

ネットワークをモニタする(ss)

ssは、ネットワークに関する様々な情報を取得するためのコマンドです。

書式:

ss [オプション]

主なオプション:

-a全ての接続を表示します
-n名前解決をせずにIPアドレスで表示します
-ttcpの情報のみを表示します
-uudpの情報のみを表示します

<実習: ssコマンドの実行>

ネットワークに関連する設定はシステムに関わるため、rootで実行します。

# ss -nat
State      Recv-Q  Send-Q  Local Address:Port   Peer Address:Port
LISTEN     0       128                 *:22                *:*
LISTEN     0       100         127.0.0.1:25                *:*
ESTAB      0       0           10.0.2.15:22         10.0.2.2:12632
LISTEN     0       128              [::]:22             [::]:*
LISTEN     0       100             [::1]:25             [::]:*

ssコマンドではオプションをひとまとめにして指定することができます。上記では「-nat」を指定しています。つまり、「名前解決をせずにIPアドレスで、TCPの接続情報を全て表示する」という意味になります。

1行が1コネクションの情報で、どこから、誰が、どのプロトコル、どのポートで接続し、そのコネクションがどのようなステータスかをStateで確認することができます。「LISTEN」は、該当のアドレス、ポートで待ち受けていることを示します。「ESTAB」はTCPコネクションが確立して通信している状態を示します。

次に、「-at」オプションで実行してみましょう。

# ss -at
State      Recv-Q  Send-Q  Local Address:Port   Peer Address:Port
LISTEN     0       128                 *:ssh               *:*
LISTEN     0       100         127.0.0.1:smtp              *:*
ESTAB      0       0           10.0.2.15:ssh        10.0.2.2:12632
LISTEN     0       128              [::]:ssh            [::]:*
LISTEN     0       100             [::1]:smtp           [::]:*

「-nat」オプションを実施した場合との違いがわかるでしょうか。ポートが番号ではなく「ssh」「smtp」等の名前に変換されています。ssコマンドは、元々IPアドレスをホスト名に、ポート番号を対応するサービス名称に直して表示しようとします。そのため、名前を解決に時間がかかる環境では結果の表示に時間がかかり、ひどい場合は表示されません。そのため、素早く結果を知りたい場合は「-n」オプションを使用します。

サービスとポート番号

ssコマンドで情報を取得した時、IPアドレスの後ろに「:(コロン)」で区切って番号が表示されます。この番号を「ポート番号」と言います。ポート番号は、コンピュータがどのような通信に使ったかを見分けるために使用します。

例えば、LinuxでWebサービスを提供するには「apache」を使用します。「apache」を起動するとWebサーバとして動作するため、httpやhttpsというプロトコルが使えるようになるわけですが、これはサーバがポート番号80番や443番で待ち受けることを意味します。

私達は普段、ブラウザを起動して「www.lpi.org」等のURLを入力してWebページにアクセスしますが、これはブラウザが「www.lpi.org」アドレスだけではなく、80番や443番というポート番号情報も付与して送信しています。

この時、送信元もポート番号を設定します。送信元は1025番ポートから順番に付与して通信を行います。これにより、サーバは受け取ったデータ毎に、指定されたポートへ返信データを送ることができます。
送信元となるクライアント側も、受け取ったデータがいつ、どのタイミングで送信したデータの返信かをポート番号で判断することができます。

データは、ネットワークの混雑状況によって、遅く届いたり、早く届いたりするため、送信した順番で受信するとは限りません。しかし、このように送信元、送信先にポート番号を付与して通信することで、同じサーバと複数のデータのやり取りをしていても、どの通信に対しての返信かがわかるようになり、確実なデータの受送信が行えるようになります。

ポート番号

送信元、送信先ポートとして指定することができるポート番号は、0~65535まで存在しており、IANA(Internet Assigned Numbers Authority)によって、以下3種類に大別されています。

名前範囲内容
WELL KNOWN PORT NUMBERS0~1023一般的なポート番号
REGISTERED PORT NUMBERS1024~49151番登録済みポート番号
DYNAMIC AND/OR PRIVATE PORTS49152~65535自由に使用できるポート番号

先程紹介した、http、httpsや、smtpなどのように、一般によく使われるポート番号の事を「WELL KNOWN PORT」と言います。「REGISTERED PORT NUMBERS」は、有名なアプリケーション等で使われるポート番号などが登録されています。クライアント側に割り当てられるポート番号など、ユーザが自由にポート番号を使用する場合は49152番以降を使用します。これらのポートは俗に、エフェメラルポート(短命なポート)と呼ばれます。

ただし、これらはあくまで指針であり強制力はありません。これに従わず勝手なポート番号を用いて通信することも可能です。セキュリティを確保するために、わざとポート番号を変更するケースもあります。

WELL KNOWN PORT

ポート番号サービス名
20FTP(データ)
21FTP(制御)
22SSH
23Telnet
25SMTP(メール送信)
53DNS
80HTTP(Web)
110POP3(メール受信)
123NTP
143IMAP(メール)
161SNMP
162SNMP-trap
389LDAP
443HTTPS(暗号化されたWeb)
514syslog
995POP3S(メール受信)

1~1024まで全てを覚える必要はありませんが、表に記載されているような代表的なサービスポートは、よく使用される基本的なサービスですので覚えておきましょう。

FTPは2つのポートが予約されていますが、流れるデータの種類が違いますので、注意して下さい。

メールで使用されるポートは送信(smtp)と受信(POP3)でポートが大きく異なります。メール受信をセキュアに行うためのPOP3Sや、gmailのようにサーバ上に管理されたメールを使用するためのimapなどがあります。

Webで使用するポートも暗号化の有無(httpは暗号化無し、httpsは暗号化)でポート番号が異なります。

他にも、リモート通信を行うためのSSHやtelnet、名前解決を行うDNS、時刻同期をするNTP、認証に使用するLDAPなど、どのポートがどのようなサービス名かだけでなく、どのような特徴を持っているか等、サービス内容の違いを比較して覚えるようにしましょう。

疎通の確認(ping)

IPアドレスはip addrコマンドを用いて確認や設定を行いますが、確認や設定が完了したら、その内容が(ネットワーク的に)正しいかどうかを確認します。この確認に用いるコマンドがpingコマンドです。

pingはTCPともUDPとも異なるICMPというプロトコルを用いて行う通信で、送信者が”echo request”というパケットを対象ノードに投げ、対象ノードから”echo reply”が返ってくることで到達性を確認します。

書式:

ping [オプション] ターゲットIPアドレス
ping6 [オプション] ターゲットIPアドレス

IPv6アドレスに対して実行する場合はping6コマンドを使います。使い方、動作はpingと同じです。

主なオプション:

-i 秒数設定した数秒間隔でPingを実行する
-c 回数設定した数回数、Pingを実行する

<実習: pingコマンドの実行>

# ping 10.0.2.2
PING 10.0.2.2 (10.0.2.2) 56(84) bytes of data.
64 bytes from 10.0.2.2: icmp_seq=1 ttl=64 time=0.289 ms
64 bytes from 10.0.2.2: icmp_seq=2 ttl=64 time=0.304 ms
[Ctrl] Cでコマンドを終了
--- 10.0.2.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.199/0.245/0.291/0.046 ms

pingコマンドを実行すると、(オプション等で回数を指定しない限り)意図的に停止しない限り実行され続け、[Ctrl]+[c]を押すまで止まりません(Windowsの場合は4回で終了します。)。

「64 byte~」と記載された1行が、「10.0.2.2」からの”echo reply”です。「icmp_seq」が、icmp通信をやり取りした回数を示しており1から順番に表示されます。この番号が順番に表示されていれば、エラーなく対象の機器とはIPネットワーク的に接続が出来ているといえます。別のメッセージが表示されたり、timeが著しく遅い場合は、Ping実行元から相手先までのネットワーク上で何らかの問題が発生していると判断できます。

経路の確認(traceroute)

tracerouteコマンドはどのような経路を辿って相手先に通信をするかを確認することができます。

tracerouteコマンドはpingと同様にICMPを利用して実施されます。実行すると目的に辿り着くまでTTLを+1づつしながら3回づつエコー要求を送信し、それが届かなくなるまで(もしくは最大ホップ数である30に達するまで)繰り返し、通信元から通信先へ辿る経路にある機器をリスト化しながら、それぞれのルータまでの応答時間を表示します。

pingコマンドは通信元と通信先のノード間の疎通の可否しかわからないため、ノード間のどこかに問題が発生しても、「相手に届かない」ということしかわかりません。このような場合にtracerouteを用いることで経路上のどこに問題があるかどうかを確認することができます。

tracerouteは、以下のような書式で実行します。

書式:

traceroute ターゲットIPアドレス
traceroute6 ターゲットIPアドレス

pingと同じように、IPv6アドレスに対してtracerouteするときはtraceroute6を用います。

<実習: tracerouteコマンドの実行>

# traceroute www.lpi.org
traceroute to www.lpi.org (65.39.134.165), 30 hops max, 60 byte packets
 1  gateway (10.0.2.2)  0.286 ms  0.211 ms  0.176 ms
 2  gateway (10.0.2.2)  9.413 ms  9.270 ms  9.154 ms

VirtualBox環境では、NATで接続している関係上、上記の2行しか表示されません。

おまけ:VirtualBox上のOS上でtracerouteする。

natをかけずに、ブリッジすれば実行可能です。
VirtualBoxの設定を変更します。

①デバイス→ネットワークから「ネットワーク設定」を開きます。


②「アダプター1」の「割り当て(A)」で設定されている[NAT]を変更します。

通常特殊な設定をしていなければ、「アダプター1」の設定変更で問題ありません。


③[NAT]から[ブリッジアダプター]に変更します。
変更したら「OK」ボタンで閉じます。

下の「名前(N)」がアクティブになり、選択肢がある場合がありますが、入る名前は使用しているパソコンに依存します。特に設定を変更する必要はありません。


④ネットワークの構成を変更したので、IPアドレスを取得しなおします。
ターミナルソフトではなく、VirtualBoxで設定してください。

$ su -
パスワード:
最終ログイン: 2021/08/03 (火) 09:36:21 JST日時 pts/0
#
# systemctl restart network
# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
(中略)
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:01:47:b2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.178/24 brd 192.168.0.255 scope global noprefixroute dynamic enp0s3
(以下省略)

インターフェース「enp0s3」のIPアドレス(inet)を確認します。
VirtualBoxのNAT環境では10.0.2.15/24が割り当てられますが、設定を変更したため、捜査しているPCが所属しているネットワーク上にあるDHCPサーバからIPアドレスが割り当てられます。
※割りあてられるIPアドレスは、それぞれの環境によって異なります。

⑤tracerouteを実施します。

# traceroute www.google.co.jp
traceroute to www.google.co.jp (142.250.196.131), 30 hops max, 60 byte packets
 1  gateway (192.168.0.1)  0.642 ms  0.597 ms  0.529 ms
 2  web.setup (192.168.111.254)  1.471 ms  1.631 ms  1.809 ms
(中略)
 8  * * *
 9  108.170.242.193 (108.170.242.193)  15.423 ms  16.308 ms 108.170.233.190 (108.170.233.190)  14.337 ms
10  108.170.242.177 (108.170.242.177)  14.771 ms  17.718 ms 142.251.60.197 (142.251.60.197)  17.219 ms
11  209.85.249.241 (209.85.249.241)  17.973 ms 209.85.249.18 (209.85.249.18)  18.080 ms 142.250.212.152 (142.250.212.152)  15.074 ms
12  216.239.43.156 (216.239.43.156)  13.741 ms nrt12s36-in-f3.1e100.net (142.250.196.131)  21.751 ms  21.614 ms

tracerouteでは、上記、1つ目や2つ目のルータを経由する時のように、3回通信時間を測定します。
しかし、ルータを経由していく中で、9~12個目のように複数の経路が存在する場合があります。このような場合はそれぞれのゲートウェイに対して確認を行い、存在するゲートウェイの分だけIPアドレスが表示されます。

tracerouteコマンドは、デフォルトの状態ではssコマンドと同じように、IPアドレスをホスト名に変換しようとします。これにより、表示に時間がかかる場合があります。
このような場合は「-n」オプションを使います。 「-n」オプションを 使うとIPアドレスのまま表示されるため、早く結果を出力することができます。

# traceroute -n www.google.co.jp
traceroute to www.google.co.jp (142.250.196.131), 30 hops max, 60 byte packets
 1  192.168.0.1  0.502 ms  6.404 ms  5.941 ms
 2  192.168.111.254  3.614 ms  3.598 ms  5.736 ms
(中略)
 8  * * *
 9  108.170.233.190  11.542 ms 209.85.253.58  19.514 ms 108.170.233.76  16.401 ms
10  142.251.60.197  19.042 ms  17.823 ms 108.170.242.209  17.719 ms
11  209.85.241.107  14.900 ms 209.85.249.18  13.944 ms 142.250.196.131  11.994 ms

確認が終わったら設定は戻して、IPアドレスを取得しなおしましょう。

# systemctl restart network
PAGE TOP