UNIX Domain Socket over TCP
Live With Linux::technique
- TOP
- Articles
- Live With Linux
- UNIX Domain Socket over TCP
序
非常に簡単なのだが、知っている人が少ないようなので紹介しよう。
UNIXドメインソケットはファイルパスをベースにしたプロセス間通信の仕組みである。 ファイルシステム上のファイルではない。
SFTPやSSHFSを用いたとしても、ネットワーク越しにUNIXドメインソケットにアクセスすることはできない。
UNIXドメインソケットを使う
サーバーを起動する
まず、サーバープロセスが /tmp/example-server.sock
というUNIXドメインソケットをlistenするとする。
$ server-program
別のホストからも /tmp/example-server.sock
にconnectしてこのソケットにアクセスできるのであれば、UNIXドメインソケットとしての利用でネットワークを越えることができたといえるだろう。
テストするだけならsocatでもできる。
$ socat UNIX-LISTEN:/tmp/example-server.sock,fork STDIO
TCPでつなぐ
サーバープロセスが動作しているホスト上でsocatを使う。
$ socat TCP-LISTEN:33355,fork UNIX-CONNECT:/tmp/example-server.sock
リモートホストからTCPにつなぐ
同じ名前のUNIXドメインソケットをlistenし、サーバープロセスの動作しているホストにつなぐ。
$ socat UNIX-LISTEN:/tmp/example-server.sock,fork TCP-CONNECT:serverhost.local:33355
リモートホストでクライアントを使う
もう準備は完了した。ネットワークごしにサーバープロセスにつなごう。
$ client-program
こちらもテストするならばsocatでできる。
$ socat UNIX-CONNECT:/tmp/example-server.sock STDIO
OpenSSHを使う方法
SSHログインが可能なのであればもうちょっと簡単な方法がある。
まず、サーバーホストの /tmp/example-server.sock
が起動される。
$ server-program
クライアントホストで-L
を使う。
$ ssh -N -L /tmp/example-server.sock:/tmp/example-server.sock serverhost.local
これでクライアントホストからアクセス可能になった。
$ client-program