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?

Author: knorv, 2010-01-27

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.

 51
Author: knorv,
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.

 18
Author: Brian Campbell,
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

 3
Author: ,
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:06:11

Nie próbowałem : ale wygląda na to, że 'lighttpd' może to zrobić za Ciebie:

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

 0
Author: monojohnny,
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
}
 0
Author: hloroform,
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