it-roy-ru.com

Перенаправление TCP-трафика на сокет домена UNIX под Linux

Предположим, что устаревшее приложение Linux прослушивает сокет домена UNIX /tmp/foo.

В дополнение к связи с этим унаследованным приложением через механизм сокетов домена UNIX, я хочу иметь возможность подключаться к нему через TCP-соединение через порт, скажем, 1234.

Какой самый простой способ привязать порт TCP к 1234, а затем перенаправить все входящие соединения на сокет домена UNIX /tmp/foo?

34
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

Эти примеры были проверены и работают как ожидалось.

53
knorv

Самый простой? Вероятно, Netcat (он же nc ):

nc -l 1234 | nc -U /tmp/foo

Первая команда прослушивает порт 1234 на предмет входящих соединений и передает полученные данные второй команде. Второй подключается к сокету домена Unix /tmp/foo и записывает свой вход в этот сокет. Обратите внимание, что это примет только одно соединение и завершится, как только это соединение будет разорвано. Если вы хотите прослушивать больше подключений, используйте параметр -k:

nc -lk 1234 | nc -U /tmp/foo

Вы можете проверить, что это работает, настроив прослушиватель для этого сокета в одном терминале:

nc -lUk /tmp/foo

И пишу ему по другому:

nc localhost 1234

socat , как рекомендовано knorv , более функционально, но более сложно в использовании.

18
Brian Campbell

Вы должны иметь возможность связываться с TCP 1234, получить сокет fd для/tmp/foo и использовать вызов select для прослушивания данных как в 1234, так и в/tmp/foo. Любые данные, записанные в 1234, вы переписываете в/tmp/foo и наоборот.

Теперь вы действуете как прокси и передаете данные туда и обратно.

И вот веб-страница, которая может помочь: http://osr507doc.sco.com/en/netguide/dusockC.io_multiplexing.html

3
Aryabhatta

В дополнение к @ knorv's 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
}
0
hloroform

Не пробовал: но похоже, что 'lighttpd' может сделать это за вас:

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

0
monojohnny