Переадресация SSH X11 не работает. Зачем?

Это вопрос отладки. Когда вы просите разъяснений, пожалуйста, убедитесь, что они еще не охвачены ниже.

У меня есть 4 машины: Z, A, N и M.

Чтобы добраться до A, сначала нужно войти в Z.

Чтобы попасть в M, сначала нужно войти в N.

Следующие работы:

ssh -X Z xclock
ssh -X Z ssh -X Z xclock
ssh -X Z ssh -X A xclock
ssh -X N xclock
ssh -X N ssh -X N xclock

Но это не так:

ssh -X N ssh -X M xclock
Error: Can't open display: 

$DISPLAY явно не установлен при входе в M. Вопрос в том, почему?

Z и A совместно используют один и тот же NFS-homedir. N и M используют один и тот же NFS-homedir. N's sshd работает на нестандартном порту.

$ grep X11 <(ssh Z cat /etc/ssh/ssh_config) 
ForwardX11 yes
# ForwardX11Trusted yes

$ grep X11 <(ssh N cat /etc/ssh/ssh_config) 
ForwardX11 yes
# ForwardX11Trusted yes

N:/etc/ssh/ssh_config == Z:/etc/ssh/ssh_config а такжеM:/etc/ssh/ssh_config == A:/etc/ssh/ssh_config

/etc/ssh/sshd_config одинаково для всех 4 машин (кроме прав доступа к портам и входам для определенных групп).

Если я перенаправлю ssh порт M на мою локальную машину, он все равно не будет работать:

terminal1$ ssh -L 8888:M:22 N
terminal2$ ssh -X -p 8888 localhost xclock
Error: Can't open display:

A:. Xauthority содержит A, но M:.Xauthority не содержит M.

xauth установлен в /usr/bin/xauth как на А, так и на М.

xauth выполняется при входе в A, но не при входе в M.

ssh -vvv не жалуется на X11 или xauth при входе в A и M. Оба говорят:

debug2: x11_get_proto: /usr/bin/xauth  list :0 2>/dev/null
debug1: Requesting X11 forwarding with authentication spoofing.
debug2: channel 0: request x11-req confirm 0
debug2: client_session2_setup: id 0
debug2: channel 0: request pty-req confirm 1
debug1: Sending environment.

У меня есть ощущение, что проблема может быть связана с отсутствием M в M:.Xauthority (вызвано xauth не запускается) или что $DISPLAY каким-то образом отключен сценарием входа в систему, но я не могу понять, что не так.

- обновление 20110628

Я не знал о sshrc так что это было хорошее предположение. Но, увы, проблема не здесь. Он не существует ни на одной из 4 машин:

$ ls ~/.ssh/rc /etc/ssh/sshrc
ls: cannot access /home/tange/.ssh/rc: No such file or directory
ls: cannot access /etc/ssh/sshrc: No such file or directory

Как уже упоминалось, переменная $DISPLAY не установлена ​​на M, но подходит для A:

$ ssh -X N ssh -X M 'echo \$DISPLAY'
<<empty>>
$ ssh -X Z ssh -X A 'echo \$DISPLAY'
localhost:14.0

Разница в выходных данных из рабочего сеанса и нерабочего сеанса (Примечание. В нерабочем сеансе нет предупреждений о переадресации X или xauth):

$ stdout ssh -X Z ssh -vX A 'echo \$DISPLAY' >/tmp/a
$ stdout ssh -X N ssh -vX M 'echo \$DISPLAY' >/tmp/b
$ diff /tmp/a /tmp/b
4c4
< debug1: Connecting to A [1.1.1.5] port 22.
---
> debug1: Connecting to M [1.1.3.3] port 22.
23,24c23,24
< debug1: Host 'A' is known and matches the RSA host key.
< debug1: Found key in /home/tange/.ssh/known_hosts:35
---
> debug1: Host 'M' is known and matches the RSA host key.
> debug1: Found key in /home/tange/.ssh/known_hosts:1
43d42
< debug1: Sending env LC_ALL = en_US.UTF-8
46c45
< localhost:14.0
---
> 
53,54c52,53
< Transferred: sent 2384, received 2312 bytes, in 0.2 seconds
< Bytes per second: sent 10714.8, received 10391.2
---
> Transferred: sent 2336, received 2296 bytes, in 0.0 seconds
> Bytes per second: sent 54629.1, received 53693.7

УСТАНОВКА ОБЪЕКТИВА lsh-server вместо openssh-server на М исправляет X-forwarding, но является неприемлемым решением.

2 ответа

Решение

Вы не указываете, если X11Forwarding установлен в yes в /etc/ssh/sshd_config на М, что определенно объясняет, почему это не работает.

В моем случае это была политика брандмауэра по умолчанию, которая была установлена ​​на "DROP".

Вам нужно проверить, какой порт прослушивается (обычно это значение 6000 + в переменной окружения $DISPLAY) и установить правильные правила. Запустите с правами root:

# echo $DISPLAY
localhost:10.0

# netstat -altnp | grep LIST          
tcp        0      0 127.0.0.1:6010              0.0.0.0:*                   LISTEN      13670/sshd

# iptables -A INPUT -i lo -p tcp -m tcp --dport 6010 -j ACCEPT 
# iptables -A INPUT -i lo -p tcp -m tcp --sport 6010 -j ACCEPT
# iptables -A OUTPUT -o lo -p tcp -m tcp --dport 6010 -j ACCEPT 
# iptables -A OUTPUT -o lo -p tcp -m tcp --sport 6010 -j ACCEPT
Другие вопросы по тегам