Por que o Firefox é tão lento com o SSH?

39

Eu tento iniciar o Firefox sobre SSH, usando

ssh -X user@hostname

e depois

firefox -no-remote

mas é muito, muito lento.

Como posso consertar isso? É um problema de conexão?

DevOps85
fonte
3
A menos que você tenha um nível incrivelmente alto de criptografia ou o servidor no qual você está transferindo uma carga alta, provavelmente não é a parte ssh da equação. Geralmente, é um problema de largura de banda e / ou latência.
Bratchley
11
Dê uma olhada nisto: stackoverflow.com/q/12977879/252489
Gowtham
@ Gowtham para que eu possa usar: ssh -X -C user @ hostname?
DevOps85 #

Respostas:

25

As configurações padrão do ssh criam uma conexão bastante lenta. Tente o seguinte:

ssh -YC4c arcfour,blowfish-cbc user@hostname firefox -no-remote

As opções usadas são:

-Y      Enables trusted X11 forwarding.  Trusted X11 forwardings are not
         subjected to the X11 SECURITY extension controls.
 -C      Requests compression of all data (including stdin, stdout,
         stderr, and data for forwarded X11 and TCP connections).  The
         compression algorithm is the same used by gzip(1), and the
         “level” can be controlled by the CompressionLevel option for pro‐
         tocol version 1.  Compression is desirable on modem lines and
         other slow connections, but will only slow down things on fast
         networks.  The default value can be set on a host-by-host basis
         in the configuration files; see the Compression option.
 -4      Forces ssh to use IPv4 addresses only.
 -c cipher_spec
         Selects the cipher specification for encrypting the session.

         For protocol version 2, cipher_spec is a comma-separated list of
         ciphers listed in order of preference.  See the Ciphers keyword
         in ssh_config(5) for more information.

O ponto principal aqui é usar um codificador de criptografia diferente, neste caso o arco é quatro mais rápido que o padrão e compactar os dados que estão sendo transferidos.


NOTA: Estou muito, muito longe de ser um especialista nisso. O comando acima é o que eu uso depois de encontrá-lo em um post de blog em algum lugar e notei uma enorme melhoria na velocidade. Estou certo de que os vários comentadores abaixo sabem do que estão falando e que esses códigos de criptografia podem não ser os melhores. É muito provável que o único trecho dessa resposta realmente relevante seja o uso do -Ccomutador para compactar os dados que estão sendo transferidos.

terdon
fonte
11
Na verdade, alterando as configurações de criptografia, você pode melhorar a taxa de transferência da conexão, mas isso quase não terá influência sobre a latência, que é o que torna a conexão X-over-ssh tão lenta ... Ou dito o contrário: você pode conseguir transferir um arquivo mais rápido, mas o tempo necessário para iniciar a transferência não será alterado (quase). Esse é o problema do protocolo X, que envolve muitas mensagens e reconhecimentos entre o cliente e o servidor; portanto, na Internet, a latência de poucos milissegundos se multiplica muitas vezes até que você possa ver um botão alterar seu status, por exemplo.
Ariel
8
O -4IPv4 é realmente relevante aqui?
Cornstalks
6
A cifra do `arcfour" está obsoleta, btw.
Reinstate Monica - M. Schröder
5
A compressão ajuda, mas não faz milagres. O Firefox é muito exigente. É improvável que alterar a cifra faça a diferença, a menos que um dos lados seja muito limitado no tempo da CPU: com dispositivos de ponta, como smartphones e PCs, o tempo de criptografia / descriptografia é insignificante em comparação à latência e largura de banda da rede.
Gilles 'SO- stop be evil'
6
As cifras sugeridas são o errado caminho a percorrer. Como Gilles diz, a maioria dos dispositivos hoje em dia não terá nenhum problema com o AES-CTR padrão: é muito rápido, especialmente se o hardware usado tiver o conjunto de instruções AES. O RC4 é fraco e está sendo eliminado gradualmente pela rede, e o Blowfish-CBC pode não ser necessariamente mais rápido que o AES-CTR.
Reid
32

Um dos maiores problemas ao iniciar remotamente um cliente X é o protocolo X, não tanto a sobrecarga do ssh! O protocolo X requer muito pingue-pongue entre o cliente e o servidor, o que mata absolutamente o desempenho no caso de aplicativos remotos.

Tente algo como "x2go" (que também passa por cima do ssh com as configurações padrão) e você perceberá que o firefox "voa" em comparação!

Várias distribuições fornecem os pacotes x2go prontos para uso, por exemplo, teste Debian ou no Stable-Backports. Mas se não, consulte http://wiki.x2go.org/doku.php/download:start , eles fornecem pacotes / repositórios binários pré-criados para muitas distribuições. Você deve instalar o x2goclient (no computador em que deseja 'usar' o firefox) e o x2goserver (no computador em que o firefox deve estar em execução); em seguida, você pode configurar suas sessões para aplicativos X únicos para obter visualizações completas da área de trabalho, etc. A própria conexão acontece sobre ssh. É uma ferramenta realmente maravilhosa :)

Para usá-lo, você executa "x2goclient", inicia uma GUI na qual é possível criar uma nova sessão: você fornece o nome DNS do servidor, porta, dados ssh, etc. e depois seleciona o "tipo de sessão", ou seja, se você quer uma área de trabalho remota completa do KDE ou GNOME, por exemplo, ou apenas um "aplicativo único" e aí você digita "firefox".

Ariel
fonte
11
como posso experimentar o x2go? o comando
DevOps85 28/02
3
Parece não haver x2goserverpacote no Debian (ou Ubuntu). Além disso, isso pode ser configurado para permitir o tunelamento? Por exemplo, eu uso o machineX, mas só posso usá-lo através do machineY. O x2go poderia lidar com isso?
terdon
@terdon você está certo, eu verifiquei apenas o cliente. Mas você pode simplesmente adicionar o repositório x2go (veja o link wiki.x2go.org/doku.php/download:start ) e o servidor está lá. Não sei por que apenas o cliente está no Debian. Tunelamento: com certeza é possível, mas nunca tentei. Eu espero que seja suficiente configurar apenas o ssh ~/.ssh/confige usar o nome do host correto (encapsulado) na sua sessão do x2go.
Ariel
@terdon: existe uma opção "Usar servidor proxy para conexão SSH" (ssh / http) na configuração da sessão do x2go. Então, isso deve fazer o truque também!
Ariel
Isso parece interessante, vou brincar um pouco mais. Até agora, posso confirmar que a configuração do túnel .ssh/confignão é suficiente. Eu tenho a configuração para que ssh machineBrealmente seja executado através de um túnel, machineAmas o x2go não parece vê-lo.
terdon
17

Tenho uma experiência muito melhor no uso de um sshtúnel para rotear o tráfego através de outra máquina. É muito fácil de configurar, pois você tem acesso ssh de qualquer maneira. Em um terminal no seu computador, digite

ssh -vv -ND 8080 user@yourserver

Mantenha essa janela aberta e observe-a entregar algumas mensagens detalhadas sobre os dados que fluem pelo túnel.

Em firefox, vá para Preferências -> Avançado -> Rede -> Conexão: Configurações.

Selecione Configuração manual do proxy e adicione um SOCKS v5proxy:

 SOCKS Host:   localhost    Port 8080

Verifique seu novo IP navegando para, por exemplo, http://whatismyipaddress.com/ .

Você pode usar um complemento do firefox como proxy foxy para alternar dinamicamente os proxies.

Sebastian
fonte
Upvoted, esta uma alternativa muito válida para utilizar a compressão baseada em NX (X2Go etc), muito mais útil do que mexer com configurações de criptografia ssh :)
Ariel
Eu sempre usei o ssh -L 8080: localhost: 8080, mas gostei da opção -ND, mas não sei por que você usou o Dinamic ou Remote ou Listen. A propósito, usar proxy é muito melhor que usar -X, mas acho que a melhor maneira é usar o VNC se você precisar de mais programas X e não apenas do Firefox.
Erm3nda
fácil de configurar e funciona com eficiência!
david.perez 22/02
2

O Firefox é tão lento quanto o SSH porque as versões mais recentes do firefox permitem várias instâncias. Se você tiver problemas de largura de banda, use um navegador leve como o dillo e você nem notará a velocidade da conexão.

Florence Taylor
fonte
Esta resposta é de uma postagem no fórum ArchLinux .
Andrew T.
11
isso não tem nada a ver com a questão - a questão não é o navegador, mas o protocolo remoto X11
João Antunes
0

Outra coisa que melhorará sua navegação pelo ssh é ativar o pipelining no Firefox. Abra about:confige mude network.http.pipeliningpara true.

Tanath
fonte
Essa opção deve acelerar o carregamento de páginas da Web, mas não tem nenhuma relação com o fato de o navegador estar executando sobre um túnel SSH ou não. De qualquer forma, cuidado com o "mas é" quando você toca opções avançadas ... ver kb.mozillazine.org/Network.http.pipelining
Ariel
Na minha experiência, navegar pelo ssh fica lento e as solicitações de pipelining são uma grande ajuda, pois, caso contrário, qualquer solicitação precisa esperar pelas anteriores, que podem ou não ser concluídas em tempo hábil, se houver. Eu também combino isso com a multiplexação ssh. Faz uma diferença notável. Desligar o oleoduto volta a ser insuportavelmente lento no meu caso.
Tanath
0

Você precisa experimentar para ver o que ajuda com seus gargalos específicos.

Para mim, ativar a compactação ( -C) melhorou a capacidade de resposta de lag inutilizável a apenas perceptível.

A escolha da cifra também pode ter um impacto, ao contrário do que algumas pessoas disseram. Você pode encontrar pessoas que compartilham referências on-line, mas não presuma que seus resultados serão os mesmos. Qual cifra é melhor para você depende do hardware. Para mim, minha cifra padrão ([email protected]) já estava vinculada à mais rápida.

Escrevi um roteiro rápido para comparar cifras relevantes sob condições um pouco realistas. Explicações nos comentários:

#!/usr/bin/bash

# Ciphers available to you depends on the intersection of ciphers compiled 
# into your client and the ciphers compiled into your host.
# Should be manually copied from "Ciphers:" section in your `man ssh_config`
# The script will try all ciphers specified here and will gracefully skip
# ciphers unavailable in the host.
#ciphers=""
# Example:
ciphers="3des-cbc aes128-cbc aes192-cbc aes256-cbc aes128-ctr aes192-ctr aes256-ctr [email protected] [email protected] [email protected]"

tmp_file=tmp.bin

# Recommend to use an identity file without a passphrase.
# That way you won't have to retype the password at each iteration.
ssh_identity_file=~/.ssh/tmp_id_no_passphrase

ssh_host="user@host"

# Size of test file, before encryption.
test_file_size_megabytes=8

# Only create test file if it doesn't yet exists.
# Doesn't check if relevant variables changed, so you'll have to delete
# the $tmp_file to regenerate it.
if test ! -f $tmp_file; then
  echo "Creating random data file" \
    "(size $test_file_size_megabytes MB): $tmp_file"

  # Not the same format as the ssh ciphers.
  # Can be left as is, unless this cipher is not supported by your openssl.
  tmp_file_cipher=aes-128-cbc

  # The purpose of encrypting the $tmp_file is to make it uncompressable.
  # I do not know if that is a concern in this scenario,
  # but better safe than sorry.

  dd if=/dev/zero bs=1M count=$test_file_size_megabytes \
    | openssl enc -$tmp_file_cipher -pass pass:123 \
    > $tmp_file
fi

for cipher in $ciphers ; do
  # Benchmark each $cipher multiple times
  for i in 1 2 3 ; do
    echo
    echo "Cipher: $cipher (try $i)"
    # Time piping the $tmp_file via SSH to $ssh_host using $cipher.
    # At destination received data is discarded.
    cat $tmp_file \
      | /usr/bin/time -p \
      ssh -i $ssh_identity_file -c "$cipher" $ssh_host 'cat > /dev/null'
  done
done

# Sample output:

# Creating random data file (size 8 MB): tmp.bin
# *** WARNING : deprecated key derivation used.                                   Using -iter or -pbkdf2 would be better.                                         8+0 records in
# 8+0 records out
# 8388608 bytes (8.4 MB, 8.0 MiB) copied, 0.0567188 s, 148 MB/s

## [redacted]

# Cipher: aes256-cbc (try 3)
# Unable to negotiate with 192.168.99.99 port 22: no matching cipher found. Their offer: [email protected],aes128-ctr,aes192-ctr,aes256-ctr,[email protected],[email protected]
# real 0.12
# user 0.03
# sys 0.03

# Cipher: aes128-ctr (try 1)
# real 9.68
# user 0.28
# sys 0.51

# Cipher: aes128-ctr (try 2)
# real 10.85
# user 0.26
# sys 0.29

## [redacted]

Você pode optar por testar com uma conexão SSH em que o cliente e o host são a mesma máquina ou em um cenário mais realista, em que o host é a máquina da qual você está encaminhando o X11, o que deve ser mais útil, porque o desempenho não depende apenas da decifração do desempenho do cliente, mas também do host.

Testar com uma máquina remota pode ter a desvantagem de introduzir ruído se a taxa de transferência da sua conexão à Internet mudar no decorrer do benchmark. Nesse caso, convém aumentar o número de vezes que cada cifra é testada.

Dominykas Mostauskis
fonte