Перенаправление TCP-трафика в UNIX-сокет под Linux
Предположим, что устаревшее приложение Linux прослушивается в доменном сокете UNIX /tmp/foo
.
В дополнение к общению с этим устаревшим приложением по механизму сокета домена UNIX я хочу иметь возможность подключиться к нему через TCP-соединение на порту, например, 1234.
Каков самый простой способ привязки к TCP-порту 1234, а затем перенаправить все входящие соединения в доменное имя UNIX /tmp/foo
?
Ответы
Ответ 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
Ответ 4
Не пробовал: но похоже, что "lighttpd" может сделать это за вас:
http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModProxyCore
Ответ 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
}