UNIXドメインソケットでリッスンしているレガシーLinuxアプリケーションを想定します/tmp/foo
。
UNIXドメインソケットメカニズムを介してこのレガシーアプリケーションと通信することに加えて、ポート1234などのTCP接続を介して接続できるようにしたいと考えています。
TCPポート1234にバインドし、すべての着信接続をUNIXドメインソケットにリダイレクトする最も簡単な方法は何ですか/tmp/foo
?
結局 socat を使用してこれを達成できる:
socat TCP-LISTEN:1234,reuseaddr,fork UNIX-CLIENT:/tmp/foo
さらに、セキュリティを少し追加しました。
socat TCP-LISTEN:1234,bind=127.0.0.1,reuseaddr,fork,su=nobody,range=127.0.0.0/8 UNIX-CLIENT:/tmp/foo
これらの例はテスト済みであり、期待どおりに動作します。
最も簡単ですか?おそらくNetcat(別名 nc
):
nc -l 1234 | nc -U /tmp/foo
最初のコマンドはポート1234で着信接続をリッスンし、結果のデータを2番目のコマンドにパイプします。 2番目はUnixドメインソケットに接続します/tmp/foo
、そしてそのソケットにその入力を書き込みます。これは単一の接続のみを受け入れ、その接続がドロップされるとすぐに終了することに注意してください。さらに接続をリッスンしたい場合は、-k
オプション:
nc -lk 1234 | nc -U /tmp/foo
1つの端末でそのソケットのリスナーを設定することで、これが機能していることをテストできます。
nc -lUk /tmp/foo
そして、別の場所でそれに書きます:
nc localhost 1234
TCP 1234にバインドし、/ tmp/fooのソケットfdを取得し、1234と/ tmp/fooの両方のデータに対して「リッスン」するselect呼び出しを使用できるはずです。データが1234に書き込まれた場合、/ tmp/fooに書き換え、その逆も同様です。
これで、プロキシとして機能し、データを相互に転送します。
そして、これが役立つかもしれないウェブページです: http://osr507doc.sco.com/en/netguide/dusockC.io_multiplexing.html
@knorvの answer に加えて:xinetd
を使用すると、デーモンのように機能します
# cat /etc/xined.d/mysrv
service mysrv
{
disable = no
type = UNLISTED
socket_type = stream
protocol = tcp
wait = no
server = /usr/bin/socat
server_args = STDIN UNIX-CLIENT:/tmp/mysocket.sock
bind = 127.0.0.1
port = 1234
}
試してみませんでしたが、「lighttpd」でこれを実行できるようです: