Как управлять тремя тысячами клиентов
В прошлом посте я рассказывал про абсолютно, совершенно бесплатный VPN который мы создали для всех. Многие спрашивали как мы сможем прожить и кто за это платит. Вышло так что оплата одного VPS выходит в среднем 250 рублей в месяц, хватает это на 75 человек, и такую сумму мы принимаем в качестве пожертвований. И после прошлого поста на наш канал подписалось более 1000 человек — а пожертвований было более 8 тысяч рублей за сутки.
Итог — нас сейчас около 3 тысяч человек — расходы в 10 тысяч рублей — за последние 30 дней мы собрали 16 тысяч рублей что покрыло с горкой расходы на месяц — май — и даже часть июня!
В этом посте я расскажу управлять таким сервисом — и автоматизировать некоторые моменты.
TimeWeb API или как автоматизировать большинство систем
Для автоматизации процесса нам нужно что бы при достижении высково среднего онлайн в течении 3–4 часов, система самостоятельно арендовала новый VDS делая из предыдущего клон.
Для начала нам нужно подсчитать сколько человек сейчас в сети.
Импортируем модуль subprocess, который позволяет выполнять команды в терминале из Python‑скрипта.
2. Выполняем команду wg show с помощью subprocess.run() , захватывая вывод команды с помощью параметра capture_output=True и конвертируя его в строку с помощью параметра text=True .
3. Проверяем код возврата команды. Если он равен нулю, то команда была успешно выполнена, и мы можем обработать вывод. Если код возврата не равен нулю, то возникла ошибка, и мы выводим сообщение об ошибке.
4. Разбиваем вывод на строки с помощью метода split(‘\n’) .
5. Считаем количество строк в выводе (количество клиентов), вычитая 1 для заголовочной строки.
6. Выводим результат в виде строки с помощью функции print() .
import subprocess result = subprocess.run(['wg', 'show'], capture_output=True, text=True) if result.returncode == 0: output = result.stdout.strip().split('\n') clients = len(output) - 1 # subtract 1 for the header line print(f"Number of connected clients: ") else: print("Error:", result.stderr)
Далее нам нужно отследить что бы понять среднее количетсов клиентов за 12 часов и после этого принять решение — арендовать клон vds или нет.
1. Мы определяем переменные avg_clients , count и max_count . avg_clients будет использоваться для хранения среднего количества клиентов, count — для хранения количества проверок, а max_count — максимальное количество проверок, которые мы хотим выполнить.
3. Мы выполняем команду wg show , как и в предыдущем скрипте, и обрабатываем вывод.
4. Мы добавляем количество клиентов к avg_clients и увеличиваем count на 1.
5. Мы выводим количество подключенных клиентов и ждем 10 минут с помощью функции time.sleep(600) .
6. После выполнения всех проверок мы вычисляем среднее количество клиентов, разделив avg_clients на count .
7. Если среднее количество клиентов больше или равно 75, мы выводим «Server is overloaded», иначе мы выводим «Server is running fine».
Код скрипта, который выводит количество подключенных клиентов Wireguard и проверяет его в течение 12 часов:
import subprocess import time avg_clients = 0 count = 0 max_count = 72 # 12 hours with a check every 10 minutes while count < max_count: result = subprocess.run(['wg', 'show'], capture_output=True, text=True) if result.returncode == 0: output = result.stdout.strip().split('\n') clients = len(output) - 1 # subtract 1 for the header line avg_clients += clients count += 1 print(f"Number of connected clients: ") time.sleep(600) # wait for 10 minutes else: print("Error:", result.stderr) avg_clients //= count if avg_clients >= 75: print("Server is overloaded") else: print("Server is running fine")
Код скрипта, который выводит количество подключенных клиентов Wireguard в течение 12 часов и проверяет, превышает ли среднее значение 75:
python import subprocess import time clients = [] for i in range(0, 144): # 12 hours * 12 updates per hour = 144 updates result = subprocess.run(['wg', 'show'], capture_output=True, text=True) if result.returncode == 0: output = result.stdout.strip().split('\n') clients.append(len(output) - 1) # subtract 1 for the header line else: print("Error:", result.stderr) clients.append(0) # add 0 to the list to maintain the length time.sleep(300) # wait 5 minutes between updates average_clients = sum(clients) / len(clients) if average_clients > 75: print("Server is overloaded") else: print(f"Number of connected clients: ") ```
1. Создаем пустой список clients , в который будем добавлять количество подключенных клиентов на каждом проходе цикла.
2. Используем цикл for для выполнения 144 обновлений (12 часов * 12 обновлений в час).
3. Выполняем команду wg show и обрабатываем вывод аналогично предыдущему скрипту.
4. Добавляем количество подключенных клиентов в список clients .
5. Если возникает ошибка, добавляем 0 в список clients , чтобы сохранить длину списка.
6. Используем функцию time.sleep() для ожидания 5 минут между обновлениями.
7. Вычисляем среднее значение количества клиентов в списке clients .
8. Если среднее значение больше 75, выводим сообщение «Server is overloaded».
9. Иначе выводим последнее значение списка clients в виде строки с помощью функции print() .
Все таки я немного соврал, не все автоматизировано, приходит оповещение, мне удобнее в Телеграм, что сервер переполнен, и уже Администратор решает, хватит ли нам денег на новый сервер или временно закрыть раздачу ключей к WG.
Для отправки оповещения в телеграм мы будем использовать библиотеку python-telegram-bot . Прежде чем начать работу с этой библиотекой, необходимо создать бота и получить токен. Для этого нужно обратиться к BotFather в Telegram и следовать инструкциям.
После получения токена, можно написать скрипт отправки сообщения в телеграм:
import telegram bot_token = 'YOUR_BOT_TOKEN_HERE' chat_id = 'YOUR_CHAT_ID_HERE' bot = telegram.Bot(token=bot_token) message = "Server is overloaded" bot.send_message(chat_id=chat_id, text=message)
Теперь можно объединить этот код с кодом предыдущего скрипта, чтобы отправлять сообщения в телеграм, если сервер перегружен:
import subprocess import time import telegram bot_token = 'YOUR_BOT_TOKEN_HERE' chat_id = 'YOUR_CHAT_ID_HERE' clients = [] for i in range(0, 144): # 12 hours * 12 updates per hour = 144 updates result = subprocess.run(['wg', 'show'], capture_output=True, text=True) if result.returncode == 0: output = result.stdout.strip().split('\n') clients.append(len(output) - 1) # subtract 1 for the header line else: print("Error:", result.stderr) clients.append(0) # add 0 to the list to maintain the length time.sleep(300) # wait 5 minutes between updates average_clients = sum(clients) / len(clients) if average_clients > 75: message = "Server is overloaded" bot = telegram.Bot(token=bot_token) bot.send_message(chat_id=chat_id, text=message) else: print(f"Number of connected clients: ")
Код отправки сообщения в телеграм добавлен в блок условия, который проверяет, превышает ли среднее значение 75. Если это так, то сообщение «Server is overloaded» отправляется в телеграм. Если нет, то выводится количество подключенных клиентов, как и ранее.
«Server is overloaded» — нам нужно клонировать VPS и поднять его.
Подключаемся к timeweb api (api key в личном кабинете)
Клонирование VPS в Timeweb включает в себя несколько шагов:
1. Получить список доступных VPS.
2. Выбрать VPS, который нужно клонировать.
3. Создать копию VPS.
4. Дождаться, пока копия будет создана.
5. Получить данные копии VPS.
6. Сохранить данные в файл конфигурации Wireguard.
Ниже я написал Python‑код, который выполняет эти шаги:
import requests import json # Задайте свой ключ API api_key = "YOUR_API_KEY_HERE" # 1. Получите список доступных VPS. url = "https://api.timeweb.com/v1/vps" headers = < "Content-Type": "application/json", "Authorization": f"Bearer " > response = requests.get(url, headers=headers) vps_list = response.json()["data"] print("Available VPS:", vps_list) # 2. Выберите VPS, которую нужно клонировать. vps_to_clone = None for v in vps_list: if v["hostname"] == "VPS_TO_CLONE": vps_to_clone = v break if vps_to_clone is None: print("VPS to clone not found.") exit(1) print("VPS to clone:", vps_to_clone) # 3. Создайте копию VPS. url = "https://api.timeweb.com/v1/vps/clone" data = < "vps_id": vps_to_clone["id"] >response = requests.post(url, headers=headers, data=json.dumps(data)) clone_id = response.json()["data"]["id"] print("Clone created:", clone_id) # 4. Дождитесь, пока копия будет создана. url = f"https://api.timeweb.com/v1/vps/clone/" while True: response = requests.get(url, headers=headers) status = response.json()["data"]["status"] if status == "completed": print("Clone processed.") break elif status == "failed": print("Clone failed.") exit(1) print("Clone status:", status) time.sleep(10) # 5. Получите данные копии VPS. url = f"https://api.timeweb.com/v1/vps/" response = requests.get(url, headers=headers) clone_vps = response.json()["data"] print("Clone details:", clone_vps) # 6. Сохраните данные в файл конфигурации Wireguard. with open("wg0.conf", "a") as f: f.write(f"[Peer]\n") f.write(f"PublicKey = \n") f.write(f"AllowedIPs = \n") f.write(f"Endpoint = \n")
Что у нас получилось
Скрипт получает данные о количестве клиентов на сервере, понимает что среднее количество превышает лимит, оповещает администратора, администратор отправляет запрос на клонирование сервера, создается клон сервера, осталось только настроить бота который выдает ключи — выдачу на новый сервер.
Так же нужно понимать что некоторые сервера могут опустеть, в течении года такое уже было, мы замечали что люди зачем то берут новые ключи, клиенты удаляют wireguard или просто не польются впн, в таком случае нужно до заполнить такие сервера, но пока серверов не так много мы просто перенастраиваем бота на выдачу ключей на определенный сервер для до заполнения.
Итог: это очень кустарный метод администрирования, мы не получаем прибыли с этой услуги, но в будущем планируем создать мини панель администратора где можно отследить параметры нагрузки на цпу, сеть.
Это статья не реклама, мы просто сделали проект добра и готовы поделится тем что у нас получилось, вы можете использовать наш опыт для организации своей услуги впн. Работайте для души!
Wireguard контроль числа подключенных юзеров. Как сделать ограниченное число подключений на один ключ?
Приветствую хабровчане.
Возник вопрос ,
многие из тех кто продает ключи к wireguard vpn ,
ставят ограничение (1, 2, 5 и т.д ) на количество активных подключений к одному ключу .
*и самое интересное — эти ограничения работают.
Собственно вопрос: Как?
На сколько я знаю, подобных функций у самого wireguard (серверной части) нет.
Усиленный гуглинг не дал результатов .
Если кто-то знает как это реализовано — прошу обьяснить.
- Вопрос задан более года назад
- 889 просмотров
4 комментария
Средний 4 комментария
реализованно посредством того или иного биллинга+ доп настройка в сервак
не уверен, но думаю к примеру проект PiVPN имеет такой функционал(он расчитан на самохостинг)
ну или к примеру Микротик — имеет изначально службу «контроля» юзеров, и работает в том числе и на wireguard (но он там вроде на основе ключа работает, не уверен)
Dimonchik @dimonchik2013
многие из тех кто продает ключи к wireguard vpn ,
ставят ограничение (1, 2, 5 и т.д ) на количество активных подключений к одному ключу .
вы же добавляйте, что ограничения работают при мултиконнекте к разным серверам
отсюда и и ответ — это делается внешним приложением
к слову, как и подсчеты траффика
А есть примеры подобных приложений?
Dimonchik @dimonchik2013
ага, на гитхабе кастомные
Решения вопроса 1
Ограничение делается при помощи ip адресов.
Типичный конфиг wg0.conf на сервере:
[Interface] PrivateKey = Address = 10.0.0.1/24 ListenPort = 51820 PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; iptables -A FORWARD -o %i -j ACCEPT PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; iptables -D FORWARD -o %i -j ACCEPT [Peer] PublicKey = AllowedIPs = 10.0.0.2/32
Вместо AllowedIPs = 10.0.0.2/32 можно сделать AllowedIPs = 10.0.0.2/28
Так же в конфиге клиента сделать:
[Interface] PrivateKey = Address = 10.0.0.2/28 DNS = 1.1.1.1,8.8.8.8 [Peer] PublicKey = Endpoint = xx.xxx.xx.xxx:51820 AllowedIPs = 0.0.0.0/0
После этого один файл должен заработать у нескольких людей. А точнее у 14.
Возможно где-то ошибся. Но примерно так.
Ответ написан 29 нояб. 2022
Нравится 1 1 комментарий
Ivan_Google @Ivan_Google Автор вопроса
спасибо, огромное
Ответы на вопрос 1
Moonshiner21 @Moonshiner21
Заработать-то он поначалу заработает, но будет жёстко глючить при одновременном подключении. См. https://www.procustodibus.com/blog/2021/01/same-ke. :
WireGuard предполагает, что каждый отдельный клиент (он же одноранговый узел) будет использовать отдельную криптографическую пару ключей. Открытый ключ в этой паре ключей используется не только для установления зашифрованного соединения с одноранговым узлом — он также используется в качестве уникального идентификатора для однорангового узла.
Фактически WireGuard использует открытый ключ однорангового узла в качестве ключа поиска во внутренней таблице подключенных одноранговых узлов; при отправке зашифрованного трафика одноранговому узлу WireGuard обращается к этой таблице, чтобы определить общедоступный IP-адрес и порт (он же конечная точка), на который он должен отправлять зашифрованный трафик. Если несколько конечных точек пытаются использовать один и тот же ключ одновременно, запись в этой таблице для других конечных точек, пытающихся использовать тот же ключ, будет перезаписана последней конечной точкой, которая использовала ключ.
Когда только один пользователь активно использует ключ, все будет в порядке, но когда несколько пользователей одновременно пытаются подключиться к одному и тому же хосту WireGuard с помощью одного и того же ключа, работа всех пользователей ухудшится — их соединение будет “зависать”, пока все пользователи, кроме одного, не откажутся. За кулисами WireGuard большую часть времени будет отправлять большинство пакетов обратно не на ту конечную точку, что приводит к пропущенным ответам и постоянным повторным попыткам приложений, которые пользователи пытаются использовать через WireGuard.
Настройка VPN WireGuard сервера и клиентов
Разработчики позиционирует WireGuard как чрезвычайно простую, но быструю и современную реализацию технологии VPN, использующую современную криптографию. WireGuard стремится быть быстрее, проще, компактнее и полезнее, чем IPsec (трудно создать что-то хуже IPsec) и намерен быть значительно более производительным, чем OpenVPN.
Wireguard — это одноранговая VPN, то есть он не использует модель клиент-сервер. В зависимости от конфигурации одноранговый узел может действовать как традиционный сервер или клиент. Он работает путем создания сетевого интерфейса на каждом одноранговом устройстве, которое действует как туннель. Одноранговые узлы аутентифицируют друг друга, обмениваясь и проверяя открытые ключи, имитируя модель SSH. Открытые ключи сопоставляются со списком IP-адресов, разрешенных в туннеле. Трафик VPN инкапсулируется в UDP.
Шифрование WireGuard основано на открытых и закрытых ключах, позволяющих одноранговым узлам устанавливать зашифрованный туннель между собой. Каждая версия WireGuard использует определенный набор криптографических шифров, чтобы обеспечить простоту, безопасность и совместимость с одноранговыми узлами. Для сравнения, другое программное обеспечение VPN, такое как OpenVPN и IPSec, использует безопасность транспортного уровня (TLS) и сертификаты для аутентификации и установления зашифрованных туннелей между системами. Различные версии TLS включают поддержку сотен различных криптографических наборов и алгоритмов, и, хотя это обеспечивает большую гибкость для поддержки различных клиентов, это также делает настройку VPN, использующей TLS, более трудоемкой, сложной и подверженной ошибкам.
Преимущества и Недостатки VPN от WireGuard
Преимущества VPN от WireGuard:
Встроен в ядро Linux.
Кроссплатформенный: Windows, macOS, BSD, iOS, Android.
Поддержка IPv4 и IPv6
Не использует TLS, вместо него шифрование с открытым ключом.
Поддержка только UDP (тот же OpenVPN поддерживает и UDP и TCP). При любом запуске Anti-DDoS процедур ваш сервер WireGuard умрет.
Сохранения логов. OpenVPN, и IKEv2 присваивают IP-адреса динамически. Это значит, что ваш VPN присваивает вам новый IP-адрес при каждом новом подключении. WireGuard не способен присваивать IP-адреса динамически. Вместо этого, вы получаете один и тот же статический IP-адрес при каждом подключении. Для выдачи одного и того же адреса при каждом подключении, WireGuard должен сохранять и хранить информацию о вашем настоящем IP-адресе и временных метках, что нарушает политику конфиденциальности большинства VPN-сервисов. Многие сервисы заявили, что не будут использовать WireGuard до устранения этого недостатка.
Может ли WireGuard обойти брандмауэры? Протокол WireGuard обычно должен обходить брандмауэры, но есть одна проблема — поскольку протокол использует только протокол передачи UDP (сложно сказать, какой именно порт, хотя это может быть порт 51820), есть вероятность, что он может быть заблокирован брандмауэрами или сетевыми администраторами, которые вообще отключают UDP и разрешают только трафик TCP.
Шаг 0: Необходимые условия
Чтобы следовать этому руководству, вам понадобятся:
Один сервер Ubuntu 20.04 или выше с доступом root (команды указаны без использования sudo).
Клиентский компьютер, который вы будете использовать для подключения к вашему серверу WireGuard.
Чтобы использовать WireGuard с IPv6, вам необходимо убедиться, что ваш сервер настроен на его поддержку.
Шаг 1: Установка WireGuard и создание пары ключей
Первым делом обновляем репозитории Ubuntu и устанавливаем пакет WireGuard:
apt update apt install wireguard wireguard-tools
Используя встроенные команды wg genkey и wg pubkey создаем пару ключей. Сначала создаем закрытый ключ, затем добавьте закрытый ключ private.key в файл конфигурации WireGuard и установите на него командой chmod права с доcтупом только для пользователя root.
wg genkey | tee /etc/wireguard/private.key chmod 600 /etc/wireguard/private.key
Вы должны получить одну строку вывода в кодировке base64, которая является закрытым ключом, и добавляем его в параметр PrivateKey.
Следующим шагом является создание соответствующего открытого ключа, который является производным от закрытого ключа. Используйте следующую команду для создания файла открытого ключа:
cat /etc/wireguard/private.key | wg pubkey | tee /etc/wireguard/public.key
После выполнения команды, вы снова получите одну строку вывода в кодировке base64, которая является открытым ключом для вашего сервера WireGuard. Скопируйте его куда-нибудь для удобства, так как вам нужно будет распространять открытый ключ любому клиенту, который подключается к серверу.
Шаг 2: Выбор адресов IPv4 и IPv6
На этом этапе у нас сгенерирована пара ключей, которая будет использоваться для шифрования входящего и исходящего трафика сервера. Далее создадим файл конфигурации для сервера WireGuard и определим частные адреса IPv4 и IPv6 для использования между сервером WireGuard и подключаемыми клиентами.
Шаг 2.1: IPv4
Серверу нужно задать частные адреса IPv4 для использования клиентами и туннельным интерфейсом. Вы можете выбрать любой диапазон IP-адресов из следующих зарезервированных блоков адресов (RFC 1918):
от 10.0.0.0 до 10.255.255.255 (префикс 10/8) от 172.16.0.0 до 172.31.255.255 (префикс 172.16/12) от 192.168.0.0 до 192.168.255.255 (префикс 192.168/16)
Я буду использовать 10.13.13.0/24. Этот диапазон допускает до 255 различных одноранговых подключений, вы можете выбрать другой диапазон адресов, который работает с конфигурацией вашей сети. Сервер WireGuard будет использовать один IP-адрес из диапазона для своего IPv4-адреса частного туннеля. Здесь мы будем использовать 10.13.13.1/24, но можно использовать любой адрес в диапазоне от 10.13.13.1 до 10.13.13.255.
Шаг 2.2: IPv6
Если вы используете WireGuard с IPv6, вам потребуется сгенерировать уникальный локальный префикс индивидуального адреса IPv6 на основе алгоритма RFC 4193. Адреса, которые вы используете с WireGuard, будут связаны с интерфейсом виртуального туннеля. Вам нужно будет выполнить несколько шагов, чтобы сгенерировать случайный уникальный префикс IPv6 в зарезервированном блоке частных IPv6-адресов fd00::/8.
Согласно RFC , рекомендуемый способ получения уникального префикса IPv6 — объединить время суток с уникальным идентификационным значением из системы, таким как серийный номер или идентификатор устройства. Затем эти значения хэшируются и усекаются, в результате чего получается набор битов, который можно использовать в качестве уникального адреса в зарезервированном частном блоке IP-адресов fd00::/8.
Чтобы начать генерировать диапазон IPv6 для вашего сервера WireGuard, соберите 64-битную метку времени с помощью утилиты даты с помощью следующей команды:
date +%s%N
Вы получите число, подобное следующему, которое представляет собой количество секунд (%s в команде даты) и наносекунд (%N) с 1970-01-01 00:00:00 UTC вместе взятых: 1655653358607803610.
Запишите значение где-нибудь для использования позже в этом разделе. Затем скопируйте значение идентификатора машины для вашего сервера из файла /var/lib/dbus/machine-id. Этот идентификатор уникален для вашей системы и не должен изменяться, пока существует сервер.
cat /var/lib/dbus/machine-id 20096c25853947c7aeee2ca1ea849d7d
Теперь вам нужно объединить метку времени с идентификатором машины и хэшировать полученное значение с помощью алгоритма SHA-1. Команда будет использовать следующий формат:
printf 162810135212759219720086c25853947c7aeee2ca1ea849d7d | sha1sum 4f267c51857d6dc93a0bca107bca2f0d86fac3bc -
Обратите внимание, что выходные данные команды sha1sum представлены в шестнадцатеричном формате, поэтому в выходных данных используются два символа для представления одного байта данных. Например, 4f и 26 в выходных данных примера — это первые два байта хешированных данных.
Алгоритм в RFC требует только младших значащих (завершающих) 40 бит или 5 байтов хэшированного вывода. Используйте команду cut для печати последних 5 байтов в шестнадцатеричной кодировке из хэша:
printf 4f267c51857d6dc93a0bca107bca2f0d86fac3bc | cut -c 31- 0d86fac3bc
Получим данных набор байтов: 0d 86 fa c3 bc.
Теперь вы можете создать свой уникальный сетевой префикс IPv6, добавив к сгенерированным вами 5 байтам префикс fd, разделяя каждые 2 байта двоеточием : для удобства чтения. Поскольку каждая подсеть в вашем уникальном префиксе может содержать в общей сложности 18 446 744 073 709 551 616 возможных IPv6-адресов, для простоты вы можете ограничить подсеть стандартным размером /64.
Используя байты, ранее сгенерированные с размером подсети /64, результирующий префикс будет следующим:
Unique Local IPv6 Address Prefix fd0d:86fa:c3bc::/64
Этот диапазон fd0d:86fa:c3bc::/64 — это то, что вы будете использовать для назначения индивидуальных IP-адресов вашим туннельным интерфейсам WireGuard на сервере и одноранговых узлах. Чтобы выделить IP для сервера, добавьте 1 после последних символов . Результирующий адрес будет fd0d:86fa:c3bc::1/64. Одноранговые узлы могут использовать любой IP-адрес в диапазоне, но обычно вы увеличиваете значение на единицу каждый раз, когда добавляете одноранговый узел, например. fd0d:86fa:c3bc::2/64. Запишите IP-адрес и продолжите настройку сервера WireGuard в следующем разделе этого руководства.
Шаг 3: Создание конфигурации сервера WireGuard
Как писал выше, использовать будем сеть 10.13.13.0/24.
Создадим файл конфигурации сервера WireGuard, с таким содержимым:
[Interface] PrivateKey = base64_encoded_private_key_goes_here Address = 10.13.13.1/24 ListenPort = 51820 SaveConfig = true
Строка SaveConfig гарантирует, что при выключении интерфейса WireGuard любые изменения будут сохранены в файле конфигурации.
Сохраните и закройте файл /etc/wireguard/wg0.conf. Теперь у вас есть первоначальная конфигурация сервера, которую вы можете использовать в зависимости от того, как вы планируете использовать свой VPN-сервер WireGuard.
Шаг 4: Настройка сетевой конфигурации сервера WireGuard
Если вы используете WireGuard только для подключения вашего компьютера к серверу WireGuard, чтобы получить доступ только к службам на сервере, вам не нужно использовать этот раздел. Если вы хотите направить интернет-трафик вашего узла WireGuard Peer через сервер WireGuard, вам необходимо настроить IP-переадресацию.
Аналогичный настройки создается для любой реализации VPN, например OpenVPN.
Чтобы настроить переадресацию, откройте файл /etc/sysctl.conf с помощью nano или другого редактора. Если вы используете IPv4 с WireGuard, добавьте следующую строку внизу файла:
net.ipv4.ip_forward=1
Если вы используете IPv6 с WireGuard, добавьте эту строку внизу файла:
net.ipv6.conf.all.forwarding=1
Если вы используете и IPv4, и IPv6, убедитесь, что вы включили обе строки. Сохраните и закройте файл, когда закончите.
Чтобы применить новые значения для текущего сеанса терминала, запустите:
sysctl -p
Теперь WireGuard Server умеет перенаправлять входящий трафик с виртуального VPN-устройства Ethernet на другие устройства на сервере, а оттуда — в общедоступный Интернет. Использование этой конфигурации позволит вам направлять весь веб-трафик от вашего узла WireGuard через IP-адрес вашего сервера, а общедоступный IP-адрес вашего клиента будет эффективно скрыт.
Шаг 5: Настройка маршрутизации и фаервола
Прежде чем трафик сможет правильно маршрутизироваться через ваш сервер WireGuard, вам необходимо настроить правила брандмауэра для правильного прохождения трафика к вашему серверу WireGuard и другим узлам и от них.
Чтобы разрешить трафик WireGuard VPN через брандмауэр сервера, вам необходимо включить в iptables динамическую трансляцию сетевых адресов (NAT), для правильной маршрутизации клиентских подключений.
Сначала найдите общедоступный сетевой интерфейс вашего сервера WireGuard, используя команду ip route, в моем случае это ens3:
ip route list default default via 45.67.34.1 dev ens3 onlink
Внизу файла после строки SaveConfig = true вставьте следующие строки:
/etc/wireguard/wg0.conf . . . PostUp = ufw route allow in on wg0 out on ens3 PostUp = iptables -t nat -I POSTROUTING -o ens3 -j MASQUERADE PostUp = ip6tables -t nat -I POSTROUTING -o ens3 -j MASQUERADE PreDown = ufw route delete allow in on wg0 out on ens3 PreDown = iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE PreDown = ip6tables -t nat -D POSTROUTING -o ens3 -j MASQUERADE
Команды в директивах PostUp будут выполняться, когда сервер WireGuard запустит виртуальный VPN-туннель. В приведенном здесь примере он добавит три правила ufw и iptables.
Правила PreDown запускаются, когда сервер WireGuard останавливает виртуальный VPN-туннель. Эти правила обратны правилам PostUp и отменяют правила пересылки и маскировки для интерфейса VPN, когда VPN останавливается.
Последней частью настройки брандмауэра на вашем сервере WireGuard является разрешение входящего и исходящего трафика через порт WireGuard UDP. Если вы не изменили порт в файле сервера /etc/wireguard/wg0.conf, вы откроете порт 51820. Если вы выбрали другой порт при редактировании конфигурации, обязательно замените его в следующей команде Настройка правил фаервола (iptables) с помощью UFW. Также не забываем открывать открыть порт SSH, как указано во второй строке.
ufw allow 51820/udp ufw allow OpenSSH
После добавления этих правил отключите и снова включите UFW, чтобы перезапустить его и загрузить изменения из всех файлов, которые вы изменили:
ufw disable ufw enable
Вы можете убедиться, что правила действуют, выполнив команду ufw status. Запустите его, и вы должны получить вывод, подобный следующему:
ufw status verbose Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), deny (routed) New profiles: skip To Action From -- ------ ---- 22/tcp (OpenSSH) ALLOW IN Anywhere 51820/udp ALLOW IN Anywhere 22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6) 51820/udp (v6) ALLOW IN Anywhere (v6)
Теперь сервер WireGuard настроен на правильную обработку трафика VPN, включая переадресацию и маскарадинг (NAT).
Шаг 6: Запуск сервера WireGuard
Для автоматического запуска сервера WireGuard нужно включите сервис wg-quick для туннеля wg0, который мы определили ранее:
systemctl enable wg-quick@wg0.service
Обратите внимание, что команда указывает имя устройства туннеля wg0 как часть имени службы. Это имя соответствует файлу конфигурации /etc/wireguard/wg0.conf. Такой подход к именованию означает, что вы можете создать столько отдельных VPN-туннелей, сколько захотите, используя свой сервер.
Например, у вас может быть туннельное устройство и имя продукта, а его файл конфигурации будет /etc/wireguard/server2.conf. Каждая конфигурация туннеля может содержать различные настройки IPv4, IPv6 и клиентского брандмауэра. Таким образом, вы можете поддерживать несколько различных одноранговых соединений, каждое из которых имеет свои уникальные IP-адреса и правила маршрутизации.
systemctl start wg-quick@wg0.service
Шаг 7: Настройка клиентов
Инструкции по установке для всех поддерживаемых платформ доступны по адресу https://wireguard.com/install/.
Шаг 7.1: Windows
Загрузите и установите пакет для Windows с веб-сайта WireGuard.
После установки откройте приложение WireGuard и нажмите «Добавить туннель» → «Добавить пустой туннель…»
Будет автоматически создана пара ключей.
Задайте имя туннеля и отредактируйте конфигурацию следующим образом:
[Interface] PrivateKey = CLIENT_PRIVATE_KEY Address = 10.13.13.2/24 [Peer] PublicKey = SERVER_PUBLIC_KEY Endpoint = SERVER_IP_ADDRESS:51820 AllowedIPs = 0.0.0.0/0
В разделе Interface добавьте новую строку c IP адресом клиента.
В одноранговом разделе Peer добавьте следующие поля:
PublicKey — открытый ключ сервера Ubuntu (файл /etc/wireguard/publickey).
Конечная точка — IP-адрес сервера Ubuntu с двоеточием и порт WireGuard (51820).
AllowedIPs (Разрешенные IP-адреса)- список разрешенных подсетей. Можно указывать каждую сеть через запятую, а можно несколько раз указать это поле. В параметре AllowedIPs задаются адреса, маршрутизация к которым будет осуществляться через VPN-интерфейс.
После этого нажмите кнопку «Сохранить».
Обратите внимание на строку «AllowedIPs = 0.0.0.0/0» — в данной конфигурации весь трафик будет маршрутизироваться через VPN-адаптер. Это может понадобиться для сокрытия реального IP при работе в интернет или для защиты трафика при подключении к недоверенным сетям (например публичные Wi-Fi точки доступа). В этом случае указываем «DNS = 8.8.8.8» (8.8.8.8 — DNS -сервер Google), чтобы DNS -запросы выполнялись через защищенное VPN-соединение.
Если VPN-туннель необходим только для доступа к LAN 192.168.100.0/24 — убираем строчку «DNS = 8.8.8.8» и в параметре AllowedIPs меняем «0.0.0.0/0» на «10.0.0.0/24, 192.168.100.0/24».
Последний шаг — добавить на сервер открытый ключ и IP-адрес клиента. Для этого запустите на сервере Ubuntu следующую команду:
sudo wg set wg0 peer CLIENT_PUBLIC_KEY allowed-ips 10.13.13.2 Обязательно измените CLIENT_PUBLIC_KEY на открытый ключ. Пользователи Windows могут скопировать открытый ключ из приложения WireGuard.
После этого вернитесь на клиентский компьютер и запустите подключение.
Шаг 7.2: Linux Ubuntu Debian
sudo apt install wireguard
После этого создайте файл конфигурации клиента
nano /etc/wireguard/wg0.conf
Для запуска соединения введите следующую команду:
sudo wg-quick up wg0
Как ограничить количество подключений на один ключ в WireGuard сервере?
Ограничение делается при помощи ip адресов при помощи беcклассовой адресации CIDR.
Конфиг wg0.conf на сервере:
[Peer] PublicKey = publickey peer1> AllowedIPs = 10.0.0.2/30
Вместо AllowedIPs = 10.0.0.2/32 можно сделать AllowedIPs = 10.0.0.2/30. В конфиге клиента прописать:
[Interface] PrivateKey = privatekey peer 1> Address = 10.0.0.2/30
В этом примере разрешено подключение 4 устройств.
Wireguard debug
wg show all dump
Заключение
Как много разных VPN в мире. В это руководстве разобрали ручную установку VPN WireGuard. По мере использования статья будет обновляться.
11 Самых Популярных Статей
- ulimit (limits.conf) управление ограничениями ресурсов ОС Linux
- 7 способов сравнения файлов по содержимому в Windows или Linux
- Что такое страны tier 1,2,3 и как правильно выбрать ГЕО для рекламной кампании
- Настройка, использование GitLab CI/CD
- Что означает «> /dev/null 2>&1» или перенаправление STDIN, STDOUT и STDERR?
- Настройка и использование сервера OpenVPN в Linux
- PostgreSQL: создать БД, пользователя, таблицу, установить права
- Виды кодировок символов
- Использование rsync в примерах
- my.cnf примеры конфигурации MySQL, MariaDB
- dig проверка DNS сервера
11 Самых Популярных Обзоров
- ТОП 4 лучших антидетект браузеров в 2023 (Бесплатные & Платные)
- Обзор и отзывы о Namecheap в 2023 году
- Хостинг Zomro (Зомро)
- Обзор браузера Dolphin
- ТОП 3 Проверенных VPN, Прокси, Хостинг VPS Турция в 2023
- Что такое абузоустойчивый хостинг (bulletproof)?
- Обзор и отзывы о 4VPS (FourServer) в 2023 году
- Обзор и отзывы AstroProxy в 2023 году
- Обзор и отзывы о PQ Hosting в 2023 году
- Обзор и отзывы о Hostinger в 2023 году: преимущества и недостатки
- Проверенные VPS / VDS хостинг провайдеры
Как настроить WireGuard, ваш собственный VPN нового века
WireGuard — это новый, надёжный и легковесный VPN-протокол. Мы рассмотрим пошаговую процедуру настройки клиентов и сервера WireGuard в облаке и на домашнем роутере для защиты, например, подключений к публичным точкам доступа Wi-Fi
⇣ Содержание
- Что такое WireGuard и зачем он нужен?
- Подготовка
- Настройка сервера Vscale
- Настройка VPN-сервера WireGuard
- Настройка VPN-клиента WireGuard
- Настройка WireGuard для Keenetic: сервер и мобильный клиент
- Послесловие
Напоминаем, что все действия, описанные в статье, пользователь делает на свой страх и риск. Материал приведен исключительно в ознакомительных целях. Если же вы собираетесь воспроизводить действия, описанные ниже, настоятельно советуем внимательно прочитать статью до конца хотя бы один раз. Редакция 3DNews не несет никакой ответственности за любые возможные последствия.
⇡#Что такое WireGuard и зачем он нужен?
WireGuard — это современный протокол для организации VPN, написанный с нуля, бесплатный и с открытыми исходниками. В отличие от «мастодонтов» вроде OpenVPN или IPSec, он намного проще и легче. Это касается и скорости (пере)подключения, и производительности, и требований к ресурсам, и процесса настройки, и объёма кода. Недавно было объявлено, что WireGuard войдёт в состав будущих ядер Linux, а впоследствии попадёт и во все популярные дистрибутивы, что косвенно указывает на зрелость этого решения.
Как и было заявлено в анонсе, мы рассматриваем сценарий защиты подключения к публичным и другим недоверенным сетям. Естественно, этим использование WireGuard не ограничивается. В качестве примера рассмотрим настройку клиентов и сервера (правда, в данном случае это условные понятия — в силу специфики протокола), работающего в облаке и на домашнем роутере Keenetic. Как показывает практика, многие публичные VPN-сервисы не отличаются щепетильностью в отношении данных клиентов, поэтому всегда лучше иметь что-то своё, подконтрольное только пользователю. В нашем случае мы рассматриваем установку и настройку WireGuard, используя для этого компьютер на Windows и облачную виртуальную машину на Ubuntu.
Нам понадобится полный набор PuTTY, так что лучше скачать сразу MSI-пакет с инсталлятором (доступен по предыдущей ссылке), который всё установит и создаст новую группу в главном меню. Там нам нужна утилита PuTTYgen. После запуска генерируем новую пару ключей с настройками по умолчанию (RSA-2048), нажав кнопку Generate и поводив с полминуты мышкой в окне утилиты. Осталось заполнить несколько полей: в Key comment можно ввести название ключа в качестве напоминания, а в Key passphrase и Confirm passphrase ввести один и тот же пароль.
Пароль этот ещё пригодится, так что его надо запомнить или сохранить в надёжном месте. Далее в PuTTYgen сохраняем по отдельности приватный (Save private key, файл .ppk) и публичный (Save public key) ключи. Если планируется использовать несколько облачных провайдеров, то для каждого из них, а лучше и для каждого сервера, использовать собственные ключи.
⇡#Настройка сервера Vscale
Vscale — российский облачный провайдер, имеющий собственные площадки в Москве и Санкт-Петербурге и предлагающий неплохие конфигурации по низким ценам. Самый дешёвый сервер, мощностей которого вполне достаточно для наших задач, обойдётся в 200 руб./месяц. Хранение снапшота стоит ещё 40 руб./месяц. И его тоже можно перенести из одного региона в другой. Зато никаких ограничений по трафику нет.
Специально для читателей 3DNews Vscale подготовила промокод 3DNEWS500, чтобы можно было ознакомиться со всеми возможностями сервиса. После регистрации надо пополнить баланс хотя бы на 100 рублей или привязать банковскую карту. Затем промокод надо активировать на этой странице. Код будет действовать до 23:59:59 18.02.2020.
Интерфейс сервиса доступен на русском языке. Разобраться в нём просто, так что коротко опишем основные этапы. Для работы первым делом нужно в настройках аккаунта добавить публичный SSH-ключ, полученный в PuTTYgen. Затем в разделе серверов создать новый сервер с ОС Ubuntu 18.04, указав нужный регион, тариф и ключ. В течение минуты сервер будет готов и запущен.
Отдельного SSH-клиента для доступа к командной строке не требуется, так как Vscale предоставляет веб-консоль. Для входа вводим логин root и нажимаем Enter, далее по одной вводим нижеприведённые команды и на всё соглашаемся, нажимая Enter:
apt-get update
apt-get upgrade
apt-get install software-properties-common
add-apt-repository ppa:wireguard/wireguard
apt-get update
apt-get install wireguard-dkms linux-headers-$(uname -r)
Пара замечаний на случай использования других облачных провайдеров. Во-первых, для Ubuntu 19.10 и более свежих версий ОС добавлять ppa не надо, достаточно будет первых двух команд. Во-вторых, доступ к командной строке возможен с помощью PuTTY. В поле Host Name надо ввести IP-адрес сервера, а в разделе Connection → SSH → Auth — путь до приватного ppk-ключа. Логин root, а пароль тот, что был указан при создании ключа (Key passphrase). Для удобства можно сохранить сессию (Save). По нажатии кнопки Open откроется окно консоли, при первом запуске предваряемое уведомлением о безопасности, с которым надо согласиться.
Обратите внимание, что даже за выключенным сервером сохраняются ресурсы, которые точно так же оплачиваются. Поэтому ненужный сервер надо удалять. Если VPN необходим не на постоянной основе, а лишь иногда, то можно сохранить все настройки, создав снапшот (бэкап). Сам снапшот можно перенести в другой регион и при создании нового сервера выбрать именно его в качестве основы. Создавать снапшот надо строго после завершения настройки VPN-сервера и весьма желательной в этом случае установки DDNS-клиента, выключив сервер непосредственно перед созданием бэкапа.
⇡#Настройка VPN-сервера WireGuard
Для настройки сервера WireGuard не будем мудрствовать лукаво, а воспользуемся открытым решением easy-wg-quick. Данный скрипт автоматически формирует файлы конфигурации и позволяет легко манипулировать настройками. Предварительно надо установить сам wireguard и некоторые дополнительные утилиты. В веб-консоли Vscale или в PuTTY вводим следующие команды, нажимая Enter после каждой:
apt-get install wireguard-tools mawk grep iproute2 qrencode
wget https://raw.githubusercontent.com/burghardt/easy-wg-quick/master/easy-wg-quick
chmod +x easy-wg-quick
При первом запуске скрипт по умолчанию создаст конфигурационный файл для сервера и для одного клиента, а также выведет QR-код, который можно отсканировать в мобильном приложении WireGuard, чтобы тут же получить все необходимые настройки.
./easy-wg-quick
Чтобы добавить настройки ещё для одного клиента (ноутбука, например), надо ещё раз выполнить эту же команду, указав имя нового профиля:
./easy-wg-quick имя_профиля
Например, для имени профиля win10 будет создан соответствующий файл wgclient_win10.conf. Его содержимое можно просмотреть командой cat, что пригодится при настройке клиента WireGuard в будущем.
cat ./wgclient_win10.conf
После добавления всех нужных профилей осталось лишь добавить сервер WireGuard в автозапуск и включить его:
cp wghub.conf /etc/wireguard/wghub.conf
systemctl enable wg-quick@wghub
systemctl start wg-quick@wghub
Для просмотра текущих подключений используйте эту команду:
wg show
⇡#Настройка VPN-клиента WireGuard
Клиенты для Windows, Android, iOS и других ОС можно скачать на сайте WireGuard. С мобильными версиями всё просто — достаточно отсканировать QR-код. Или же, как и для всех остальных клиентов, вручную скопировать настройки из файлов wgclient_*.conf. Из дополнительных опций там есть только возможность исключить доступ через VPN для выбранных пользователем приложений: Excluded Applications в настройках профиля.
В случае Windows-клиента в меню левой нижней кнопки надо выбрать Add empty tunnel, вставить в новом окне всё содержимое conf-файла, указать имя профиля (Name). Опционально можно включить функцию kill-switch для блокировки любого трафика вне VPN-подключения. Наконец, надо сохранить (Save) и активировать (Activate) соединение. Для проверки корректности подключения проще всего зайти на какой-нибудь сайт, определяющий текущий внешний IP-адрес.
В актуальных моделях роутеров Keenetic с прошивкой версии 3.3 или старше также появилась поддержка VPN-подключений WireGuard — нужно установить одноимённый компонент. Чтобы импортировать настройки соединения, нужно сохранить содержимое файла wgclient_*.conf (см. выше) в текстовый документ, а затем в разделе «Другие подключения» загрузить параметры из этого файла. Роутер создаст на их основе новое подключение, которое нужно активировать переключателем в левой части списка.
Для корректной работы надо сделать несколько небольших изменений (кстати, после каждого действия не забывайте нажимать кнопку «Сохранить» в нижней части веб-интерфейса). Во-первых, включить галочку «Использовать для входа в Интернет». Во-вторых, поле «Разрешенные подсети» привести к виду 0.0.0.0/0. В-третьих, в разделе «Приоритеты подключений» перетащить свежесозданное подключение выше всех остальных.
После этого все клиенты, подключённые к роутеру, по умолчанию будут выходить в Интернет через VPN-туннель. Если же необходим доступ только для некоторых устройств, то лучше завести отдельный профиль.
Обратите внимание, что для каждого клиента нужно будет сгенерировать и скопировать собственный conf-файл. Если на предыдущем этапе вы настроили DDNS-клиент на сервере, то в разделе Endpoint у всех клиентов надо будет прописать DDNS-имя вместо IP-адреса.
⇡#Настройка WireGuard для Keenetic: сервер и мобильный клиент
В самом начале мы уже упоминали, что принципиального различия между сервером и клиентом в случае WireGuard нет. И раз уже поддержка этого протокола доступна в прошивке, то можно настроить подключение клиентов к роутеру. В текущей версии не все настройки вынесены в веб-интерфейс, но ничего сложного всё равно нет. Единственное требование — наличие «белого» внешнего IP-адреса, пусть даже динамического (в этом случае поможет DDNS).
В разделе «Другие подключения» в секции WireGuard нужно добавить новое подключение. Указываем имя (любое) и ставим галочку «Генерация ключей» (Generate a random key pair). В поле «Адрес» надо ввести любой подходящий адрес из частного диапазона, но такой, чтобы он не пересекался с другими сетями на самом роутере. В качестве примера используем 10.11.12.1/24. Номер порта можно указать произвольный, лишь бы он не блокировался провайдером и не совпадал с уже открытыми портами для других сервисов. В нашем примере это 55555. Наконец, в поле DNS надо указать адрес любого публичного DNS-сервера.
Следующий этап — добавление пиров (клиентов) соответствующей кнопкой. Имя указываем любое, а в поле «Разрешённые подсети» вводим 0.0.0.0/0. Теперь открываем на смартфоне мобильное приложение WireGuard и добавляем новое подключение — Create from scratch. В разделе Interface указываем имя (любое) и жмём кнопку Generate. Содержимое поля Public Key копируем и вставляем в настройках пира на роутере в поле «Публичный ключ». В поле Addresses указываем частный IP-адрес из той же подсети, что и для роутера. В нашем примере у него был 10.11.12.1/24, так что для клиента возьмём просто следующий: 10.11.12.2/24. DNS опять же любой публичный.
В разделе Peers в поле Public keys копируем содержимое поля «Публичный ключ» роутера, в Allowed IPs вводим 0.0.0.0/0, а в Endpoint вводим внешний IP-адрес роутера (или DDNS-имя) и порт через двоеточие, то есть для нашего примера должна получиться конструкция вида xx.xx.xx.xx:55555. Опционально можно включить функцию поддержки активности подключения, указав время в секундах в поле Persistent keepalive на клиенте и в поле «Проверка активности» в параметрах пира на роутере. Обычно достаточно интервала от 3 до 30 секунд. Для остальных клиентов придётся повторить эту же процедуру добавления новых пиров.
Но это ещё не всё. После добавления пиров необходимо разрешить им доступ в локальную сеть и в Интернет. В разделе «Межсетевой экран» надо найти WireGuard-подключение — ориентируйтесь по имени, оно может быть в выпадающем меню сверху — и завести для него новое разрешающее правило (см. скриншот выше). Также надо будет подключиться к роутеру по telnet с помощью PuTTY и ввести несколько команд. Адрес по умолчанию my.keenetic.net, логин и пароль те же, что для доступа к веб-интерфейсу, команды приведены ниже:
interface Wireguard0 security-level private
ip nat Wireguard0
system configuration save
Наконец, после всех этих действий надо активировать WireGuard-соединение. Если всё прошло успешно, то после подключения клиента напротив пира будет гореть зелёный кружочек и показываться статистика по трафику. Только учтите, что производительность роутера всё-таки намного меньше, чем у любого облачного сервера. Так что приличную скорость соединения он обеспечит ценой нагрузки на CPU маршрутизатора, что может повлиять на работу других сервисов.
Напоследок напомним «народную» мудрость: на VPN надейся, а сам не плошай. Проще говоря, надо всегда соблюдать осторожность и цифровую гигиену. К совсем уж подозрительным сетям и вовсе подключаться не надо, да и про базовые правила забывать не стоит. Их не так уж много: вовремя ставить обновления ОС и ПО, использовать двухфакторную аутентификацию, тщательно выбирать используемые программы, проверять разумность запросов ПО на доступ к различным ресурсам устройства, обзавестись современным антивирусом. Всё это касается и смартфонов, и планшетов, и ноутбуков, и десктопов.