Przekierowanie ruchu TCP do gniazda domeny UNIX pod Linuksem
Załóżmy, że starsza aplikacja Linuksa nasłuchuje na gniazdku domeny UNIX /tmp/foo
.
Oprócz komunikacji z tą starszą aplikacją poprzez mechanizm gniazd domeny UNIX chcę być w stanie połączyć się z nią poprzez połączenie TCP na porcie say 1234.
Jak najłatwiej połączyć się z portem TCP 1234, a następnie przekierować wszystkie przychodzące połączenia do gniazda domeny UNIX /tmp/foo
?
5 answers
Okazuje się, że socat może być użyty do osiągnięcia tego celu:
socat TCP-LISTEN:1234,reuseaddr,fork UNIX-CLIENT:/tmp/foo
I z odrobiną dodatkowego bezpieczeństwa:
socat TCP-LISTEN:1234,bind=127.0.0.1,reuseaddr,fork,su=nobody,range=127.0.0.0/8 UNIX-CLIENT:/tmp/foo
Te przykłady zostały przetestowane i działają zgodnie z oczekiwaniami.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-27 20:57:14
Najłatwiej? Prawdopodobnie Netcat (aka nc
):
nc -l 1234 | nc -U /tmp/foo
Pierwsze polecenie nasłuchuje na porcie 1234 połączeń przychodzących i przekazuje wynikowe dane do drugiego polecenia. Drugi łączy się z gniazdem domeny uniksowej /tmp/foo
i zapisuje swoje wejście do tego gniazda. Zauważ, że będzie to akceptować tylko jedno połączenie i zakończyć, gdy tylko to połączenie zostanie przerwane. Jeśli chcesz słuchać więcej połączeń, użyj opcji -k
:
nc -lk 1234 | nc -U /tmp/foo
Możesz sprawdzić, że to działa poprzez ustawienie słuchacza dla tego gniazda w jednym terminalu:
nc -lUk /tmp/foo
I pisząc do niego w innym:
nc localhost 1234
Socat , jako zalecany przez knorv , jest bardziej zdolny, ale bardziej skomplikowany w użyciu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:31
Powinieneś być w stanie połączyć się z TCP 1234, uzyskać Gniazdo fd dla /tmp / foo i użyć wywołania select do "nasłuchiwania" danych zarówno na 1234, jak i /tmp / foo. Wszelkie dane zapisane do 1234, przepisujesz do /tmp / foo i odwrotnie.
Teraz działasz jako proxy i przesyłasz dane tam iz powrotem.
A oto strona, która może pomóc: http://osr507doc.sco.com/en/netguide/dusockC.io_multiplexing.html
Nie próbowałem : ale wygląda na to, że 'lighttpd' może to zrobić za Ciebie:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-27 19:09:17
W additonach do @knorv ' S odpowiedź : z {[1] } może działać jak demon
# 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
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:12