- WireGuard - VPN-протокол, встроенный в ядро Linux с версии 5.6: на VPS с Ubuntu или Debian он ставится командой
sudo apt install wireguardи настраивается одним файлом/etc/wireguard/wg0.conf. - Сервер WireGuard по умолчанию слушает UDP-порт 51820; в файрволе открывают только его -
sudo ufw allow 51820/udp. - Чтобы весь трафик клиента шёл через VPS, на сервере включают
net.ipv4.ip_forward=1и NAT (iptables MASQUERADE), а в конфиге клиента указываютAllowedIPs = 0.0.0.0/0. - Конфиг WireGuard переносится на телефон QR-кодом:
qrencode -t ansiutf8 < phone.confрисует код прямо в терминале, его сканирует официальное приложение WireGuard. - Личному VPN на одного-двух человек хватает VPS с 1 vCPU и 2 ГБ памяти - на Tihost такой сервер стоит $4.00 в месяц.
Зачем свой VPN на VPS
- Защищённое подключение в публичных Wi-Fi - в кафе, отеле или аэропорту весь трафик идёт до вашего сервера в зашифрованном туннеле;
- доступ к своим сервисам - админки, базы данных и мониторинг можно закрыть от интернета и открыть только для адресов VPN-сети
10.8.0.0/24; - доступ к домашней сети - домашний роутер или мини-сервер подключается к тому же VPS как ещё один клиент, и вы достаёте до него из любой точки;
- фиксированный IP - в белые списки рабочих систем, панелей и файрволов достаточно добавить один публичный IPv4-адрес сервера.
WireGuard проще OpenVPN и IPsec: конфиг занимает десяток строк, ключи - короткие строки, как в SSH, а соединение восстанавливается само при смене сети, например при переходе с Wi-Fi на мобильный интернет. Подробности о протоколе - на wireguard.com.
Какой сервер нужен для WireGuard
WireGuard работает в ядре и почти не нагружает процессор, поэтому для одного-двух человек хватает младшей конфигурации Starter - 1 vCPU и 2 ГБ памяти за $4.00 в месяц. Важно, чтобы VPS был на полной виртуализации KVM со своим ядром - на Tihost это так. Локацию выбирайте ближе к себе: чем меньше задержка до сервера, тем незаметнее VPN. Как сравнить Германию, Финляндию и Польшу - в статье о выборе локации VPS.
Шаг 1. Установите WireGuard
Пакет wireguard ставит утилиты wg и wg-quick, qrencode понадобится для QR-кода, а iptables - для NAT (в минимальной установке Debian 12 его может не быть):
sudo apt update
sudo apt install -y wireguard qrencode iptablesШаг 2. Сгенерируйте ключи сервера и клиента
У каждого участника туннеля - пара ключей: закрытый (private) хранится только у него, открытый (public) отдаётся другой стороне. umask 077 делает новые файлы доступными только root. Последняя команда выводит ключи - они понадобятся в конфигах:
sudo -i
cd /etc/wireguard
umask 077
wg genkey | tee server.key | wg pubkey > server.pub
wg genkey | tee phone.key | wg pubkey > phone.pub
cat server.key server.pub phone.key phone.pubШаг 3. Создайте конфиг сервера wg0.conf
Сначала узнайте имя внешнего сетевого интерфейса - оно стоит после слова dev в маршруте по умолчанию. Часто это eth0 или ens3:
ip route list default
# default via 203.0.113.1 dev eth0 proto staticСоздайте файл /etc/wireguard/wg0.conf и подставьте ключи. Если интерфейс называется не eth0, замените его в строках PostUp и PostDown. PostUp при старте туннеля разрешает пересылку пакетов и включает NAT (MASQUERADE) - клиенты выходят в интернет с IP сервера, PostDown убирает эти правила при остановке:
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <содержимое server.key>
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
# телефон
PublicKey = <содержимое phone.pub>
AllowedIPs = 10.8.0.2/32Шаг 4. Включите пересылку пакетов
По умолчанию Linux не пересылает пакеты между интерфейсами, и трафик клиента дальше сервера не пойдёт. Параметр net.ipv4.ip_forward=1 включает пересылку, а файл в /etc/sysctl.d/ сохраняет её после перезагрузки:
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl -p /etc/sysctl.d/99-wireguard.confШаг 5. Откройте порт 51820/udp
WireGuard работает по UDP, и снаружи серверу нужен только порт из ListenPort. WireGuard не отвечает на пакеты без правильного ключа, поэтому сканер портов не увидит, что на сервере работает VPN:
sudo ufw allow 51820/udp
sudo ufw statusШаг 6. Запустите туннель
wg-quick@wg0 - сервис systemd, который поднимает интерфейс wg0 из конфига и включается при загрузке сервера. wg show должен показать интерфейс, порт 51820 и одного пира (peer) - телефон:
sudo systemctl enable --now wg-quick@wg0
sudo wg showШаг 7. Подготовьте конфиг клиента
Конфиг клиента - зеркало серверного: свой закрытый ключ, открытый ключ сервера и его адрес в Endpoint (подставьте IP своего VPS). AllowedIPs = 0.0.0.0/0 отправляет в туннель весь IPv4-трафик, DNS задаёт DNS-сервер на время подключения, а PersistentKeepalive = 25 раз в 25 секунд шлёт пакет, чтобы соединение не обрывалось за NAT домашнего роутера или оператора:
[Interface]
PrivateKey = <содержимое phone.key>
Address = 10.8.0.2/32
DNS = 1.1.1.1
[Peer]
PublicKey = <содержимое server.pub>
Endpoint = 203.0.113.10:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25Если VPN нужен только для доступа к своим сервисам, а не для всего трафика, укажите AllowedIPs = 10.8.0.0/24 - тогда через туннель пойдут только адреса VPN-сети.
Шаг 8. Перенесите конфиг на телефон QR-кодом
Сохраните конфиг клиента на сервере как /etc/wireguard/phone.conf и выведите его QR-кодом прямо в терминал. В приложении WireGuard для Android или iOS нажмите «+» и выберите сканирование QR-кода; на компьютере конфиг импортируется файлом:
sudo nano /etc/wireguard/phone.conf
sudo qrencode -t ansiutf8 < /etc/wireguard/phone.confШаг 9. Проверьте подключение
Включите туннель в приложении и выполните на сервере wg show: у пира должны появиться строки latest handshake с временем последнего рукопожатия и transfer с объёмом трафика. Любой сервис проверки IP на телефоне должен показать адрес вашего VPS:
sudo wg showЕсли рукопожатия нет, проверьте, что порт 51820/udp открыт в UFW, а в Endpoint указан правильный IP. Если рукопожатие есть, но сайты не открываются, - проверьте ip_forward и имя интерфейса в PostUp.
Как добавить ещё одно устройство
Для каждого устройства сгенерируйте свою пару ключей, допишите в wg0.conf новый блок [Peer] со следующим адресом (10.8.0.3/32, 10.8.0.4/32 и так далее) и перезапустите туннель. Один конфиг на несколько устройств не используйте: два клиента с одним ключом будут выбивать друг друга.
sudo nano /etc/wireguard/wg0.conf
sudo systemctl restart wg-quick@wg0AMD Ryzen 9, NVMe и защита от DDoS в Германии, Финляндии и Польше. Оплата криптовалютой или картой.
Частые вопросы
Какой порт использует WireGuard?
WireGuard по умолчанию использует UDP-порт 51820 - он задаётся параметром ListenPort в конфиге сервера. В файрволе открывают только этот порт: sudo ufw allow 51820/udp.
Сколько ресурсов нужно VPS для WireGuard?
WireGuard работает в ядре Linux и почти не нагружает сервер: личному VPN на несколько устройств хватает VPS с 1 vCPU и 2 ГБ памяти. На Tihost такая конфигурация стоит $4.00 в месяц.
Чем WireGuard отличается от OpenVPN?
WireGuard проще в настройке - конфиг на десяток строк и ключи как в SSH, работает в ядре Linux и быстро восстанавливает соединение при смене сети. OpenVPN старше, работает в пространстве пользователя и гибче в настройке, но сложнее.
Почему WireGuard подключился, но интернет не работает?
Чаще всего на сервере не включена пересылка пакетов (net.ipv4.ip_forward=1) или в правиле MASQUERADE указан не тот сетевой интерфейс. Имя интерфейса показывает команда ip route list default - оно стоит после слова dev.
Как подключить телефон к WireGuard?
Сохраните конфиг клиента на сервере и выполните qrencode -t ansiutf8 < phone.conf - в терминале появится QR-код. В приложении WireGuard для Android или iOS выберите добавление туннеля сканированием QR-кода.
Можно ли пускать через WireGuard только часть трафика?
Да. В конфиге клиента WireGuard укажите AllowedIPs = 10.8.0.0/24 вместо 0.0.0.0/0 - тогда через туннель пойдут только адреса VPN-сети, а остальной трафик - напрямую.