"Быстрый
<br />
Чтобы поднять WireGuard site-to-site между MikroTik (RouterOS 7) и VPS на Linux:</p>
<ul>
<li>На VPS: установи WireGuard, создай интерфейс wg0, пропиши peer с публичным ключом MikroTik и AllowedIPs = адрес туннеля + локальная подсеть за MikroTik</li>
<li>На MikroTik: создай WireGuard-интерфейс, добавь IP, добавь peer с ключом VPS и AllowedIPs = адрес туннеля + подсеть VPS</li>
<li>На VPS: включи ip_forward, добавь iptables FORWARD + MASQUERADE если нужен выход в интернет</li>
<li>На <a class="wpil_keyword_link" href="https://it-apteka.com/tag/mikrotik/" target="_blank" rel="noopener" title="mikrotik" data-wpil-keyword-link="linked" data-wpil-monitor-id="2851">MikroTik</a>: добавь статический маршрут через WireGuard-интерфейс, разреши UDP-порт в firewall</li>
<li>Если MikroTik за CG-NAT — используй PersistentKeepalive = 25 на стороне MikroTik, Endpoint указывай только на VPS</li>
</ul>
<p>Туннель поднимается за 15-20 минут. RouterOS 7.1 и выше, Ubuntu/Debian на VPS.<br />
<h2>Зачем это нужно и когда L2TP наконец умирает</h2>
<p>L2TP/IPsec на MikroTik работает. Работало в 2012-м, работает сейчас. Вопрос только в том, сколько времени ты тратишь на его капризы: согласование фаз, MTU-проблемы, падение при смене IP, портянки политик в конфиге. WireGuard решает всё это одним интерфейсом и 20 строками конфига.</p>
<p>Конкретные сценарии где это нужно прямо сейчас:</p>
<ul>
<li>Офис-1 и Офис-2 нужно объединить в одну L3-сеть, у одного из них CG-NAT от провайдера</li>
<li>Домашняя сеть с MikroTik и VDS в Европе — нужен единый адресный пространство</li>
<li>Белый IP на VPS используется как точка входа, а за MikroTik сидят сервисы которые надо пробросить</li>
<li>Failover: основной канал падает, трафик переключается на резервный через туннель</li>
</ul>
<p>В статье разберём схему MikroTik (RouterOS 7) — VPS (Ubuntu/Debian). Это самый частый запрос. Принципы те же если у тебя два MikroTik — просто VPS заменяется вторым роутером с RouterOS.</p>
<p>Что понадобится: MikroTik с RouterOS 7.1+, VPS с публичным IP, 15-20 минут и доступ по SSH к обоим устройствам.</p>
<h2>Как работает WireGuard site-to-site: разбор схемы</h2>
<p>WireGuard — это L3-туннель. Никакого «моста» между сетями нет — только маршрутизация. Каждый хост на каждой стороне видит другую сторону как обычную IP-сеть, просто трафик идёт через зашифрованный UDP-туннель.</p>
<p>Самая важная концепция которую нужно понять до начала: <strong>AllowedIPs в WireGuard — это одновременно ACL и таблица маршрутизации.</strong> Трафик для адресов из AllowedIPs идёт через туннель к этому peer. Трафик от peer принимается только если источник совпадает с его AllowedIPs. Если это не уложилось в голове сейчас — уложится через 10 минут на практике.</p>
<pre class="mermaid">
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart LR
A["LAN: 192.168.10.0/24"] --> B["MikroTik wg0: 10.0.0.2/30"]
B -->|"UDP 51820 / зашифровано"| C["VPS wg0: 10.0.0.1/30"]
C --> D["VPS LAN / Docker / сервисы"]
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style B fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style C fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style D fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
</pre>
<p>Адресный план который используется в статье — зафиксируй для себя:</p>
<table>
<thead>
<tr>
<th>Сторона</th>
<th>WireGuard IP</th>
<th>Локальная сеть</th>
<th>Роль</th>
</tr>
</thead>
<tbody>
<tr>
<td>VPS (Ubuntu)</td>
<td>10.0.0.1/30</td>
<td>—</td>
<td>Responder (принимает подключение)</td>
</tr>
<tr>
<td>MikroTik</td>
<td>10.0.0.2/30</td>
<td>192.168.10.0/24</td>
<td>Initiator (инициирует из-за NAT)</td>
</tr>
</tbody>
</table>
<p>Почему /30 а не /24 для туннеля: это правило хорошего тона для point-to-point линков. Два адреса, никакого лишнего пространства. Если хочешь подключить несколько peer — бери /24 или /29.</p>
<h2>Системные требования</h2>
<table>
<thead>
<tr>
<th>Компонент</th>
<th>Минимум</th>
<th>Проверено</th>
</tr>
</thead>
<tbody>
<tr>
<td>RouterOS</td>
<td>7.1</td>
<td>7.14, 7.15, 7.16</td>
</tr>
<tr>
<td>Ubuntu (VPS)</td>
<td>20.04 LTS</td>
<td>22.04, 24.04</td>
</tr>
<tr>
<td><a class="wpil_keyword_link" href="https://it-apteka.com/tag/debian/" target="_blank" rel="noopener" title="Debian" data-wpil-keyword-link="linked" data-wpil-monitor-id="2847">Debian</a> (VPS)</td>
<td>11 (Bullseye)</td>
<td>12 (Bookworm)</td>
</tr>
<tr>
<td>WireGuard (ядро <a class="wpil_keyword_link" href="https://it-apteka.com/category/linux/" target="_blank" rel="noopener" title="Linux" data-wpil-keyword-link="linked" data-wpil-monitor-id="2848">Linux</a>)</td>
<td>kernel 5.6+</td>
<td>встроен в Ubuntu 20.04+</td>
</tr>
<tr>
<td>wireguard-tools</td>
<td>1.0.20200319</td>
<td>1.0.20210914</td>
</tr>
</tbody>
</table>
<p>На момент публикации актуальна RouterOS 7.16. Перед настройкой проверь свежие релизы на <a href="https://mikrotik.com/download" rel="nofollow" target="_blank">mikrotik.com/download</a>.</p>
<p>WireGuard на MikroTik доступен только в RouterOS 7. Если у тебя RouterOS 6 — обнови. Процедура обновления через 6.49 stable -> 7.x описана в официальной документации MikroTik.</p>
<h2>Порты и firewall</h2>
<table>
<thead>
<tr>
<th>Порт</th>
<th>Протокол</th>
<th>Направление</th>
<th>Назначение</th>
<th>Открыт снаружи</th>
</tr>
</thead>
<tbody>
<tr>
<td>51820</td>
<td>UDP</td>
<td>входящий на VPS</td>
<td>WireGuard туннель</td>
<td>Да</td>
</tr>
<tr>
<td>51820</td>
<td>UDP</td>
<td>входящий на MikroTik</td>
<td>WireGuard (опционально)</td>
<td>Если нет CG-NAT</td>
</tr>
<tr>
<td>22</td>
<td>TCP</td>
<td>входящий на VPS</td>
<td>SSH управление</td>
<td>Рекомендуется ограничить по IP</td>
</tr>
</tbody>
</table>
<h2>Настройка VPS (Ubuntu/Debian): сторона сервера</h2>
<h3>Шаг 1. Установка WireGuard</h3>
<p>На <a href="https://it-apteka.com/linux-v-aprele-2026-jadro-7-0-ubuntu-26-04-lts-i-francija-brosaet-windows/" title="Linux в апреле 2026: ядро 7.0, Ubuntu 26.04 LTS и Франция бросает Windows" target="_blank" rel="noopener" data-wpil-monitor-id="2838">Ubuntu</a> 20.04 и выше WireGuard встроен в ядро. Нужны только инструменты.</p>
<pre><code class="language-bash">
apt update && apt install wireguard wireguard-tools -y
</code></pre>
<p>Проверь что модуль загружен:</p>
<pre><code class="language-bash">
lsmod | grep wireguard
</code></pre>
<p>Если пусто — загрузи вручную:</p>
<pre><code class="language-bash">
modprobe wireguard
</code></pre>
<h3>Шаг 2. Генерация ключей VPS</h3>
<p>Каждый WireGuard-интерфейс имеет пару ключей: приватный (никуда не уходит) и публичный (отдаётся peer-у). Генерируй их так:</p>
<pre><code class="language-bash">
# Создаём директорию с правильными правами
install -m 0700 -d /etc/wireguard
# Генерируем ключи
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
</code></pre>
<p>Публичный ключ VPS понадобится при настройке MikroTik. Скопируй его сейчас — потом будешь искать.</p>
<h3>Шаг 3. Создание конфига wg0.conf</h3>
"Важно:
<br />
В секции [Peer] (MikroTik) указывай AllowedIPs = 10.0.0.2/32, 192.168.10.0/24. Первый адрес — это WireGuard IP MikroTik. Второй — локальная подсеть за MikroTik. Именно это позволит трафику из 192.168.10.0/24 ходить через туннель.<br />
<pre><code class="language-text">
# /etc/wireguard/wg0.conf
[Interface]
PrivateKey = <ПРИВАТНЫЙ_КЛЮЧ_VPS>
Address = 10.0.0.1/30
ListenPort = 51820
# Включаем форвардинг и NAT при поднятии интерфейса
PostUp = sysctl -w net.ipv4.ip_forward=1
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
PostUp = iptables -A FORWARD -o wg0 -j ACCEPT
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -D FORWARD -o wg0 -j ACCEPT
[Peer]
# MikroTik
PublicKey = <ПУБЛИЧНЫЙ_КЛЮЧ_MIKROTIK>
AllowedIPs = 10.0.0.2/32, 192.168.10.0/24
# Endpoint не указываем - MikroTik сам подключится
# PersistentKeepalive не нужен на стороне VPS
</code></pre>
<p>Обрати внимание: Endpoint для MikroTik не прописан. VPS ждёт входящего подключения. MikroTik инициирует сессию сам, и WireGuard запомнит его адрес автоматически. Это важно при CG-NAT — у MikroTik может не быть постоянного публичного IP.</p>
<p>Запусти интерфейс и добавь в автозапуск:</p>
<pre><code class="language-bash">
systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0
# Проверяем статус
systemctl status wg-quick@wg0
</code></pre>
<h3>Шаг 4. ip_forward на постоянной основе</h3>
<p>PostUp через sysctl работает до перезагрузки. Чтобы форвардинг сохранялся:</p>
<pre><code class="language-bash">
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
</code></pre>
<h3>Шаг 5. Firewall на VPS</h3>
<p>Открой UDP 51820 в UFW или iptables. Если используешь UFW:</p>
<pre><code class="language-bash">
ufw allow 51820/udp comment "WireGuard"
ufw reload
</code></pre>
<p>Если UFW не используешь и у тебя чистый iptables:</p>
<pre><code class="language-bash">
iptables -A INPUT -p udp --dport 51820 -j ACCEPT
# Не забудь сохранить правила (iptables-persistent или netfilter-persistent)
apt install iptables-persistent -y
netfilter-persistent save
</code></pre>
<h2>Настройка MikroTik (RouterOS 7): сторона клиента</h2>
<h3>Шаг 1. Создание WireGuard-интерфейса</h3>
<p>Открой Terminal в Winbox или подключись по SSH. Выполни:</p>
<pre><code class="language-bash">
/interface wireguard add name=wg-tunnel listen-port=51820
</code></pre>
<p>MikroTik сгенерирует ключи автоматически. Посмотри публичный ключ — он нужен для конфига VPS:</p>
<pre><code class="language-bash">
/interface wireguard print
</code></pre>
<p>В выводе найди строку <code>public-key=</code>. Скопируй значение — это публичный ключ MikroTik который надо вставить в wg0.conf на VPS.</p>
<h3>Шаг 2. Назначение IP-адреса</h3>
<pre><code class="language-bash">
/ip address add address=10.0.0.2/30 interface=wg-tunnel
</code></pre>
<h3>Шаг 3. Добавление peer (VPS)</h3>
"PersistentKeepalive
<br />
Если MikroTik за NAT или CG-NAT — без PersistentKeepalive туннель будет падать через несколько минут простоя. NAT-таблица на провайдерском оборудовании протухает, и VPS теряет маршрут к MikroTik. PersistentKeepalive = 25 секунд — стандартное значение, держит сессию живой.<br />
<pre><code class="language-bash">
/interface wireguard peers add \
interface=wg-tunnel \
public-key="<ПУБЛИЧНЫЙ_КЛЮЧ_VPS>" \
endpoint-address=<IP_VPS> \
endpoint-port=51820 \
allowed-address=10.0.0.1/32,0.0.0.0/0 \
persistent-keepalive=25s
</code></pre>
<p>Подожди — здесь <code>allowed-address=10.0.0.1/32,0.0.0.0/0</code> это полный туннель (весь трафик через VPS). Если нужен только доступ к подсети VPS а не выход в интернет — замени на конкретные подсети:</p>
<pre><code class="language-bash">
/interface wireguard peers add \
interface=wg-tunnel \
public-key="<ПУБЛИЧНЫЙ_КЛЮЧ_VPS>" \
endpoint-address=<IP_VPS> \
endpoint-port=51820 \
allowed-address=10.0.0.1/32,172.16.0.0/24 \
persistent-keepalive=25s
</code></pre>
<p>Где 172.16.0.0/24 — подсеть которая живёт за VPS и к которой нужен доступ.</p>
<h3>Шаг 4. Статический маршрут</h3>
<p>AllowedIPs в MikroTik работает иначе чем в Linux wg-quick. На Linux wg-quick автоматически добавляет маршруты из AllowedIPs. MikroTik этого не делает — маршруты надо добавить вручную.</p>
<pre><code class="language-bash">
# Маршрут к VPS (WireGuard IP)
/ip route add dst-address=10.0.0.1/32 gateway=wg-tunnel
# Если нужен доступ к подсети за VPS (например, Docker-сети)
/ip route add dst-address=172.16.0.0/24 gateway=wg-tunnel
</code></pre>
<p>Если хочешь гнать весь трафик через VPS — добавь default route с большей метрикой (distance) чем основной:</p>
<pre><code class="language-bash">
/ip route add dst-address=0.0.0.0/0 gateway=wg-tunnel distance=2
</code></pre>
<h3>Шаг 5. Firewall на MikroTik</h3>
<p>Стандартный firewall RouterOS блокирует туннель. Нужно разрешить входящий UDP на порт WireGuard и форвардинг через туннельный интерфейс.</p>
<pre><code class="language-bash">
# Разрешаем входящий WireGuard (UDP 51820)
/ip firewall filter add \
action=accept \
chain=input \
protocol=udp \
dst-port=51820 \
comment="WireGuard input" \
place-before=1
# Разрешаем форвардинг через wg-tunnel
/ip firewall filter add \
action=accept \
chain=forward \
in-interface=wg-tunnel \
comment="WireGuard forward in" \
place-before=1
/ip firewall filter add \
action=accept \
chain=forward \
out-interface=wg-tunnel \
comment="WireGuard forward out" \
place-before=1
</code></pre>
<p>Параметр <code>place-before=1</code> вставляет правило перед первым существующим. Это критично — firewall RouterOS обрабатывает правила сверху вниз, и drop-правила по умолчанию идут в начале списка.</p>
<h3>Шаг 6. NAT на MikroTik (если локальная сеть должна выходить через VPS)</h3>
<p>Если хосты за MikroTik должны выходить в интернет через VPS — добавь masquerade:</p>
<pre><code class="language-bash">
/ip firewall nat add \
chain=srcnat \
out-interface=wg-tunnel \
action=masquerade \
comment="Masquerade through WireGuard"
</code></pre>
<p>Без этого правила ответный трафик с VPS не будет знать куда возвращаться — у хостов в 192.168.10.0/24 нет маршрута к VPS через интернет напрямую.</p>
<h2>Архитектура полного потока трафика</h2>
<pre class="mermaid">
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
A["Хост 192.168.10.100"] -->|"dst: 172.16.0.5"| B["MikroTik - проверка маршрутов"]
B -->|"dst: 172.16.0.0/24 via wg-tunnel"| C["WireGuard шифрование"]
C -->|"UDP 51820 encrypted"| D["VPS - wg0 расшифровка"]
D -->|"ip_forward + FORWARD accept"| E["Сервис на 172.16.0.5"]
E -->|"ответ"| D
D -->|"UDP 51820 encrypted"| C
C --> B
B --> A
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style B fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style C fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#c2410c
style D fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style E fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
</pre>
<h2>Проверка: туннель живой или нет</h2>
<h3>На VPS</h3>
<pre><code class="language-bash">
# Статус интерфейса и handshake
wg show
# Должно быть:
# latest handshake: X seconds/minutes ago
# transfer: X received, X sent
</code></pre>
<p>Если в строке <code>latest handshake</code> нет значения вообще — MikroTik ещё не подключился. Если handshake был, но давно — проверь PersistentKeepalive.</p>
<pre><code class="language-bash">
# Проверка маршрутизации с VPS до MikroTik WG IP
ping 10.0.0.2
# Проверка доступности хоста за MikroTik
ping 192.168.10.1
</code></pre>
<h3>На MikroTik</h3>
<pre><code class="language-bash">
# Проверка статуса peer
/interface wireguard peers print
# Посмотри поле "last-handshake" - если есть время, туннель жив
# Пинг до VPS WireGuard IP
/ping 10.0.0.1
# Проверка таблицы маршрутов
/ip route print where gateway=wg-tunnel
</code></pre>
<p>Хорошая проверка site-to-site — traceroute с хоста в локальной <a class="wpil_keyword_link" href="https://it-apteka.com/category/networks/" target="_blank" rel="noopener" title="Сети" data-wpil-keyword-link="linked" data-wpil-monitor-id="2850">сети</a> до адреса на стороне VPS. Если первый хоп — MikroTik, второй — 10.0.0.1 (VPS WireGuard IP), а третий — целевой хост, всё работает правильно.</p>
<pre><code class="language-bash">
# С MikroTik
/tool traceroute 172.16.0.5
</code></pre>
<h2>Осложнения: что идёт не так и как чинить</h2>
<h3>Ошибка: туннель поднялся, пинги до 10.0.0.1 есть, но до 192.168.10.x с VPS не добраться</h3>
<p>Причина: на VPS нет маршрута до 192.168.10.0/24, или блокирует iptables FORWARD. AllowedIPs в wg0.conf на VPS для MikroTik peer должен включать подсеть 192.168.10.0/24.</p>
<pre><code class="language-bash">
# Проверяем что в AllowedIPs у peer на VPS
wg show wg0 allowed-ips
# Должно быть: 10.0.0.2/32 192.168.10.0/24
# Проверяем FORWARD правила
iptables -L FORWARD -n -v | grep wg0
</code></pre>
<h3>Ошибка: нет handshake — туннель не поднимается</h3>
<p>Причина: чаще всего UDP 51820 заблокирован на VPS файрволом или у облачного провайдера в Security Group. Также бывает неверный публичный ключ.</p>
<pre><code class="language-bash">
# Проверяем слушает ли WireGuard на порту
ss -ulnp | grep 51820
# С внешней машины проверяем доступность порта
nc -zu <IP_VPS> 51820 && echo "open" || echo "closed"
# На VPS смотрим в лог
journalctl -u wg-quick@wg0 -n 50
</code></pre>
<h3>Ошибка: туннель работает, но падает каждые 3-5 минут</h3>
<p>Причина: MikroTik за NAT, PersistentKeepalive не настроен. NAT-сессия на провайдерском оборудовании закрывается по таймауту.</p>
<pre><code class="language-bash">
# На MikroTik - проверяем и исправляем keepalive
/interface wireguard peers print
/interface wireguard peers set 0 persistent-keepalive=25s
</code></pre>
<h3>Ошибка: MTU проблемы — большие пакеты теряются, маленькие проходят</h3>
<p>Симптом: ping проходит, TCP-сессии зависают, HTTPS не открывается. Классика WireGuard через провайдерский NAT или PPPoE.</p>
<p>WireGuard добавляет 60 байт оверхеда. При стандартном MTU 1500 на физическом интерфейсе WireGuard-пакет не влезает если провайдер режет фрейм.</p>
<pre><code class="language-bash">
# Устанавливаем MTU явно на MikroTik
/interface wireguard set wg-tunnel mtu=1420
# Или через MSS clamping (мягче, без ручного MTU)
/ip firewall mangle add \
chain=forward \
protocol=tcp \
tcp-flags=syn \
in-interface=wg-tunnel \
action=change-mss \
new-mss=1360 \
passthrough=yes
</code></pre>
<pre><code class="language-bash">
# На VPS
ip link set wg0 mtu 1420
# Или в wg0.conf добавить в [Interface]:
# MTU = 1420
</code></pre>
<h3>Ошибка: MikroTik видит peer но маршрут не работает</h3>
<p>Причина: правила firewall forward на MikroTik стоят ниже drop-правил по умолчанию.</p>
<pre><code class="language-bash">
# Смотрим порядок правил
/ip firewall filter print
# Accept-правила для wg-tunnel должны быть ДО drop-all
# Если они внизу - перемещаем вверх
/ip firewall filter move [find comment="WireGuard forward in"] destination=1
</code></pre>
<h3>Ошибка: CG-NAT — у MikroTik нет публичного IP вообще</h3>
<p>Это не ошибка, это особенность провайдера. Схема работает: MikroTik инициирует соединение к VPS, который всегда доступен по публичному IP. Endpoint прописывается только на стороне MikroTik. PersistentKeepalive = 25 обязателен. Проверь что на VPS в wg0.conf для MikroTik peer нет строки Endpoint — он там не нужен.</p>
<h2>Сценарий с обоими MikroTik (без VPS)</h2>
<p>Если оба устройства — MikroTik, один из которых с публичным IP — схема симметрична. Сторона с белым IP слушает на фиксированном порту. Сторона за NAT инициирует, использует PersistentKeepalive.</p>
<p>На обоих MikroTik создаёшь WireGuard интерфейс, обмениваешься публичными ключами, прописываешь peer. Никакого wg0.conf здесь нет — всё через RouterOS команды или Winbox.</p>
<p>Одна строка в кавычках убивает весь отдел в 9 утра понедельника. Это не метафора, это причина почему в production конфиги комментируют.</p>
<h2>Failover: что делать если основной канал падает</h2>
<p>WireGuard сам по себе не имеет failover — это просто туннель. Но RouterOS умеет переключать маршруты по доступности шлюза.</p>
<pre><code class="language-bash">
# Основной маршрут через ISP (distance=1)
/ip route add dst-address=0.0.0.0/0 gateway=<ISP_GATEWAY> distance=1 check-gateway=ping
# Резервный через WireGuard туннель (distance=2, поднимается при недоступности основного)
/ip route add dst-address=0.0.0.0/0 gateway=wg-tunnel distance=2
</code></pre>
<p>Параметр <code>check-gateway=ping</code> заставляет RouterOS периодически проверять доступность шлюза. Если ISP-шлюз не отвечает на ping — маршрут с distance=1 деактивируется и начинает работать distance=2 через туннель.</p>
<pre class="mermaid">
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
A["Трафик из LAN"] --> B["Проверка маршрутов"]
B -->|"ISP доступен - distance=1"| C["ISP Gateway"]
B -->|"ISP недоступен - distance=2"| D["WireGuard -> VPS"]
C --> E["Интернет"]
D --> E
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style B fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style C fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style D fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#c2410c
style E fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
</pre>
<h2>Альтернативы и когда их выбирать</h2>
<table>
<thead>
<tr>
<th>Протокол</th>
<th>Сложность настройки</th>
<th>Производительность</th>
<th>Стабильность за NAT</th>
<th>RouterOS поддержка</th>
</tr>
</thead>
<tbody>
<tr>
<td>WireGuard</td>
<td>Низкая</td>
<td>Высокая</td>
<td>Хорошая (keepalive)</td>
<td>RouterOS 7+</td>
</tr>
<tr>
<td>IPsec IKEv2</td>
<td>Высокая</td>
<td>Высокая</td>
<td>Хорошая</td>
<td>RouterOS 6+</td>
</tr>
<tr>
<td>L2TP/IPsec</td>
<td>Средняя</td>
<td>Средняя</td>
<td>Плохая за CG-NAT</td>
<td>RouterOS 6+</td>
</tr>
<tr>
<td>OpenVPN</td>
<td>Средняя</td>
<td>Низкая (user-space)</td>
<td>Хорошая (TCP mode)</td>
<td>RouterOS 7+</td>
</tr>
<tr>
<td>EoIP + IPsec</td>
<td>Средняя</td>
<td>Средняя</td>
<td>Средняя</td>
<td>RouterOS (только MikroTik-MikroTik)</td>
</tr>
</tbody>
</table>
<p>WireGuard выбираем когда: одна из сторон Linux, нужна максимальная простота конфига, важна скорость, есть CG-NAT. IPsec IKEv2 остаётся актуальным если нужна совместимость с корпоративным оборудованием Cisco/Juniper или требуется сертифицированное шифрование.</p>
<h2>Профилактика и мониторинг</h2>
<h3>Скрипт мониторинга туннеля на MikroTik</h3>
<p>RouterOS позволяет поднять туннель автоматически через Scheduler. Скрипт проверяет доступность VPS и перезапускает WireGuard если peer не отвечает:</p>
<pre><code class="language-bash">
# Создаём скрипт
/system script add name="wg-check" source={
:local pingResult [/ping 10.0.0.1 count=3 as-value]
:if ($pingResult < 1) do={
/log warning "WireGuard: VPS not reachable, restarting interface"
/interface disable wg-tunnel
:delay 3s
/interface enable wg-tunnel
}
}
# Добавляем в планировщик - запуск каждые 5 минут
/system scheduler add name="wg-monitor" interval=5m on-event=wg-check
</code></pre>
<h3>Что бэкапить</h3>
<p>На MikroTik обязательно экспортируй конфиг после настройки:</p>
<pre><code class="language-bash">
/export file=wg-config-backup
# Файл сохраняется в Files, скачай через Winbox или SCP
</code></pre>
<p>На VPS сохрани wg0.conf в надёжное место. Приватный ключ потерять нельзя - восстановить без него туннель не получится, придётся перегенерировать ключи на обеих сторонах.</p>
<h3>Обновление конфига без потери туннеля</h3>
<p>На VPS при изменении wg0.conf не нужно перезапускать интерфейс полностью - можно применить изменения горячо:</p>
<pre><code class="language-bash">
# Применяем изменения без разрыва туннеля
wg syncconf wg0 <(wg-quick strip wg0)
</code></pre>
<p>На MikroTik изменения в peers применяются сразу без перезапуска интерфейса.</p>
<h2>Безопасность: что закрыть после настройки</h2>
<p>Базовая безопасность которую игнорируют в 90% гайдов:</p>
<ul>
<li>Порт SSH на VPS - смени на нестандартный или закрой для всех кроме твоего IP</li>
<li>fail2ban на VPS - <a class="wpil_keyword_link" href="https://it-apteka.com/category/security/" target="_blank" rel="noopener" title="Безопасность" data-wpil-keyword-link="linked" data-wpil-monitor-id="2849">защита</a> от брутфорса SSH</li>
<li>Приватный ключ WireGuard - права 600, читать может только root</li>
<li>На MikroTik отключи Winbox и API на WAN-интерфейсе</li>
<li>Ограничь доступ к RouterOS services только с wireguard или LAN интерфейса</li>
</ul>
<pre><code class="language-bash">
# Права на приватный ключ VPS
chmod 600 /etc/wireguard/server_private.key
chmod 600 /etc/wireguard/wg0.conf
# fail2ban установка
apt install fail2ban -y
systemctl enable fail2ban
systemctl start fail2ban
</code></pre>
<pre><code class="language-bash">
# На MikroTik - отключаем лишние сервисы на WAN
/ip service set www disabled=yes
/ip service set api disabled=yes
/ip service set winbox address=192.168.10.0/24,10.0.0.0/30
</code></pre>
<h2>FAQ</h2>
<h3>Почему wireguard site to site mikrotik не работает после настройки?</h3>
<p>Чаще всего три причины. Первая - firewall на MikroTik: accept-правила для wg-tunnel стоят ниже drop-правил. Проверь порядок через <code>/ip firewall filter print</code>. Вторая - нет маршрута: MikroTik не добавляет маршруты автоматически из AllowedIPs, только Linux wg-quick это делает. Добавь маршрут вручную. Третья - неверные AllowedIPs: если на VPS в peer для MikroTik не прописана подсеть 192.168.10.0/24, трафик из этой сети будет отброшен.</p>
<h3>Как проверить что wireguard туннель mikrotik работает правильно?</h3>
<p>На MikroTik выполни <code>/interface wireguard peers print</code> - в поле last-handshake должно быть время не старше нескольких минут. Затем <code>/ping 10.0.0.1</code> - должен пройти. С VPS выполни <code>wg show</code> - в поле latest handshake должно быть актуальное время. Если handshake есть но пинги до локальной сети не проходят - проблема в маршрутах или FORWARD-правилах.</p>
<h3>Что делать если mikrotik за cgnat и нет белого ip?</h3>
<p>Это стандартная схема для WireGuard. Белый IP нужен только на VPS. MikroTik инициирует подключение - не указывай Endpoint на стороне VPS, не прописывай статический Endpoint для MikroTik peer. PersistentKeepalive = 25 на MikroTik обязателен - без него NAT-сессия протухнет и туннель упадёт. VPS должен слушать на фиксированном порту UDP 51820.</p>
<h3>Чем wireguard отличается от l2tp ipsec на mikrotik?</h3>
<p>WireGuard - современный протокол с фиксированным набором криптографии (Curve25519, ChaCha20, Poly1305). Нет переговоров по алгоритмам, нет фаз IKE, нет SA. L2TP/IPsec сложнее в отладке, хуже работает за NAT, требует открытых UDP 500 и 4500 одновременно. WireGuard требует только одного UDP-порта. Производительность WireGuard выше за счёт работы в ядре Linux. Минус WireGuard: нет на RouterOS 6, и нет обфускации трафика из коробки.</p>
<h3>Почему wireguard туннель падает каждые несколько минут?</h3>
<p>Классический симптом CG-NAT или обычного NAT без keepalive. NAT-таблица на провайдерском оборудовании закрывает UDP-сессии по таймауту 2-5 минут. Решение: на MikroTik в настройках peer установи persistent-keepalive=25s. Это заставляет MikroTik отправлять keepalive-пакет каждые 25 секунд, поддерживая NAT-запись живой.</p>
<h3>Как добавить второй офис к существующему wireguard туннелю?</h3>
<p>На VPS в wg0.conf добавь новую секцию [Peer] с ключом второго MikroTik и его AllowedIPs. Обязательно убедись что AllowedIPs у разных peer не пересекаются - это запрещено в WireGuard. Выполни <code>wg syncconf wg0 <(wg-quick strip wg0)</code> чтобы применить без перезапуска. На втором MikroTik настройка идентична первому.</p>
<h2>Итог</h2>
<p>WireGuard site-to-site между MikroTik и VPS - это 20 минут работы против нескольких часов с IPsec. Ты получаешь зашифрованный L3-туннель, который живёт за CG-NAT, переживает смену IP на стороне MikroTik, и при необходимости работает как резервный канал при падении основного.</p>
<p>Ключевые точки где люди застревают: порядок правил в firewall MikroTik, ручное добавление маршрутов, PersistentKeepalive за NAT, и правильные AllowedIPs на обеих сторонах. Всё это разобрано выше.</p>
"Не
<br />
Пиши в комментарии: модель MikroTik, версию RouterOS, провайдера (CG-NAT или белый IP), и что именно видишь в wg show и /interface wireguard peers print. Разберёмся.<br />
<h2>Источники</h2>
<ul>
<li><a href="https://help.mikrotik.com/docs/spaces/ROS/pages/69664792/WireGuard" rel="nofollow" target="_blank">MikroTik официальная документация WireGuard</a></li>
<li><a href="https://documentation.ubuntu.com/server/how-to/wireguard-vpn/site-to-site" rel="nofollow" target="_blank">Ubuntu Server - WireGuard site-to-site</a></li>
<li><a href="https://www.wireguard.com/" rel="nofollow" target="_blank">WireGuard официальный сайт</a></li>
</ul>
Быстрый ответ
Чтобы поднять WireGuard site-to-site между MikroTik (RouterOS 7) и VPS на Linux:
- На VPS: установи WireGuard, создай интерфейс wg0, пропиши peer с публичным ключом MikroTik и AllowedIPs = адрес туннеля + локальная подсеть за MikroTik
- На MikroTik: создай WireGuard-интерфейс, добавь IP, добавь peer с ключом VPS и AllowedIPs = адрес туннеля + подсеть VPS
- На VPS: включи ip_forward, добавь iptables FORWARD + MASQUERADE если нужен выход в интернет
- На MikroTik: добавь статический маршрут через WireGuard-интерфейс, разреши UDP-порт в firewall
- Если MikroTik за CG-NAT — используй PersistentKeepalive = 25 на стороне MikroTik, Endpoint указывай только на VPS
Туннель поднимается за 15-20 минут. RouterOS 7.1 и выше, Ubuntu/Debian на VPS.
Зачем это нужно и когда L2TP наконец умирает
L2TP/IPsec на MikroTik работает. Работало в 2012-м, работает сейчас. Вопрос только в том, сколько времени ты тратишь на его капризы: согласование фаз, MTU-проблемы, падение при смене IP, портянки политик в конфиге. WireGuard решает всё это одним интерфейсом и 20 строками конфига.
Конкретные сценарии где это нужно прямо сейчас:
- Офис-1 и Офис-2 нужно объединить в одну L3-сеть, у одного из них CG-NAT от провайдера
- Домашняя сеть с MikroTik и VDS в Европе — нужен единый адресный пространство
- Белый IP на VPS используется как точка входа, а за MikroTik сидят сервисы которые надо пробросить
- Failover: основной канал падает, трафик переключается на резервный через туннель
В статье разберём схему MikroTik (RouterOS 7) — VPS (Ubuntu/Debian). Это самый частый запрос. Принципы те же если у тебя два MikroTik — просто VPS заменяется вторым роутером с RouterOS.
Что понадобится: MikroTik с RouterOS 7.1+, VPS с публичным IP, 15-20 минут и доступ по SSH к обоим устройствам.
Как работает WireGuard site-to-site: разбор схемы
WireGuard — это L3-туннель. Никакого «моста» между сетями нет — только маршрутизация. Каждый хост на каждой стороне видит другую сторону как обычную IP-сеть, просто трафик идёт через зашифрованный UDP-туннель.
Самая важная концепция которую нужно понять до начала: AllowedIPs в WireGuard — это одновременно ACL и таблица маршрутизации. Трафик для адресов из AllowedIPs идёт через туннель к этому peer. Трафик от peer принимается только если источник совпадает с его AllowedIPs. Если это не уложилось в голове сейчас — уложится через 10 минут на практике.
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart LR
A["LAN: 192.168.10.0/24"] --> B["MikroTik wg0: 10.0.0.2/30"]
B -->|"UDP 51820 / зашифровано"| C["VPS wg0: 10.0.0.1/30"]
C --> D["VPS LAN / Docker / сервисы"]
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style B fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style C fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style D fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
Адресный план который используется в статье — зафиксируй для себя:
| Сторона |
WireGuard IP |
Локальная сеть |
Роль |
| VPS (Ubuntu) |
10.0.0.1/30 |
— |
Responder (принимает подключение) |
| MikroTik |
10.0.0.2/30 |
192.168.10.0/24 |
Initiator (инициирует из-за NAT) |
Почему /30 а не /24 для туннеля: это правило хорошего тона для point-to-point линков. Два адреса, никакого лишнего пространства. Если хочешь подключить несколько peer — бери /24 или /29.
Системные требования
| Компонент |
Минимум |
Проверено |
| RouterOS |
7.1 |
7.14, 7.15, 7.16 |
| Ubuntu (VPS) |
20.04 LTS |
22.04, 24.04 |
| Debian (VPS) |
11 (Bullseye) |
12 (Bookworm) |
| WireGuard (ядро Linux) |
kernel 5.6+ |
встроен в Ubuntu 20.04+ |
| wireguard-tools |
1.0.20200319 |
1.0.20210914 |
На момент публикации актуальна RouterOS 7.16. Перед настройкой проверь свежие релизы на mikrotik.com/download.
WireGuard на MikroTik доступен только в RouterOS 7. Если у тебя RouterOS 6 — обнови. Процедура обновления через 6.49 stable -> 7.x описана в официальной документации MikroTik.
Порты и firewall
| Порт |
Протокол |
Направление |
Назначение |
Открыт снаружи |
| 51820 |
UDP |
входящий на VPS |
WireGuard туннель |
Да |
| 51820 |
UDP |
входящий на MikroTik |
WireGuard (опционально) |
Если нет CG-NAT |
| 22 |
TCP |
входящий на VPS |
SSH управление |
Рекомендуется ограничить по IP |
Настройка VPS (Ubuntu/Debian): сторона сервера
Шаг 1. Установка WireGuard
На Ubuntu 20.04 и выше WireGuard встроен в ядро. Нужны только инструменты.
apt update && apt install wireguard wireguard-tools -y
Проверь что модуль загружен:
lsmod | grep wireguard
Если пусто — загрузи вручную:
modprobe wireguard
Шаг 2. Генерация ключей VPS
Каждый WireGuard-интерфейс имеет пару ключей: приватный (никуда не уходит) и публичный (отдаётся peer-у). Генерируй их так:
# Создаём директорию с правильными правами
install -m 0700 -d /etc/wireguard
# Генерируем ключи
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
Публичный ключ VPS понадобится при настройке MikroTik. Скопируй его сейчас — потом будешь искать.
Шаг 3. Создание конфига wg0.conf
Важно: AllowedIPs у peer
В секции [Peer] (MikroTik) указывай AllowedIPs = 10.0.0.2/32, 192.168.10.0/24. Первый адрес — это WireGuard IP MikroTik. Второй — локальная подсеть за MikroTik. Именно это позволит трафику из 192.168.10.0/24 ходить через туннель.
# /etc/wireguard/wg0.conf
[Interface]
PrivateKey =
Address = 10.0.0.1/30
ListenPort = 51820
# Включаем форвардинг и NAT при поднятии интерфейса
PostUp = sysctl -w net.ipv4.ip_forward=1
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
PostUp = iptables -A FORWARD -o wg0 -j ACCEPT
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -D FORWARD -o wg0 -j ACCEPT
[Peer]
# MikroTik
PublicKey =
AllowedIPs = 10.0.0.2/32, 192.168.10.0/24
# Endpoint не указываем - MikroTik сам подключится
# PersistentKeepalive не нужен на стороне VPS
Обрати внимание: Endpoint для MikroTik не прописан. VPS ждёт входящего подключения. MikroTik инициирует сессию сам, и WireGuard запомнит его адрес автоматически. Это важно при CG-NAT — у MikroTik может не быть постоянного публичного IP.
Запусти интерфейс и добавь в автозапуск:
systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0
# Проверяем статус
systemctl status wg-quick@wg0
Шаг 4. ip_forward на постоянной основе
PostUp через sysctl работает до перезагрузки. Чтобы форвардинг сохранялся:
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
Шаг 5. Firewall на VPS
Открой UDP 51820 в UFW или iptables. Если используешь UFW:
ufw allow 51820/udp comment "WireGuard"
ufw reload
Если UFW не используешь и у тебя чистый iptables:
iptables -A INPUT -p udp --dport 51820 -j ACCEPT
# Не забудь сохранить правила (iptables-persistent или netfilter-persistent)
apt install iptables-persistent -y
netfilter-persistent save
Настройка MikroTik (RouterOS 7): сторона клиента
Шаг 1. Создание WireGuard-интерфейса
Открой Terminal в Winbox или подключись по SSH. Выполни:
/interface wireguard add name=wg-tunnel listen-port=51820
MikroTik сгенерирует ключи автоматически. Посмотри публичный ключ — он нужен для конфига VPS:
/interface wireguard print
В выводе найди строку public-key=. Скопируй значение — это публичный ключ MikroTik который надо вставить в wg0.conf на VPS.
Шаг 2. Назначение IP-адреса
/ip address add address=10.0.0.2/30 interface=wg-tunnel
Шаг 3. Добавление peer (VPS)
PersistentKeepalive - почему это критично
Если MikroTik за NAT или CG-NAT — без PersistentKeepalive туннель будет падать через несколько минут простоя. NAT-таблица на провайдерском оборудовании протухает, и VPS теряет маршрут к MikroTik. PersistentKeepalive = 25 секунд — стандартное значение, держит сессию живой.
/interface wireguard peers add \
interface=wg-tunnel \
public-key="" \
endpoint-address= \
endpoint-port=51820 \
allowed-address=10.0.0.1/32,0.0.0.0/0 \
persistent-keepalive=25s
Подожди — здесь allowed-address=10.0.0.1/32,0.0.0.0/0 это полный туннель (весь трафик через VPS). Если нужен только доступ к подсети VPS а не выход в интернет — замени на конкретные подсети:
/interface wireguard peers add \
interface=wg-tunnel \
public-key="" \
endpoint-address= \
endpoint-port=51820 \
allowed-address=10.0.0.1/32,172.16.0.0/24 \
persistent-keepalive=25s
Где 172.16.0.0/24 — подсеть которая живёт за VPS и к которой нужен доступ.
Шаг 4. Статический маршрут
AllowedIPs в MikroTik работает иначе чем в Linux wg-quick. На Linux wg-quick автоматически добавляет маршруты из AllowedIPs. MikroTik этого не делает — маршруты надо добавить вручную.
# Маршрут к VPS (WireGuard IP)
/ip route add dst-address=10.0.0.1/32 gateway=wg-tunnel
# Если нужен доступ к подсети за VPS (например, Docker-сети)
/ip route add dst-address=172.16.0.0/24 gateway=wg-tunnel
Если хочешь гнать весь трафик через VPS — добавь default route с большей метрикой (distance) чем основной:
/ip route add dst-address=0.0.0.0/0 gateway=wg-tunnel distance=2
Шаг 5. Firewall на MikroTik
Стандартный firewall RouterOS блокирует туннель. Нужно разрешить входящий UDP на порт WireGuard и форвардинг через туннельный интерфейс.
# Разрешаем входящий WireGuard (UDP 51820)
/ip firewall filter add \
action=accept \
chain=input \
protocol=udp \
dst-port=51820 \
comment="WireGuard input" \
place-before=1
# Разрешаем форвардинг через wg-tunnel
/ip firewall filter add \
action=accept \
chain=forward \
in-interface=wg-tunnel \
comment="WireGuard forward in" \
place-before=1
/ip firewall filter add \
action=accept \
chain=forward \
out-interface=wg-tunnel \
comment="WireGuard forward out" \
place-before=1
Параметр place-before=1 вставляет правило перед первым существующим. Это критично — firewall RouterOS обрабатывает правила сверху вниз, и drop-правила по умолчанию идут в начале списка.
Шаг 6. NAT на MikroTik (если локальная сеть должна выходить через VPS)
Если хосты за MikroTik должны выходить в интернет через VPS — добавь masquerade:
/ip firewall nat add \
chain=srcnat \
out-interface=wg-tunnel \
action=masquerade \
comment="Masquerade through WireGuard"
Без этого правила ответный трафик с VPS не будет знать куда возвращаться — у хостов в 192.168.10.0/24 нет маршрута к VPS через интернет напрямую.
Архитектура полного потока трафика
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
A["Хост 192.168.10.100"] -->|"dst: 172.16.0.5"| B["MikroTik - проверка маршрутов"]
B -->|"dst: 172.16.0.0/24 via wg-tunnel"| C["WireGuard шифрование"]
C -->|"UDP 51820 encrypted"| D["VPS - wg0 расшифровка"]
D -->|"ip_forward + FORWARD accept"| E["Сервис на 172.16.0.5"]
E -->|"ответ"| D
D -->|"UDP 51820 encrypted"| C
C --> B
B --> A
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style B fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style C fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#c2410c
style D fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style E fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
Проверка: туннель живой или нет
На VPS
# Статус интерфейса и handshake
wg show
# Должно быть:
# latest handshake: X seconds/minutes ago
# transfer: X received, X sent
Если в строке latest handshake нет значения вообще — MikroTik ещё не подключился. Если handshake был, но давно — проверь PersistentKeepalive.
# Проверка маршрутизации с VPS до MikroTik WG IP
ping 10.0.0.2
# Проверка доступности хоста за MikroTik
ping 192.168.10.1
На MikroTik
# Проверка статуса peer
/interface wireguard peers print
# Посмотри поле "last-handshake" - если есть время, туннель жив
# Пинг до VPS WireGuard IP
/ping 10.0.0.1
# Проверка таблицы маршрутов
/ip route print where gateway=wg-tunnel
Хорошая проверка site-to-site — traceroute с хоста в локальной сети до адреса на стороне VPS. Если первый хоп — MikroTik, второй — 10.0.0.1 (VPS WireGuard IP), а третий — целевой хост, всё работает правильно.
# С MikroTik
/tool traceroute 172.16.0.5
Осложнения: что идёт не так и как чинить
Ошибка: туннель поднялся, пинги до 10.0.0.1 есть, но до 192.168.10.x с VPS не добраться
Причина: на VPS нет маршрута до 192.168.10.0/24, или блокирует iptables FORWARD. AllowedIPs в wg0.conf на VPS для MikroTik peer должен включать подсеть 192.168.10.0/24.
# Проверяем что в AllowedIPs у peer на VPS
wg show wg0 allowed-ips
# Должно быть: 10.0.0.2/32 192.168.10.0/24
# Проверяем FORWARD правила
iptables -L FORWARD -n -v | grep wg0
Ошибка: нет handshake — туннель не поднимается
Причина: чаще всего UDP 51820 заблокирован на VPS файрволом или у облачного провайдера в Security Group. Также бывает неверный публичный ключ.
# Проверяем слушает ли WireGuard на порту
ss -ulnp | grep 51820
# С внешней машины проверяем доступность порта
nc -zu 51820 && echo "open" || echo "closed"
# На VPS смотрим в лог
journalctl -u wg-quick@wg0 -n 50
Ошибка: туннель работает, но падает каждые 3-5 минут
Причина: MikroTik за NAT, PersistentKeepalive не настроен. NAT-сессия на провайдерском оборудовании закрывается по таймауту.
# На MikroTik - проверяем и исправляем keepalive
/interface wireguard peers print
/interface wireguard peers set 0 persistent-keepalive=25s
Ошибка: MTU проблемы — большие пакеты теряются, маленькие проходят
Симптом: ping проходит, TCP-сессии зависают, HTTPS не открывается. Классика WireGuard через провайдерский NAT или PPPoE.
WireGuard добавляет 60 байт оверхеда. При стандартном MTU 1500 на физическом интерфейсе WireGuard-пакет не влезает если провайдер режет фрейм.
# Устанавливаем MTU явно на MikroTik
/interface wireguard set wg-tunnel mtu=1420
# Или через MSS clamping (мягче, без ручного MTU)
/ip firewall mangle add \
chain=forward \
protocol=tcp \
tcp-flags=syn \
in-interface=wg-tunnel \
action=change-mss \
new-mss=1360 \
passthrough=yes
# На VPS
ip link set wg0 mtu 1420
# Или в wg0.conf добавить в [Interface]:
# MTU = 1420
Ошибка: MikroTik видит peer но маршрут не работает
Причина: правила firewall forward на MikroTik стоят ниже drop-правил по умолчанию.
# Смотрим порядок правил
/ip firewall filter print
# Accept-правила для wg-tunnel должны быть ДО drop-all
# Если они внизу - перемещаем вверх
/ip firewall filter move [find comment="WireGuard forward in"] destination=1
Ошибка: CG-NAT — у MikroTik нет публичного IP вообще
Это не ошибка, это особенность провайдера. Схема работает: MikroTik инициирует соединение к VPS, который всегда доступен по публичному IP. Endpoint прописывается только на стороне MikroTik. PersistentKeepalive = 25 обязателен. Проверь что на VPS в wg0.conf для MikroTik peer нет строки Endpoint — он там не нужен.
Сценарий с обоими MikroTik (без VPS)
Если оба устройства — MikroTik, один из которых с публичным IP — схема симметрична. Сторона с белым IP слушает на фиксированном порту. Сторона за NAT инициирует, использует PersistentKeepalive.
На обоих MikroTik создаёшь WireGuard интерфейс, обмениваешься публичными ключами, прописываешь peer. Никакого wg0.conf здесь нет — всё через RouterOS команды или Winbox.
Одна строка в кавычках убивает весь отдел в 9 утра понедельника. Это не метафора, это причина почему в production конфиги комментируют.
Failover: что делать если основной канал падает
WireGuard сам по себе не имеет failover — это просто туннель. Но RouterOS умеет переключать маршруты по доступности шлюза.
# Основной маршрут через ISP (distance=1)
/ip route add dst-address=0.0.0.0/0 gateway= distance=1 check-gateway=ping
# Резервный через WireGuard туннель (distance=2, поднимается при недоступности основного)
/ip route add dst-address=0.0.0.0/0 gateway=wg-tunnel distance=2
Параметр check-gateway=ping заставляет RouterOS периодически проверять доступность шлюза. Если ISP-шлюз не отвечает на ping — маршрут с distance=1 деактивируется и начинает работать distance=2 через туннель.
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
A["Трафик из LAN"] --> B["Проверка маршрутов"]
B -->|"ISP доступен - distance=1"| C["ISP Gateway"]
B -->|"ISP недоступен - distance=2"| D["WireGuard -> VPS"]
C --> E["Интернет"]
D --> E
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style B fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style C fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style D fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#c2410c
style E fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
Альтернативы и когда их выбирать
| Протокол |
Сложность настройки |
Производительность |
Стабильность за NAT |
RouterOS поддержка |
| WireGuard |
Низкая |
Высокая |
Хорошая (keepalive) |
RouterOS 7+ |
| IPsec IKEv2 |
Высокая |
Высокая |
Хорошая |
RouterOS 6+ |
| L2TP/IPsec |
Средняя |
Средняя |
Плохая за CG-NAT |
RouterOS 6+ |
| OpenVPN |
Средняя |
Низкая (user-space) |
Хорошая (TCP mode) |
RouterOS 7+ |
| EoIP + IPsec |
Средняя |
Средняя |
Средняя |
RouterOS (только MikroTik-MikroTik) |
WireGuard выбираем когда: одна из сторон Linux, нужна максимальная простота конфига, важна скорость, есть CG-NAT. IPsec IKEv2 остаётся актуальным если нужна совместимость с корпоративным оборудованием Cisco/Juniper или требуется сертифицированное шифрование.
Профилактика и мониторинг
Скрипт мониторинга туннеля на MikroTik
RouterOS позволяет поднять туннель автоматически через Scheduler. Скрипт проверяет доступность VPS и перезапускает WireGuard если peer не отвечает:
# Создаём скрипт
/system script add name="wg-check" source={
:local pingResult [/ping 10.0.0.1 count=3 as-value]
:if ($pingResult < 1) do={
/log warning "WireGuard: VPS not reachable, restarting interface"
/interface disable wg-tunnel
:delay 3s
/interface enable wg-tunnel
}
}
# Добавляем в планировщик - запуск каждые 5 минут
/system scheduler add name="wg-monitor" interval=5m on-event=wg-check
Что бэкапить
На MikroTik обязательно экспортируй конфиг после настройки:
/export file=wg-config-backup
# Файл сохраняется в Files, скачай через Winbox или SCP
На VPS сохрани wg0.conf в надёжное место. Приватный ключ потерять нельзя - восстановить без него туннель не получится, придётся перегенерировать ключи на обеих сторонах.
Обновление конфига без потери туннеля
На VPS при изменении wg0.conf не нужно перезапускать интерфейс полностью - можно применить изменения горячо:
# Применяем изменения без разрыва туннеля
wg syncconf wg0 <(wg-quick strip wg0)
На MikroTik изменения в peers применяются сразу без перезапуска интерфейса.
Безопасность: что закрыть после настройки
Базовая безопасность которую игнорируют в 90% гайдов:
- Порт SSH на VPS - смени на нестандартный или закрой для всех кроме твоего IP
- fail2ban на VPS - защита от брутфорса SSH
- Приватный ключ WireGuard - права 600, читать может только root
- На MikroTik отключи Winbox и API на WAN-интерфейсе
- Ограничь доступ к RouterOS services только с wireguard или LAN интерфейса
# Права на приватный ключ VPS
chmod 600 /etc/wireguard/server_private.key
chmod 600 /etc/wireguard/wg0.conf
# fail2ban установка
apt install fail2ban -y
systemctl enable fail2ban
systemctl start fail2ban
# На MikroTik - отключаем лишние сервисы на WAN
/ip service set www disabled=yes
/ip service set api disabled=yes
/ip service set winbox address=192.168.10.0/24,10.0.0.0/30
FAQ
Почему wireguard site to site mikrotik не работает после настройки?
Чаще всего три причины. Первая - firewall на MikroTik: accept-правила для wg-tunnel стоят ниже drop-правил. Проверь порядок через /ip firewall filter print. Вторая - нет маршрута: MikroTik не добавляет маршруты автоматически из AllowedIPs, только Linux wg-quick это делает. Добавь маршрут вручную. Третья - неверные AllowedIPs: если на VPS в peer для MikroTik не прописана подсеть 192.168.10.0/24, трафик из этой сети будет отброшен.
Как проверить что wireguard туннель mikrotik работает правильно?
На MikroTik выполни /interface wireguard peers print - в поле last-handshake должно быть время не старше нескольких минут. Затем /ping 10.0.0.1 - должен пройти. С VPS выполни wg show - в поле latest handshake должно быть актуальное время. Если handshake есть но пинги до локальной сети не проходят - проблема в маршрутах или FORWARD-правилах.
Что делать если mikrotik за cgnat и нет белого ip?
Это стандартная схема для WireGuard. Белый IP нужен только на VPS. MikroTik инициирует подключение - не указывай Endpoint на стороне VPS, не прописывай статический Endpoint для MikroTik peer. PersistentKeepalive = 25 на MikroTik обязателен - без него NAT-сессия протухнет и туннель упадёт. VPS должен слушать на фиксированном порту UDP 51820.
Чем wireguard отличается от l2tp ipsec на mikrotik?
WireGuard - современный протокол с фиксированным набором криптографии (Curve25519, ChaCha20, Poly1305). Нет переговоров по алгоритмам, нет фаз IKE, нет SA. L2TP/IPsec сложнее в отладке, хуже работает за NAT, требует открытых UDP 500 и 4500 одновременно. WireGuard требует только одного UDP-порта. Производительность WireGuard выше за счёт работы в ядре Linux. Минус WireGuard: нет на RouterOS 6, и нет обфускации трафика из коробки.
Почему wireguard туннель падает каждые несколько минут?
Классический симптом CG-NAT или обычного NAT без keepalive. NAT-таблица на провайдерском оборудовании закрывает UDP-сессии по таймауту 2-5 минут. Решение: на MikroTik в настройках peer установи persistent-keepalive=25s. Это заставляет MikroTik отправлять keepalive-пакет каждые 25 секунд, поддерживая NAT-запись живой.
Как добавить второй офис к существующему wireguard туннелю?
На VPS в wg0.conf добавь новую секцию [Peer] с ключом второго MikroTik и его AllowedIPs. Обязательно убедись что AllowedIPs у разных peer не пересекаются - это запрещено в WireGuard. Выполни wg syncconf wg0 <(wg-quick strip wg0) чтобы применить без перезапуска. На втором MikroTik настройка идентична первому.
Итог
WireGuard site-to-site между MikroTik и VPS - это 20 минут работы против нескольких часов с IPsec. Ты получаешь зашифрованный L3-туннель, который живёт за CG-NAT, переживает смену IP на стороне MikroTik, и при необходимости работает как резервный канал при падении основного.
Ключевые точки где люди застревают: порядок правил в firewall MikroTik, ручное добавление маршрутов, PersistentKeepalive за NAT, и правильные AllowedIPs на обеих сторонах. Всё это разобрано выше.
Не заработало?
Пиши в комментарии: модель MikroTik, версию RouterOS, провайдера (CG-NAT или белый IP), и что именно видишь в wg show и /interface wireguard peers print. Разберёмся.
Источники