Speedtest всем хорош, кроме того что он позволяет измерить скорость от “себя” до некоего рандомного сервера, который обычно располагается еще и относительно близко к машине, скорость с которой измеряется. Это удобно, если надо оценить своего провайдера, или покрытие сотовой сети в определенном месте.
Но у меня стояла другая задача - надо было измерить скорость между двумя конкретными узлами сети (на самом деле еще и построить мониторинг для этого!). Кажется, что можно было бы быстренько соорудить какой нибудь велосипед, перегоняя трафик из /dev/random
в /dev/null
через tcp-сокет, но зачем, если есть iperf3. Он умеет работать в клиент-серверном режиме, поддерживает авторизацию, поэтому можно не опасаться, что скрипт-киддисы будут заливать терабайты sql-инъекций и прочих Q-injection
в наш сервак.
В этой небольшой заметке я расскажу как поднять iperf3 в режиме сервера, настроить аутентификацию клиентов и запускать iperf3-клиент на локальной машине для измерений точка-точка.
Генерим аутентификационные данные
Аутентификация iperf3 состояит из двух компонентов.
Во первых, потребуется RSA-ключи для обеспечения шифрования передаваемых кредов пользователя, во вторых нужны эти самые креды.
Ключи легко генерятся при помощи openssl
(я рискну предположить, что если запускается всякий linux-софт, то есть доступ до консоли). Креды на сервере хранятся в хешированном виде, так что все довольно безопасно и утечки пароля опасаться не стоит, но тем не менее, пароль должен быть длинным, случайным, храниться в менеджере паролей. Имя пользователя - тоже, ну а че бы нет, не руками же его вводить.
Генерим RSA-ключи
Можно открыть man page, а можно скопирнуть команды ниже.
Что теперь есть в каталоге где выполнялись команды: private.pem
- приватный ключ, зашифрованный, public.pem
- публичный ключ (он нужен клиентам для подключения), private_not_protected.pem
- приватный ключ, незашифрованный (он понадобится серверу для работы в автоматическом режиме). Прихраним полученные артефакты в надежном месте до поры до времени.
Генерим креды пользователя
Вторым компонентом защиты от залива половины интернета в сервак iperf3 являются креды пользователя. Сервер употребляет их в хешированном и соленом виде, клиент требует ввод через stdin или можно передать в переменной окружения, если клиент работает в составе автоматизированного решения (запускается без участия человека).
Опять же, все описано в man, а можно скопирнуть отсюда:
Полученный хешик (9c37242bb7f83fef32689cb2005cc341dce3b424c48aa34c6a1cbc9d51c2b44b
) вместе с именем пользователя надо прихранить в csv
файле, который будет использоваться сервером.
Пользователей может быть несколько или даже много. Я очень надеюсь, что никто не догадается использовать логопасс из статьи, несмотря на то что они достаточно длинные и надежные :-)
Поднимаем сервер
А вот сейчас будет контент которого нет в man pages, так что… копируйте отсюда. Сервак будем крутить systemd юнитом. Для этого напишем вот такой незамысловатый файлик:
И сложим его в /etc/systemd/system/iperf3.service
.
Внимательный читатель уже мог догадаться, куда надо сложить приватный ключ и файл с кредами. Ну конечно же в /etc/iperf3/
! Можно сложить конечно куда то еще, в этом случае надо указать правильные пути к файлам через опции --rsa-private-key-path
(для приватного ключа) и --authorized-users-path
(для csv
файлов с солеными и хешированными кредами).
Chmod для этих файлов можно сделать побезопаснее:
Приемлемо!
Запустить сервак проще простого:
Готовенько! Можно запускать клиента.
Стартуем клиента
С клиентом все будет проще. Для запуска понадобится публичный ключ и логопасс, которые были созданы ранее. Для запуска “руками” пароль будет запрошен при старте приложения:
Пароль можно передать через переменную среды, это может понадобиться при запуске из другой софтины или скрипта:
Это если из консоли, а если надо вызвать из дотнета, то переменную надо засунуть в коллекцию EnvironmentVariables
объекта ProcessStartInfo
:
Ну вот и все. Это оказалось проще чем казалось:-)