Frage SSH-Tunneling ist schneller als OpenVPN, könnte es sein?


Logischerweise sollte VPN für das Tunneln schneller als SSH sein, weil:

  • Es läuft auf UDP und nicht auf TCP (also kein TCP über TCP)
  • Es hat Kompression

Heute habe ich jedoch die Redis-Replikation über beide Methoden getestet.
Ich führte den Test über eine AWS-VM in Irland durch und stellte eine Verbindung zu einer AWS-VM in den USA her.
Da mein Testfall die Redis-Replikation ist, habe ich genau das getestet - ich habe einen leeren Redis-Server ausgeführt, und nachdem das Laden beendet war, habe ich ausgeführt slaveof der andere Server, und die Zeit zwischen gemessen Connecting to MASTER und MASTER <-> SLAVE sync: Finished with success. Zwischendurch habe ich gebraucht

while 1; do redis-cli -p 7777 info | grep master_sync_left_bytes;sleep 1; done

Um eine grobe Schätzung der Geschwindigkeit zu erhalten.
SSH hat bei weitem gewonnen: ~ 11MB / s im Vergleich zu OpenVPNs ~ 2MB / s.
Bedeutet das, dass alles, was ich recherchiert habe, falsch war, oder habe ich mein Setup grob falsch konfiguriert?

Aktualisieren

Ich habe mehrere Tests mit demselben Datensatz durchgeführt und folgende Ergebnisse erhalten:

  • OpenVPN
    • TCP:
      Kompression: 15m
      keine Komprimierung: 21m
    • UDP:
      Kompression: 5m
      keine Komprimierung: 6m
  • SSH
    Standardeinstellungen: 1m50s
    keine Komprimierung: 1m30s
    Kompression: 2m30s

Update2

Hier sind die iperf Ergebnisse, mit bidirektionalen Tests (außer SSH, wo kein Rückweg verfügbar ist)

| method           | result (Mb/s)|
|------------------+--------------|
| ssh              | 91.1 / N.A   |
| vpn blowfish udp | 43 / 11      |
| vpn blowfish tcp | 13 / 12      |
| vpn AES udp      | 36 / 4       |
| vpn AES tcp      | 12 / 5       |

Technische Daten

Ich benutze CentOS 6.3 (Server), CentOS 6.5 (Client).
OpenVPN-Version ist 2.3.2 (wie in Ubuntu 14.10, also keine verschimmelte Version)
Mein SSH-Tunnel sieht so aus:

ssh -f XXXX@XXXX -i XXXX -L 12345:127.0.0.1:12345 -N

Meine Konfigurationsdatei sieht folgendermaßen aus:
Server

port 1194
proto udp
dev tun0
topology subnet
log /var/log/openvpn.log

ca XXXX
cert XXXX
key XXXX
dh XXXX
crl-verify XXXX

cipher AES-256-CBC

server XXXX 255.255.255.0

ifconfig-pool-persist /etc/openvpn/ipp.txt
keepalive 10 120
comp-lzo
status /var/log/openvpn-status.log
verb 3
tun-mtu 1500
fragment 1300

persist-key
persist-tun

Klient

client

remote XXXX 1194

proto udp
dev tun
log /var/log/openvpn.log
comp-lzo

cipher AES-256-CBC
ns-cert-type server

# the full paths to your server keys and certs
ca XXXX
cert XXXX
key XXXX

tun-mtu 1500 # Device MTU
fragment 1300 # Internal fragmentation

persist-key
persist-tun
nobind

20
2017-12-17 14:50


Ursprung


SSH unterstützt auch die Komprimierung, so dass zwischen OpenVPN und SSH nicht unbedingt etwas anderes ist. Haben Sie versucht, die Komprimierung auf beiden Seiten zu deaktivieren? Wenn Sie die Übertragung über OpenVPN durchführen, führen Sie top oder etwas auf Ihrem Client / Server aus. Gibt es irgendwelche offensichtlichen Anzeichen, dass Sie Ihre CPU / Speicher / etc mit der VPN-Verbindung maximieren? - Zoredache
Es scheint unwahrscheinlich für ein von AWS gehostetes System, aber es gibt eine kleine Möglichkeit, dass UDP eine Ratenbegrenzung erhält oder so. Hast du versucht, OpenVPN über TCP zu machen? - Zoredache
@Nitz TCP-Tunnel in SSH verwenden kein TCP über TCP. Tatsächlich wird der ssh-Client in der Regel mit unzureichenden Berechtigungen ausgeführt, um dies zu tun. Und nein, ssh entfernt keine TCP-Header von Paketen, weil es niemals ein TCP-Paket berührt. ssh ist nur eine Anwendung, die wie jede andere Anwendung den TCP-Stack im Kernel nutzt. Daten werden über eine TCP-Verbindung von einem Programm zum ssh-Client übertragen. Der ssh-Client verschlüsselt die Daten und sendet sie über die TCP-Verbindung an den Server. Der Server entschlüsselt es und sendet es über die dritte TCP-Verbindung an ein Programm am anderen Ende. - kasperd
Sicher, es könnte ein bisschen mehr Overhead mit OpenVPN sein, weil es die zusätzlichen IP / TCp-Header hat. Aber das sollte keinen Unterschied von 4-10 mal langsamer machen. Wenn der Unterschied in dem 5-10% langsameren Bereich liegt, könnte ich versucht sein, dies zu beschuldigen. Der Grund, warum Sie noch untersuchen sollten, ist, dass dies ein Symptom für ein zugrunde liegendes Problem sein könnte, das andere Dinge auf eine Weise beeinflussen könnte, die weniger offensichtlich ist. - Zoredache
@Nitz Wenn ich dich richtig verstehe, sagst du, dass die unverschlüsselten Pakete, die die virtuelle Schnittstelle betreten, 1424 Bytes sind, aber die verschlüsselten Pakete, die auf der physikalischen Schnittstelle gesendet werden, nur 160 Bytes sind. Das würde auf eine ziemlich extreme Fragmentierung hindeuten, die auf der VPN-Schicht oder der UDP / IP-Schicht darunter auftritt. Das könnte sicherlich das Leistungsproblem erklären. Die Pakete auf der virtuellen Schnittstelle sollten etwas in der Größenordnung von 1300-1400 Bytes haben. Die Pakete auf der physischen Schnittstelle sollten etwas in der Größenordnung von 1400-1500 Bytes haben. - kasperd


Antworten:


Dank an Kasperdist es KommentarIch habe gelernt, dass SSH nicht unter TCP-over-TCP leidet, da es nur Paketdaten verschiebt. Ich schrieb ein Blogeintrag darüber, aber das Interessanteste ist das netstat Ausgabe, was beweist, dass SSH tatsächlich Schicht 3,4 Daten nicht erhalten:

nach dem Tunneln, vor dem Verbinden 

backslasher@client$ netstat -nap | grep -P '(ssh|redis)'
...
tcp        0      0 127.0.0.1:20000             0.0.0.0:*                   LISTEN      20879/ssh
tcp        0      0 10.105.16.225:53142         <SERVER IP>:22              ESTABLISHED 20879/ssh
...

backslasher@server$ netstat -nap | grep -P '(ssh|redis)'
...
tcp        0      0 0.0.0.0:6379                0.0.0.0:*                   LISTEN      54328/redis-server
tcp        0      0 <SERVER IP>:22              <CLIENT IP>:53142           ESTABLISHED 53692/sshd
...

Nach dem Tunneln und Verbinden

backslasher@client$ netstat -nap | grep -P '(ssh|redis)'
...
tcp        0      0 127.0.0.1:20000             0.0.0.0:*                   LISTEN      20879/ssh
tcp        0      0 127.0.0.1:20000             127.0.0.1:53142             ESTABLISHED 20879/ssh
tcp        0      0 127.0.0.1:53142             127.0.0.1:20000             ESTABLISHED 21692/redis-cli
...

backslasher@server$ netstat -nap | grep -P '(ssh|redis)'
...
tcp        0      0 0.0.0.0:6379                0.0.0.0:*                   LISTEN      54328/redis-server
tcp        0      0 127.0.0.1:6379              127.0.0.1:42680             ESTABLISHED 54328/redis-server
tcp        0      0 127.0.0.1:42680             127.0.0.1:6379              ESTABLISHED 54333/sshd
tcp        0      0 <SERVER IP>:22              <CLIENT IP>:53142           ESTABLISHED 52889/sshd
...

Also werde ich SSH-Tunneling verwenden, da es scheint, dass mein OpenVPN nicht falsch konfiguriert ist oder irgendetwas, nur nicht das richtige Werkzeug für den Job.


6
2017-12-19 16:12





Es hängt davon ab, was Sie erreichen wollen und was Ihre Prioritäten sind. VPN verbindet Sie mit einem Netzwerk und SSH mit einer Maschine. VPN ist ein bisschen sicherer mit der Kapselung, was SSH nicht tut.

Darüber hinaus ermöglicht VPN den gesamten Datenverkehr, der im Gegensatz zu SSH, in dem Sie die Anwendungen erzwingen müssen, problemlos ausgeführt werden kann.

Werden Sie AD überhaupt benutzen? Mit VPN können Sie das viel einfacher machen.

Ich bevorzuge SSH für schnelle Notwendigkeiten und VPN für kritische Anwendungen, wo ich die zusätzliche Zeit verschonen sollte.

Abhängig von der Situation habe ich SSH in einem VPN verwendet, falls das VPN kompromittiert wurde. Auf diese Weise müsste jemand Sondieren durch das SSH-Tunneling durchführen.


2
2017-09-17 03:29



Ich renne wieder über den Tunnel, also reicht mir ein einziger Port. Ich war nur erstaunt über die Tatsache, dass VPN nicht immer die beste Lösung für den Tunneling Netzwerkverkehr ist - Nitz