惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News and Events Feed by Topic
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
大猫的无限游戏
大猫的无限游戏
T
Tailwind CSS Blog
S
SegmentFault 最新的问题
V
V2EX
阮一峰的网络日志
阮一峰的网络日志
C
Cisco Blogs
博客园 - 叶小钗
P
Privacy International News Feed
Jina AI
Jina AI
Apple Machine Learning Research
Apple Machine Learning Research
T
Threatpost
IT之家
IT之家
博客园 - 聂微东
Know Your Adversary
Know Your Adversary
Help Net Security
Help Net Security
罗磊的独立博客
I
Intezer
S
Schneier on Security
博客园_首页
C
CERT Recently Published Vulnerability Notes
雷峰网
雷峰网
Cisco Talos Blog
Cisco Talos Blog
宝玉的分享
宝玉的分享
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Webroot Blog
Webroot Blog
TaoSecurity Blog
TaoSecurity Blog
MyScale Blog
MyScale Blog
P
Privacy & Cybersecurity Law Blog
T
The Exploit Database - CXSecurity.com
PCI Perspectives
PCI Perspectives
Security Latest
Security Latest
H
Heimdal Security Blog
S
Secure Thoughts
Hacker News: Ask HN
Hacker News: Ask HN
Y
Y Combinator Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Microsoft Security Blog
Microsoft Security Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
SecWiki News
SecWiki News
The GitHub Blog
The GitHub Blog
A
Arctic Wolf
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
T
Threat Research - Cisco Blogs
Engineering at Meta
Engineering at Meta
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
WireGuard: простота и надёжность современного VPN-туннеля или секретное рукопожатие в тёмной комнате
noise_floor · 2026-05-22 · via Все публикации подряд на Хабре

Уровень сложностиПростой

Время на прочтение7 мин

Охват и читатели312

Туториал

Было бы неверным рассматривать WireGuard только как средство для обхода блокировок. Однако без этого свойства его тоже рассмотреть не получится. Сегодня я порассуждаю о безопасности связи с внешним миром, и соберу в одном месте полную пошаговую инструкцию по развёртыванию.

Дисклеймер, граждане. Не проходите мимо.

Данная статья носит исключительно образовательный и исследовательский характер. Автор рассматривает WireGuard как инструмент построения защищённых каналов связи для корпоративной инфраструктуры, удалённой работы и защиты персональных данных в небезопасных сетях.

Развёртывание личного VPN-сервера, описанное ниже, предназначено для законных целей: объединение офисов, защита трафика в публичном Wi-Fi, доступ к домашним устройствам. Автор не призывает к использованию технологии для получения доступа к информации, распространение которой ограничено на территории Российской Федерации, и напоминает, что ответственность за использование VPN лежит на конечном пользователе в соответствии с действующим законодательством.

WireGuard - протокол защищенного туннелирования, реализованный как виртуальный сетевой интерфейс в ядре Linux. Отмечу отдельно, что в ядре Linux 5.6+ версии, поскольку официально он добавлен только в 2020 году. В версиях до 5.6 его придётся компилировать отдельно самостоятельно. Для своих практических целей, рассматриваю Debian 12 с ядром 6.1LTS, где также добавлены оптимизации WireGuard (GSO — Generic Segmentation Offload, GRO — Generic Receive Offload). Поскольку материал имеет практическую направленность, то сразу о том, что я использовал при подготовке этой статьи: VPS 1CPU 3,3 ГГц, 1ГБ RAM, ПЗУ 15 ГБ NVMe с системой Debian 12.

Стоит отметить, что даже такая скромная начинка VPS позволяет развернуть достойную по количеству и качеству сеть. В этом скрывается первый жирный плюс WireGuard. В отличие от OpenVPN и IPSec, WireGuard не является отдельным приложением, поэтому потребление ресурсов более чем очень скромное. Система рассчитана на хорошее масштабирование. Каждый отдельный клиент - пир не займет более нескольких килобайт памяти. Примерно 1,5–1,9 КБ на одного подключенного пира для версий ядра 2021 года и новее. Процесс подключения и удержания связи выглядит, как HANDSHAKE, и далее каждые 2-3 минуты ротация сессионных ключей (если идёт трафик), в отсутствии трафика ничего не происходит.

Статистика нагрузки на сервер с WireGuard в течении суток при 8 -12 активных пользователях (устройств). Оперативную память, в основном, ест система и Docker-контейнер

Статистика нагрузки на сервер с WireGuard в течении суток при 8 -12 активных пользователях (устройств). Оперативную память, в основном, ест система и Docker-контейнер

Предлагаю вам, дорогие читатели, изучить материал патча: Linux-Kernel Archive: [PATCH 5.10 660/663] wireguard: queueing: get rid of per-peer ring buffers, где Джейсон Доненфельд сам описывает плюсы и минусы перехода от рингбуфферов к очередям на основе списков. Основная идея - сократить выделение памяти. Короткая цитата:

Джейсон А. Доненфельд <Jason@xxxxxxxxx>  Пн 01 мар 2021

Наличие двух буферов кольца на одного пиринга означает, что каждый узел приводит к двум огромным распределениям колец. На восьмиядерной x86_64-машине этот коммит сокращает выделение на одного пиринга с 18 688 байт до 1 856 байт, что составляет сокращение на 90%. Девяносто процентов! При некоторых развертываниях на одной машине , приближающейся к 500 000 пиров, речь идёт о сокращении с 7 гигабайт памяти до 700 мегабайт.

Что с безопасностью?

Самая существенная часть. WireGuard позиционируется, в первую очередь, как криптопротокол. Это своего рода Кондом для посещений Интернета. VPN-туннель — лишь следствие того, как работает шифрование.

Вопрос традиционно вызывает споры между приверженцами OpenVPN, WireGuard. Везде, как водится, есть свои сильные и слабые стороны.

К преимуществам, к примеру, OpenVPN часто относят гибкость в выборе алгоритмов шифрования, но и это же является его недостатком. Сразу встаёт вопрос: каким должен быть стек? AES-256 или 128? или CHACHA? Да, для грамотной и корректной настройки нужны специалисты высокого класса. И для своих задач OpenVPN бывает действительно незаменим.

Однако именно заявленная простота - в этом и причина такой, можно сказать, рекламы WireGuard - открывает доступ огромному количеству пользователей к созданию собственной системы безопасности. Я не покупаю доступ к VPN у сторонних поставщиков, не доверяю открытым сетям. Мне важна сохранность моих персональных данных, ключей, логинов и пр.. Я сам арендую для себя сервак за копейки и гоню через него свой зашифрованный трафик.

Какое шифрование используется?

Это самому можно увидеть после установки WireGuard:

apt install wireguard -y 
modprobe wireguard && lsmod | grep wireguard

libchacha20poly1305
curve25519_x86_64
libcurve25519_generic

Для "рукопожатия" сервер использует общий секрет, вычисленный на основе приватных и публичных ключей.
Приватный и публичный ключи составляют криптографическую пару: публичный ключ математически выводится из приватного. Обратное вычисление невозможно, и в этом основа безопасности:

wg genkey | tee server_private.key | wg pubkey > server_public.key

ChaCha20 шифрует трафик сеансовыми ключами, которые вывела хэш-функция BLAKE2s из общего секрета. Пакеты трафика аутентифицируются Poly1305.

Ещё одна известная фича WireGuard — «стелс-режим».

Помимо того, что у протокола нет обязательной привязки к конкретным портам (51820 используется традиционно), найдя порт, не получится понять, что там. Как это работает?

При сканировании NMAP посылает тестовый пакет данных на порт, ожидая ответа. WireGuard, будучи криптопротоколом, пытается расшифровать этот пакет известными ему приватными ключами. Poly1305 проверяет аутентичность подписи — и поскольку данные мусорные, а подпись не соответствует содержимому, пакет молча отбрасывается без какого-либо ответа. NMAP фиксирует open|filtered. Что внутри — не ясно.

Разумеется, не всё так однобоко и великолепно, и не для всех сценариев WireGuard является рекомендуемым инструментом туннелирования. Предлагаю к прочтению перевод статьи с IPFire Майкла Тремера (он является явным сторонником IPsec) от 2020 года, размещенный на Хабре: Почему не стоит пользоваться WireGuard / Хабр от Data_center_MIRAN. Это иной взгляд на вопрос. Очень познавательно.

Действительно, WireGuard лишен многих полезных опций, которые кажутся базовыми при работе с туннелированием. На фоне IPsec и OpenVPN он выглядит словно авто в минимальной комплектации, где нет даже магнитолы. Протокол построен поверх UDP, и это одна из самых заметных проблем. Если в сети, где вы планируете работать, установлена блокировка UDP-трафика, то без костылей не обойтись (например, udp2raw, чтобы «завернуть» UDP-пакеты WireGuard в TCP-соединение), которые, впрочем, тоже могут не дать результата. РКН периодически уверенно кладёт WireGuard из-за невозможности маскировать UDP-трафик под HTTPS. Таким образом выходит, что основная "фишка" в легковесности протокола и быстрорукопожатности становится же ахиллесовой пятой.

Нет ни одного технического решения (думаю, это касается не только туннелирования), которое удовлетворило все запросы и всех запросчиков. Для повседневного использования, при всех присущих минусах и плюсах, я для себя выбрал WireGuard, как легкий и быстрый способ получить дополнительную безопасность. Более того, нет никакой необходимости арендовать сервер за рубежом (иностранный, разумеется, дороже (около 2500р/мес у меня). Для дополнительно шифрования трафика прекрасно подойдёт и отечественный.

Пора переходить к практической части.

Как развернуть эту конфетку?

На весь процесс, вместе с Docker и прочим, уйдёт не более часа при аккуратном выполнении.

Ниже собраны все команды и содержание конфигураций, чтобы их удобно было копировать. После них будут предоставлены необходимые инструкции.

Итак, мы арендовали серверное пространство. Открываем консоль и строчка за строчкой выполняем команды из списка. Одна команда (строчка) за один раз. Если надо с чем-то согласиться - со всем соглашаемся. Linux ерунды не предложит.

apt update && apt upgrade -y

apt install wireguard -y

modprobe wireguard && lsmod | grep wireguard

umask 077
wg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key

cat /etc/wireguard/server_private.key
cat /etc/wireguard/server_public.key

mkdir -p /etc/wireguard/clients
umask 077
wg genkey | tee /etc/wireguard/clients/peer_private.key | wg pubkey > /etc/wireguard/clients/peer_public.key

cat /etc/wireguard/clients/peer_private.key
cat /etc/wireguard/clients/peer_public.key

nano /etc/wireguard/wg0.conf

chmod 600 /etc/wireguard/wg0.conf

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

ip route get 1.1.1.1 | awk '{print $5; exit}'

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

apt install iptables-persistent -y

iptables -I INPUT -p udp --dport 51820 -j ACCEPT

netfilter-persistent save

nano /etc/wireguard/clients/peer.conf

cat /etc/wireguard/clients/peer.conf

Содержимое файла конфигурации wg0.conf:
После команды из 20й строчки списка выше откроется редактор, куда надо вставить эти данные (скопировать туда ключи, полученные во время генераций после команды из строки 8):

[Interface]
Address = 10.0.0.1/24
ListenPort = 51820 (можно любой, по вкусу, кроме зарезервированных)
PrivateKey = (приватный ключ Сервера)

[Peer]
PublicKey = (публичный ключ КЛИЕНТА)
AllowedIPs = 10.0.0.2/32

Содержимое peer.conf:
Аналогично wg0.conf после команды из 37й строчки (nano /etc/wireguard/clients/peer.conf)

[Interface]
Address = 10.0.0.2/32
PrivateKey = (здесь приватный ключ КЛИЕНТА)
DNS = 1.1.1.1

[Peer]
PublicKey = (здесь должен быть публичный ключ СЕРВЕРА)
Endpoint = (здесь должен быть ваш публичный IP)
AllowedIPs = 0.0.0.0/0

В примере DNS = 1.1.1.1 - Cloudflare. Можете для себя выбрать другой, например, Google 8.8.8.8 - тоже шустрый, однако Cloudflare не хранит логи, в отличии от Google, или AdGuard - 94.140.14.14, 94.140.15.15, который хорош для блокировки рекламы. Можете прописать даже два или более через запятую: DNS = 1.1.1.1, 8.8.8.8, 94.140.15.15. В сущности, DNS можно не указывать вовсе, тогда будет использоваться системный, но лучше так не делать.

Если вы дошли до этого места и правильно выполнили все команды в консоли, то поздравляю. Вы настроили WireGuard!

wg-quick up wg0 - запускаем интерфейс

wg show - проверяем. Если всё ОК, то мы увидим следующий вывод:

latest handshake: 5 seconds ago
transfer: 1.2 MiB received, 800 KiB sent

Всё работает!

systemctl enable wg-quick@wg0 - добавляем WireGuard в автозапуск на сервере, чтобы вручную не запускать при каждой перезагрузке VPS

На этом можно было бы остановиться. Но есть ещё одна маленькая деталь, которую хочется добавить, чтобы опыт взаимодействия с WireGuard был действительно приятным. Добавим веб-интерфейс для заведения новых пиров на сервер.

Сначала остановим сервер: wg-quick down wg0
Далее устанавливаем и проверяем Docker:

apt install docker.io docker-compose -y
systemctl enable --now docker
docker --version

docker run -d \
  --name=wg-easy \
  -e WG_HOST= ДОБАВЬТЕ СВОЙ ПУБЛИЧНЫЙ IP \
  -e PASSWORD= ПРИДУМАЙТЕ СВОЙ ПАРОЛЬ! \
  -e WG_DEFAULT_DNS=1.1.1.1 \
  -v ~/.wg-easy:/etc/wireguard \
  -p 51820:51820/udp \ 
  -p 51821:51821/tcp \
  --cap-add=NET_ADMIN \
  --cap-add=SYS_MODULE \
  --sysctl="net.ipv4.conf.all.src_valid_mark=1" \
  --sysctl="net.ipv4.ip_forward=1" \
  --restart unless-stopped \
  weejewel/wg-easy 

Обратите внимание, что конфиги Docker копируются скопом. Нужно добавить свой пароль, свой порт-UDP, если при настройке WireGuard вы установили не 51820

Далее открываем порт в фаерволе:

iptables -I INPUT -p tcp --dport 51821 -j ACCEPT
netfilter-persistent save

Всё! На этом точно всё. Проверяем. Заходим к себе в панель по адресу:
ваш_публичный_ip:tcp_порт_из_кофнигов_docker
(например: 145.145.145.145:51821),
вводим пароль из конфигов Docker и радуемся сами, а также радуем близких своим собственным VPN. За чудесный веб-интерфейс благодарим weejewel (Emile Nijssen)

Всем спасибо за внимание! С уважением @noise_floor .