Mam dwie maszyny, klienta i serwer.
Klient (który stoi za firmową zaporą ogniową) otwiera tunel zwrotny SSH do serwera, który ma publicznie dostępny adres IP, za pomocą tego polecenia:
ssh -nNT -R0: localhost: 2222 [email protected]
W OpenSSH 5.3+ 0
występowanie tuż po -R
oznacza „wybierz dostępny port”, a nie jawnie go wzywając. Powodem tego jest to, że nie chcę wybierać używanego portu. W rzeczywistości istnieje wielu Klientów, którzy muszą założyć podobne tunele.
Problem polega na tym, że serwer nie wie, który klient jest który. Jeśli chcemy ponownie połączyć się z jednym z tych klientów (za pośrednictwem hosta lokalnego), to skąd wiemy, który port odnosi się do którego klienta?
Wiem, że ssh zgłasza numer portu w wierszu poleceń, gdy jest używany w powyższy sposób. Jednak chciałbym również użyć autossh, aby utrzymać sesje przy życiu. autossh uruchamia proces potomny prawdopodobnie przez fork / exec, tak że dane wyjściowe rzeczywistego polecenia ssh są tracone w eterze.
Ponadto nie mogę wymyślić żadnego innego sposobu uzyskania zdalnego portu od klienta. Zastanawiam się więc, czy istnieje sposób na określenie tego portu na serwerze.
Jednym z moich pomysłów jest użycie / etc / sshrc, który jest podobno skryptem uruchamianym dla każdego połączenia. Jednak nie wiem, w jaki sposób można uzyskać tutaj istotne informacje (być może PID konkretnego procesu sshd obsługującego to połączenie?) Chciałbym kilka wskazówek.
Dzięki!
źródło
Odpowiedzi:
Czy VPN nie byłby bardziej odpowiedni? OpenVPN jest bardzo prosty w konfiguracji. Oto przykładowa konfiguracja i kilka linków prowadzących przez proces tworzenia certyfikatu:
Następnie utwórz nowy plik
/etc/openvpn/client_server.conf
i umieść w nim następujące elementy, zmieniającSERVER_IP_ADDRESS
odpowiednioNastępnie zbuduj klucz dla każdego użytkownika, który ma się połączyć, i utwórz plik konfiguracyjny w katalogu ccd
Adres IP MUSI być odpowiedni dla podsieci / 30 (patrz http://www.subnet-calculator.com/cidr.php ), ponieważ dostępne są tylko 2 adresy (serwer i klient) na połączenie. Twój następny dostępny adres IP klienta to 192.168.100.6 i tak dalej.
Następnie masz statyczne adresy IP na podłączającego użytkownika.
Następnie dostarcz
the [email protected]
plik do użytkownika końcowego i użyj następującego pliku konfiguracyjnegoźródło
ifconfig-push 192.168.100.2 192.168.100.3
- Nie mam pojęcia, dlaczego różni się na platformach. I tak, oznacza to, że 4 klientów są używane na klienta (marnotrawstwo, ale charakter bestii).Jeśli każdy z klientów ma inną nazwę użytkownika, możesz użyć,
netstat
aby dowiedzieć się, na jakim porciesshd
nasłuchuje proces tego użytkownika . Na przykład:źródło
Możesz zmienić efemeryczny zakres portów (
/proc/sys/net/ipv4/ip_local_port_range
dla Linuksa), a następnie użyć statycznie przydzielonych portów poza tym zakresem.źródło
echo $[61002+RANDOM%4532]
numer portu w tym zakresie.Chcę taką samą konfigurację jak Ty, zwiększyłem poziom dziennika serwera SSH do DEBUG i pokazał w dziennikach, jaki był lokalny port klienta
na przykład:
polecenie klienta:
ssh -N -R0:127.0.0.1:5522 [email protected]
dziennik serwera:
tam widzisz numer portu
źródło
Powinieneś być w stanie wyodrębnić odpowiednie informacje z wyników:
Uruchom jako root.
źródło
Uruchom ten skrypt na serwerze:
Możesz potrzebować dwóch sudo. Usuń, jeśli nie.
PS - To jest zmodyfikowana wersja rozwiązania, które znalazłem gdzie indziej. Myślę, że mógł pochodzić z StackOverflow, ale nie mogę znaleźć oryginalnego odwołania.
źródło