ソケットを理解する
序章
ソケットは、サーバー上で実行されているプログラム間、または別々のサーバー上で実行されているプログラム間のプロセス間通信を可能にする方法です。 サーバー間の通信は、ネットワークソケットに依存します。このソケットは、インターネットプロトコル(IP)を使用して、データの送受信をカプセル化および処理します。
クライアントとサーバーの両方のネットワークソケットは、ソケットアドレスによって参照されます。 アドレスは、伝送制御プロトコル(TCP)やユーザーデータグラムプロトコル(UDP)などのトランスポートプロトコル、IPアドレス、およびポート番号の一意の組み合わせです。
このチュートリアルでは、プロセス間通信に使用される次のさまざまなタイプのソケットについて学習します。
- ストリームソケット。基盤となるトランスポートプロトコルとしてTCPを使用します。
- データグラムソケット。基盤となるトランスポートプロトコルとしてUDPを使用します。
- Unixドメインソケット。ネットワークインターフェイスやIPパケットの代わりに、ローカルファイルを使用してデータを送受信します。
このチュートリアルの各セクションでは、Linuxシステムでそれぞれのソケットタイプを列挙する方法も学習します。 さまざまなコマンドラインツールを使用して、各タイプのソケットを調べます。
前提条件
このチュートリアルの例は、Ubuntu20.04サーバーで検証されています。 ディストリビューションに必要な各ツールの同等のバージョンがインストールされている限り、ローカルコンピューターまたはリモートサーバーで最新のLinuxディストリビューションを使用してこのチュートリアルに従うことができます。
Ubuntu 20.04の使用を開始するには、 Ubuntu20.04の初期サーバーセットアップガイドに従って構成された1台のサーバーが必要です。
また、システムのソケットを調べるために、他のいくつかのパッケージが必要になります。 を使用して、システムのパッケージキャッシュが最新であることを確認します。 apt update
指図:
- sudo apt update
次に、次のコマンドを使用して必要なパッケージをインストールします。
- sudo apt install iproute2 netcat-openbsd socat
The iproute2
パッケージには、 ss
ユーティリティ。これは、ソケットを検査するために使用します。 を使用します netcat-openbsd
netcatをインストールするためのパッケージ。 netcatは次のように省略されていることに注意してください nc
コマンドラインで呼び出されたとき。 最後に、 socat
サンプルソケットを作成するためのパッケージ。
ストリームソケットとは何ですか?
ストリームソケットはコネクション型です。つまり、ネットワークソケットとの間で送受信されるパケットは、アプリケーションで処理するためにホストオペレーティングシステムによって配信されます。 ネットワークベースのストリームソケットは通常、伝送制御プロトコル(TCP)を使用して、ネットワークインターフェイスを介してデータをカプセル化して送信します。
TCPは、ステートフル接続に依存する信頼性の高いネットワークプロトコルになるように設計されています。 TCPベースのストリームソケットを使用してプログラムによって送信されたデータは、リモートシステムによって正常に受信されます(ルーティング、ファイアウォール、またはその他の接続の問題がないことを前提としています)。 TCPパケットは、物理ネットワークインターフェイスに任意の順序で到着できます。 パケットが順不同で到着した場合、ネットワークアダプタとホストオペレーティングシステムは、アプリケーションで処理するためにパケットが正しい順序で再構築されることを保証します。
TCPベースのストリームソケットの一般的な使用法は、ApacheやNginxなどのWebサーバーがポートでHTTP要求を処理する場合です。 80
、またはポートのHTTPS 443
. HTTPの場合、ソケットアドレスは次のようになります。 203.0.113.1:80
、HTTPSの場合は次のようになります 203.0.113.1:443
.
TCPベースのストリームソケットの作成
次の例では、 socat
(略して SOcket CAT
)ポート8080(代替HTTPポート)でHTTP要求をリッスンするWebサーバーをエミュレートするコマンド。 次に、を使用してソケットを調べます ss
、 と nc
コマンド。
まず、以下を実行します socat
ポートで接続をリッスンする2つのTCPベースのソケットを作成するコマンド 8080
、IPv4およびIPv6インターフェースを使用:
- socat TCP4-LISTEN:8080,fork /dev/null&
- socat TCP6-LISTEN:8080,ipv6only=1,fork /dev/null&
- The
TCP4-LISTEN:8080
とTCP6-LISTEN:8080
引数は、使用するプロトコルタイプとポート番号です。 彼らは言うsocat
ポートにTCPソケットを作成するには8080
すべてのIPv4およびIPv6インターフェースで、着信接続について各ソケットをリッスンします。socat
システムで使用可能な任意のポートでリッスンできるため、0
に65535
ソケットオプションの有効なパラメータです。 - The
fork
オプションは、次のことを確認するために使用されますsocat
接続を処理した後も実行を継続します。それ以外の場合は、自動的に終了します。 - The
/dev/null
リモートソケットアドレスの代わりにパスが使用されます。 この場合、それは伝えますsocat
着信入力を印刷するには/dev/null
サイレントに破棄するファイル。 - The
ipv6only=1
フラグはIPv6ソケットに使用され、ソケットがIPv4にマップされたIPv6アドレスにパケットを送信するように構成されていないことをオペレーティングシステムに通知します。 このフラグがないと、socat
IPv4アドレスとIPv6アドレスの両方にバインドします。 - The
&
文字は、バックグラウンドでコマンドを実行するようにシェルに指示します。 このフラグは、socat
ソケットを調べるために他のコマンドを呼び出している間、実行を継続します。
次のような出力が表示されます。これは、2つを示しています。 socat
シェルセッションのバックグラウンドで実行されているプロセスID。 プロセスIDは、ここで強調表示されているものとは異なります。
Output[1] 434223
[2] 434224
これで2つあります socat
TCPポートでリッスンしているプロセス 8080
バックグラウンドで、を使用してソケットを調べることができます ss
と nc
ユーティリティ。
TCPベースのストリームソケットの調査
を使用して最新のLinuxシステムでTCPソケットを調べるには ss
コマンドを実行し、次のフラグを指定して実行し、出力を制限します。
- The
-4
と-6
フラグが伝えるss
それぞれIPv4またはIPv6ソケットのみを調べます。 このオプションを省略すると、両方のソケットセットが表示されます。 - The
t
フラグは、出力をTCPソケットに制限します。 デフォルトでは、ss
ツールは、Linuxシステムで使用されているすべてのタイプのソケットを表示します。 - The
l
フラグは、出力をリスニングソケットに制限します。 このフラグがないと、SSH、Webサーバーに接続されている可能性のあるクライアント、またはシステムが他のサーバーに接続している可能性のある接続など、すべてのTCP接続が表示されます。 - The
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ソケットがポートで使用可能なすべてのIPv4インターフェイスをリッスンしていることを示しています 8080
. 特定の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ソケットがポートで使用可能なすべてのIPv6インターフェイスをリッスンしていることを示しています 8080
(によって示されるように ::
文字。すべてゼロで構成されるアドレスの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
- The
-4
フラグは、netcatにIPv4を使用するように指示します。 - The
-v
フラグは、端末に詳細な出力を出力するために使用されます。 - –
z
オプションは、netcatがデータを送信せずにソケットにのみ接続することを保証します。 - ローカルループバック
127.0.0.1
システムには独自のIPアドレスがあるため、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ソケットに接続してループバックをリッスンしていることを示しています 127.0.0.1
ポートのIPv4アドレス 8080
. 2行目は無視してかまいません。これは、端末のバックグラウンドで実行されているsocatプロセスからのものです。
これで、同じ接続テストを繰り返すことができますが、IPv6を使用します。 次のnetcatコマンドを実行します。
- nc -6 -vz ::1 8080
次のような出力を受け取るはずです。
OutputConnection to ::1 8080 port [tcp/http] succeeded!
強調表示されている行は、netcatからの出力です。 これは、netcatがTCPソケットに接続してループバックをリッスンしていることを示しています ::1
ポートのIPv6アドレス 8080
. ここでも、出力の2行目を無視できます。
ソケットをクリーンアップするには、を実行する必要があります fg
作成した各socatプロセスの(フォアグラウンド)コマンド。 次に、を使用します 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)は、ポートでUDPソケットを使用します 123
コンピュータ間でクロックを同期します。 NTPプロトコルのUDPソケットの例は次のとおりです。 203.0.113.1:123
.
データグラムソケットの作成
前のTCPソケットの例と同様に、このセクションでは使用します socat
再度、UDPポートで要求をリッスンするNTPサーバーをエミュレートします 123
. 次に、を使用して作成したソケットを調べます。 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
- 各コマンドのプレフィックスは
sudo
、ポートのため0
に1024
ほとんどのシステムで予約されています。sudo
管理者権限でコマンドを実行します。これにより、socat
予約範囲内の任意のポートにバインドします。 - The
UDP4-LISTEN:123
とUDP6-LISTEN:123
引数は、使用するプロトコルタイプとポートです。 彼らはsocatにポート上にUDPベースのソケットを作成するように指示します123
IPv4およびIPv6インターフェースの両方で、着信データをリッスンします。 ここでも、0〜65535の全範囲のポートは、UDPソケットの有効なパラメータです。 - The
fork
,ipv6only=1
、 と/dev/null
引数は、前のTCPの例で説明したのと同じ方法で使用されます。
これで2つあります socat
UDPポートでリッスンしているプロセス 123
、を使用してソケットを調べることができます ss
と nc
ユーティリティ。
データグラムソケットの調査
を使用して最新のLinuxシステムでUDPソケットを調べるには ss
コマンド、次のコマンドで実行します -4
、-6, and
出力を制限するuln`フラグ:
The 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ソケットがポートのすべてのIPv4インターフェイスで使用可能であることを示しています 123
. 特定の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
出力の一部は、IPv6TCPソケットがポートのすべてのIPv6インターフェイスで使用可能であることを示しています 123
(によって示されるように ::
文字)。 特定のIPv6アドレスでのみ利用可能なサービスでは、たとえば、強調表示されたフィールドにそのIPのみが表示されます。 [2604:a880:400:d1::3d3:6001]:123
.
データグラムソケットのテスト
IPv4インターフェイスとIPv6インターフェイスの両方でUDPソケットを作成および列挙する方法に精通しているので、それらに接続して実験することができます。 TCPソケットと同様に、netcatユーティリティを使用してUDPソケットを試すことができます。
ポートでサンプルUDPソケットに接続するには 123
このチュートリアルの前のセクションで作成したもので、次のnetcatコマンドを実行します。
- nc -4 -u -vz 127.0.0.1 123
- The
-4
フラグは、netcatにIPv4を使用するように指示します。 - The
-u
オプションは、TCPの代わりにUDPを使用するようにnetcatに指示します。 - The
-v
フラグは、端末に詳細な出力を出力するために使用されます。 - –
z
オプションは、netcatがデータを送信せずにソケットにのみ接続することを保証します。 - ローカルループバック
127.0.0.1
システムには独自のIPアドレスがあるため、IPアドレスが使用されます。 システムのIPがわかっている場合は、それを使用してテストすることもできます。 たとえば、システムのパブリックまたはプライベートIPアドレスが203.0.113.1
ループバックIPの代わりにそれを使用できます。
次のような出力が表示されます。
OutputConnection to 127.0.0.1 123 port [udp/ntp] succeeded!
出力は、netcatがループバックをリッスンしているUDPソケットからエラーを受信しなかったことを示しています 127.0.0.1
ポートのIPv4アドレス 123
. このエラー応答の欠如は、ソケットが 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がループバックをリッスンしているUDPソケットからエラーを受信しなかったことを示しています ::1
ポートのIPv6アドレス 123
. 繰り返しになりますが、このエラー応答の欠如は、 ::1:123
利用可能です。
ソケットをクリーンアップするには、を実行する必要があります fg
作成した各socatプロセスの(フォアグラウンド)コマンド。 次に、を使用します CTRL+C
各socatを閉じます。
走る fg
2番目のIPv6を導入する socat
ターミナルのフォアグラウンドへのインスタンス。 次に実行します 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&
- 最初のコマンドは、socatにを使用してソケットを作成するように指示します。
unix-listen
ストリームベースのUDSを作成するアドレスタイプ。 - 2番目のコマンドは
unix-recvfrom
データグラムベースのUDSを作成するソケットタイプとして - どちらのコマンドも、ファイル名の後にファイル名を指定します
:
セパレータ。 ファイル名は、ソケット自体のアドレスです。 最初のストリームの例では、/tmp/stream.sock
2番目のデータグラムの例では、/tmp/datagram.sock
. ソケットの名前は任意ですが、トラブルシューティングの際にわかりやすい名前にするのに役立ちます。 - The
fork
、 と/dev/null
引数は、ストリームおよびデータグラムソケットの例のセクションで説明されているのと同じ方法で使用されます。
2つのUDSソケットを作成したので、次を使用してそれらを調べることができます。 ss
と nc
ユーティリティ。
Unixドメインソケットの調査
リスニングしているすべてのUnixドメインソケットを一覧表示するには、 ss -xln
指図。 The 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
. . .
強調表示されていることに注意してください u_str
の一部 /tmp/stream/sock
ライン。 このフィールドは、ソケットタイプがストリームベースのUDSであることを示します。 2行目は、タイプが u_dgr
これは、ソケットタイプがデータグラムベースであることを意味します。
Unixドメインソケットはファイルであるため、通常のLinuxユーザーおよびグループのアクセス許可とアクセス制御を使用して、ソケットに接続できるユーザーを制限できます。 次のようなファイルシステムツールを使用することもできます ls
, mv
, chown
と chmod
UDSファイルを調べて操作します。 SELinuxなどのツールを使用して、UDSファイルにさまざまなセキュリティコンテキストでラベルを付けることもできます。
ファイルがUDSソケットであるかどうかを確認するには、 ls
, file
また stat
ユーティリティ。 ただし、これらのツールはいずれも、UDSがストリームベースかデータグラムベースかを判断できないことに注意してください。 使用 ss
Unixドメインソケットに関する最も完全な情報のためのツール。
ファイルシステム上のソケットを調べるには、 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
ファイルの権限の前にある文字。
The 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ソケットに接続できます。 作成したサンプルソケットに接続するには、追加のソケットを指定する必要があります -U
netcatコマンドの実行時にフラグを立てます。 このフラグは、TCPまたはUDPベースのネットワークソケットではなく、UDSに接続するようにnetcatに指示します。
さらに、ソケットがデータグラムベースの場合は、 -u
このチュートリアルの「データグラムソケット」セクションで学習したように、netcatにデータグラムを使用するように指示するフラグ。
次のコマンドを使用してストリームベースのソケットに接続することにより、UDSソケットの調査を開始しましょう。
- nc -U -z /tmp/stream.sock
The -U
Unixドメインソケットに接続していることをnetcatに通知します。 –z
オプションは、netcatがデータを送信せずにソケットにのみ接続することを保証します。 The /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
ソケットをクリーンアップするには、を実行する必要があります fg
作成した各socatプロセスの(フォアグラウンド)コマンド。 次に、を使用します 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
)には、どちらのモードでも使用できる例が多数含まれています。 The socat
ユーティリティは、このチュートリアルでカバーされていない多くの異なるタイプのソケットに接続するために使用できる、より高度なツールです。 そのドキュメント(man socat
)には、さまざまな使用方法の例も多数含まれています。
ソケットとは何か、およびソケットがどのように機能するかを理解することは、コアシステム管理スキルです。 このチュートリアルで実験したツールと手法は、ソケットについて理解を深め、サーバーとアプリケーションが相互に正しく通信していない場合にソケットのトラブルシューティングを行う方法を理解するのに役立ちます。