SSH туннелирование быстрее, чем OpenVPN, не так ли?


21

Логически, 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

Чтобы получить грубую оценку скорости.
Длинный выстрел выиграл SSH: ~ 11 МБ / с по сравнению с ~ 2 МБ / с OpenVPN.
Означает ли это, что все то, что я повторно проверил, было неверным, или я неправильно настроил мои настройки?

Обновить

Я провел несколько тестов с одним и тем же набором данных и получил следующие результаты:

  • OpenVPN
    • TCP:
      сжатие: 15 м
      без сжатия: 21 м
    • UDP:
      сжатие: 5 м
      без сжатия: 6 м
  • 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

3
SSH также поддерживает сжатие, поэтому между OpenVPN и SSH это не обязательно что-то другое. Вы пытались отключить сжатие с обеих сторон? Когда вы выполняете передачу через OpenVPN, запустите top или что-то на вашем клиенте / сервере. Существуют ли какие-либо явные признаки того, что вы загружаете свой ЦП, память и т. Д. С помощью VPN-подключения?
Зоредаче

2
Это кажется маловероятным для системы, размещенной на AWS, но есть небольшая вероятность того, что UDP ограничивается скоростью или что-то в этом роде. Вы пытались сделать OpenVPN через TCP?
Зоредаче

4
Туннели @Nitz TCP в ssh не используют TCP через TCP. На самом деле ssh-клиент обычно запускается с недостаточными привилегиями, чтобы сделать это. И нет, ssh не удаляет заголовки TCP из пакетов, потому что он даже не затрагивает пакет TCP. ssh - это просто приложение, использующее стек TCP в ядре, как и любое другое приложение. Данные передаются через одно TCP-соединение от какой-либо программы к клиенту ssh. Клиент ssh шифрует данные и отправляет их через TCP-соединение на сервер. Сервер расшифровывает его и отправляет через третье TCP-соединение с программой на другом конце.
kasperd

2
Конечно, с OpenVPN может быть немного больше издержек, потому что у него есть дополнительные заголовки IP / TCp. Но это не должно иметь значения в 4-10 раз медленнее. Если бы разница была в 5-10% более медленном диапазоне, я мог бы испытать искушение винить это. Причина, по которой вы, возможно, захотите продолжить расследование, заключается в том, что это может быть симптомом какой-то основной проблемы, которая может влиять на другие вещи менее очевидным образом.
Zoredache

2
@ Nitz Если я правильно вас понимаю, вы говорите, что незашифрованные пакеты, поступающие в виртуальный интерфейс, имеют размер 1424 байта, а зашифрованные пакеты, отправленные на физический интерфейс, имеют размер всего 160 байтов. Это указывало бы на довольно экстремальную фрагментацию, происходящую на уровне VPN или на уровне UDP / IP под ним. Это, безусловно, может объяснить проблему производительности. Пакеты на виртуальном интерфейсе должны быть порядка 1300-1400 байт. Пакеты на физическом интерфейсе должны быть порядка 1400-1500 байтов.
kasperd

Ответы:


7

Благодаря kasperd «S комментарий , я узнал , что SSH не страдает от TCP-над-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.

Кроме того, VPN позволяет легко проходить через него весь трафик, в отличие от SSH, где вам придется форсировать приложения.

Собираетесь ли вы использовать AD вообще? Потому что VPN позволит вам сделать это гораздо проще.

Я предпочитаю SSH для быстрых потребностей и VPN для критически важных приложений, где я должен сэкономить дополнительное время.

В зависимости от ситуации я использовал SSH в VPN на случай, если VPN был скомпрометирован. Таким образом, кто-то должен был пройти через SSH-туннелирование.


2
Я запускаю redis через туннель, поэтому мне достаточно одного порта. Меня просто поразил тот факт, что VPN не всегда является лучшим решением для туннелирования сетевого трафика
Nitz
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.