4.4 レッスン 1
Certificate: |
Linux Essentials |
---|---|
Version: |
1.6 |
Topic: |
4 Linuxオペレーティングシステム |
Objective: |
4.4 ネットワーク上のコンピュータ |
Lesson: |
1 of 1 |
はじめに
今日の世界では、コンピュータデバイスがネットワークを通してあらゆる種類の情報を交換しています。コンピュータネットワークの中心となる概念は、コンピュータデバイスと相手(ピア)との物理的な接続です。そのコネクションを リンク と呼び、2つのデバイス間の最も基本的な接続になります。リンクは、銅線、光ファイバー、無線、レーザーなど、さまざななメディアを介して確立されます。
コンピュータデバイスのインターフェイスがリンクを提供します。デバイスは複数のインターフェイスを持つことができるので、複数のリンクと接続できます。相互に直接接続したデバイスの一群によって、コンピュータ同士がリンクしてネットワークを形作ります。このようなネットワークが世界中にたくさんあります。リンク層のネットワーク範囲を超えて通信するためにはルーターを使用します。リンク層のネットワークを島と考えれば、ルーターは島々を繋ぐ橋に例えることができます。情報は橋を通って、別の島のデバイスに至ることができます。
このモデルは、ネットワークの階層構造に繋がりまります:
- リンク層
-
直接接続しているデバイス間の通信を処理します、
- ネットワーク層
-
個々のネットワークから外に出るための経路と、リンク層のネットワークを超えてデバイスに与えた一意のアドレスを処理します。
- アプリケーション層
-
独立したプログラム同士が相互接続できるようにします。
最初に発明されたとき、コンピュータネットワークは電話と同様の回線交換を使用していました。つまり、2つのノードを間に専用の直接リンクを作り通信していたのです。この方法は上手く機能しましたが、たった2つのホストの通信で、リンクの全容量を使っていました。
やがて、コンピュータネットワークは パケットスイッチ と呼ばれる方法に移行しました。この方法では、どこからどこへ行く情報であるのかを示すヘッダーを使ってデータをグループ化します。データ本体はフレームに格納されて、フレームのヘッダが示す受信先にリンクを使って送られます。これにより、複数のデバイスが1つのリンクを共有して、ほぼ同時に通信できるようになりました。
リンク層のネットワーク
パケットの役割は、デバイス間を繋ぐリンクを通して、発信元から受信先にデータを運ぶことです。デバイス同士は相互に相手を識別する方法が必要で、そのために使用するのが リンク層アドレス (link layer address)です。Ethernet(イーサネット)では、それぞれのデバイスを識別するために 48ビットから成る MAC (Media Access Control)アドレスを使用します。それらは全世界で一意である必要はありませんし、リンクの外で通信相手を特定するために使用することもありません。つまり、リンク層アドレスを、他のリンクに宛てたパケットをルーティングするために使用することはできません。パケットの受信者は、宛先アドレスが自身のリンク層アドレスであることをチェックして、一致したときにのみパケットを処理し、一致しない場合はパケットを破棄します。ブロードキャスト パケット(ローカルネットワークすべてに送られるパケット)はこのルールの例外で、常に受け入れられます。
ip link show
コマンドは、利用可能なネットワークインターフェイスとそのリンク層アドレス、最大パケットサイズなどの情報を表示します。
$ ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 00:0c:29:33:3b:25 brd ff:ff:ff:ff:ff:ff
上記の出力は、コンピュータデバイスが2つのインターフェイス lo
と ens33
を持つことを示しています。lo
は ループバックインターフェイス で MACアドレスは 00:00:00:00:00:00
、ens33
は Ethernetインターフェイスで MACアドレスは 00:0c:29:33:3b:25
です。
IPv4 ネットワーク
Googleや Twitterなどの Webサイトにアクセスしたり、電子メールをチェックしたり、企業が相互に接続すると、パケットが1つのリンク層ネットワークから別のネットワークに旅をします。多くの場合、これらのネットワークは間接的に接続されていて、パケットが最終的な目的地に到着するためには、いくつものリンク層ネットワークを通過していかねばなりません。
ネットワークインターフェイスのリンク層アドレスは、そのネットワークの外では使えません。他のリンク層ネットワークに属するデバイスにとってこのこのアドレスは必要ないので、グローバルに一意のアドレス形式を使ってルーティングを行います。そのアドレス形式とルーティングの全体的な概念が、IP (Internet Protocol)によって実現されています。
Note
|
プロトコル とは、それに従う当事者が互いに共有する一連の手順で、多くの規格として定義されています。コンピュータの世界ではさまざまな製造メーカーによる製品が相互に通信できるように、全員が合意した規格です。 |
IPv4 アドレス
IPアドレスは(MACアドレスと同様に)データパケットがどこから来てどこに行くかを示す方法です。IPv4は(IPの)元のプロトコルです。IPv4アドレスは32ビットで、論理上は4,294,967,296個のアドレスが使えますが、一部の範囲はブロードキャスト(特定のネットワーク内の全ての受信者に届けられる)やマルチキャスト(ブロードキャストと同様だがラジオのように選局することが必要)、私的利用などのために特別に予約されているため、利用できるアドレスはずっと少なくなっています。
IPv4アドレスを表記するときは、ドットで区切った4つの数値を使います。それぞれの数値の範囲は、0から255です。いくつかを例示します:
192.168.0.1
これらの数値は、技術的には8つのビットを表しています。すなわち、上記のアドレスは次のようにも書けます:
11000000.10101000.00000000.00000001
実際には10進数表記が使われますが、サブネットを理解するためにはビット単位の表現も有用です。
IPv4のサブネット
ルーティングを行うために、IPアドレスをネットワーク部とホスト部の2つに分けて考えます。ネットワーク部は、デバイスが属するネットワークを識別するもので、パケットをそのネットワークに届けるルーティングに使用します。ホスト部は、あるネットワークにおけるデバイスを識別するもので、到着したリンク層ネットワークにおいて特定の受信者にパケットを引き渡すために使用します。
IPアドレスはいつでもサブネットとホスト部に分けられます。そこで、どこで分割するかを示すために サブネットマスク を使います。前述のIPアドレスの2進数表現を、再度見ていきましょう:
11000000.10101000.00000000.00000001
IPアドレスに対して、サブネットマスクではネットワーク部にあたるビットを 1
に、ホスト部にあたるビットを 0
にセットします。
11111111.11111111.11111111.00000000
実際には、ネットマスクも10進数表記します。
255.255.255.0
これは、ネットワークの範囲 192.168.0.0
から 192.168.0.255
を意味します。ネットマスクにおける先頭からの3つの数値は全てのビットが1ですが、IPアドレスに変更はありません。
サブネットマスクには、CIDR (Classless Inter-Domain Routing/サイダー)と呼ばれる別の表記方法もあります。この表記方法は、サブネットマスクに何ビットを使用するかを、IPアドレスの後に示すものです。例では 32ビットの内の24ビットを 1
にセットしていますから、CIDR表記では 192.168.0.1/24
となります。
プライベート IPv4アドレス
先に述べましたが、IPv4アドレス空間の一部は、特別な用途のために予約されています。その1つがプライベートアドレスで、以下のサブネットがそれに当たります:
-
10.0.0.0/8
-
172.16.0.0/12
-
192.168.0.0/16
これらのサブネット内のアドレスは、誰でも使用することができます。その代わり、これらのサブネットは多くのネットワークで同時に使用される可能性があるので、公共のインターネット上ではルーティングされません。
今日、ほとんどのネットワークは内部アドレス(訳注: プライベートアドレスと同じ意味)を使用しています。これにより、外部アドレスを割り当てなくても、内部ネットワークでの通信が可能です。今日のインターネット接続では、1つの外部IPv4アドレスのみを使用します。ルーターは、パケットをインターネットに転送する際に、全ての内部アドレスをその1つの外部IPアドレスにマップします。これを NAT (Network Address Translation/ナット)と呼びます。NATの特別な場合として、ルーターが(複数かつ任意の)内部アドレスを1つの外部アドレスにマップすることを マスカレード (masquerade)と呼びます。この役割は、内部ネットワークのあらゆるデバイスが、インターネット上の任意のIPアドレスに接続できるようにすることです。
Note
|
マスカレードでは、内部デバイスはグローバルに有効なアドレスを持たないので、インターネット側からは見えません。ただし、これはセキュリティ機能ではありません。マスカレードを使用している場合でも、ファイアウォールは必要です。 |
IPv4アドレスの設定
コンピュータにIPv4アドレスを設定するには、主に2つの方法があります。アドレスを手作業で割り当てるか、DHCP (Dynamic Host Configuration Protocol/ディ・エイチ・シー・ピー)で自動割り当てを行うか、です。
DHCPを使用すると、中央のサーバーがどのアドレスをどのデバイスに割り当てるかを制御します。サーバーは、DNSサーバーのIPアドレスやデフォルトのルーターのIPアドレスなど、ネットワークに関する他の情報をデバイスに提供したり、より複雑な設定によって、ネットワークからオペレーティングシステムを起動することもできます。多くのシステムではDHCPがデフォルトで有効になっていますから、ネットワークに接続したときにはすでにIPアドレスを持っている可能性が高いでしょう。
ip addr add
コマンドを使って、インターフェイスに手動でIPアドレスを追加することもできます。ここでは、インターフェイス ens33
にアドレス 192.168.0.5
を割り当ててみましょう。ネットワークのネットマスクは 255.255.255.0
で、CIDR表記では /24
になります。
$ sudo ip addr add 192.168.0.5/255.255.255.0 dev ens33
続いて、ip addr show
コマンドでアドレスが追加されたことを確認してみましょう。
$ ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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 valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 25: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:0c:29:33:3b:25 brd ff:ff:ff:ff:ff:ff inet 192.168.0.5/24 192.168.0.255 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::010c:29ff:fe33:3b25/64 scope link noprefixroute valid_lft forever preferred_lft forever
上の実行例では lo
インターフェイスと ens33
インターフェイスに、アドレスが割り当てられています。
デバイスへの到達性を確認するには ping
コマンドを使います。これは エコー要求
(echo request)という特別な種類のメッセージを送り、送信者は受信者に応答を求めます。2つのデバイスのが接続に成功すると、受信者はエコー応答を返送して、接続を確認します。
$ ping -c 3 192.168.0.1 PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data. 64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=2.16 ms 64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=1.85 ms 64 bytes from 192.168.0.1: icmp_seq=3 ttl=64 time=3.41 ms --- 192.168.0.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 5ms rtt min/avg/max/mdev = 1.849/2.473/3.410/0.674 ms
-c 3
パラメータは3つのエコー要求を送った後に ping
を停止します。オプションを指定しないと、ping
は永遠に実行を続けるので、 Ctrl+C を押して止める必要があります。
IPv4のルーティング
ルーティングとは、パケットが送信元のネットワークから宛先のネットワークに到達するまでのプロセスです。それぞれのデバイスはルーティングテーブルを維持していて、そこには、デバイスが接続しているリンク層のネットワーク経由で至ることができるIPネットワークと、ルーターにパケットを渡して中継して貰うことで至ることができるIPネットワークのリストが収められています。テーブルの最後には、デフォルトルート として、他のルートに一致しなかったパケットをすべて受け取るルーターが定義されています。
接続しようとするときに、デバイスは宛先のIPアドレスをルーティングテーブルで探します。アドレスが一致すれば、いずれかのリンク層ネットワーク、ないしはルーティングテーブルに掲載されているルーターに宛てて、パケットが送出されます。
ルーター自体もルーティングテーブルを維持しています。パケットを受け取ると、自分自身のルーティングテーブルから宛先アドレスを探し、パケットを次のルーターに送ります。パケットが宛先ネットワークのルーターに届くまで繰り返されます。このパケットの旅に関与するルーターそれぞれを ホップ (hop)と呼びます。最後のルーターは、ルーティングテーブルから宛先アドレスが直接接続されているリンクを見つけて、パケットをそのリンクのインターフェイスから送出するのです。
ほとんどのホームネットワークでは、ISP (internet service provider)から提供された1台のルーターしか出口がありません。この場合、デバイスは、直接接続されているネットワーク宛てではない全てのパケットをホームルーターに送信し、ホームルーターはそれをプロバイダのルーターにさらに転送します。これがデフォルトルートの例です。
ip route show
コマンドは、現在のIPv4ルーティングテーブルを表示します:
$ ip route show 127.0.0.0/8 via 127.0.0.1 dev lo0 192.168.0.0/24 dev ens33 scope link
デフォルトルートを設定するには、デフォルトのゲートウェイとなるルーターのアドレスが必要です。例えば、ルーターのアドレスが 192.168.0.1
だとすると、以下のコマンドでデフォルトルートを設定します。
$ sudo ip route add default via 192.168.0.1
再度、ip route show
を実行して確認しましょう:
$ ip route show default via 192.168.0.1 dev ens33 127.0.0.0/8 via 127.0.0.1 dev lo0 192.168.0.0/24 dev ens33 scope link
IPv6ネットワーキング
IPv6は、IPv4の欠点、主にはオンラインになるデバイスの大幅な増加によるアドレス不足に対処できるように設計されました。さらに、自動ネットワーク設定のための新しいプロトコルなども含まれています。アドレスは32ビットではなく128ビットで、概ね 2128 ものアドレスが使えます。ただし、IPv4と同様に、他の用途に予約されている割り当て範囲があるため、グローバルに利用可能なパブリックアドレス数はかなり少なくなります。それでも、この膨大なアドレスは、現在インターネットに接続されているものだけでなく、将来の増加に対しても十分なものです。これにより、変換に伴う遅延や、インターネット側からマスカレードされたデバイスに接続できないという問題を含めて、マスカレードの必要性がほぼ無くなります。
IPv6アドレス
アドレスは、4桁の16進数のグループをコロンで区切った8つのグループで表記します:
2001:0db8:0000:abcd:0000:0000:0000:7334
Note
|
16進数の数字は |
表記を簡単にするため、グループ毎に先頭のゼロは省略できます。ただし、各グループは少なくとも1桁の数字が必要です:
2001:db8:0:abcd:0:0:0:7334
また、ゼロのグループが連続する場合には、そのグループ全体を ::
で置き換えることができます:
2001:db8:0:abcd::7334
ただし、::
による置き換えは、アドレス毎に1回限りです。
IPv6プレフィックス
IPv6アドレスの前半64ビットを ルーティングプレフィックス (routing prefix)と呼び、ルーターがデバイスが属するネットワークを識別して送り先への経路を決定するために使われます。サブネット化はプレフィックス部のみを使って行われます。ISPは通常 /48 ないし /58 のプレフイックスを顧客に割り当て、残りの 16 ないし 8 ビットを内部のサブネットに使用します。
IPv6には主要なプレフィックスが3種類あります:
- グローバル ユニーク アドレス(Global Unique Address)
-
グローバルアドレス用に予約されたブロックから割り当てられるプレフィックスです。
- ユニーク ローカル アドレス(Unique Local Address)
-
インターネットではルーティングされませんが、組織内ではルーティングされるプレフィックスです。インターネットに接続していない場合であっても、デバイスがアドレスを保持できるようにします。IPv4におけるプライベートアドレス範囲に相当します。先頭の8ビットは
fc
ないしfd
で、続く40ビットは乱数です。 - リンクローカル アドレス(Link Local Address)
-
リンク内でのみ有効なプレフィックスです。全てのIPv6対応ネットワークインターフェイスは、
fe80
で始まるこのようなアドレスを1つ持っています。これらのアドレスは、自動構成を使って追加のアドレスを要求したり、近隣探索プロトコル(Neighbor Discovery protocol)を使ってネットワーク内の他のコンピュータを見つけるために、IPv6が内部的に使用します。
IPv6 インターフェイス識別子
プレフィックスはデバイスがどのネットワークに属するかを示しますが、ネットワーク内のデバイスを列挙するためにインターフェイス識別子を使います。IPアドレスの後半64ビットが、IPv4アドレスの後半と同様の、インターフェイス識別子となります。
IPv6アドレスを手動で割り当てる場合は、インターフェイス識別子がアドレスの一部となります。アドレスの自動割り当てを使用すると、デバイス識別子は、乱数から選択されるか、デバイスのリンク層アドレスから導出されます。つまり、IPv6アドレスの中に、リンク層アドレスのバリエーションが含まれることがあります。
IPv6のアドレス設定
IPv4と同様に、IPv6もアドレスを手作業ないし自動的に割り当てられます。ただし、IPv6では自動構成に DHCPv6 と SLAAC (Stateless Address Autoconfiguration)の2種類があります。
SLAACは、2つの自動構成方法の中では簡単で、IPv6規格の中に含まれています。デバイスは、新しい 近隣探索プロトコル (Neighbor Discovery Protocol)のメッセージを使って、通信相手を見つけたり、ネットワークの情報を要求するメッセージを送ります。ネットワーク情報を返すのはルーターで、IPv6プレフィックスを含んでいます。デバイスはそのプレフィックスと自身が選択したインターフェイス識別子を組み合わせてアドレスを生成し、まだ未使用であればそのアドレスを使用します。なお、デバイスは選択した実際のアドレスをルーターにフィードバックすることは行いません(訳注: ステートレスの由来です)。
一方、DHCPv6は(IPv4の)DHCPをIPv6にあわせてアップデートしたものです。毎回同じアドレスを同じクライアントに渡したり、SLAACよりも多くのオプションをクライアントに送ることができるなど、クライアントに渡す情報をより細かく制御することができます。なお、クライアントはアドレスを使用するためにDHCPv6サーバーの明示的な許可を得る必要があります。
IPv6アドレスを手動でインターフェイスに割り当てる方法は、IPv4の場合と同じです。
$ sudo ip addr add 2001:db8:0:abcd:0:0:0:7334/64 dev ens33
割り当てがうまくいったことを確認するには、IPv4と同じく ip addr show
コマンドをいます。
$ ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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 valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 25: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:0c:29:33:3b:25 brd ff:ff:ff:ff:ff:ff inet 192.168.0.5/24 192.168.0.255 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::010c:29ff:fe33:3b25/64 scope link noprefixroute valid_lft forever preferred_lft forever inet6 2001:db8:0:abcd::7334/64 scope global valid_lft forever preferred_lft forever
実行例には、リンクローカルアドレス fe80::010c:29ff:fe33:3b25/64
も表示されています。
IPv4と同様に、ping
コマンドで IPv6でのデバイス間の到達可能性を確認できます。
$ ping 2001:db8:0:abcd::1 PING 2001:db8:0:abcd::1(2001:db8:0:abcd::1) 56 data bytes 64 bytes from 2001:db8:0:abcd::1: icmp_seq=1 ttl=64 time=0.030 ms 64 bytes from 2001:db8:0:abcd::1: icmp_seq=2 ttl=64 time=0.040 ms 64 bytes from 2001:db8:0:abcd::1: icmp_seq=3 ttl=64 time=0.072 ms --- 2001:db8:0:abcd::1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 43ms rtt min/avg/max/mdev = 0.030/0.047/0.072/0.018 ms
Note
|
一部のLinuxシステムでは、 |
リンクローカルアドレスを再度確認するには、同じく ping
を使用します。しかし、すべてのインターフェースはプレフィックス fe80::/64
を使用するので、アドレスと共にインターフェイス名を指定する必要があります。
$ ping6 -c 1 fe80::010c:29ff:fe33:3b25%ens33 PING fe80::010c:29ff:fe33:3b25(fe80::010c:29ff:fe33:3b25) 56 data bytes 64 bytes from fe80::010c:29ff:fe33:3b25%ens33: icmp_seq=1 ttl=64 time=0.049 ms --- fe80::010c:29ff:fe33:3b25 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.049/0.049/0.049/0.000 ms
DNS
IPアドレスは覚えにくいだけでなく、サービスや製品を販売しようとしている場合にはクールな印象を与えることはできません。そこで、DNS (Domain Name System)の出番です。DNSの最も簡単な例は、example.com
のような覚えやすいドメインメインをIPアドレスに対応づける分散電話帳です。例えば、ユーザーがWebサイトを見ようとする場合、URLの一部としてDNSホスト名を入力します。Webブラウザは、構成に従ってDNSリゾルバにそのDNS名を送ります。次に、DNSリゾルバはドメインに関連するアドレスを探します。そして、リゾルバがアドレスをWebブラウザに返して、WebブラウザはそのIPアドレスのサーバーへの接続を試みます。
LinuxがDNSデータの検索に使用するリゾルバーは、設定ファイル /etc/resolv.conf
で設定します:
$ cat /etc/resolv.conf search lpi nameserver 192.168.0.1
名前を解決しようとするときに、リゾルバはまず /etc/hosts
ファイル見て、要求された名前に対するアドレスがないかを探します。
あればそのアドレスを返して、DNSにはアクセスしません。これにより、ネットワーク管理者は、DNSサーバーを設定する手間をかけずに名前解決を行えます。ファイルのそれぞれの行には、IPアドレスと、1つ以上の名前が書かれます:
127.0.0.1 localhost.localdomain localhost ::1 localhost.localdomain localhost 192.168.0.10 server 2001:db8:0:abcd::f server
DNSを検索するには host
コマンドを使います:
$ host learning.lpi.org learning.lpi.org has address 208.94.166.198
より詳細な情報を得るには、dig
を使います:
$ dig learning.lpi.org ; <<>> DiG 9.14.3 <<>> learning.lpi.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21525 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ; COOKIE: 2ac55879b1adef30a93013705d3306d2128571347df8eadf (bad) ;; QUESTION SECTION: ;learning.lpi.org. IN A ;; ANSWER SECTION: learning.lpi.org. 550 IN A 208.94.166.198 ;; Query time: 3 msec ;; SERVER: 192.168.0.1#53(192.168.0.1) ;; WHEN: Sat Jul 20 14:20:21 EST 2019 ;; MSG SIZE rcvd: 89
ここでは、DNSレコードの種類を見ることもできて、ここではIPv4アドレスを示す A
です。
ソケット
ソケット は、2つのプログラムが通信する際のエンドポイント(端点)です。ソケットがネットワーク経由で繋がると、異なるデバイス上でプログラムが実行できます。例えば、Webブラウザが手元のラップトップで、Webサーバーは会社のデータセンターで実行されるといった具合です。
ソケットには3つの種類があります:
- Unix ソケット
-
同じマシン上で実行されるプロセス同士を繋ぎます。
- UDP (User Datagram Protocol) ソケット
-
高速だが信頼性のないプロトコル(UDP)を使って、アプリケーション同士を繋ぎます。
- TCP (Transmission Control Protocol) ソケット
-
UDPより信頼性が高く、例えばデータの受信確認などが行えるソケットです。
Unixソケットは、同じデバイスで実行されているアプリケーション同士のみを繋ぎます。TCPソケットとUDPソケットは、ネットワーク越しで接続できます。TCPは、送られたものが常に同じ順番で届くストリームデータを扱えます。UDPは打ちっ放しで、パケットを送りますがそれが相手に届くことは保証されません。UDPの方がTCPよりもオーバーヘッドが少ないので、オンラインビデオゲームなどの低遅延アプリケーションに適しています。
TCPとUDPは、1つのIPアドレスで複数のソケットを識別するためにポート番号を使います。発信側のポート番号は通常ランダムですが、待ち受け側のポート番号はサービス毎に標準化されています。例えば、HTTPはポート80を、HTTPSは443を、リモートのLinuxシステムにログインするためのSSHはポート22で、それぞれ待ち受けます。
管理者がLinuxコンピュータのソケットを調査するために、ss
コマンドを使います。送信元のアドレス(source address)、受信先のアドレス(destination addres)、ソケット種別など、あらゆるものを表示します。特に便利な機能にフィルターがあり、指定の接続状態のソケットを監視できます。ss
では、情報を選択するフィルター式などのオプションを使用できます。
オプションなしで実行すると、接続が確立されている全てのソケットを表示します。-p
オプションはソケットを使用しているプロセスの情報を、-s
は ソケットの概要を、それぞれ表示します。たくさんのオプションがありますが、主要なオプションをいくつか示します。-4
と -6
は、IPプロトコルを IPv4 ないし IPv6 のいずれかに絞り込みます。-t
と -u
は、それぞれ TCP と UDP ソケットを選択します。-l
は新しい接続を待ち受けているソケットのみを表示します。
例えば、次のコマンドは使用中の TCPソケットのみを表示します:
$ ss -t State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.0.5:49412 192.168.0.1:https ESTAB 0 0 192.168.0.5:37616 192.168.0.1:https ESTAB 0 0 192.168.0.5:40114 192.168.0.1:https ESTAB 0 0 192.168.0.5:54948 192.168.0.1:imap ...
演習
-
ホストの
ens33
インターフェイスに2つのIPアドレスを割り当てます。ひとつは IPv4 アドレス192.168.10.10/24
で、ひとつは IPv6 アドレス2001:0:0:abcd:0:8a2e:0370:7334/64
です。これらを実現するにはどのようなコマンドを入力しますか? -
以下のアドレスリストの内、プライベートなものはどれでしょう?
192.168.10.1
120.56.78.35
172.16.57.47
10.100.49.162
200.120.42.6
-
example.com
に192.168.0.15
を割り当てるために、hosts ファイルに追加するエントリは何ですか? -
次のコマンドで何が起きますか?
sudo ip -6 route add default via 2001:db8:0:abcd::1
発展演習
-
以下のリクエストに対応する DNSレコード種別は何ですか:
-
テキストデータ
-
IPアドレスの逆引き
-
独自のアドレスを持たず、別のドメインに依存するドメイン
-
メールサーバー
-
-
Linuxには ブリッジと呼ばれる機能があります。これは何で、どのように役立つのですか?
-
ss
コマンドで、接続済の UDPソケットを表示するオプションは何ですか? -
Linuxデバイスで動作している全てのソケットの統計集計を表示するコマンドは何ですか?
-
前問のコマンドで次の出力が得られました。TCPとUDPのソケットは、それぞれ幾つがアクティブですか?
Total: 978 (kernel 0) TCP: 4 (estab 0, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0 Transport Total IP IPv6 * 0 - - RAW 1 0 1 UDP 7 5 2 TCP 4 3 1 INET 12 8 4 FRAG 0 0 0
まとめ
このトピックでは、Linuxコンピュータのネットワークを取り上げました。最初に、ネットワークのさまざまなレイヤーについて学びました。
-
リンク層は、デバイスを直接接続する
-
ネットワーク層は、グローバルなアドレス空間とネットワーク間のルーティングを提供する
-
アプリケーション層は、アプリケーション同士が互いに接続する
IPv4 と IPv6 で、個々のコンピュータのアドレスを指定する方法と、アプリケーションが相互接続する際に使用するソケットを調べる方法を見てきました。また、名前をIPアドレスに変換するDNSも学びました。
演習で使用したコマンド:
dig
-
DNS情報を問い合わせて、その問い合わせと応答に関するさまざまな情報を表示します。
host
-
DNS情報を問い合わせて、要約を出力します。
ip
-
ネットワークインターフェイスやアドレス、ルーティングなど、Linuxのネットワークを設定します:。
ping
-
リモートデバイスとの接続性をテストします。
ss
-
ソケットに関連する情報を表示します。
演習の解答
-
ホストの
ens33
インターフェイスに2つのIPアドレスを割り当てます。ひとつは IPv4 アドレス192.168.10.10/24
で、ひとつは IPv6 アドレス2001:0:0:abcd:0:8a2e:0370:7334/64
です。これらを実現するにはどのようなコマンドを入力しますか?sudo ip addr add 192.168.10.10/24 dev ens33 sudo ip addr add 2001:0:0:abcd:0:8a2e:0370:7334/64 dev ens33
-
以下のアドレスリストの内、プライベートなものはどれでしょう?
192.168.10.1
○
120.56.78.35
172.16.57.47
○
10.100.49.162
○
200.120.42.6
-
example.com
に192.168.0.15
を割り当てるために、hosts ファイルに追加するエントリは何ですか?192.168.0.15 example.com
-
次のコマンドで何が起きますか?
sudo ip -6 route add default via 2001:db8:0:abcd::1
デフォルトルートをテーブルに追加して、すべての IPv6トラフィックをアドレス
2001:db8:0:abcd::1
のルーターに送ります。
発展演習
-
以下のリクエストに対応する DNSレコード種別は何ですか:
-
テキストデータ
TXT
-
IPアドレスの逆引き
PTR
-
独自のアドレスを持たず、別のドメインに依存するドメイン
CNAME
-
メールサーバー
MX
-
-
. Linuxには ブリッジと呼ばれる機能があります。これは何で、どのように役立つのですか?
ブリッジは複数のネットワークインターフェイスを(論理的に1つのインターフェイスに)まとめます。ブリッジに接続されたインターフェイスは、それらが同じリンク層ネットワークあるかのように通信できます。すべてのデバイスは同じサブネットからのIPアドレスを使用し、接続するためにルータを必要としません。
-
ss
コマンドで、接続済の UDPソケットを表示するオプションは何ですか?-u
オプションで、接続済のUDPソケットがすべて表示されます。 -
Linuxデバイスで動作している全てのソケットの統計集計を表示するコマンドは何ですか?
ss -s
コマンドは、すべてのソケットの統計集計を表示します。 -
前問のコマンドで次の出力が得られました。TCPとUDPのソケットは、それぞれ幾つがアクティブですか?
Total: 978 (kernel 0) TCP: 4 (estab 0, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0 Transport Total IP IPv6 * 0 - - RAW 1 0 1 UDP 7 5 2 TCP 4 3 1 INET 12 8 4 FRAG 0 0 0
TCPとUDPを合わせて11個のソケットがアクティブです。