Перенаправление TCP-трафика на сокет домена UNIX под Linux - PullRequest
37 голосов
/ 27 января 2010

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

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

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

Ответы [ 5 ]

56 голосов
/ 27 января 2010

Оказывается 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

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

19 голосов
/ 28 января 2010

Самый простой? Вероятно, 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 , более способный, но более сложный в использовании.

3 голосов
/ 27 января 2010

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

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

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

0 голосов
/ 24 июня 2016

В дополнениях к @ 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 голосов
/ 27 января 2010

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

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

...