Jak określić port przydzielony na serwerze dla dynamicznie powiązanego tunelu zwrotnego openssh?

16

Podczas tworzenia tuneli zwrotnych w najnowszych wersjach OpenSSH można podać zdalny port 0 w celu powiązania dowolnego dostępnego portu:

-R [adres_powiązania:] port: host: port hosta

...

Jeśli argumentem portu jest „0”, port nasłuchiwania zostanie dynamicznie przydzielony na serwerze i zgłoszony klientowi w czasie wykonywania.

Strona klienta klienta openssh ssh

Moje pytanie brzmi: w jaki sposób (w sposób zautomatyzowany) mogę określić ten przydział portów na serwerze. Wydaje się raczej nieprzydatne, że jest zgłaszane do hosta z uruchomionym klientem ssh - ale nie do celu, który będzie chciał nawiązać połączenia z tym portem, aby uzyskać dostęp do usług na kliencie.

Dwie podobne opcje, o których myślę, są uruchomione

# netstat -ntlp

na serwerze i poszukaj podejrzanych portów powiązanych 127.0.0.1 przez sshd lub patrząc na wynik

# lsof -p $PPID | grep TCP | grep LISTEN

Ale żaden z nich nie jest przyjemny z punktu widzenia automatyzacji i nie ma żadnego sposobu na powiązanie portów dynamicznych z powrotem z portem usługi początkowej, jeśli utworzono więcej niż jeden taki tunel.

Czy brakuje mi czegoś, aby skutecznie uzyskać listę aktywnych tuneli (zarówno numerów portów lokalnych, jak i zdalnych) po stronie serwera sshd, podobnie jak odpowiednik zmiennej środowiskowej SSH_CONNECTION, ale dla aktywnych tuneli?

W pewnym kontekście próbuję utworzyć potencjalnie bardzo wiele jednoczesnych tuneli zwrotnych do hosta, tunelując z powrotem do tego samego numeru portu na wielu różnych hostach. Automatyczne zarządzanie pulą portów przez stos TCP wydaje się być najbardziej efektywnym sposobem na zrobienie tego.

struktura kodowana
źródło
Podczas korzystania ze składni „-R 0: xxxx: y”, ssh wyświetli „Przydzielony port 49488 do zdalnego przekazania do xxxx: y na stderr.
BlakBat
Tak, problem polega na tym, jak uzyskać te informacje po stronie serwera - gdzie byłoby to o wiele bardziej pomocne ...
codedstructure

Odpowiedzi:

1

Jeśli ustawisz „LogLevel” w pliku konfiguracyjnym sshd_config na DEBUG1 (lub na dowolnym poziomie DEBUG), sshd zarejestruje numery portów w /var/log/auth.log.

Pamiętaj, że użycie LogLevel DEBUG lub wyższej może być zagrożeniem dla prywatności, ponieważ wiele jest rejestrowanych.

(z /var/log/auth.log, usunięto kilka wierszy, aby wyświetlić odpowiednie informacje)

Jun 24 06:18:24 radon sshd[9334]: Connection from 192.168.13.10 port 39193
Jun 24 06:18:24 radon sshd[9334]: Accepted publickey for lornix from 192.168.13.10 port 39193 ssh2
Jun 24 06:18:24 radon sshd[9334]: pam_unix(sshd:session): session opened for user lornix by (uid=0)
Jun 24 06:18:24 radon sshd[9334]: User child is on pid 9339
Jun 24 06:18:24 radon sshd[9339]: debug1: Local forwarding listening on 0.0.0.0 port 0.
Jun 24 06:18:24 radon sshd[9339]: debug1: Allocated listen port 39813
Jun 24 06:18:24 radon sshd[9339]: debug1: channel 0: new [port listener]
Jun 24 06:18:24 radon sshd[9339]: debug1: Local forwarding listening on :: port 39813.
Jun 24 06:18:24 radon sshd[9339]: debug1: channel 1: new [port listener]
Jun 24 06:18:27 radon sshd[9339]: Received disconnect from 192.168.13.10: 11: disconnected by user

Jeśli to zrobisz, możesz zobaczyć, gdzie można przeanalizować informacje o połączeniu, a następnie port przekierowany (w tym przypadku 39813)

Użyłem tego wiersza poleceń między dwoma moimi komputerami, mam skonfigurowane logowanie za pomocą klucza ssh, więc nie ma monitów o podanie hasła ani opóźnień

-xenon- lornix:~> ssh -R "*:0:radon:22" -N -T radon
Allocated port 39813 for remote forward to radon:22

-N określa, że ​​nie podano polecenia, a -T zatrzymuje przydział tty dla tego połączenia.

Innym sposobem na rozpowszechnienie informacji o połączeniu z portem byłoby przeanalizowanie go po stronie klienta i wysłanie wiadomości e-mail, jabbera, wiadomości tekstowej, sygnałów dymu lub gołębia w celu dostarczenia numeru portu każdemu, kto tego potrzebuje.

lornix
źródło
0

Możesz podłączyć stderr sshdo programu, który otwiera połączenie z serwerem na maszynie docelowej i zgłasza jego nazwę / adres IP / numer seryjny / cokolwiek wraz z numerem portu. Coś w stylu:

% ssh -R "*:0:radon:22" -N -T radon 2>&1 | sed "s/^/`uname -n` /" | netcat radon 3743
Russell Nelson
źródło