Netcat przestaje nasłuchiwać ruchu UDP

8

Używam netcata na niektórych maszynach z Linuksem (zobacz to inne pytanie ), ale widzę pewne nieoczekiwane zachowanie.

W przeciwieństwie do przewodnika w zaakceptowanej odpowiedzi, nie używam tunelowania UDP do wykonywania zapytań DNS. Mam zdalny serwer, na którym mogę się zalogować, ale nie mogę instalować oprogramowania, i próbuję tunelować ruch UDP z mojego komputera do serwera, a następnie skonfigurować osobny tunel, aby wysyłać odpowiedzi UDP z serwera na mój komputer .

Tunel przechodzący z mojej maszyny do serwera działa idealnie, jednak po stronie serwera instancja netcata, która oczekuje na odpowiedź z serwera UDP, zamknie słuchacza po otrzymaniu pierwszej odpowiedzi. Mogę więc wysłać żądanie i otrzymać 1 odpowiedź z powrotem, ale wszelkie kolejne żądania sprawiają, że serwer jest w porządku, ale odpowiedzi nie są odbierane. Za pomocą netstat widzę, że przed otrzymaniem odpowiedzi netcat nasłuchuje, ale port jest zamykany po otrzymaniu odpowiedzi.

Wydaje się, że instancja netcat na moim komputerze radzi sobie ze wszystkim dobrze. Na obu komputerach działa Netcat v1.10-38. Jakieś pomysły, co się dzieje?

ciężki
źródło

Odpowiedzi:

2

Istnieje wiele rzeczy zwanych netcat; ubuntu ma nawet dla niego / etc / alternatives symboliczne-link-hackery.

Myślę, że część twojego problemu polega na tym, że UDP nie robi sesji; Skopiowałem część pliku /usr/share/doc/netcat-traditional/README.gz poniżej, co dość dobrze wyjaśnia.

Połączenia UDP są otwierane zamiast TCP, gdy podano -u. Nie są to tak naprawdę „połączenia” jako takie, ponieważ UDP jest protokołem bezpołączeniowym, chociaż netcat wewnętrznie korzysta z mechanizmu „podłączonego gniazda UDP”, który obsługuje większość jąder. Chociaż netcat twierdzi, że wychodzące połączenie UDP jest natychmiast „otwarte”, żadne dane nie są wysyłane, dopóki coś nie zostanie odczytane ze standardowego wejścia. Dopiero potem można ustalić, czy naprawdę jest serwer UDP na drugim końcu, a często po prostu nie można tego stwierdzić. Większość protokołów UDP używa limitów czasu i ponownych prób, aby wykonać swoje zadanie, a w wielu przypadkach nie będzie w ogóle przeszkadzać w odpowiadaniu, dlatego należy określić limit czasu i mieć nadzieję na najlepsze.

OK, więc może to nie jest świetne wytłumaczenie, ale to właśnie mogłem znaleźć.

Jeśli jeszcze tego nie zrobiłeś, możesz poeksperymentować z dowolnymi dostępnymi opcjami netcat, które miałyby związek z czekaniem ... czy eksperymentowałeś z:

  • używając -l oraz -u, aby upewnić się, że jesteś w trybie „nasłuchiwania”

  • -vv, aby zobaczyć dokładnie, co się dzieje

  • -q -1 ... które powinny „czekać wiecznie” nawet po otrzymaniu EOF (mam nadzieję, że znów nasłuchasz?)

pbr
źródło
5
więc jest to teraz akceptowana odpowiedź, ale nie wiemy, która z porad okazała się przydatna :(
törzsmókus,
2

Możesz socatdo tego użyć . Ma bardzo fajną opcję fork:

fork Po ustanowieniu połączenia obsługuje swój kanał w procesie potomnym i utrzymuje proces macierzysty w próbie utworzenia większej liczby połączeń, poprzez nasłuchiwanie lub połączenie w pętli (przykład).

Klient (tak, uruchamiany z klienta):

$ ssh -L 7753:localhost:7753 YourServer.com "/usr/bin/socat tcp4-listen:7753,reuseaddr,fork UDP:8.8.8.8:53"

Klient:

$ sudo socat udp4-listen:53,reuseaddr,fork tcp:localhost:7753
$ dig @127.0.0.1 google.com
Andrey Arapov
źródło