commit 4396ef1cdc103c4f71b05dcc6a2e15066f17dc58 Author: spyk3r Date: Tue Aug 11 21:30:26 2026 +0500 Add awg+mikrotik.md diff --git a/awg+mikrotik.md b/awg+mikrotik.md new file mode 100644 index 0000000..91db5ab --- /dev/null +++ b/awg+mikrotik.md @@ -0,0 +1,866 @@ +# Настройка MikroTik + Ubuntu + AmneziaWG + BGP + +## Схема + +```text +Клиенты LAN +192.168.0.0/24 + | + v +MikroTik +192.168.0.3 +AS 64999 + | + | маршруты, полученные по BGP + | next-hop -> 192.168.0.253 + v +Ubuntu 24.04 +192.168.0.253 + | + v +awg0 +AmneziaWG + | + v +VPN / Internet +``` + +Внешний BGP peer: + +```text +Peer IP: 45.148.244.55 +Remote AS: 65444 + +Local IP: 77.79.185.98 +Local AS: 64999 +``` + +Задача: + +- MikroTik получает маршруты по BGP. +- Для всех полученных маршрутов next-hop заменяется на `192.168.0.253`. +- Ubuntu работает как шлюз в AmneziaWG. +- Клиентам не нужно знать про Ubuntu. +- Маршруты нигде не дублируются вручную. +- SNAT на MikroTik автоматически применяется ко всему трафику, чей next-hop — `192.168.0.253`. + +--- + +# 1. Ubuntu: установка AmneziaWG + +Устанавливаем зависимости: + +```bash +apt update + +apt install -y \ + git \ + build-essential \ + dkms \ + linux-headers-$(uname -r) \ + iptables \ + resolvconf +``` + +Клонируем kernel module: + +```bash +cd /root + +git clone https://github.com/amnezia-vpn/amneziawg-linux-kernel-module.git +``` + +Устанавливаем через DKMS: + +```bash +cd /root/amneziawg-linux-kernel-module/src + +make dkms-install +``` + +Проверяем: + +```bash +dkms status +``` + +Загружаем модуль: + +```bash +modprobe amneziawg +``` + +Проверяем: + +```bash +lsmod | grep amneziawg +``` + +--- + +# 2. Установка awg-tools + +```bash +cd /root + +git clone https://github.com/amnezia-vpn/amneziawg-tools.git +cd amneziawg-tools/src + +make +make install +``` + +Проверяем: + +```bash +awg --version +awg-quick --help +``` + +--- + +# 3. Конфигурация AWG + +Создаем каталог: + +```bash +mkdir -p /etc/amnezia +``` + +Создаем конфиг: + +```bash +nano /etc/amnezia/awg0.conf +``` + +Пример: + +```ini +[Interface] +PrivateKey = CLIENT_PRIVATE_KEY +Address = 10.9.9.2/32 +MTU = 1280 +Table = off + +Jc = ... +Jmin = ... +Jmax = ... +S1 = ... +S2 = ... +H1 = ... +H2 = ... +H3 = ... +H4 = ... + +[Peer] +PublicKey = SERVER_PUBLIC_KEY +PresharedKey = ... +Endpoint = VPN_SERVER_IP:PORT +AllowedIPs = 0.0.0.0/0 +PersistentKeepalive = 25 +``` + +Важно: + +```ini +Table = off +``` + +Мы не хотим, чтобы `awg-quick` заменял default route самой Ubuntu. + +Права: + +```bash +chmod 600 /etc/amnezia/awg0.conf +``` + +Поднимаем туннель: + +```bash +awg-quick up awg0 +``` + +Проверяем: + +```bash +awg show +ip addr show awg0 +``` + +Проверяем выход через VPN: + +```bash +curl --interface awg0 https://ifconfig.io +``` + +или: + +```bash +curl -4 --interface awg0 https://ipinfo.io/ip +``` + +Должен вернуться IP VPN-сервера. + +--- + +# 4. Автозапуск AWG + +```bash +systemctl enable awg-quick@awg0 +``` + +Можно сразу включить: + +```bash +systemctl enable --now awg-quick@awg0 +``` + +Проверка: + +```bash +systemctl status awg-quick@awg0 +``` + +--- + +# 5. Статический IP Ubuntu + +Предполагаем: + +```text +Ubuntu: 192.168.0.253/24 +MikroTik: 192.168.0.3 +``` + +Пример Netplan: + +```yaml +network: + version: 2 + ethernets: + ens18: + dhcp4: false + addresses: + - 192.168.0.253/24 + routes: + - to: default + via: 192.168.0.3 + nameservers: + addresses: + - 1.1.1.1 + - 8.8.8.8 +``` + +Применить: + +```bash +netplan try +``` + +или: + +```bash +netplan apply +``` + +Проверить: + +```bash +ip -br addr +ip route +``` + +--- + +# 6. Включаем forwarding на Ubuntu + +Временно: + +```bash +sysctl -w net.ipv4.ip_forward=1 +``` + +Постоянно: + +```bash +cat >/etc/sysctl.d/99-router.conf <> /etc/iproute2/rt_tables +``` + +Добавляем default route через AWG: + +```bash +ip route add default dev awg0 table awg +``` + +Все пакеты, пришедшие через LAN-интерфейс `ens18`, отправляем в таблицу `awg`: + +```bash +ip rule add iif ens18 lookup awg priority 100 +``` + +Проверяем: + +```bash +ip rule +``` + +Должно быть: + +```text +0: from all lookup local +100: from all iif ens18 lookup awg +32766: from all lookup main +32767: from all lookup default +``` + +Проверяем таблицу: + +```bash +ip route show table awg +``` + +Ожидаем: + +```text +default dev awg0 scope link +``` + +--- + +# 8. iptables на Ubuntu + +Разрешаем forwarding: + +```bash +iptables -A FORWARD \ + -i ens18 \ + -o awg0 \ + -s 192.168.0.0/24 \ + -j ACCEPT +``` + +Обратный трафик: + +```bash +iptables -A FORWARD \ + -i awg0 \ + -o ens18 \ + -d 192.168.0.0/24 \ + -m conntrack \ + --ctstate RELATED,ESTABLISHED \ + -j ACCEPT +``` + +NAT при выходе через AWG: + +```bash +iptables -t nat -A POSTROUTING \ + -o awg0 \ + -s 192.168.0.0/24 \ + -j MASQUERADE +``` + +Проверяем: + +```bash +iptables -L FORWARD -n -v +iptables -t nat -L POSTROUTING -n -v +``` + +--- + +# 9. MSS для AWG + +Если `awg0` использует MTU `1280`, можно дополнительно ограничить MSS. + +```bash +iptables -t mangle -A FORWARD \ + -i ens18 \ + -o awg0 \ + -p tcp \ + --tcp-flags SYN,RST SYN \ + -j TCPMSS \ + --set-mss 1200 +``` + +Обратное направление: + +```bash +iptables -t mangle -A FORWARD \ + -i awg0 \ + -o ens18 \ + -p tcp \ + --tcp-flags SYN,RST SYN \ + -j TCPMSS \ + --set-mss 1200 +``` + +Проверка: + +```bash +iptables -t mangle -L FORWARD -n -v +``` + +--- + +# 10. Сохранение iptables + +Устанавливаем: + +```bash +apt install -y iptables-persistent +``` + +Сохраняем: + +```bash +netfilter-persistent save +``` + +Проверяем: + +```bash +cat /etc/iptables/rules.v4 +``` + +После изменения правил: + +```bash +netfilter-persistent save +``` + +--- + +# 11. Автоматическое восстановление policy routing + +`iptables-persistent` не сохраняет: + +```bash +ip rule +ip route table awg +``` + +Их удобно добавлять через `PostUp/PostDown` в `awg0.conf`. + +Пример: + +```ini +[Interface] +PrivateKey = ... +Address = 10.9.9.2/32 +MTU = 1280 +Table = off + +PostUp = ip route add default dev %i table awg +PostUp = ip rule add iif ens18 lookup awg priority 100 + +PostDown = ip rule del iif ens18 lookup awg priority 100 +PostDown = ip route del default dev %i table awg + +... +``` + +Тогда при: + +```bash +systemctl start awg-quick@awg0 +``` + +маршрутизация будет создаваться автоматически. + +Проверить после перезапуска: + +```bash +ip rule +ip route show table awg +``` + +--- + +# 12. MikroTik RouterOS 6: BGP instance + +Создаем BGP instance: + +```routeros +/routing bgp instance +add name=awg-bgp \ + as=64999 \ + router-id=77.79.185.98 +``` + +--- + +# 13. BGP input filter + +Все маршруты от внешнего peer должны использовать Ubuntu `192.168.0.253` как next-hop. + +```routeros +/routing filter +add chain=awg-bgp-in \ + action=accept \ + set-in-nexthop=192.168.0.253 +``` + +Важно: **не ставить `set-routing-mark`**. + +Маршруты должны попадать в обычную main routing table. + +--- + +# 14. BGP peer + +```routeros +/routing bgp peer +add name=awg-routes \ + instance=awg-bgp \ + remote-address=45.148.244.55 \ + remote-as=65444 \ + update-source=77.79.185.98 \ + multihop=yes \ + in-filter=awg-bgp-in +``` + +Проверяем: + +```routeros +/routing bgp peer print status +``` + +--- + +# 15. Проверка полученных BGP-маршрутов + +Например: + +```routeros +/ip route print detail where dst-address=149.154.160.0/20 +``` + +Ожидаем: + +```text +ADb +dst-address=149.154.160.0/20 +gateway=192.168.0.253 +gateway-status=192.168.0.253 reachable +received-from=awg-routes +``` + +Главное: + +```text +gateway=192.168.0.253 +``` + +и маршрут должен быть активным: + +```text +A +``` + +--- + +# 16. Проблема асимметричной маршрутизации + +Без дополнительного SNAT возникает такая ситуация: + +```text +Windows 192.168.0.6 + | + v +MikroTik 192.168.0.3 + | + v +Ubuntu 192.168.0.253 + | + v +AWG +``` + +Но ответ Ubuntu отправляет напрямую: + +```text +AWG + | + v +Ubuntu + | + +--------> 192.168.0.6 +``` + +потому что Ubuntu и Windows находятся в одной `/24`. + +Получается: + +```text +туда: +PC -> MikroTik -> Ubuntu -> AWG + +обратно: +AWG -> Ubuntu -> PC +``` + +Это ломает симметрию TCP. + +--- + +# 17. Универсальный SNAT на MikroTik + +Нам нужно делать SNAT **для любого трафика, чей выбранный gateway — `192.168.0.253`**. + +Для этого используем `route-dst`. + +Сначала маркируем соединение: + +```routeros +/ip firewall mangle +add chain=postrouting \ + src-address=192.168.0.0/24 \ + route-dst=192.168.0.253 \ + connection-mark=no-mark \ + action=mark-connection \ + new-connection-mark=via-awg \ + passthrough=yes \ + comment="Mark connections routed via AWG" +``` + +Теперь универсальный SNAT: + +```routeros +/ip firewall nat +add chain=srcnat \ + src-address=192.168.0.0/24 \ + connection-mark=via-awg \ + action=src-nat \ + to-addresses=192.168.0.3 \ + comment="SNAT traffic routed via AWG" +``` + +Таким образом **не нужны address-list и отдельные NAT-правила для каждого BGP-префикса**. + +--- + +# 18. Как это работает + +Например BGP присылает: + +```text +149.154.160.0/20 +``` + +Input filter превращает маршрут в: + +```text +149.154.160.0/20 via 192.168.0.253 +``` + +Клиент обращается: + +```text +192.168.0.6 -> 149.154.167.99 +``` + +MikroTik выбирает: + +```text +next-hop = 192.168.0.253 +``` + +`route-dst` это видит: + +```text +route-dst=192.168.0.253 +``` + +соединению ставится: + +```text +connection-mark=via-awg +``` + +после чего SNAT: + +```text +192.168.0.6 + | + v +192.168.0.3 +``` + +Ubuntu теперь видит: + +```text +192.168.0.3 -> 149.154.167.99 +``` + +и обратный пакет обязательно возвращается: + +```text +AWG + | + v +Ubuntu + | + v +MikroTik 192.168.0.3 + | + v +Windows 192.168.0.6 +``` + +--- + +# 19. Проверка с клиента + +Например Telegram: + +```powershell +tracert 149.154.167.99 +``` + +Должно быть примерно: + +```text +1 192.168.0.3 +2 192.168.0.253 +3 10.x.x.x +4 ... +``` + +TCP: + +```powershell +Test-NetConnection 149.154.167.99 -Port 443 +``` + +Ожидаем: + +```text +TcpTestSucceeded : True +``` + +HTTPS: + +```powershell +curl.exe -4 -v https://web.telegram.org/ +``` + +Ожидаем: + +```text +Connected to web.telegram.org +HTTP/1.1 200 OK +``` + +--- + +# 20. Проверка на Ubuntu + +Посмотреть проходящий трафик: + +```bash +tcpdump -ni ens18 'host 149.154.167.99 and tcp port 443' +``` + +При работающем SNAT источник должен быть: + +```text +192.168.0.3.xxxxx > 149.154.167.99.443 +``` + +А **не**: + +```text +192.168.0.6.xxxxx > 149.154.167.99.443 +``` + +Проверить AWG: + +```bash +awg show +``` + +Проверить внешний IP самого туннеля: + +```bash +curl --interface awg0 https://ipinfo.io/ip +``` + +--- + +# 21. Итоговая схема + +```text + BGP peer + 45.148.244.55 AS65444 + | + | BGP prefixes + v + MikroTik RouterOS 6 + 77.79.185.98 + AS64999 + | + BGP input filter + set-in-nexthop=192.168.0.253 + | + v + main routing table + + 149.154.160.0/20 -> 192.168.0.253 + другие BGP сети -> 192.168.0.253 + | + route-dst match + | + connection-mark + via-awg + | + SNAT source + -> 192.168.0.3 + | + v + 192.168.0.253 + Ubuntu 24.04 + | + policy routing + iif ens18 -> awg + | + v + awg0 + | + v + AmneziaWG VPN +``` + +В результате BGP становится единственным источником списка сетей: новый префикс автоматически получает next-hop `192.168.0.253`, автоматически попадает через AWG и автоматически получает нужный SNAT на MikroTik.