## Site-to-Site GRE между двумя MikroTik RouterOS 7.14+ (Shats ↔ Malinin) Этот гайд пошагово настраивает маршрут между двумя площадками по GRE-туннелю так, чтобы клиенты за роутером Shats из сети `192.168.0.0/16` видели клиентов сети `192.168.1.0/24` за роутером Malinin. - Платформа: MikroTik RouterOS 7.14+ - Туннель: GRE (с опцией — GRE поверх IPsec для шифрования) - Очень подробно: с командами CLI, проверками и устранением неполадок ### Схема и адреса - Router Shats: - WAN (публичный): `178.49.24.65` - LAN: `192.168.0.0/16` - GRE IP на туннеле: `10.199.99.1/30` - Router Malinin: - WAN (публичный): `80.64.170.90` - LAN: `192.168.1.0/24` - GRE IP на туннеле: `10.199.99.2/30` GRE-интерфейс поднимается между публичными адресами. На GRE назначаем /30 адреса из подсети `10.199.99.0/30`. --- ### Предпосылки и рекомендации 1) Доступ в терминал RouterOS (WinBox/WebFig/SSH). 2) На обоих маршрутизаторах уже есть рабочий доступ в интернет на WAN-интерфейсах. 3) Если включён FastTrack — его нужно отключить или исключить межсайтовый трафик из fasttrack. 4) Маскарадинг (srcnat/masquerade) — добавим правила обхода NAT для межсайтового трафика, чтобы не NAT’ить его. 5) MTU/MSS — включим `clamp-tcp-mss` на GRE, чтобы избежать фрагментации. Примечание: Если у вас на WAN есть строгий firewall, заранее разрешите протокол GRE (IP protocol 47) в `input` на адреса пиров. --- ### 0) Резервная копия (рекомендуется) ```rsc /system backup save name=pre-gre-setup ``` --- ### 1) Создание GRE-интерфейсов Настраиваем GRE на каждом роутере. Важно указать правильные `local-address` (своё публичное) и `remote-address` (публичный адрес удалённого роутера). #### На Shats ```rsc /interface gre add name=gre-to-malinin local-address=178.49.24.65 remote-address=80.64.170.90 clamp-tcp-mss=yes keepalive=10s,10 /ip address add address=10.199.99.1/30 interface=gre-to-malinin comment="GRE to Malinin" ``` #### На Malinin ```rsc /interface gre add name=gre-to-shats local-address=80.64.170.90 remote-address=178.49.24.65 clamp-tcp-mss=yes keepalive=10s,10 /ip address add address=10.199.99.2/30 interface=gre-to-shats comment="GRE to Shats" ``` Пояснения: - `clamp-tcp-mss=yes` — автоматически поджимает MSS внутри GRE, снижая риск фрагментации. - `keepalive=10s,10` — отправка keepalive каждые 10 секунд, 10 неудачных попыток → интерфейс считается down. --- ### 2) Маршрутизация между LAN-сетями Добавляем на обоих роутерах статические маршруты в удалённые LAN через IP удалённого конца GRE. #### На Shats (в сторону сети Malinin 192.168.1.0/24) ```rsc /ip route add dst-address=192.168.1.0/24 gateway=10.199.99.2 comment="to Malinin via GRE" ``` #### На Malinin (в сторону сети Shats 192.168.0.0/16) ```rsc /ip route add dst-address=192.168.0.0/16 gateway=10.199.99.1 comment="to Shats via GRE" ``` --- ### 3) Обход NAT (srcnat bypass) Если у вас есть общие правила `masquerade` на WAN, необходимо добавить правила «accept» перед masquerade, чтобы НЕ NAT’ить межсайтовый трафик. Это критично для корректной маршрутизации между приватными сетями. #### На Shats ```rsc /ip firewall nat add chain=srcnat src-address=192.168.0.0/16 dst-address=192.168.1.0/24 action=accept comment="bypass NAT to Malinin LAN" ``` #### На Malinin ```rsc /ip firewall nat add chain=srcnat src-address=192.168.1.0/24 dst-address=192.168.0.0/16 action=accept comment="bypass NAT to Shats LAN" ``` Убедитесь, что эти правила стоят ВЫШЕ ваших общих правил `masquerade`. --- ### 4) FastTrack: отключить или исключить межсайтовый трафик Если включён FastTrack, он может «обходить» firewall/NAT-цепочки и ломать туннельный трафик. Проще всего — отключить FastTrack, или скорректировать условие fasttrack-правила так, чтобы исключить межсайтовые сети. Вариант A — полностью отключить FastTrack (на обоих): ```rsc /ip firewall filter set [find where chain=forward and action=fasttrack-connection] disabled=yes ``` Вариант B — исключить межсайтовый трафик из FastTrack (пример для типового fasttrack-правила): ```rsc /ip firewall filter # Пример: добавляем отрицательные условия к существующему fasttrack-правилу set [find where chain=forward and action=fasttrack-connection and connection-state~"established,related"] \ src-address=!192.168.0.0/16 dst-address=!192.168.1.0/24 ``` Примечание: точный синтаксис «set ... src-address/dst-address» для вашего текущего fasttrack-правила может отличаться. Универсально — поставить ПЕРЕД fasttrack явное `accept` для межсайтовых сетей в обе стороны (такие пакеты не попадут под fasttrack): ```rsc /ip firewall filter add chain=forward src-address=192.168.0.0/16 dst-address=192.168.1.0/24 action=accept comment="allow site-to-site" add chain=forward src-address=192.168.1.0/24 dst-address=192.168.0.0/16 action=accept comment="allow site-to-site" ``` --- ### 5) Разрешения в firewall (input) для GRE Если у вас жёсткие политики на `input`, нужно явно разрешить GRE-пакеты c удалённого публичного IP в адрес вашего WAN. #### На Shats ```rsc /ip firewall filter add chain=input protocol=gre src-address=80.64.170.90 dst-address=178.49.24.65 action=accept comment="allow GRE from Malinin" ``` #### На Malinin ```rsc /ip firewall filter add chain=input protocol=gre src-address=178.49.24.65 dst-address=80.64.170.90 action=accept comment="allow GRE from Shats" ``` Разрешите также `icmp` (для диагностики) и доступ управления (ssh/winbox) по необходимости. Если политика по умолчанию — `drop`, удостоверьтесь, что выше есть правила `accept` для established/related. --- ### 6) Проверка работоспособности 1) Статус GRE-интерфейса: ```rsc /interface gre print detail ``` 2) Ping точек GRE: ```rsc /ping 10.199.99.2 interface=gre-to-malinin ;# выполнять на Shats /ping 10.199.99.1 interface=gre-to-shats ;# выполнять на Malinin ``` 3) Ping межсайтовых адресов (с указанием источника из LAN): ```rsc # На Shats — пингуем хост в 192.168.1.0/24, например 192.168.1.10 /ping 192.168.1.10 src-address=192.168.0.1 # На Malinin — пингуем хост в 192.168.0.0/16, например 192.168.0.10 /ping 192.168.0.10 src-address=192.168.1.1 ``` 4) Таблица маршрутов и ARP (диагностика): ```rsc /ip route print where dst-address~"192.168.0.0/16|192.168.1.0/24" /ip neighbor print ``` 5) Connection tracking (убедиться, что нет NAT на межсайтовых потоках): ```rsc /ip firewall connection print where dst-address~"192.168.1." or src-address~"192.168.1." ``` --- ### 7) Частые проблемы и решения - Туннель up, но пинги межсайт не идут: проверьте, что на обеих сторонах есть статические маршруты через адрес ДРУГОГО конца GRE (10.199.99.2 на Shats и 10.199.99.1 на Malinin). - Пакеты идут в одну сторону: убедитесь в обходе NAT (правила `srcnat action=accept` стоят выше masquerade) и в исключении FastTrack. - Туннель не поднимается: разрешите `protocol=gre` на `input` между публичными IP, проверьте, что `local-address`/`remote-address` указаны верно. - Большие пакеты/веб «подвисают»: включён `clamp-tcp-mss=yes` на GRE. При необходимости можно уменьшить MTU GRE-интерфейса (например, до 1430) и повторно проверить. --- ### 8) Полные блоки конфигурации для быстрого применения Скопируйте на соответствующий роутер целиком. Корректируйте адреса управления (src-address в ping) под ваши реальные адреса шлюзов/LAN. #### Применить на Shats ```rsc /interface gre add name=gre-to-malinin local-address=178.49.24.65 remote-address=80.64.170.90 clamp-tcp-mss=yes keepalive=10s,10 /ip address add address=10.199.99.1/30 interface=gre-to-malinin comment="GRE to Malinin" /ip route add dst-address=192.168.1.0/24 gateway=10.199.99.2 comment="to Malinin via GRE" /ip firewall nat add chain=srcnat src-address=192.168.0.0/16 dst-address=192.168.1.0/24 action=accept comment="bypass NAT to Malinin LAN" /ip firewall filter add chain=input protocol=gre src-address=80.64.170.90 dst-address=178.49.24.65 action=accept comment="allow GRE from Malinin" # (Опция) Явно разрешить межсайтовый трафик и обойти fasttrack add chain=forward src-address=192.168.0.0/16 dst-address=192.168.1.0/24 action=accept comment="allow site-to-site" add chain=forward src-address=192.168.1.0/24 dst-address=192.168.0.0/16 action=accept comment="allow site-to-site" # (Опция) отключить fasttrack целиком # set [find where chain=forward and action=fasttrack-connection] disabled=yes ``` #### Применить на Malinin ```rsc /interface gre add name=gre-to-shats local-address=80.64.170.90 remote-address=178.49.24.65 clamp-tcp-mss=yes keepalive=10s,10 /ip address add address=10.199.99.2/30 interface=gre-to-shats comment="GRE to Shats" /ip route add dst-address=192.168.0.0/16 gateway=10.199.99.1 comment="to Shats via GRE" /ip firewall nat add chain=srcnat src-address=192.168.1.0/24 dst-address=192.168.0.0/16 action=accept comment="bypass NAT to Shats LAN" /ip firewall filter add chain=input protocol=gre src-address=178.49.24.65 dst-address=80.64.170.90 action=accept comment="allow GRE from Shats" # (Опция) Явно разрешить межсайтовый трафик и обойти fasttrack add chain=forward src-address=192.168.1.0/24 dst-address=192.168.0.0/16 action=accept comment="allow site-to-site" add chain=forward src-address=192.168.0.0/16 dst-address=192.168.1.0/24 action=accept comment="allow site-to-site" # (Опция) отключить fasttrack целиком # set [find where chain=forward and action=fasttrack-connection] disabled=yes ``` --- ### 9) (Опционально) Шифрование: GRE поверх IPsec Если требуется шифровать GRE-трафик через интернет, включите IPsec в транспортном режиме для протокола GRE между публичными IP. Пример — IKEv2 с PSK и современными шифрами. Команды приводятся симметрично на обеих сторонах (подставьте соответствующие локальные/удалённые адреса и одинаковый секрет). #### На Shats ```rsc /ip ipsec profile add name=prof-gre ike-dh-group=modp2048 ike-encryption=aes-256 ike-integrity=sha256 /ip ipsec proposal add name=prop-gre auth-algorithms=sha256 enc-algorithms=aes-256-gcm pfs-group=none /ip ipsec peer add name=peer-malinin address=80.64.170.90/32 exchange-mode=ike2 profile=prof-gre send-initial-contact=yes /ip ipsec identity add peer=peer-malinin auth-method=pre-shared-key secret="SET_STRONG_SHARED_KEY" /ip ipsec policy add src-address=178.49.24.65/32 dst-address=80.64.170.90/32 protocol=gre action=encrypt level=require \ proposal=prop-gre tunnel=no sa-src-address=178.49.24.65 sa-dst-address=80.64.170.90 ``` #### На Malinin ```rsc /ip ipsec profile add name=prof-gre ike-dh-group=modp2048 ike-encryption=aes-256 ike-integrity=sha256 /ip ipsec proposal add name=prop-gre auth-algorithms=sha256 enc-algorithms=aes-256-gcm pfs-group=none /ip ipsec peer add name=peer-shats address=178.49.24.65/32 exchange-mode=ike2 profile=prof-gre send-initial-contact=yes /ip ipsec identity add peer=peer-shats auth-method=pre-shared-key secret="SET_STRONG_SHARED_KEY" /ip ipsec policy add src-address=80.64.170.90/32 dst-address=178.49.24.65/32 protocol=gre action=encrypt level=require \ proposal=prop-gre tunnel=no sa-src-address=80.64.170.90 sa-dst-address=178.49.24.65 ``` Дополнительно: - Если политика `input` строгая, разрешите UDP/500 и UDP/4500 (IKE/NAT-T) и `ipsec-esp` между публичными IP. - На публичных адресах без NAT можно оставить `nat-traversal=no` (по умолчанию RouterOS 7 сам определяет необходимость). Для надёжности: `peer set peer-... passive=no`. Проверка: ```rsc /ip ipsec active-peers print detail /ip ipsec installed-sa print detail ``` --- ### 10) Финальная проверка связности пользователей 1) С ПК за Shats (например, `192.168.0.100`) — ping `192.168.1.10` (ПК за Malinin). Должны быть ответы. 2) С ПК за Malinin (например, `192.168.1.50`) — ping `192.168.0.10` (ПК за Shats). 3) Traceroute между сетями должен показывать переход через GRE (обычно один «хоп» до адреса удалённой LAN через 10.199.99.1↔10.199.99.2). 4) При большой нагрузке на межсайтовый трафик убедитесь, что нет внезапных обрывов (если есть — проверьте MTU/MSS и FastTrack/NAT правила). --- Готово. После выполнения шагов клиенты `192.168.0.0/16` за Shats будут видеть клиентов `192.168.1.0/24` за Malinin через GRE-туннель. Для безопасности можно включить опциональный раздел IPsec.