web-dev-qa-db-ja.com

SSHトンネリングはOpenVPNよりも高速ですか?

論理的には、VPNはトンネリングに関してSSHよりも高速であるべきです。

  • TCPではないのでUDPで実行されています(TCP over TCP))
  • 圧縮あり

ただし、今日は両方の方法でRedisレプリケーションをテストしました。
私はアイルランドのAWS VMでテストを実行し、US-East 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はロングショットで勝利しました:OpenVPNの〜2MB /秒と比較して〜11MB /秒。
それは、私が再調査したものすべてが間違っていたことを意味しますか、それともセットアップを大幅に誤って構成しましたか?

更新

私は同じデータセットでいくつかのテストを行い、これらの結果を得ました:

  • OpenVPN
    • TCP:
      圧縮:15m
      圧縮なし:21m
    • UDP:
      圧縮:5m
      圧縮なし:6m
  • SSH
    デフォルト:1m50s
    圧縮なし:1m30s
    圧縮:2m30s

Update2

以下は、双方向テストを含む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
21
Nitz

kasperdcomment のおかげで、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
...

私のOpenVPNが正しく構成されていないようで、ジョブに適したツールではないため、SSHトンネリングを使用します。

7
Nitz

それはあなたが達成しようとしていることとあなたの優先順位が何であるかに依存します。 VPNはネットワークに接続し、マシンにSSHで接続します。 VPNは、SSHが行わないカプセル化により、もう少し安全です。

また、VPNを使用すると、アプリケーションを強制する必要があるSSHとは異なり、すべてのトラフィックが簡単に通過できます。

ADを使用しますか? VPNを使用すると、はるかに簡単にそれを行うことができます。

私は高速の必需品にはSSHを、余計な時間を割く必要がある重要なアプリケーションにはVPNを好みます。

状況に応じて、VPNが侵害された場合に備えて、VPNでSSHを使用しました。この方法では、プローブをしている人がSSHトンネリングを通過する必要があります。

3
rhymsy