Dlaczego Firefox jest tak wolny od SSH?

39

Próbuję uruchomić Firefoksa przez SSH, używając

ssh -X user@hostname

i wtedy

firefox -no-remote

ale jest bardzo, bardzo wolny.

Jak mogę to naprawić? Czy to problem z połączeniem?

DevOps85
źródło
3
Jeśli nie masz niewiarygodnie wysokiego poziomu szyfrowania lub serwer, na którym ssh'ing ma duże obciążenie, prawdopodobnie nie jest to część ssh równania. Zazwyczaj jest to problem z przepustowością i / lub opóźnieniami.
Bratchley,
1
Spójrz na to: stackoverflow.com/q/12977879/252489
Gowtham
@Gowtham, więc mogę użyć: ssh -X -C użytkownik @ nazwa hosta?
DevOps85

Odpowiedzi:

25

Domyślne ustawienia ssh sprawiają, że połączenie jest dość wolne. Zamiast tego spróbuj wykonać następujące czynności:

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

Dostępne opcje to:

-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.

Najważniejsze jest tutaj użycie innego szyfru szyfrującego, w tym przypadku arcfour, który jest szybszy niż domyślny, i kompresowanie przesyłanych danych.


UWAGA: Jestem bardzo, bardzo daleki od eksperta w tej dziedzinie. Powyższe polecenie jest tym, którego używam po znalezieniu go gdzieś na blogu i zauważyłem ogromną poprawę prędkości. Jestem pewien, że różni komentatorzy poniżej wiedzą, o czym mówią, i że te szyfry szyfrujące mogą nie być najlepsze. Jest bardzo prawdopodobne, że jedyną naprawdę istotną częścią tej odpowiedzi jest użycie -Cprzełącznika do kompresji przesyłanych danych.

terdon
źródło
11
Właściwie zmieniając ustawienia szyfrowania, możesz poprawić przepustowość połączenia, ale to nie będzie miało prawie żadnego wpływu na opóźnienie, co powoduje, że połączenie X-over-ssh jest tak wolne ... Lub mówiąc inaczej: możesz osiągnąć transfer plik szybciej, ale czas potrzebny na rozpoczęcie przesyłania nie zmieni się (prawie). Taki jest problem protokołu X, wymaga on wielu komunikatów i potwierdzeń między klientem a serwerem, więc przez Internet opóźnienie kilku milisekund jest mnożone wiele razy, aż na przykład zobaczysz przycisk zmieniający swój status.
Ariel
8
Czy -4(IPv4) jest tutaj naprawdę istotne?
Cornstalks
6
Szyfr „arcfour” jest przestarzały, btw.
Przywróć Monikę - M. Schröder
5
Kompresja pomaga, ale nie czyni cudów. Firefox jest bardzo wymagający. Zmiana szyfru raczej nie zrobi różnicy, chyba że jedna ze stron jest bardzo bardzo ograniczona w czasie procesora: w przypadku urządzeń wysokiej klasy, takich jak smartfony i komputery, czas szyfrowania / deszyfrowania jest nieznaczny w porównaniu z opóźnieniem sieci i przepustowością.
Gilles „SO- przestań być zły”
6
Sugerowane szyfry to zła droga. Jak mówi Gilles, większość urządzeń w dzisiejszych czasach nie będzie miała żadnego problemu z domyślnym AES-CTR: jest bardzo szybki, szczególnie jeśli używany sprzęt ma zestaw instrukcji AES. RC4 jest słaby i jest stopniowo wycofywany z sieci, a Blowfish-CBC niekoniecznie musi być szybszy niż AES-CTR.
Reid
32

Jednym z największych problemów podczas zdalnego uruchamiania niektórych klientów X jest protokół X, a nie narzut ssh! Protokół X wymaga dużo ping-ponga między klientem a serwerem, co absolutnie obniża wydajność w przypadku aplikacji zdalnych.

Wypróbuj coś takiego jak „x2go” (który również przechodzi przez ssh z domyślnymi ustawieniami), aby zauważyć, że firefox „lata” w porównaniu!

Kilka dystrybucji dostarcza pakiety x2go od razu po wyjęciu z pudełka, na przykład testowanie Debiana lub w Stable-Backports. Ale jeśli nie, zobacz http://wiki.x2go.org/doku.php/download:start , zapewniają one gotowe pakiety binarne / repozytoria dla wielu dystrybucji. Powinieneś zainstalować x2goclient (na komputerze, na którym chcesz „używać” firefox) i x2goserver (na komputerze, na którym powinien działać firefox), możesz następnie skonfigurować sesje dla pojedynczych aplikacji X dla pełnych widoków pulpitu itp. Samo połączenie dzieje się przez ssh. To naprawdę wspaniałe narzędzie :)

Aby go użyć, uruchamiasz „x2goclient”, uruchamia GUI, w którym możesz utworzyć nową sesję: podajesz nazwę dns serwera, port, dane ssh itp., A następnie wybierasz „typ sesji”, tj. Jeśli chcesz na przykład pełnego zdalnego pulpitu KDE lub GNOME, lub po prostu „pojedynczej aplikacji” i tam wpisz „firefox”.

Ariel
źródło
1
jak mogę wypróbować x2go? polecenie
DevOps85
3
Wydaje się, że nie ma x2goserverpakietu na Debianie (lub Ubuntu). Czy można to również skonfigurować, aby umożliwić tunelowanie? Na przykład używam machineX, ale mogę ssh tylko na maszynieY. Czy x2go sobie z tym poradzi?
terdon
@terdon masz rację, sprawdziłem tylko klienta. Ale możesz po prostu dodać repozytorium x2go (zobacz link wiki.x2go.org/doku.php/download:start ), a serwer już tam jest. Nie wiem, dlaczego tylko klient jest w Debianie. Tunelowanie: na pewno jest to możliwe, ale nigdy tego nie próbowałem. Spodziewałbym się, że wystarczy po prostu skonfigurować ssh ~/.ssh/configi użyć właściwej (tunelowanej) nazwy hosta w sesji x2go.
Ariel
@terdon: w konfiguracji sesji x2go dostępna jest opcja „Użyj serwera proxy do połączenia SSH” (ssh / http). To też powinno wystarczyć!
Ariel
To wydaje się interesujące, pobawię się nim jeszcze trochę. Do tej pory mogę potwierdzić, że konfiguracja tunelu .ssh/confignie wystarczy. Mam tę konfigurację, która ssh machineBfaktycznie biegnie przez tunel, machineAale x2go nie wydaje się tego widzieć.
terdon
17

Mam znacznie lepsze doświadczenie w używaniu sshtunelu do kierowania ruchem przez inną maszynę. Jest bardzo łatwy w konfiguracji, ponieważ i tak masz dostęp do ssh. W terminalu na komputerze wpisz

ssh -vv -ND 8080 user@yourserver

Pozostaw to okno otwarte i obserwuj, jak wyświetla pełne komunikaty o danych przepływających przez tunel.

W firefoxprzejdź do Preferencje -> Zaawansowane -> Sieć -> Połączenie: Ustawienia.

Wybierz Ręczna konfiguracja serwera proxy i dodaj SOCKS v5serwer proxy:

 SOCKS Host:   localhost    Port 8080

Sprawdź swój nowy adres IP, przechodząc do np . Http://whatismyipaddress.com/ .

Możesz użyć dodatku firefox, takiego jak proxy proxy, aby dynamicznie przełączać proxy.

Sebastian
źródło
Pozytywnie oceniany, jest to bardzo ważna alternatywa dla korzystania z kompresji opartej na NX (x2go itp.), O wiele bardziej przydatna niż majstrowanie przy ustawieniach szyfrowania ssh :)
Ariel
Użyłem zawsze ssh -L 8080: localhost: 8080, ale podobała mi się opcja -ND, ale nie jestem pewien, dlaczego zamiast tego użyłeś Dinamic, Remote lub Listen. Nawiasem mówiąc, używanie proxy jest znacznie lepsze niż użycie -X, ale myślę, że lepszym sposobem jest użycie VNC, jeśli potrzebujesz więcej programów X, a nie tylko Firefox.
erm3nda
łatwy w konfiguracji i działa skutecznie!
david.perez
2

Firefox jest tak powolny w stosunku do SSH, ponieważ nowsze wersje firefox pozwalają na wiele instancji. Jeśli masz problemy z przepustowością, użyj lekkiej przeglądarki, takiej jak dillo, a nawet nie zauważysz prędkości połączenia.

Florence Taylor
źródło
Ta odpowiedź pochodzi z postu na forum ArchLinux .
Andrew T.
1
nie ma to nic wspólnego z problemem - problemem nie jest przeglądarka, ale zdalny protokół X11
João Antunes
0

Kolejną rzeczą, która poprawi przeglądanie przez ssh, jest włączenie potokowania w Firefox. Otwórz about:configi zmień network.http.pipeliningna true.

Tanath
źródło
Ta opcja powinna przyspieszyć ładowanie stron internetowych, ale nie ma to żadnego związku z faktem, że przeglądarka działa w tunelu SSH, czy nie. W każdym razie, uważaj na „ale” po dotknięciu opcji zaawansowanych ... patrz kb.mozillazine.org/Network.http.pipelining
Ariel
Z mojego doświadczenia wynika, że ​​przeglądanie ssh staje się wolne, a żądania potokowe są dużą pomocą, ponieważ w przeciwnym razie każde żądanie musi czekać na poprzednie, które mogą, ale nie muszą zostać ukończone w odpowiednim czasie, jeśli w ogóle. Łączę to również z multipleksowaniem ssh. To robi zauważalną różnicę. Wyłączenie potokowania w moim przypadku powraca do nieznośnej powolności.
Tanath,
0

Musisz eksperymentować, aby zobaczyć, co pomaga w konkretnych wąskich gardłach.

Dla mnie włączenie kompresji ( -C) poprawiło czas reakcji z bezużytecznego na po prostu zauważalne opóźnienie.

Wybór szyfru może również mieć wpływ, w przeciwieństwie do tego, co niektórzy mówią. Możesz znaleźć osoby udostępniające testy porównawcze online, ale nie zakładaj, że Twoje wyniki będą takie same. To, który szyfr jest dla Ciebie najlepszy, zależy od sprzętu. Dla mnie mój domyślny szyfr ([email protected]) był już powiązany z najszybszym.

Napisałem krótki skrypt, aby porównać odpowiednie szyfry w nieco realistycznych warunkach. Objaśnienia w komentarzach:

#!/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]

Możesz wybrać test z połączeniem SSH, w którym klient i host są tą samą maszyną, lub możesz przetestować w bardziej realistycznym scenariuszu, w którym host jest maszyną, z której wykonujesz przekazywanie X11, co powinno być bardziej przydatne, ponieważ wydajność zależy nie tylko od odszyfrowania wydajności klienta, ale także od hosta.

Testowanie na zdalnej maszynie może mieć tę wadę, że powoduje zakłócenia, jeśli przepustowość połączenia internetowego zmienia się w trakcie testu porównawczego. W takim przypadku może być konieczne zwiększenie liczby testów każdego szyfru.

Dominykas Mostauskis
źródło