从逻辑上讲,VPN应该比SSH隧道更快,因为:
但是,今天我testing了两种方法的Redis复制。
我通过爱尔兰AWS VM运行testing,连接到美国东部的AWS VM。
由于我的testing用例是Redis复制,这正是我testing的 – 我运行了一个空白的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。
这是否意味着我所研究的所有内容都是错误的,或者我的设置严重错误?
我用相同的数据集做了几个testing,得到了这些结果:
这里是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隧道。