Как получить «статический IP» для любого устройства
Многие пользователи сталкиваются с проблемой: провайдер выдаёт динамический IP или использует CGNAT, из-за чего невозможно принимать входящие подключения. Аренда статического IP стоит денег, а иногда вообще недоступна. Решение — поднять WireGuard VPN сервер на VPS с пробросом портов. В этой статье разберём, как настроить такой сервер и подключить к нему клиентов.
Зачем нужен WireGuard с пробросом портов
Существует множество сценариев, когда необходимо принимать входящие подключения на устройство, находящееся за NAT провайдера:
- Игровые серверы — хостинг Minecraft, CS2, Valheim и других игр на домашнем ПК
- Удалённый доступ — подключение к домашнему компьютеру по RDP, SSH или VNC
- Веб-разработка — демонстрация локальных проектов клиентам
- IoT и умный дом — доступ к камерам, контроллерам и датчикам извне
- Файловые серверы — FTP, SFTP, Nextcloud на домашнем NAS
- Мобильные прокси — организация входящих подключений к прокси-серверам на модемах
WireGuard идеально подходит для этой задачи благодаря высокой производительности, минимальным задержкам и простоте настройки. В отличие от OpenVPN, WireGuard работает на уровне ядра Linux и обеспечивает пропускную способность близкую к нативной.
Схема работы
Архитектура решения выглядит следующим образом:
Когда внешний клиент подключается к IP-адресу VPS на порт из диапазона 64000–64199, сервер перенаправляет трафик через WireGuard туннель на ваше устройство (10.8.0.2). Ваше приложение получает подключение так, будто клиент подключился напрямую.
Требования
Для сервера (VPS)
- VPS с публичным IP-адресом (подойдёт минимальный тариф от $3-5/мес)
- Ubuntu 20.04/22.04/24.04 или Debian 11/12
- Root-доступ
- Открытый UDP порт 51820 (для WireGuard)
- Открытые TCP/UDP порты для проброса (в нашем примере: 64000–64399)
Для клиента
- Любая ОС с поддержкой WireGuard: Windows, Linux, macOS, Android, iOS
- Установленный клиент WireGuard
Установка WireGuard на сервер
Подключитесь к серверу по SSH и выполните следующие команды:
1. Обновление системы
apt update && apt upgrade -y
2. Установка WireGuard
apt install wireguard wireguard-tools -y
3. Включение IP-форвардинга
Это критически важный шаг — без него проброс портов работать не будет:
# Включить немедленно
echo 1 > /proc/sys/net/ipv4/ip_forward
# Сделать постоянным после перезагрузки
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
4. Генерация ключей сервера
# Создаём директорию для конфигов (если её нет)
mkdir -p /etc/wireguard
cd /etc/wireguard
# Генерируем приватный и публичный ключи сервера
wg genkey | tee server_private.key | wg pubkey > server_public.key
# Устанавливаем безопасные права доступа
chmod 600 server_private.key
# Просмотр ключей
echo "Приватный ключ сервера:"
cat server_private.key
echo "Публичный ключ сервера:"
cat server_public.key
Важно: сохраните публичный ключ сервера — он понадобится для настройки клиентов.
5. Генерация ключей для клиентов
# Ключи для клиента 1
wg genkey | tee client1_private.key | wg pubkey > client1_public.key
# Ключи для клиента 2
wg genkey | tee client2_private.key | wg pubkey > client2_public.key
# Просмотр
echo "=== Клиент 1 ==="
echo "Приватный: $(cat client1_private.key)"
echo "Публичный: $(cat client1_public.key)"
echo "=== Клиент 2 ==="
echo "Приватный: $(cat client2_private.key)"
echo "Публичный: $(cat client2_public.key)"
Конфигурация сервера
Создайте файл конфигурации WireGuard:
nano /etc/wireguard/wg0.conf
Вставьте следующий конфиг, заменив ключи на свои:
[Interface]
# IP-адрес сервера в VPN-сети
Address = 10.8.0.1/24
# Порт для подключения клиентов
ListenPort = 51820
# Приватный ключ сервера (из файла server_private.key)
PrivateKey = ВАШ_ПРИВАТНЫЙ_КЛЮЧ_СЕРВЕРА
# Не перезаписывать конфиг при выключении
SaveConfig = false
# ============================================
# NAT для выхода клиентов в интернет
# ============================================
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
PostUp = iptables -A FORWARD -o wg0 -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -D FORWARD -o wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# ============================================
# Проброс портов для клиента 1 (10.8.0.2)
# Диапазон: 64000–64199 (200 портов)
# ============================================
# TCP
PostUp = iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 64000:64199 -j DNAT --to-destination 10.8.0.2
PostDown = iptables -t nat -D PREROUTING -i eth0 -p tcp --dport 64000:64199 -j DNAT --to-destination 10.8.0.2
# UDP
PostUp = iptables -t nat -A PREROUTING -i eth0 -p udp --dport 64000:64199 -j DNAT --to-destination 10.8.0.2
PostDown = iptables -t nat -D PREROUTING -i eth0 -p udp --dport 64000:64199 -j DNAT --to-destination 10.8.0.2
# ============================================
# Проброс портов для клиента 2 (10.8.0.3)
# Диапазон: 64200–64399 (200 портов)
# ============================================
# TCP
PostUp = iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 64200:64399 -j DNAT --to-destination 10.8.0.3
PostDown = iptables -t nat -D PREROUTING -i eth0 -p tcp --dport 64200:64399 -j DNAT --to-destination 10.8.0.3
# UDP
PostUp = iptables -t nat -A PREROUTING -i eth0 -p udp --dport 64200:64399 -j DNAT --to-destination 10.8.0.3
PostDown = iptables -t nat -D PREROUTING -i eth0 -p udp --dport 64200:64399 -j DNAT --to-destination 10.8.0.3
# ============================================
# Клиенты
# ============================================
# Клиент 1
[Peer]
PublicKey = ПУБЛИЧНЫЙ_КЛЮЧ_КЛИЕНТА_1
AllowedIPs = 10.8.0.2/32
# Клиент 2
[Peer]
PublicKey = ПУБЛИЧНЫЙ_КЛЮЧ_КЛИЕНТА_2
AllowedIPs = 10.8.0.3/32
⚠️ Важные замечания по конфигу:
- eth0 — имя сетевого интерфейса. На вашем сервере оно может отличаться (ens3, enp0s3 и т.д.). Проверьте командой
ip a - SaveConfig = false — обязательно установите false, иначе WireGuard перезапишет конфиг при остановке и правила iptables пропадут
- -i eth0 в правилах PREROUTING — указывает входящий интерфейс, повышает безопасность
Определение имени сетевого интерфейса
# Найти интерфейс с внешним IP
ip route get 8.8.8.8 | grep -oP 'dev \K\S+'
Если команда вернула не eth0, замените eth0 в конфиге на полученное значение.
Запуск WireGuard
# Запустить WireGuard
wg-quick up wg0
# Включить автозапуск при загрузке системы
systemctl enable wg-quick@wg0
# Проверить статус
wg show
Вы должны увидеть информацию об интерфейсе wg0 и зарегистрированных пирах.
Конфигурация клиента
На клиентском устройстве создайте файл конфигурации. Для Windows и macOS это делается через GUI приложение WireGuard (кнопка "Add Tunnel" → "Add empty tunnel").
Конфиг для клиента 1 (получает порты 64000–64199)
[Interface]
# Приватный ключ клиента (из файла client1_private.key)
PrivateKey = ПРИВАТНЫЙ_КЛЮЧ_КЛИЕНТА_1
# IP-адрес клиента в VPN-сети
Address = 10.8.0.2/32
# DNS-сервер (опционально, можно убрать)
DNS = 1.1.1.1
[Peer]
# Публичный ключ сервера (из файла server_public.key)
PublicKey = ПУБЛИЧНЫЙ_КЛЮЧ_СЕРВЕРА
# Маршрутизация всего трафика через VPN
AllowedIPs = 0.0.0.0/0, ::/0
# IP-адрес и порт вашего VPS
Endpoint = ВАШ_IP_СЕРВЕРА:51820
# Поддержание соединения (важно для NAT)
PersistentKeepalive = 25
Конфиг для клиента 2 (получает порты 64200–64399)
[Interface]
PrivateKey = ПРИВАТНЫЙ_КЛЮЧ_КЛИЕНТА_2
Address = 10.8.0.3/32
DNS = 1.1.1.1
[Peer]
PublicKey = ПУБЛИЧНЫЙ_КЛЮЧ_СЕРВЕРА
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = ВАШ_IP_СЕРВЕРА:51820
PersistentKeepalive = 25
???? Варианты AllowedIPs
Параметр AllowedIPs определяет, какой трафик пойдёт через VPN:
0.0.0.0/0, ::/0— весь трафик (IPv4 и IPv6) через VPN. Ваш внешний IP изменится на IP сервера.0.0.0.0/1, 128.0.0.0/1, ::/1, 8000::/1— то же самое, но без перехвата маршрута по умолчанию (решает проблемы с некоторыми системами)10.8.0.0/24— только трафик к VPN-сети. Интернет идёт напрямую, но проброс портов всё равно работает
PersistentKeepalive — зачем нужен
Параметр PersistentKeepalive = 25 заставляет клиента каждые 25 секунд отправлять keepalive-пакеты серверу. Это необходимо по двум причинам:
- NAT traversal — домашние роутеры «забывают» UDP-соединения через 30-120 секунд неактивности. Keepalive поддерживает mapping активным.
- Входящие подключения — сервер должен знать актуальный endpoint клиента для отправки трафика. Без keepalive после простоя сервер «потеряет» клиента.
Настройка файрвола
Убедитесь, что на сервере открыты необходимые порты:
Для UFW (Ubuntu)
# Порт WireGuard
ufw allow 51820/udp
# Порты для проброса (клиент 1)
ufw allow 64000:64199/tcp
ufw allow 64000:64199/udp
# Порты для проброса (клиент 2)
ufw allow 64200:64399/tcp
ufw allow 64200:64399/udp
# Применить изменения
ufw reload
# Проверить статус
ufw status
Для iptables (без UFW)
# Порт WireGuard
iptables -A INPUT -p udp --dport 51820 -j ACCEPT
# Порты для проброса
iptables -A INPUT -p tcp --dport 64000:64399 -j ACCEPT
iptables -A INPUT -p udp --dport 64000:64399 -j ACCEPT
# Сохранить правила
apt install iptables-persistent -y
netfilter-persistent save
Проверка на хостинге
Некоторые VPS-провайдеры имеют дополнительный файрвол в панели управления. Проверьте настройки в личном кабинете хостинга и откройте там порты 51820/udp и 64000–64399 tcp/udp.
Проверка работоспособности
1. Проверка подключения клиента
После подключения клиента на сервере выполните:
wg show
Вы должны увидеть информацию о подключённом пире с последним handshake:
interface: wg0
public key: xxxxx
private key: (hidden)
listening port: 51820
peer: ПУБЛИЧНЫЙ_КЛЮЧ_КЛИЕНТА
endpoint: IP_КЛИЕНТА:ПОРТ
allowed ips: 10.8.0.2/32
latest handshake: 5 seconds ago
transfer: 1.25 MiB received, 3.50 MiB sent
2. Проверка проброса портов
На клиентском устройстве запустите тестовый сервер:
# Python 3 (простой HTTP-сервер на порту 64100)
python3 -m http.server 64100
# Или netcat для TCP
nc -l -p 64100
С другого устройства (не подключённого к VPN) попробуйте подключиться:
# Через браузер
http://ВАШ_IP_СЕРВЕРА:64100
# Или через curl
curl http://ВАШ_IP_СЕРВЕРА:64100
# Или netcat
nc ВАШ_IP_СЕРВЕРА 64100
3. Проверка UDP
# На клиенте (слушаем UDP)
nc -u -l -p 64100
# С внешнего устройства
echo "test" | nc -u ВАШ_IP_СЕРВЕРА 64100
4. Проверка правил iptables на сервере
# Просмотр NAT-правил
iptables -t nat -L -n -v
# Должны быть видны правила DNAT для ваших диапазонов портов
Решение проблем
Клиент не подключается
- Проверьте, запущен ли WireGuard на сервере:
systemctl status wg-quick@wg0 - Проверьте, открыт ли порт 51820/udp на файрволе сервера
- Убедитесь, что публичный ключ сервера в конфиге клиента соответствует ключу на сервере
- Проверьте правильность IP-адреса сервера в Endpoint
Подключение есть, но проброс не работает
- Проверьте IP forwarding:
cat /proc/sys/net/ipv4/ip_forward(должно быть 1) - Проверьте имя сетевого интерфейса в конфиге (eth0, ens3 и т.д.)
- Убедитесь, что порты открыты на файрволе
- Проверьте, слушает ли приложение на клиенте нужный порт
Соединение периодически отваливается
- Убедитесь, что PersistentKeepalive установлен в конфиге клиента
- Попробуйте уменьшить значение до 15-20 секунд
Низкая скорость
- Попробуйте изменить MTU в секции [Interface]:
MTU = 1420 - Проверьте загрузку CPU на сервере
- Выберите VPS географически ближе к вам
Просмотр логов
# Логи WireGuard
dmesg | grep wireguard
# Системные логи
journalctl -u wg-quick@wg0 -f
# Отладка iptables (логирование DNAT)
iptables -t nat -I PREROUTING -p tcp --dport 64000:64199 -j LOG --log-prefix "DNAT: "
dmesg | grep DNAT
Масштабирование: добавление новых клиентов
Для добавления нового клиента:
- Сгенерируйте новую пару ключей
- Выберите свободный IP (10.8.0.4, 10.8.0.5 и т.д.)
- Выберите свободный диапазон портов (64400–64599 и т.д.)
- Добавьте секцию [Peer] и правила iptables в серверный конфиг
- Перезапустите WireGuard:
wg-quick down wg0 && wg-quick up wg0
Пример добавления клиента 3:
# Добавить в /etc/wireguard/wg0.conf
# Проброс портов для клиента 3 (10.8.0.4)
PostUp = iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 64400:64599 -j DNAT --to-destination 10.8.0.4
PostDown = iptables -t nat -D PREROUTING -i eth0 -p tcp --dport 64400:64599 -j DNAT --to-destination 10.8.0.4
PostUp = iptables -t nat -A PREROUTING -i eth0 -p udp --dport 64400:64599 -j DNAT --to-destination 10.8.0.4
PostDown = iptables -t nat -D PREROUTING -i eth0 -p udp --dport 64400:64599 -j DNAT --to-destination 10.8.0.4
# В конец файла
[Peer]
PublicKey = ПУБЛИЧНЫЙ_КЛЮЧ_КЛИЕНТА_3
AllowedIPs = 10.8.0.4/32
Заключение
WireGuard с пробросом портов — это элегантное решение для получения «статического IP» без необходимости платить провайдеру или менять тариф. Один недорогой VPS может обслуживать десятки клиентов, каждый из которых получает свой набор портов для входящих подключений.
Преимущества данного подхода:
- Экономия — VPS за $3-5/мес дешевле, чем статический IP у большинства провайдеров
- Гибкость — можно быстро менять диапазоны портов и добавлять клиентов
- Безопасность — весь трафик зашифрован, реальный IP скрыт
- Производительность — WireGuard обеспечивает минимальные накладные расходы
- Надёжность — соединение автоматически восстанавливается после обрывов
Если вы используете мобильные прокси от mobileproxy.space, данная схема позволяет организовать стабильный доступ к прокси-серверам, работающим на модемах за NAT провайдера.
Часто задаваемые вопросы
Можно ли пробросить порт 80 или 443?
Да, но многие хостинги блокируют эти порты по умолчанию. Также имейте в виду, что некоторые провайдеры фильтруют входящий трафик на стандартные порты.
Сколько клиентов можно подключить к одному серверу?
Теоретически — тысячи. Практически ограничение определяется пропускной способностью сервера и количеством доступных портов (65535 минус системные).
Работает ли это с IPv6?
Да, но требуется дополнительная настройка ip6tables. В этой статье мы рассмотрели только IPv4.
Что делать, если у меня несколько сетевых интерфейсов на сервере?
Укажите конкретный интерфейс в правилах iptables через параметр -i для PREROUTING и -o для POSTROUTING.