tylko z SSH: dostęp do tunelu w odwrotnym kierunku za pośrednictwem proxy SOCKS ssh

15

Od czasu do czasu muszę się połączyć z serwerem, na którym dostęp jest mocno ograniczony.
Zapora DMZ zezwala tylko na przychodzące SSH.
Wychodzące połączenia HTTP są blokowane.

Szukam łatwego sposobu na tunelowanie dostępu do sieci poprzez moją sesję SSH, więc mogę zainstalować aktualizacje i oprogramowanie za pomocą yum / apt-get. Idealnie chciałbym uniknąć instalowania dodatkowego oprogramowania / usług w obszarze chronionym.

Co robisz w takiej sytuacji?

SSH ma -D <port>opcję proxy SOCKS. Ale niestety jest to tylko jedna droga od klienta do serwera i nie ma opcji odwrotnej.

Kaii
źródło

Odpowiedzi:

26

W końcu udało mi się to osiągnąć sshtylko:

  1. uruchom lokalny serwer proxy SOCKS na komputerze klienckim (używając ssh -D)
  2. połącz się ze zdalnym serwerem i skonfiguruj zwrotne przekazywanie portów ( ssh -R) do lokalnego proxy SOCKS
  3. skonfiguruj oprogramowanie serwera, aby korzystało z przekazanego proxy

1. Uruchom lokalne proxy proxy w tle

Połącz się z hostem lokalnym przez SSH i otwórz serwer proxy SOCKS na porcie 54321.

$ ssh -f -N -D 54321 localhost

-f uruchamia SSH w tle.

Uwaga: jeśli zamkniesz terminal, w którym uruchomiłeś polecenie, proces proxy zostanie zabity. Pamiętaj również, aby posprzątać po sobie, zamykając okno terminala po zakończeniu lub zabijając samemu proces!

2. połącz się ze zdalnym serwerem i skonfiguruj odwrotne przekierowanie portów

Powiąż zdalny port 6666 z lokalnym portem 54321. Dzięki temu lokalny serwer proxy skarpet będzie dostępny dla zdalnej witryny na porcie 6666.

$ ssh root@target -R6666:localhost:54321

3. skonfiguruj oprogramowanie serwera, aby korzystało z przekazanego proxy

Wystarczy skonfigurować yum, apt, curl, wget lub inne narzędzie obsługujące SOCKS do korzystania z proxy 127.0.0.1:6666.

Voilá! Miłego tunelowania!


4. opcjonalnie: skonfiguruj oprogramowanie serwera, aby korzystało z przekazywanego proxy

Przekonałem się, że instalacja proxychainsna serwerze docelowym znacznie ułatwia.

Umożliwia dowolnemu oprogramowaniu korzystanie z proxy SOCKS (nawet telnet), poprzez zastosowanie LD_PRELOADsztuczki przekierowującej żądania TCP i DNS z dowolnych poleceń do proxy.

Skonfiguruj /etc/proxychains.confserwer proxy do przesyłania dalej:

[ProxyList]
# SSH reverse proxy
socks5  127.0.0.1 6666

Tunelowe narzędzia arbitralne (wykorzystujące TCP) z proxychains:

$ proxychains telnet google.com 80
$ proxychains yum update
$ proxychains apt-get update
Kaii
źródło
3

Nowsze wersje SSH pozwalają na użycie bardzo prostej opcji ssh-R <[bind_address:]port>. Użycie tylko portu na hoście i być może adresu powiązania, ale nieokreślenie portu po stronie klienta spowoduje utworzenie odwrotnego proxy SOCKS.

Jest to również stwierdzone na stronach podręcznika nowszych wersji SSH:

[...] jeśli nie określono wyraźnego miejsca docelowego, ssh będzie działać jako serwer proxy SOCKS 4/5 i przekaże połączenia do miejsc docelowych żądanych przez zdalnego klienta SOCKS.

Możesz to sprawdzić za pomocą curl łączącego się z prostym interfejsem API „daj mi moje IP”, takim jak http://ifconfig.io .

$ curl ifconfig.io

vs

$ curl --socks5 localhost:<PORT> ifconfig.io

Richard Metzler
źródło
2
Przydałoby się wspomnieć, w którym numerze wersji wprowadzono tę funkcję.
kasperd
o wiele prostsze, dzięki!
Kaii,
1
@kasperd: OpenSSH 7.6 , wydany 03.10.2017. Sprawdź trzeci punkt w sekcji Nowe funkcje
MestreLion