SSH隧道比OpenVPN快,是吗?


21

从逻辑上讲,VPN的隧道传输速度应比SSH快,这是因为:

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

但是,今天我测试了这两种方法的Redis复制。
我通过连接到美国东部AWS VM的爱尔兰AWS VM运行测试。
由于我的测试用例是Redis复制,因此这正是我所测试的-我运行了一个空白的Redis服务器,并在完成加载后,执行slaveof了另一台服务器,并测量了Connecting to MASTER和之间的时间 MASTER <-> 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。
这是否意味着我重新确定的所有内容都是错误的,还是我严重错误地配置了我的设置?

更新资料

我对同一数据集进行了几次测试,并得到了以下结果:

  • 开放VPN
    • TCP:
      压缩:15m
      无压缩:21m
    • UDP:
      压缩:5m
      无压缩:6m
  • SSH
    默认值:1m50s
    无压缩:1m30s
    压缩:2m30s

更新2

以下是双向测试的iperf结果(SSH除外,其中没有返回路径可用)

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

技术规格

我正在运行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

我的配置文件如下:
服务器

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

3
SSH也支持压缩,因此OpenVPN和SSH之间不一定有什么不同。您是否尝试过在两侧禁用压缩?通过OpenVPN执行传输时,请在客户端/服务器上运行top或其他内容。是否有任何明显的迹象表明您正在通过VPN连接最大化CPU /内存/等?
Zoredache 2014年

2
对于AWS托管系统来说,这似乎不太可能,但是UDP受到速率限制或某种限制的可能性很小。您是否尝试过通过TCP进行OpenVPN?
Zoredache 2014年

4
ssh中的@Nitz TCP隧道不使用任何基于TCP的TCP。实际上,ssh客户端通常在没有足够特权的情况下甚至无法运行。而且,ssh不会从数据包中剥离任何TCP标头,因为它甚至从未接触过TCP数据包。与其他任何应用程序一样,ssh只是一个利用内核中的TCP堆栈的应用程序。数据通过一个TCP连接从某个程序传输到ssh客户端。ssh客户端对数据加密并通过TCP连接将其发送到服务器。服务器解密并通过第三TCP连接将其发送到另一端的程序。
kasperd 2014年

2
当然,OpenVPN可能会有更多开销,因为它具有额外的IP / TCp标头。但这不应使速度相差4-10倍。如果差异在5-10%的较慢范围内,我可能会试图将其归咎于此。您可能仍要调查的原因是,这可能是一些潜在问题的症状,这些问题可能以不太明显的方式影响其他事物。
Zoredache 2014年

2
@Nitz如果我正确理解您的意思,您是说进入虚拟接口的未加密数据包为1424字节,但是在物理接口上发送的加密数据包仅为160字节。这表明在VPN层或其下面的UDP / IP层上发生了相当极端的碎片。那肯定可以解释性能问题。虚拟接口上的数据包应为1300-1400字节左右。物理接口上的数据包应为1400-1500字节左右。
kasperd 2014年

Answers:


7

感谢kasperd评论,我了解到SSH不受TCP-over-TCP的影响,因为它仅移动数据包数据。我写了一篇有关它的博客文章,但是最有趣的是netstat输出,证明SSH确实不会保留第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并未配置错误或其他任何东西,只是不适合该工作的合适工具。


3

这取决于您要实现的目标和优先级。VPN将您连接到网络,将SSH连接到计算机。使用封装,VPN更加安全,而SSH则不能。

此外,与SSH(您必须强制应用程序)相比,VPN允许所有流量轻松通过它。

您完全要使用AD吗?因为VPN将使您更轻松地执行此操作。

我更喜欢SSH来满足快速的必需品需求,而VPN则适合于关键应用程序,我应该在这些应用程序上花些时间。

根据情况,我在VPN中使用了SSH,以防VPN受到威胁。这样一来,某人进行探测就必须通过SSH隧道。


2
我在隧道上运行Redis,所以一个端口就足够了。我只是通过一个事实,即VPN并不总是隧道网络流量的最佳解决方案惊讶
尼茨
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.