SSH 隧道比 OpenVPN 快,是吗?

Nit*_*itz 24 networking ssh openvpn

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

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

但是,今天我通过两种方法测试了 Redis 复制。
我在连接到美国东部 AWS 虚拟机的爱尔兰 AWS 虚拟机上运行了测试。
由于我的测试用例是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
Run Code Online (Sandbox Code Playgroud)

粗略估计速度。
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       |
Run Code Online (Sandbox Code Playgroud)

技术规格

我正在运行 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
Run Code Online (Sandbox Code Playgroud)

我的配置文件看起来像:
服务器

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
Run Code Online (Sandbox Code Playgroud)

客户

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
Run Code Online (Sandbox Code Playgroud)

Nit*_*itz 10

感谢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
...
Run Code Online (Sandbox Code Playgroud)

隧道和连接后

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
...
Run Code Online (Sandbox Code Playgroud)

所以我将使用 SSH 隧道,因为我的 OpenVPN 似乎没有配置错误或任何东西,只是不是适合这项工作的工具。


rhy*_*msy 5

这取决于您想要实现的目标以及您的优先事项是什么。VPN 将您连接到网络,并将 SSH 连接到计算机。VPN 通过封装而更加安全,而 SSH 则没有这样做。

此外,VPN 允许所有流量轻松通过它,而 SSH 则必须强制应用程序通过。

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

我更喜欢使用 SSH 来满足快速需求,而使用 VPN 来满足我应该节省额外时间的关键应用程序。

根据具体情况,我在 VPN 中使用了 SSH,以防 VPN 遭到破坏。这样一来,探测者就必须通过 SSH 隧道。

  • 我在隧道上运行 redis,所以一个端口就足够了。我只是惊讶于 VPN 并不总是网络流量隧道的最佳解决方案 (2认同)