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
Nitz
источник
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 не настроен неправильно или что-то в этом роде, просто не является подходящим инструментом для работы.

Nitz
источник
3

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

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

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

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

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

rhymsy
источник
2
Я запускаю redis через туннель, поэтому мне достаточно одного порта. Меня просто поразил тот факт, что VPN не всегда является лучшим решением для туннелирования сетевого трафика
Nitz