O encaminhamento SSH X11 não funciona. Por quê?

1

Esta é uma questão de depuração. Quando você pedir esclarecimentos, certifique-se de que eles não estejam cobertos abaixo.

Eu tenho 4 máquinas: Z, A, N e M.

Para chegar a A você precisa entrar no Z primeiro.

Para chegar ao M, você precisa entrar no N primeiro.

Os seguintes trabalhos:

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

Mas isso não acontece:

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

O $ DISPLAY claramente não está definido ao fazer login no M. A pergunta é por quê?

Z e A compartilham o mesmo NFS-homedir. N e M compartilham o mesmo NFS-homedir. O sshd de N é executado em uma porta não padrão.

$ 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 e M:/etc/ssh/ssh_config == A:/etc/ssh/ssh_config

/etc/ssh/sshd_config é o mesmo para todas as 4 máquinas (além das permissões de porta e login para determinados grupos).

Se eu encaminhar a porta ssh de M para minha máquina local, ainda assim não funcionará:

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

A: .Xauthority contém A, mas M: .Xauthority não contém M.

xauth está instalado em /usr/bin/xauth em A e M.

xauth está sendo executado ao fazer login no A, mas não ao efetuar login no M.

ssh -vvv não reclama de X11 ou xauth ao fazer login em A e M. Ambos dizem:

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.

Tenho a sensação de que o problema pode estar relacionado a M em falta em M: .Xauthority (causado por xauth não ser executado) ou que $ DISPLAY está de alguma forma sendo desativado por um script de login, mas não consigo descobrir o que é errado.

- atualização 20110628

Eu não sabia sobre sshrc , então foi um bom palpite. Mas, infelizmente, não o problema aqui. Não existe em nenhuma das 4 máquinas:

$ 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

Como mencionado, a variável $ DISPLAY não está definida em M, mas está bem em A:

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

A diferença na saída de uma sessão de trabalho e de uma sessão que não está funcionando (Observação: não há avisos sobre o encaminhamento do X ou o xauth na sessão que não está funcionando):

$ 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

A instalação de lsh-server em vez de openssh-server em M corrige o encaminhamento de X, mas é uma solução inaceitável.

    
por Ole Tange 27.06.2011 / 18:02

2 respostas

2

Você não especifica se X11Forwarding está definido como yes em /etc/ssh/sshd_config em M, o que definitivamente explica por que não está funcionando.

    
por 27.06.2011 / 20:04
0

No meu caso, a diretiva padrão do firewall foi definida como "DROP".

Você precisa verificar qual porta está sendo ouvida (geralmente é 6000 + valor na variável de ambiente $ DISPLAY) e definir regras adequadas. Executar como 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
    
por 30.11.2014 / 02:08