序章
ソケットは、サーバー上で実行されているプログラム間、または別々のサーバー上で実行されているプログラム間のプロセス間通信を可能にする方法です。 サーバー間の通信は、ネットワークソケットに依存します。このソケットは、インターネットプロトコル(IP)を使用して、データの送受信をカプセル化および処理します。
クライアントとサーバーの両方のネットワークソケットは、ソケットアドレスによって参照されます。 アドレスは、伝送制御プロトコル(TCP)やユーザーデータグラムプロトコル(UDP)などのトランスポートプロトコル、IPアドレス、およびポート番号の一意の組み合わせです。
このチュートリアルでは、プロセス間通信に使用される次のさまざまなタイプのソケットについて学習します。
- ストリームソケット。基盤となるトランスポートプロトコルとしてTCPを使用します。
- データグラムソケット。基盤となるトランスポートプロトコルとしてUDPを使用します。
- Unixドメインソケット。ネットワークインターフェイスやIPパケットの代わりに、ローカルファイルを使用してデータを送受信します。
このチュートリアルの各セクションでは、Linuxシステムでそれぞれのソケットタイプを列挙する方法も学習します。 さまざまなコマンドラインツールを使用して、各タイプのソケットを調べます。
前提条件
このチュートリアルの例は、Ubuntu20.04サーバーで検証されています。 ディストリビューションに必要な各ツールの同等のバージョンがインストールされている限り、ローカルコンピューターまたはリモートサーバーで最新のLinuxディストリビューションを使用してこのチュートリアルに従うことができます。
Ubuntu 20.04の使用を開始するには、 Ubuntu20.04の初期サーバーセットアップガイドに従って構成された1台のサーバーが必要です。
このページに埋め込まれているインタラクティブ端末を使用して、このチュートリアルで使用するサンプルのsocat
およびnc
コマンドを試すこともできます。 次のインタラクティブターミナルを起動します!ボタンをクリックして開始します。
インタラクティブターミナルを起動します!
また、システムのソケットを調べるために、他のいくつかのパッケージが必要になります。 apt update
コマンドを使用して、システムのパッケージキャッシュが最新であることを確認します。
sudo apt update
次に、次のコマンドを使用して必要なパッケージをインストールします。
sudo apt install iproute2 netcat-openbsd socat
iproute2
パッケージには、ss
ユーティリティが含まれています。これは、ソケットの検査に使用します。 netcat-openbsd
パッケージを使用してnetcatをインストールします。 netcatは、コマンドラインで呼び出されるとnc
と省略されることに注意してください。 最後に、socat
パッケージを使用してサンプルソケットを作成します。
ストリームソケットとは何ですか?
ストリームソケットはコネクション型です。つまり、ネットワークソケットとの間で送受信されるパケットは、アプリケーションで処理するためにホストオペレーティングシステムによって配信されます。 ネットワークベースのストリームソケットは通常、伝送制御プロトコル(TCP)を使用して、ネットワークインターフェイスを介してデータをカプセル化して送信します。
TCPは、ステートフル接続に依存する信頼性の高いネットワークプロトコルになるように設計されています。 TCPベースのストリームソケットを使用してプログラムによって送信されたデータは、リモートシステムによって正常に受信されます(ルーティング、ファイアウォール、またはその他の接続の問題がないことを前提としています)。 TCPパケットは、物理ネットワークインターフェイスに任意の順序で到着できます。 パケットが順不同で到着した場合、ネットワークアダプタとホストオペレーティングシステムは、アプリケーションで処理するためにパケットが正しい順序で再構築されることを保証します。
TCPベースのストリームソケットの一般的な使用法は、ポート80
でHTTPリクエストを処理する、またはポート443
でHTTPSを処理するApacheやNginxなどのWebサーバーです。 HTTPの場合、ソケットアドレスは203.0.113.1:80
のようになり、HTTPSの場合は203.0.113.1:443
のようになります。
TCPベースのストリームソケットの作成
次の例では、socat
(SOcket CAT
の略)コマンドを使用して、ポート8080(代替HTTPポート)でHTTP要求をリッスンするWebサーバーをエミュレートします。 次に、ss
およびnc
コマンドを使用してソケットを調べます。
まず、次のsocat
コマンドを実行して、IPv4およびIPv6インターフェイスを使用して、ポート8080
で接続をリッスンする2つのTCPベースのソケットを作成します。
socat TCP4-LISTEN:8080,fork /dev/null& socat TCP6-LISTEN:8080,ipv6only=1,fork /dev/null&
TCP4-LISTEN:8080
およびTCP6-LISTEN:8080
引数は、使用するプロトコルタイプとポート番号です。socat
に、すべてのIPv4およびIPv6インターフェイスのポート8080
にTCPソケットを作成し、各ソケットで着信接続をリッスンするように指示します。socat
は、システムで使用可能な任意のポートでリッスンできるため、0
から65535
までの任意のポートがソケットオプションの有効なパラメーターです。fork
オプションは、socat
が接続を処理した後も実行を継続するようにするために使用されます。実行しない場合、自動的に終了します。- リモートソケットアドレスの代わりに
/dev/null
パスが使用されます。 この場合、socat
に、着信入力を/dev/null
ファイルに出力するように指示します。これにより、入力はサイレントに破棄されます。 ipv6only=1
フラグは、IPv6ソケットに使用され、ソケットがIPv4にマップされたIPv6アドレスにパケットを送信するように構成されていないことをオペレーティングシステムに通知します。 このフラグがないと、socat
はIPv4アドレスとIPv6アドレスの両方にバインドされます。&
文字は、コマンドをバックグラウンドで実行するようにシェルに指示します。 このフラグは、ソケットを調べるために他のコマンドを呼び出している間、socat
が実行され続けることを保証します。
次のような出力が表示されます。これは、シェルセッションのバックグラウンドで実行されている2つのsocat
プロセスIDを示しています。 プロセスIDは、ここで強調表示されているものとは異なります。
Output[1] 434223 [2] 434224
バックグラウンドでTCPポート8080
をリッスンする2つのsocat
プロセスがあるので、ss
およびnc
ユーティリティを使用してソケットを調べることができます。
TCPベースのストリームソケットの調査
ss
コマンドを使用して最新のLinuxシステムでTCPソケットを調べるには、次のフラグを指定してTCPソケットを実行し、出力を制限します。
-4
フラグと-6
フラグは、ss
にそれぞれIPv4またはIPv6ソケットのみを検査するように指示します。 このオプションを省略すると、両方のソケットセットが表示されます。t
フラグは、出力をTCPソケットに制限します。 デフォルトでは、ss
ツールは、Linuxシステムで使用されているすべてのタイプのソケットを表示します。l
フラグは、出力をリスニングソケットに制限します。 このフラグがないと、SSH、Webサーバーに接続されている可能性のあるクライアント、またはシステムが他のサーバーに接続している可能性のある接続など、すべてのTCP接続が表示されます。n
フラグは、サービス名の代わりにポート番号が表示されるようにします。
最初にss -4 -tln
コマンドを実行して、システム上の接続をリッスンしているIPv4TCPベースのソケットを調べます。
ss -4 -tln
次のような出力が表示されます。
OutputState Recv-Q Send-Q Local Address:Port Peer Address:Port Process . . . LISTEN 0 1 0.0.0.0:8080 0.0.0.0:* . . .
システムで実行されているサービスによっては、出力に他のポートを持つ他の回線が存在する場合があります。 出力の強調表示された0.0.0.0:8080
部分は、IPv4TCPソケットがポート8080
で使用可能なすべてのIPv4インターフェイスをリッスンしていることを示します。 特定のIPv4アドレスのみをリッスンしているサービスは、強調表示されたフィールドにそのIPのみを表示します(例:203.0.113.1:8080
)。
ここで、同じss
コマンドを再度実行しますが、-6
フラグを使用します。
ss -6 -tln
次のような出力が表示されます。
OutputState Recv-Q Send-Q Local Address:Port Peer Address:Port Process . . . LISTEN 0 5 [::]:8080 [::]:* . . .
システムで実行されているサービスによっては、出力に他のポートを持つ他の回線が存在する場合があります。 出力の強調表示された[::]:8080
部分は、IPv6TCPソケットがポート8080
で使用可能なすべてのIPv6インターフェイスをリッスンしていることを示します(::
文字で示されます。これはIPv6表記です。すべてゼロで構成されるアドレス)。 特定のIPv6アドレスのみをリッスンしているサービスでは、強調表示されたフィールドにそのIPのみが表示されます(例:[2604:a880:400:d1::3d3:6001]:8080
)。
TCPベースのストリームソケットへの接続
これまで、IPv4インターフェイスとIPv6インターフェイスの両方でTCPソケットを作成および列挙する方法を学習しました。 接続をリッスンする2つのソケットがあるので、netcatユーティリティを使用してソケットへの接続を試すことができます。
netcatを使用してローカルおよびリモートソケットへのTCP接続をテストすることは、システム間の接続とファイアウォールの問題を切り分けるのに役立つ非常に便利なトラブルシューティング手法です。
netcatを使用してローカルループバックアドレスを介してIPv4ソケットに接続するには、次のコマンドを実行します。
nc -4 -vz 127.0.0.1 8080
-4
フラグは、netcatにIPv4を使用するように指示します。-v
フラグは、詳細な出力を端末に出力するために使用されます。- -
z
オプションは、netcatがデータを送信せずにソケットにのみ接続することを保証します。 - システムには独自の一意のIPアドレスがあるため、ローカルループバック
127.0.0.1
IPアドレスが使用されます。 システムのIPがわかっている場合は、それを使用してテストすることもできます。 たとえば、システムのパブリックまたはプライベートIPアドレスが203.0.113.1の場合、ループバックIPの代わりにそれを使用できます。
次のような出力が表示されます。
OutputConnection to 127.0.0.1 (127.0.0.1) 8080 port [tcp/http-alt] succeeded!
強調表示されている行は、netcatからの出力です。 これは、netcatがTCPソケットに接続して、ポート8080
のループバック127.0.0.1
IPv4アドレスをリッスンしていることを示しています。 2行目は無視してかまいません。これは、端末のバックグラウンドで実行されているsocatプロセスからのものです。
これで、同じ接続テストを繰り返すことができますが、IPv6を使用します。 次のnetcatコマンドを実行します。
nc -6 -vz ::1 8080
次のような出力を受け取るはずです。
OutputConnection to ::1 8080 port [tcp/http] succeeded!
強調表示されている行は、netcatからの出力です。 これは、netcatがTCPソケットに接続して、ポート8080
のループバック::1
IPv6アドレスをリッスンしていることを示しています。 ここでも、出力の2行目を無視できます。
ソケットをクリーンアップするには、作成したsocatプロセスごとにfg
(フォアグラウンド)コマンドを実行する必要があります。 次に、CTRL+C
を使用して各socatを閉じます。 fg
は、実行した順序とは逆の順序でプロセスを端末のフォアグラウンドに移動します。したがって、プロセスを実行すると、2番目のsocat
インスタンスが最初に対話するインスタンスになります。
fg
を実行して、2番目のIPv6socatインスタンスを端末のフォアグラウンドに移動します。 次に、CTRL+C
を実行して閉じます。
fg
次のような出力が表示されます。
Outputsocat TCP6-LISTEN:8080,ipv6only=1,fork /dev/null
CTRL+C
を押してプロセスを停止します。
次に、fg
を再度実行して、最初のIPv4ソケットをクリーンアップします。 次のような出力が必要です。
Outputsocat TCP4-LISTEN:8080,fork /dev/null
CTRL+C
を押してプロセスを停止します。
これで、システムのIPv4およびIPv6ソケットが作成、調査、および接続されました。 これらの手法とツールは、ローカル開発システムまたはリモート実稼働サーバーで機能するため、各ツールを試して、TCPソケットのテストとトラブルシューティングにどのように使用できるかを理解してください。
データグラムソケットとは何ですか?
データグラムソケットはコネクションレス型です。つまり、ソケットとの間で送受信されるパケットは、アプリケーションによって個別に処理されます。 ネットワークベースのデータグラムソケットは通常、ユーザーデータグラムプロトコル(UDP)を使用してデータをカプセル化および送信します。
UDPはパケットヘッダーのシーケンス情報をエンコードせず、プロトコルに組み込まれているエラー訂正はありません。 データグラムベースのネットワークソケットを使用するプログラムは、データ送信を成功させるために、独自のエラー処理およびデータ順序付けロジックを組み込む必要があります。
UDPソケットは、ドメインネームシステム(DNS)サーバーで一般的に使用されています。 デフォルトでは、DNSサーバーはポート53
を使用してドメイン名のクエリを送受信します。 DNSサーバーのUDPソケットアドレスの例は、203.0.113.1:53
のようになります。
注:プロトコルは人間が読める形式のソケットアドレスには含まれていませんが、オペレーティングシステムは、アドレスの一部としてTCPプロトコルとUDPプロトコルを含めることでソケットアドレスを区別します。 したがって、203.0.113.1:53
のような人間が読める形式のソケットアドレスはどちらのプロトコルも使用できます。 ss
や古いnetstat
ユーティリティなどのツールを使用して、使用されているソケットの種類を判別します。
ネットワークタイムプロトコル(NTP)は、ポート123
のUDPソケットを使用して、コンピューター間のクロックを同期します。 NTPプロトコルのUDPソケットの例は、203.0.113.1:123
です。
データグラムソケットの作成
前のTCPソケットの例と同様に、このセクションでは、socat
を再度使用して、UDPポート123
で要求をリッスンするNTPサーバーをエミュレートします。 次に、ss
およびnc
コマンドを使用して作成したソケットを調べます。
まず、次のsocat
コマンドを実行して、IPv4およびIPv6インターフェイスを使用して、ポート123で接続をリッスンする2つのUDPソケットを作成します。
sudo socat UDP4-LISTEN:123,fork /dev/null& sudo socat UDP6-LISTEN:123,ipv6only=1,fork /dev/null&
次のような出力が表示されます。これは、シェルセッションのバックグラウンドで実行されている2つのsocat
プロセスIDを示しています。 プロセスIDは、ここで強調表示されているものとは異なります。
Output[1] 465486 [2] 465487
- ほとんどのシステムではポート
0
から1024
が予約されているため、各コマンドの前にはsudo
が付いています。sudo
は、管理者権限でコマンドを実行します。これにより、socat
は予約された範囲内の任意のポートにバインドできます。 UDP4-LISTEN:123
およびUDP6-LISTEN:123
引数は、使用するプロトコルタイプとポートです。 それらは、IPv4とIPv6の両方のインターフェースのポート123
にUDPベースのソケットを作成し、着信データをリッスンするようにsocatに指示します。 ここでも、0〜65535の全範囲のポートは、UDPソケットの有効なパラメータです。fork
、ipv6only=1
、および/dev/null
引数は、前のTCPの例で説明したのと同じ方法で使用されます。
UDPポート123
でリッスンする2つのsocat
プロセスがあるので、ss
およびnc
ユーティリティを使用してソケットを調べることができます。
データグラムソケットの調査
ss
コマンドを使用して最新のLinuxシステムでUDPソケットを調べるには、次の-4
、-6 , and
uln`フラグを指定して実行し、出力を制限します。
u
フラグは、出力をUDPソケットに制限します。 その他のフラグは、前のTCPの例で使用されたものと同じです。
最初にss -4 -uln
コマンドを実行して、システムで接続をリッスンしているIPv4UDPソケットを調べます。
ss -4 -uln
次のような出力が表示されます。
OutputState Recv-Q Send-Q Local Address:Port Peer Address:Port Process . . . UNCONN 0 0 0.0.0.0:123 0.0.0.0:* . . .
システムで実行されているサービスによっては、出力に他のポートを持つ他の回線が存在する場合があります。 出力の強調表示された0.0.0.0:123
部分は、IPv4UDPソケットがポート123
のすべてのIPv4インターフェイスで使用可能であることを示します。 特定のIPv4アドレスでのみ利用可能なサービスでは、強調表示されたフィールドにそのIPのみが表示されます(例:203.0.113.1:123
)。
ここで、同じss
コマンドを再度実行しますが、-6
フラグを使用します。
ss -6 -uln
次のような出力が表示されます。
OutputState Recv-Q Send-Q Local Address:Port Peer Address:Port Process . . . UNCONN 0 0 [::]:123 [::]:* . . .
システムで実行されているサービスによっては、出力に他のポートを持つ他の回線が存在する場合があります。 出力の強調表示された[::]:123
部分は、IPv6 TCPソケットがポート123
のすべてのIPv6インターフェイスで使用可能であることを示します(::
文字で示されます)。 特定のIPv6アドレスでのみ利用可能なサービスでは、強調表示されたフィールドにそのIPのみが表示されます(例:[2604:a880:400:d1::3d3:6001]:123
)。
データグラムソケットのテスト
IPv4インターフェイスとIPv6インターフェイスの両方でUDPソケットを作成および列挙する方法に精通しているので、それらに接続して実験することができます。 TCPソケットと同様に、netcatユーティリティを使用してUDPソケットを試すことができます。
このチュートリアルの前のセクションで作成したポート123
のサンプルUDPソケットに接続するには、次のnetcatコマンドを実行します。
nc -4 -u -vz 127.0.0.1 123
-4
フラグは、netcatにIPv4を使用するように指示します。-u
オプションは、TCPの代わりにUDPを使用するようにnetcatに指示します。-v
フラグは、詳細な出力を端末に出力するために使用されます。- -
z
オプションは、netcatがデータを送信せずにソケットにのみ接続することを保証します。 - システムには独自の一意のIPアドレスがあるため、ローカルループバック
127.0.0.1
IPアドレスが使用されます。 システムのIPがわかっている場合は、それを使用してテストすることもできます。 たとえば、システムのパブリックまたはプライベートIPアドレスが203.0.113.1
の場合、ループバックIPの代わりにそれを使用できます。
次のような出力が表示されます。
OutputConnection to 127.0.0.1 123 port [udp/ntp] succeeded!
出力は、netcatがポート123
のループバック127.0.0.1
IPv4アドレスをリッスンしているUDPソケットからエラーを受信しなかったことを示しています。 このエラー応答の欠如は、127.0.0.1:123
のソケットが使用可能であることを推測するために使用されます。 この動作は、ソケットが使用可能かどうかを確認するためにパケットを交換する必要があるTCPソケットとは異なります。
注:この例のソケットが使用できない場合、リモートシステムはコード3のICMPタイプ3メッセージ(宛先到達不能)を返します。これは、ポートが到達不能であることを示します。リモートホスト。
エラー応答の欠如に基づいてソケットが使用可能であると推測することは、ICMPトラフィックをブロックしているファイアウォールまたは接続の問題がないことを前提としています。 UDPソケットを介してアプリケーションデータを送信、受信、および検証しない限り、リモートUDPポートが開いてパケットを受け入れるという保証はありません。
これで、同じ接続テストを繰り返すことができますが、IPv6を使用します。 次のnetcatコマンドを実行します。
nc -6 -u -vz ::1 123
次のような出力を受け取るはずです。
OutputConnection to ::1 123 port [udp/ntp] succeeded!!
出力は、netcatがポート123
のループバック::1
IPv6アドレスをリッスンしているUDPソケットからエラーを受信しなかったことを示しています。 この場合も、このエラー応答の欠如は、::1:123
のソケットが使用可能であることを推測するために使用されます。
ソケットをクリーンアップするには、作成したsocatプロセスごとにfg
(フォアグラウンド)コマンドを実行する必要があります。 次に、CTRL+C
を使用して各socatを閉じます。
fg
を実行して、2番目のIPv6socat
インスタンスを端末のフォアグラウンドに移動します。 次に、CTRL+C
を実行して閉じます。
fg
次のような出力が表示されます。
Outputsudo socat UDP6-LISTEN:123,ipv6only=1,fork /dev/null
CTRL+C
を押してプロセスを停止します。
次に、fg
を再度実行して、最初のIPv4ソケットをクリーンアップします。 次のような出力が得られます。
Outputsudo socat UDP4-LISTEN:123,fork /dev/null
CTRL+C
を押してプロセスを停止します。
これで、システムでIPv4およびIPv6 UDPソケットを作成、調査、およびテストしました。 各ツールを試して、UDPソケットのテストとトラブルシューティングにどのように使用できるかを理解してください。
Unixドメインソケットとは何ですか?
同じサーバー上で実行されるプログラムは、Unixドメインソケット(UDS)を使用して相互に通信することもできます。 Unixドメインソケットは、ストリームベースまたはデータグラムベースにすることができます。 ドメインソケットを使用する場合、データは、ホストファイルシステム上のファイルを介して、オペレーティングシステムのカーネル内のプログラム間で直接交換されます。 ドメインソケットを使用してデータを送受信するには、プログラムはネットワークベースのソケットとプロトコルを完全にバイパスして、共有ソケットファイルの読み取りと書き込みを行います。
Unixドメインソケットは、ネットワークインターフェイスに接続する必要のないデータベースシステムで広く使用されています。 たとえば、Ubuntu上のMySQLは、デフォルトで/var/run/mysqld/mysql.sock
という名前のファイルをローカルクライアントとの通信に使用します。 クライアントは、MySQLサーバー自体と同様に、ソケットからの読み取りとソケットへの書き込みを行います。
PostgreSQLは、ローカルの非ネットワーク通信にソケットを使用する別のデータベースシステムです。 通常、デフォルトでは/run/postgresql/.s.PGSQL.5432
をソケットファイルとして使用します。
Unixドメインソケットの作成
前のセクションでは、TCPがストリームソケットでどのように使用されるか、およびUDPがデータグラムソケットでどのように使用されるかについて説明しました。 このセクションでは、socat
を使用して、TCPまたはUDPを使用してデータをカプセル化してネットワーク経由で送信することなく、ストリームベースとデータグラムベースの両方のUnixドメインソケットを作成します。 次に、ss
およびnc
コマンドを使用して作成したソケットを調べます。 最後に、netcatを使用したUnixドメインソケットのテストについて学習します。
開始するには、次のsocat
コマンドを実行して、2つのソケットファイルを作成します。
socat unix-listen:/tmp/stream.sock,fork /dev/null& socat unix-recvfrom:/tmp/datagram.sock,fork /dev/null&
- 最初のコマンドは、
unix-listen
アドレスタイプを使用してソケットを作成するようにsocatに指示します。これにより、ストリームベースのUDSが作成されます。 - 2番目のコマンドは、ソケットタイプとして
unix-recvfrom
を指定します。これにより、データグラムベースのUDSが作成されます。 - どちらのコマンドも、
:
区切り文字の後にファイル名を指定します。 ファイル名は、ソケット自体のアドレスです。 最初のストリームの例では/tmp/stream.sock
であり、2番目のデータグラムの例では/tmp/datagram.sock
です。 ソケットの名前は任意ですが、トラブルシューティングの際にわかりやすい名前にするのに役立ちます。 fork
、および/dev/null
引数は、ストリームおよびデータグラムソケットの例のセクションで説明されているのと同じ方法で使用されます。
2つのUDSソケットを作成したので、ss
およびnc
ユーティリティを使用してそれらを調べることができます。
Unixドメインソケットの調査
リスニングしているすべてのUnixドメインソケットを一覧表示するには、ss -xln
コマンドを実行します。 x
フラグは、ドメインソケットのみが表示されるようにします。
ss -xln
次のような出力が表示されます。
OutputNetid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process . . . u_str LISTEN 0 5 /tmp/stream.sock 436470 * 0 u_dgr UNCONN 0 0 /tmp/datagram.sock 433843 * 0 . . .
/tmp/stream/sock
行の強調表示されたu_str
部分に注目してください。 このフィールドは、ソケットタイプがストリームベースのUDSであることを示します。 2行目は、タイプがu_dgr
であることを示しています。これは、ソケットタイプがデータグラムベースであることを意味します。
Unixドメインソケットはファイルであるため、通常のLinuxユーザーおよびグループのアクセス許可とアクセス制御を使用して、ソケットに接続できるユーザーを制限できます。 ls
、mv
、chown
、chmod
などのファイルシステムツールを使用して、UDSファイルを調べたり操作したりすることもできます。 SELinuxなどのツールを使用して、UDSファイルにさまざまなセキュリティコンテキストでラベルを付けることもできます。
ファイルがUDSソケットであるかどうかを確認するには、ls
、file
、またはstat
ユーティリティを使用します。 ただし、これらのツールはいずれも、UDSがストリームベースかデータグラムベースかを判断できないことに注意してください。 Unixドメインソケットに関する最も完全な情報については、ss
ツールを使用してください。
ファイルシステム上のソケットを調べるために、stat
ユーティリティは最も関連性の高い情報を表示します。 以前に作成したソケットで実行します。
stat /tmp/stream.sock /tmp/datagram.sock
次のような出力が表示されます。
Output File: /tmp/stream.sock Size: 0 Blocks: 1 IO Block: 131072 socket Device: 48h/72d Inode: 1742 Links: 1 Access: (0755/srwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2021-03-01 18:10:25.025755168 +0000 Modify: 2021-03-01 18:10:25.025755168 +0000 Change: 2021-03-01 18:22:42.678231700 +0000 Birth: - File: /tmp/datagram.sock Size: 0 Blocks: 1 IO Block: 131072 socket Device: 48h/72d Inode: 1743 Links: 1 Access: (0755/srwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2021-03-01 18:10:25.025755168 +0000 Modify: 2021-03-01 18:10:25.025755168 +0000 Change: 2021-03-01 18:10:25.025755168 +0000 Birth: -
各ファイルのタイプはsocket
(出力の右端で強調表示)であり、アクセスモードにはファイルのアクセス許可の前にs
文字があることに注意してください。
ls
ユーティリティは、ファイルがソケットであるかどうかも示します。 ls -l
を実行して、ファイルを調べます。
ls -l /tmp/stream.sock /tmp/datagram.sock
次のような出力が表示されます。 ソケットの場合、ファイルモードでは、ファイルのアクセス許可フィールドの前にs
文字が含まれていることに注意してください。
Outputsrwxr-xr-x 1 root root 0 Mar 1 18:10 /tmp/datagram.sock srwxr-xr-x 1 root root 0 Mar 1 18:10 /tmp/stream.sock
Unixドメインソケットを作成し、ss
およびさまざまなファイルシステムベースのツールを使用してそれらを調べる方法を学習したので、次のステップは、netcatなどのツールを使用してソケットをテストすることです。
Unixドメインソケットのテスト
netcatユーティリティを使用して、Unixドメインソケット、およびこのチュートリアルの前半ですでに学習したTCPおよびUDPソケットに接続できます。 作成したサンプルソケットに接続するには、netcatコマンドを実行するときに追加の-U
フラグを指定する必要があります。 このフラグは、TCPまたはUDPベースのネットワークソケットではなく、UDSに接続するようにnetcatに指示します。
さらに、ソケットがデータグラムベースの場合は、-u
フラグを使用して、このチュートリアルの「データグラムソケット」セクションで学習したデータグラムを使用するようにnetcatに指示します。
次のコマンドを使用してストリームベースのソケットに接続することにより、UDSソケットの調査を開始しましょう。
nc -U -z /tmp/stream.sock
-U
は、Unixドメインソケットに接続していることをnetcatに通知します。 -z
オプションは、netcatがデータを送信せずにソケットにのみ接続することを保証します。 /tmp/stream.sock
は、ファイルシステム上のソケットのアドレスです。
コマンドを実行しても、netcatからの出力はありません。 ただし、ソケットが使用できない場合、netcatは次のようなエラーメッセージを出力します。
Outputnc: unix connect failed: No such file or directory nc: /tmp/stream.sock: No such file or directory
したがって、ストリームベースのUDSソケットをテストするときにnetcatからの出力がないということは、接続が成功したことを意味します。
今回はデータグラムベースのUDSについて、テストプロセスを繰り返します。
nc -uU -z /tmp/datagram.sock
追加の-u
フラグが追加され、リモートソケットがデータグラムソケットであることをnetcatに通知します。 この場合も、テストが成功した場合、出力は送信されません。
アドレスにソケットがない場合は、次のようなエラーが発生します。
Outputnc: unix connect failed: No such file or directory nc: /tmp/datagram.sock: No such file or directory
ソケットをクリーンアップするには、作成したsocatプロセスごとにfg
(フォアグラウンド)コマンドを実行する必要があります。 次に、CTRL+C
を使用して各socatを閉じます。
fg
を実行して、データグラムベースのsocat
インスタンスを端末のフォアグラウンドに移動します。
fg
次のような出力が表示されます。
Outputsocat unix-recvfrom:/tmp/datagram.sock,fork /dev/null
CTRL+C
を実行して閉じます。 出力は受信されません。
次に、fg
を再度実行して、最初のストリームベースのUDSソケットをクリーンアップします。
ここでも、次のような出力が必要です。
Outputsocat unix-listen:/tmp/stream.sock,fork /dev/null
CTRL+C
を実行してプロセスを終了します。 出力は受信されません。
これで、システム上でUnixデータグラムソケットソケットを作成、調査、およびテストしました。 netcatとsocat
を試して、UDSを介してデータを送受信する方法、およびUnixドメインソケットをテストおよびトラブルシューティングする方法をよく理解してください。
結論
このチュートリアルでは、Linuxシステムでさまざまな種類のソケットがどのように使用されるかを調べました。 通常、ネットワーク通信にTCPを使用するストリームベースのソケットについて学習しました。 また、UDPを使用してネットワーク経由でデータを送信するデータグラムベースのソケットについても学びました。 最後に、Unixドメインソケットをローカルサーバーに基づいてストリームまたはデータグラムベースにする方法を検討しました。
各セクションでは、ss
ユーティリティを使用して、Linuxシステムのソケットに関する情報を収集しました。 ss
ツールが提供するさまざまなフラグが、システム上のソケットを調べるときに、出力を特定のタイプのソケットに制限するのにどのように役立つかを学びました。
最後に、netcatおよびsocat
ツールを使用して、このチュートリアルで説明した3つの異なるタイプのソケットのそれぞれを作成して接続しました。 netcatユーティリティは、ソケットへの接続に広く使用されていますが、ソケットを作成することもできます。 そのドキュメント(man nc
)には、どちらのモードでも使用できる方法の例が多数含まれています。 socat
ユーティリティは、このチュートリアルでカバーされていないさまざまな種類のソケットに接続するために使用できる、より高度なツールです。 そのドキュメント(man socat
)には、さまざまな使用方法の例も多数含まれています。
ソケットとは何か、およびソケットがどのように機能するかを理解することは、コアシステム管理スキルです。 このチュートリアルで実験したツールと手法は、ソケットについて理解を深め、サーバーとアプリケーションが相互に正しく通信していない場合にソケットのトラブルシューティングを行う方法を理解するのに役立ちます。