Chienomi

UNIX Domain Socket over TCP

Live With Linux::technique

非常に簡単なのだが、知っている人が少ないようなので紹介しよう。

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