web-dev-qa-db-ja.com

LinuxでTCPトラフィックをUNIXドメインソケットにリダイレクトする

UNIXドメインソケットでリッスンしているレガシーLinuxアプリケーションを想定します/tmp/foo

UNIXドメインソケットメカニズムを介してこのレガシーアプリケーションと通信することに加えて、ポート1234などのTCP接続を介して接続できるようにしたいと考えています。

TCPポート1234にバインドし、すべての着信接続をUNIXドメインソケットにリダイレクトする最も簡単な方法は何ですか/tmp/foo

38
knorv

結局 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

これらの例はテスト済みであり、期待どおりに動作します。

57
knorv

最も簡単ですか?おそらく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

socatknorvが推奨 と同様に、より機能的ですが、使用がより複雑です。

23
Brian Campbell

TCP 1234にバインドし、/ tmp/fooのソケットfdを取得し、1234と/ tmp/fooの両方のデータに対して「リッスン」するselect呼び出しを使用できるはずです。データが1234に書き込まれた場合、/ tmp/fooに書き換え、その逆も同様です。

これで、プロキシとして機能し、データを相互に転送します。

そして、これが役立つかもしれないウェブページです: http://osr507doc.sco.com/en/netguide/dusockC.io_multiplexing.html

3
Aryabhatta

@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
}
1
hloroform

試してみませんでしたが、「lighttpd」でこれを実行できるようです:

http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModProxyCore

0
monojohnny