Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Выключается 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

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

Ответ 2

Самый простой? Вероятно, Netcat (aka 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

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

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

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

Ответ 5

В дополнениях к @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
}