Jak włączyć przekazywanie SSH X11 przez dodatkowy serwer?

33

Mam hosty A, B i C. Z hosta AI może uzyskać dostęp tylko przez ssh B. Z BI może uzyskać dostęp do C. Chcę mieć możliwość uruchamiania programów X11 na C i przesyłania dalej do A.

Próbowałem tego:

$ Ssh -XB
B $ ssh -XC
C $ xclock
Błąd: Nie można otworzyć wyświetlacza:

Ale to nie działa.

Lexsys
źródło

Odpowiedzi:

25

Można to zrobić na kilka sposobów, preferuję przekazywanie portu ssh:

Najpierw połącz się z maszyną B i przekaż [localPort] do C: 22 przez B

A$ ssh -L [localPort]:C:22 B

Następnie połącz się z C z A przez ten nowo utworzony tunel przy użyciu [localPort], przekazując X11

A$ ssh -X -p [localPort] localhost

Teraz możemy uruchamiać programy X11 na C i wyświetlać je na A

C$ xclock

[localPort] może być dowolnym portem, którego jeszcze nie słuchasz na A, często używam 2222 dla uproszczenia.

Dave
źródło
3
nie do końca ... jeśli X11 Forwarding nie jest włączony na serwerze C, nie będzie działać. to też nie będzie działać, chyba że ustawimy AllowTcpForwarding yes i GatewayPorts yes na serwerze B. ta odpowiedź jest w ogóle nie do przyjęcia
asdmin
Masz rację, nie zauważyłem tego, ponieważ używam debiana, na którym X11Forwarding i AllowTcpForwarding są domyślnie włączone. GatewayPorts nie jest potrzebny, ponieważ kiedy jest wyłączony, SSH nadal nasłuchuje na localhost i do tego się łączymy. Będziesz go potrzebować tylko wtedy, gdy będziesz chciał nawiązać drugie połączenie za pomocą zewnętrznego adresu IP dla maszyny A.
dave
W kroku 1 nie poprosił mnie o hasło do hosta B i ostatecznie połączyłem się z hostem C. W innym oknie wypróbowałem krok 2 i otrzymuję komunikat „ssh_exchange_identification: Połączenie zamknięte przez zdalny host”.
msb
ssh: connect to host ... port 22: Połączenie odrzucone podczas wykonywania pierwszego polecenia
Rodrigo
7

Można to łatwo osiągnąć za pomocą przekierowania portów:

A$ ssh -NL 2022:C:22 B &
A$ ssh -X -p 2022 localhost
C$ xclock

Port localhost: 2022 jest przekazywany do C: 22 przez B SSH do C przez localhost: 2022 Użyj X jak zwykle

AgentK
źródło
2
Nie zadziała to z tych samych powodów, które podano w innym miejscu, w przypadku gdy B (brama) nie ma włączonych prawidłowych opcji przekazywania sshd.
g33kz0r
nie poprosiłem o hasło do hosta B, co jest dziwne; i to nie zadziałało, dostałem komunikat o błędzie „kanał 2: otwarty nieudany: administracyjnie zabroniony: otwarty nieudany ssh_exchange_identification: Połączenie zamknięte przez zdalny host”
msb
4

Zakładając, że problem polega na tym, że środkowa maszyna nie ma X, ale skonfigurowana w inny sposób, aby umożliwić przekazywanie X11, wystarczy zainstalować xauth.

w systemie opartym na yumie (fedora, redhat, centos):

B$ sudo yum install xauth

w systemie opartym na apt (debian, ubuntu):

B$ sudo apt-get install xauth
Jayen
źródło
Yay - idealny do bezgłowego malinowego pi.
cmc
@cmc lub używając ssh jak VPN.
Jayen
@cmc masz yumna pi?
Jayen
nope- sudo apt-get install xauth
cmc
3

W przypadku nowszych wersji opensshd musisz wyłączyć, X11UseLocalhostaby to działało.

Musisz to zrobić na hoście C /etc/ssh/sshd_configi zrestartować sshd, aby to działało:

X11Forwarding yes
X11UseLocalhost no
Brad Allison
źródło
2

Nie możesz przekierować wyświetlacza X11, jeśli masz wyłączone X11 Forwarding w dowolnym używanym sshd.

man sshd_config:

X11Forwarding
  Specifies whether X11 forwarding is permitted. The argument must be “yes”
  or “no”.  The default is “no”.

Musisz upewnić się, że X11 Forwarding jest włączony w miejscu docelowym i wszystkich używanych pośrednich sshds.

Tylko mała wskazówka: powinieneś spróbować użyć VNC, przekierowanie wyświetlania X11 wymaga dość dużej przepustowości.

asdmin
źródło
Sugestie @ AgentK i @ dave wymagają tylko włączenia X11 Forwarding na ostatecznym hoście, ponieważ używają tunelu SSH do ominięcia hosta pośredniego. Twoja sugestia jest prawie na pewno dlaczego metoda PO zawiodła na początku, ale to nie znaczy, że odpowiedzi innych ludzi „są nie do przyjęcia”
Daniel Lawson,
ich odpowiedzi były wadliwe i rozwiązały problem, nie rozwiązując go. prawidłowa i użyteczna odpowiedź rozważyłaby pierwotne pytanie i rozwiązałaby je, i zapewniłaby inne sposoby tylko w przypadku, gdyby pytanie oryginalne nie było możliwe do rozwiązania. przy okazji, żadne z nich nie wspomniało o
X11 Forwarding
W niektórych systemach wartością domyślną jest „ yes”.
Brad Gilbert,
Sprawdziłem, czy X11 Forwarding jest włączony na B i C, a AllowTcp Forwarding jest ustawiony na yes na B. Ale rezultat moich poleceń jest taki sam. Odpowiedź Dave'a działa dla mnie dobrze.
lexsys
to zróbcie to, ale to tylko lekarstwo. możesz także uruchomić ssh z parametrem „-v” lub wypróbować echo $ DISPLAY wszystkich zagnieżdżonych poleceń ssh, aby dowiedzieć się, gdzie zgubi się $ DISPLAY
asdmin
2

Jeśli często przechodzisz z punktu A do C, możesz skonfigurować B jako serwer proxy:

A:~/.ssh/config:

Host C
  ForwardX11   yes
  ProxyCommand ssh -W %h:%p B

to po prostu:

A$ ssh C xclock
Jayen
źródło
1

Próbowałeś już z

A$ ssh -Y B
B$ ssh -Y C
C$ xlclock

Flaga -Y „Włącza zaufane przekazywanie X11”.

pyhimys
źródło
Ten sam wynik.
lexsys
To zadziałało dla mnie, ale tylko po to, aby odkryć, jak wolny jest X11
Rodrigo