Как включить пересылку SSH X11 через дополнительный сервер?

33

У меня есть хосты A, B и C. С хоста AI можно получить доступ только через ssh B. Из BI можно получить доступ к C. Я хочу иметь возможность запускать программы X11 на C и перенаправлять отображение на A.

Я попробовал это:

A $ ssh -XB
B $ ssh -XC
C $ xclock
Ошибка: не удается открыть дисплей:

Но это не работает.

lexsys
источник

Ответы:

25

Есть несколько способов сделать это, один из которых я предпочитаю, это переслать порт ssh:

Сначала подключитесь к машине B и перешлите [localPort] на C: с 22 по B

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

Затем подключитесь к C из A через этот вновь созданный туннель, используя [localPort], перенаправив X11

A$ ssh -X -p [localPort] localhost

Теперь мы можем запускать программы X11 на C и отображать их на A

C$ xclock

[localPort] может быть любым портом, который вы еще не прослушиваете на A, я часто использую 2222 для простоты.

Дейв
источник
3
не совсем ... если X11Forwarding не включен на сервере C, он не будет работать. это также не будет работать, если не установить AllowTcpForwarding yes и GatewayPorts yes на сервере B. этот ответ вообще не приемлем
asdmin
Вы делаете хорошее замечание, я не заметил этого, так как я использую debian, для которого X11Forwarding и AllowTcpForwarding включены по умолчанию. GatewayPorts не нужен, поскольку, когда он отключен, SSH все еще прослушивает localhost, и именно к этому мы подключаемся. Он понадобится вам только в том случае, если вы захотите установить второе соединение через внешний IP-адрес для машины A.
Дейв
На шаге 1 он не спрашивал у меня пароль для хоста B, и в итоге я подключился к хосту C. В другом окне я попытался выполнить шаг 2, и я получил «ssh_exchange_identification: Соединение закрыто удаленным хостом».
MSB
ssh: подключиться к хосту ... порт 22: соединение не выполнено при выполнении первой команды
Rodrigo
7

Это легко сделать с помощью переадресации портов:

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

Порт localhost: 2022 перенаправляется на C: 22 через B SSH на C через localhost: 2022 Используйте X как обычно

AgentK
источник
2
Это не будет работать по тем же причинам, что и в других случаях, если в B (шлюзе) не включены правильные параметры пересылки sshd.
g33kz0r
не спрашивал мой пароль для хоста B, что странно; и это не сработало, я получил сообщение об ошибке «канал 2: открыть не удалось: административно запрещено: открыть не удалось ssh_exchange_identification: соединение закрыто удаленным хостом»
msb
4

Предполагая, что проблема заключается в том, что на средней машине нет X, но в остальном он настроен на пересылку X11, просто установите xauth.

в системе на основе yum (fedora, redhat, centos):

B$ sudo yum install xauth

в системе на основе apt (debian, ubuntu):

B$ sudo apt-get install xauth
Jayen
источник
Yay- идеально подходит для малины без головы.
CMC
@cmc или используя ssh как vpn.
Jayen
@cmc у тебя есть yumпи?
Jayen
nope- sudo apt-get install xauth
cmc
3

Для новых версий opensshd вы должны отключить, X11UseLocalhostчтобы это работало.

Вам нужно сделать это на хосте C /etc/ssh/sshd_configи перезапустить sshd, чтобы это работало:

X11Forwarding yes
X11UseLocalhost no
Брэд Эллисон
источник
2

Вы не можете переслать отображение X11, если у вас отключен X11Forwarding в любом используемом sshd.

man sshd_config:

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

Вы должны убедиться, что X11Forwarding включен в пункте назначения и во всех промежуточных sshds, которые вы используете.

Небольшая подсказка: вы должны попытаться использовать VNC, переадресация дисплея X11 требует довольно большой полосы пропускания.

asdmin
источник
Предложения @ AgentK и @ dave требуют только включения X11Forwarding на конечном хосте, поскольку они используют туннель SSH для обхода промежуточного хоста. Ваше предположение почти наверняка является причиной того, почему метод ОП сначала не удался, но это не означает, что ответы других людей «неприемлемы»
Даниэль Лоусон,
их ответы были неполноценными и исправили проблему, а не решили ее. правильный и полезный ответ будет рассматривать исходный вопрос и решать его, а также предоставлять другие способы только в том случае, если вопрос об оригиналах не решаем. кстати, ни один из них не упомянул X11Forwarding, что очень важно
asdmin
В некоторых системах по умолчанию используется значение " yes".
Брэд Гилберт
Я проверил, что X11Forwarding включен на B и C, а AllowTcpForwarding установлен на yes на B. Но результат моих команд тот же. И ответ Дейва прекрасно работает для меня.
lexsys
затем сделайте это, но это только лекарство. вы также можете запустить ssh с параметром -v или попробовать echo $ DISPLAY всех вложенных команд ssh, чтобы узнать, где теряется $ DISPLAY
asdmin
2

Если вы часто переходите от A к C, вы можете настроить B как прокси:

A:~/.ssh/config:

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

тогда это просто

A$ ssh C xclock
Jayen
источник
1

Вы пробовали с

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

Флаг -Y «Включает доверенную пересылку X11».

Пайхимис
источник
Тот же результат.
lexsys
Это сработало для меня, но только для того, чтобы узнать, насколько медленный X11
Rodrigo