Nit*_*itz 24 networking ssh openvpn
从逻辑上讲,VPN 在隧道方面应该比 SSH 更快,因为:
但是,今天我通过两种方法测试了 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。
这是否意味着我所研究的所有内容都是错误的,还是我的设置配置严重错误?
我用相同的数据集做了几次测试,得到了这些结果:
以下是带有双向测试的 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 似乎没有配置错误或任何东西,只是不是适合这项工作的工具。
这取决于您想要实现的目标以及您的优先事项是什么。VPN 将您连接到网络,并将 SSH 连接到计算机。VPN 通过封装而更加安全,而 SSH 则没有这样做。
此外,VPN 允许所有流量轻松通过它,而 SSH 则必须强制应用程序通过。
您打算使用 AD 吗?因为 VPN 可以让您更轻松地做到这一点。
我更喜欢使用 SSH 来满足快速需求,而使用 VPN 来满足我应该节省额外时间的关键应用程序。
根据具体情况,我在 VPN 中使用了 SSH,以防 VPN 遭到破坏。这样一来,探测者就必须通过 SSH 隧道。
| 归档时间: |
|
| 查看次数: |
20056 次 |
| 最近记录: |