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?
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?
Respostas:
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 -C
comutador para compactar os dados que estão sendo transferidos.
-4
IPv4 é realmente relevante aqui?
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".
x2goserver
pacote 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?
~/.ssh/config
e usar o nome do host correto (encapsulado) na sua sessão do x2go.
.ssh/config
não é suficiente. Eu tenho a configuração para que ssh machineB
realmente seja executado através de um túnel, machineA
mas o x2go não parece vê-lo.
Tenho uma experiência muito melhor no uso de um ssh
tú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 v5
proxy:
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.
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.
Outra coisa que melhorará sua navegação pelo ssh é ativar o pipelining no Firefox. Abra about:confige mude network.http.pipeliningpara true.
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 (chacha20-poly1305@openssh.com) 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 aes128-gcm@openssh.com aes256-gcm@openssh.com chacha20-poly1305@openssh.com"
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: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
# 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.