Relay-сервер для Wireguard и Cloudflare WARP
Описание • Для кого • Системные требования • Быстрый старт • Использование • Лицензия
WARP Relay — это решение для организаций, где по соображениям информационной безопасности запрещен прямой доступ к внешним ресурсам (глобальный интернет), но сотрудникам необходимо подключаться к корпоративным VPN-серверам (Wireguard или Cloudflare WARP).
⚠️ Примечание: В скриптах в качестве примера используется адресengage.cloudflareclient.com— это endpoint бесплатного сервиса Cloudflare WARP, который приведён для демонстрации и быстрого тестирования работы Wireguard / WARP Relay. Автор проекта не имеет никакого отношения к компании Cloudflare, Inc. В продуктивных контурах вы должны использовать исключительно корпоративный VPN сервер, указав его IP-адрес и порт вручную.
В сети организации размещается Relay-сервер, имеющий доступ к внешней сети. Сотрудники подключаются к внешнему корпоративному VPN-серверу через внутренний IP-адрес Relay-сервера.
Описание схемы:
На схеме представлена корпоративная сеть организации 192.168.11.0/24. Рабочие станции сотрудников (192.168.11.101, 192.168.11.102) не имеют прямого доступа к внешней сети Интернет по соображениям информационной безопасности. Однако сотрудникам необходимо подключаться к корпоративному VPN-серверу Wireguard, расположенному в центральном офисе с публичным IP-адресом 40.30.20.10.
Для решения этой задачи в локальной сети развёрнут Wireguard / WARP Relay сервер (192.168.11.10), имеющий выход в Интернет. На Relay-сервере выполняется настройка nftables или iptables для перенаправления трафика:
nftables
export TAG="WR_RULE"
export SRC_IP=192.168.11.10
export DST_IP=40.30.20.10
export SRC_PORT=2288
export DST_PORT=51820
export NFT_CONF="/etc/nftables.conf"
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/ipv4-forwarding.conf
sysctl -w net.ipv4.ip_forward=1
nft add table ip nat 2>/dev/null || true
nft add table ip filter 2>/dev/null || true
nft add chain ip nat prerouting { type nat hook prerouting priority -100 \; } 2>/dev/null || true
nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; } 2>/dev/null || true
nft add chain ip filter forward { type filter hook forward priority filter \; } 2>/dev/null || true
nft add rule ip nat prerouting ip daddr $SRC_IP udp dport $SRC_PORT dnat to $DST_IP:$DST_PORT comment \"$TAG\"
nft add rule ip nat postrouting ip daddr $DST_IP udp dport $DST_PORT masquerade comment \"$TAG\"
nft add rule ip filter forward ip daddr $DST_IP udp dport $DST_PORT accept comment \"$TAG\"
nft add rule ip filter forward ip saddr $DST_IP udp sport $DST_PORT accept comment \"$TAG\"
nft list ruleset > "$NFT_CONF"iptables
export TAG="WR_RULE"
export SRC_IP=192.168.11.10
export DST_IP=40.30.20.10
export SRC_PORT=2288
export DST_PORT=51820
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/ipv4-forwarding.conf
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING \
-d ${SRC_IP} -p udp --dport ${SRC_PORT} \
-j DNAT --to-destination ${DST_IP}:${DST_PORT} \
-m comment --comment "${TAG}"
iptables -t nat -A POSTROUTING \
-p udp -d ${DST_IP} --dport ${DST_PORT} \
-j MASQUERADE \
-m comment --comment "${TAG}"
iptables -A FORWARD -p udp -d ${DST_IP} --dport ${DST_PORT} -j ACCEPT -m comment --comment "${TAG}"
iptables -A FORWARD -p udp -s ${DST_IP} --sport ${DST_PORT} -j ACCEPT -m comment --comment "${TAG}"
sudo DEBIAN_FRONTEND=noninteractive apt install -y netfilter-persistent
sudo netfilter-persistent saveРезультат: сотрудникам для подключения к корпоративному VPN достаточно указать внутренний адрес Relay-сервера 192.168.11.10:2288. Весь трафик автоматически перенаправляется на внешний Wireguard-сервер 40.30.20.10:51820, при этом сотрудники не имеют прямого доступа в Интернет.
- 🔒 Корпоративная сеть без интернета — сотрудники могут подключаться к внешнему VPN через внутренний relay
- 🏢 Филиалы и удаленные офисы — централизованный доступ к корпоративной сети через единую точку входа
- 🛡️ Соответствие ИБ-требованиям — внешний доступ только через контролируемый сервер
- ☁️ Cloudflare WARP — подключение к WARP через внутренний relay для Zero Trust доступа
Этот проект предназначен для:
- Сетевых инженеров — настройка и поддержка сетевой инфраструктуры
- Системных администраторов — развертывание и обслуживание серверов
- DevOps / SRE — автоматизация и интеграция в инфраструктуру
| Параметр | Минимум | Рекомендуется |
|---|---|---|
| CPU | 1 vCPU | 2 vCPU |
| RAM | 512 MB | 1 GB |
| Диск | 5 GB | 10 GB |
| Сеть | 1 интерфейс с доступом во внешнюю сеть | 2 интерфейса (внутренний + внешний) |
- Ubuntu 20.04 LTS / 22.04 LTS / 24.04 LTS
- Debian 11 / 12
- Arch Linux
- Fedora
- Alpine
- Другие дистрибутивы на базе Debian, Arch, RHEL, alpine (с адаптацией команд)
iptablesилиnftables— для настройки правил NAT и forwardingcurl— для определения внешнего IP-адресаnetfilter-persistent— для сохранения правил после перезагрузки(при использовании iptables)getent— для DNS-разрешения (обычно входит в базовую поставку)
- ✅ Доступ к внешней сети (интернет) для Relay-сервера
- ✅ UDP порт 4500 (по умолчанию) должен быть открыт для входящих соединений
- ✅ Включен IP forwarding в ядре Linux
Скачайте и запустите скрипт:
wget https://raw.githubusercontent.com/openwarpkit/warp-relay/main/wr.sh
chmod +x wr.sh
sudo ./wr.shВариант 1 — один UDP-порт (стандартный режим)
curl -fsSL https://raw.githubusercontent.com/openwarpkit/warp-relay/main/simple.sh | sudo bashВариант 2 — несколько UDP-портов одновременно (мультипорт)
curl -fsSL https://raw.githubusercontent.com/openwarpkit/warp-relay/main/simple_multiport.sh | sudo bashСкрипт автоматически настраивает проброс для следующих UDP-портов (например используются порты Cloudflare WARP):
500 854 859 864 878 880 890 891 894 903
908 928 934 939 942 943 945 946 955 968
987 988 1002 1010 1014 1018 1070 1074 1180 1387
1701 1843 2371 2408 2506 3138 3476 3581 3854 4177
4198 4233 4500 5279 5956 7103 7152 7156 7281 7559
8319 8742 8854 8886
Если клиент подключается к Relay-серверу по порту X, то трафик будет перенаправлен на внешний сервер на тот же самый порт X.
Интерактивный скрипт с меню для удобного управления:
sudo ./wr.shДоступные опции:
- Автонастройка (Cloudflare UDP 4500) — автоматическое определение IP-адресов и настройка для Cloudflare WARP
- Ввести параметры вручную — ручной ввод IP-адресов и портов для кастомной конфигурации
- Показать Relay правила файрволла — просмотр текущих iptables правил
- Откат изменений (удаление) — полное удаление всех настроек и правил
- Выход — завершение работы скрипта
Быстрая установка без интерактивного меню:
sudo ./simple.shЧто делает скрипт:
- Определяет внешний IP сервера (
ifconfig.me,icanhazip.com,api.ipify.org) - Определяет IP Cloudflare WARP (
engage.cloudflareclient.com) - Настраивает nftables или iptables правила для UDP порта 4500
- Включает IP forwarding
- Сохраняет правила для автозагрузки
Если необходимо настроить вручную:
nftables
# Настроить iptables (пример для Cloudflare WARP)
export TAG="WR_RULE"
export SRC_IP=YOUR_SERVER_IP
export DST_IP="$(getent ahostsv4 engage.cloudflareclient.com | awk '{print $1; exit}')"
export SRC_PORT=4500
export DST_PORT=4500
export NFT_CONF="/etc/nftables.conf"
# Включить IP forwarding
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/ipv4-forwarding.conf
sysctl -w net.ipv4.ip_forward=1
# Добавить таблицы для фильтрации
nft add table ip nat 2>/dev/null || true
nft add table ip filter 2>/dev/null || true
# DNAT правило
nft add chain ip nat prerouting { type nat hook prerouting priority -100 \; } 2>/dev/null || true
# MASQUERADE правило
nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; } 2>/dev/null || true
nft add chain ip filter forward { type filter hook forward priority filter \; } 2>/dev/null || true
# Разрешить forwarding
nft add rule ip nat prerouting ip daddr $SRC_IP udp dport $SRC_PORT dnat to $DST_IP:$DST_PORT comment \"$TAG\"
nft add rule ip nat postrouting ip daddr $DST_IP udp dport $DST_PORT masquerade comment \"$TAG\"
nft add rule ip filter forward ip daddr $DST_IP udp dport $DST_PORT accept comment \"$TAG\"
nft add rule ip filter forward ip saddr $DST_IP udp sport $DST_PORT accept comment \"$TAG\"
# Сохранить правила
nft list ruleset > "$NFT_CONF"iptables
# Включить IP forwarding
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/ipv4-forwarding.conf
sysctl -w net.ipv4.ip_forward=1
# Настроить iptables (пример для Cloudflare WARP)
SRC_IP="YOUR_SERVER_IP"
DST_IP="$(getent ahostsv4 engage.cloudflareclient.com | awk '{print $1; exit}')"
SRC_PORT=4500
DST_PORT=4500
# DNAT правило
iptables -t nat -A PREROUTING \
-d ${SRC_IP} -p udp --dport ${SRC_PORT} \
-j DNAT --to-destination ${DST_IP}:${DST_PORT} \
-m comment --comment "WR_RULE"
# MASQUERADE правило
iptables -t nat -A POSTROUTING \
-p udp -d ${DST_IP} --dport ${DST_PORT} \
-j MASQUERADE \
-m comment --comment "WR_RULE"
# Разрешить forwarding
iptables -A FORWARD -p udp -d ${DST_IP} --dport ${DST_PORT} -j ACCEPT -m comment --comment "WR_RULE"
iptables -A FORWARD -p udp -s ${DST_IP} --sport ${DST_PORT} -j ACCEPT -m comment --comment "WR_RULE"
# Сохранить правила
sudo DEBIAN_FRONTEND=noninteractive apt install -y netfilter-persistent
sudo netfilter-persistent save# На Relay-сервере
sudo ./wr.sh
# Выбрать пункт 1 - Автонастройка
# На клиенте настроить подключение WARP:
# Endpoint: IP_адрес_Relay_сервера:4500# На Relay-сервере
sudo ./wr.sh
# Выбрать пункт 2 - Ввести параметры вручную
# Ввести IP вашего Wireguard сервера и нужный порт
# На клиенте настроить Wireguard:
# Endpoint: IP_адрес_Relay_сервера:ПОРТ# На Relay-сервере проверить правила
sudo ./wr.sh
# Выбрать пункт 3 - Показать Relay правила файрволла
# Или вручную:
# nftables
nft list ruleset | grep WR_RULE
# iptables
iptables -t nat -L -n -v | grep WR_RULE
iptables -L FORWARD -n -v | grep WR_RULEДля полного удаления настроек:
sudo ./wr.sh
# Выбрать пункт 4 - Откат изменений (удаление)Или вручную:
nftables
# Удалить правила с тегом WR_RULE
for table in nat filter; do
for chain in prerouting postrouting forward; do
nft -a list chain ip "$table" "$chain" 2>/dev/null | \
grep -B1 "comment \"$TAG\"" | \
grep -o 'handle [0-9]*' | \
awk '{print $2}' | \
while read -r handle; do
if [[ "$handle" =~ ^[0-9]+$ ]]; then
nft delete rule ip "$table" "$chain" handle "$handle" 2>/dev/null || true
fi
done
done
done
# Отключить IP forwarding
echo "net.ipv4.ip_forward=0" > /etc/sysctl.d/ipv4-forwarding.conf
sysctl -w net.ipv4.ip_forward=0
# Сохранить изменения
nft list ruleset > /etc/nftables.confiptables
# Удалить правила с тегом WR_RULE
iptables -t nat -S | grep "WR_RULE" | sed 's/^-A/-D/' | while read rule; do
iptables -t nat $rule
done
iptables -S | grep "WR_RULE" | sed 's/^-A/-D/' | while read rule; do
iptables $rule
done
# Отключить IP forwarding
echo "net.ipv4.ip_forward=0" > /etc/sysctl.d/ipv4-forwarding.conf
sysctl -w net.ipv4.ip_forward=0
# Сохранить изменения
netfilter-persistent savewarp-relay/
├── img/
│ ├── logo.png # Логотип проекта
│ ├── warp-relay.png # Схема работы
│ └── warp-relay.drawio # Исходник схемы
├── simple.sh # Простая установка (один UDP-порт)
├── simple_multiport.sh # Простая установка (несколько UDP-портов)
├── wr.sh # Интерактивный скрипт
└── README.md # Документация
- 🔐 Все nftables и iptables правила помечены тегом
WR_RULEдля легкого управления - 📝 Скрипты требуют прав root (sudo)
- 🔄 IP forwarding включается только для необходимого трафика
- 💾 Правила автоматически сохраняются для переживания перезагрузок
# Проверить доступность ifconfig.me
curl -4s ifconfig.me
# Если не работает, используйте альтернативу:
curl -4s icanhazip.com
# Или укажите адрес вручную задав значение переменной SRC_IP:# nftables
# Проверить состояние службы и включить ее
systemctl status nftables
systemctl enable --now nftables
# Пересохранить правила вручную
nft list ruleset > /etc/nftables.conf
# iptables
# Проверить установку netfilter-persistent
dpkg -l | grep netfilter-persistent
# Пересохранить правила вручную
sudo netfilter-persistent save# Проверить включен ли IP forwarding
sysctl net.ipv4.ip_forward
# Проверить правила nftables
nft list ruleset
# Проверить правила iptables
sudo iptables -t nat -L -n -v
sudo iptables -L FORWARD -n -v
# Проверить логи ядра
sudo dmesg | grep -i iptablesПриветствуются pull requests и issues! Если у вас есть идеи по улучшению или вы нашли баг — создайте issue на GitHub.
Этот проект распространяется под лицензией MIT.
Подробности смотрите в файле LICENSE.

