SSH隧道比OpenVPN更快,可以吗?

从逻辑上讲,VPN应该比SSH隧道更快,因为:

  • 它运行在UDP上而不是TCP上(所以TCP上没有TCP)
  • 它有压缩

但是,今天我testing了两种方法的Redis复制。
我通过爱尔兰AWS VM运行testing,连接到美国东部的AWS VM。
由于我的testing用例是Redis复制,这正是我testing的 – 我运行了一个空白的Redis服务器,并且在完成加载之后,我执行了其他服务器的slaveof ,并测量了Connecting to MASTERMASTER <-> SLAVE sync: Finished with success 。 在之间,我用了

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

为了得到速度的粗略估计。
SSH远远胜出:〜11MB / s,相比于OpenVPN的〜2MB / s。
这是否意味着我所研究的所有内容都是错误的,或者我的设置严重错误?

更新

我用相同的数据集做了几个testing,得到了这些结果:

  • OpenVPN的
    • TCP:
      压缩: 15米
      没有压缩: 21米
    • UDP:
      压缩: 5米
      没有压缩: 6米
  • SSH
    默认值:1分50秒
    没有压缩: 1m30s
    压缩: 2m30s

UPDATE2

这里是iperf结果,双向testing(SSH除外,没有返回path可用)

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

技术规格

我正在运行CentOS 6.3(服务器),CentOS 6.5(客户端)。
OpenVPN的版本是2.3.2(与Ubuntu 14.10相同,所以没有发霉的版本)
我的SSH隧道如下所示:

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

我的configuration文件如下所示:
服务器

 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 

客户

 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 

感谢kasperd的评论 ,我了解到SSH不会受TCP-over-TCP的攻击 ,因为它只是移动分组数据。 我写了一篇关于它的博客文章 ,但最有趣的是netstat输出,certificateSSH确实不保留第3,4层数据:

隧道之后,连接之前

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

隧道和连接后

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

所以我打算使用SSH隧道技术,因为我的OpenVPN似乎没有configuration错误或任何东西,只是不适合工作。

这取决于你想要达到的目标以及你的优先事项。 VPN将您连接到networking,并通过SSH连接到计算机。 对于封装来说,VPN更安全一些,而SSH并不这样做。

此外,VPN允许所有的stream量轻松通过它,而SSH则需要强制应用程序。

你打算使用AD吗? 因为VPN会让你更轻松地做到这一点。

我更喜欢SSH来快速的需要和VPN的关键应用程序,我应该省下额外的时间。

根据情况,我已经在VPN中使用SSH,以防VPN受到威胁。 这样,有人探测将不得不通过SSH隧道。