Files
2026-08-11 21:30:26 +05:00

14 KiB
Raw Permalink Blame History

Настройка MikroTik + Ubuntu + AmneziaWG + BGP

Схема

Клиенты 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:

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

Устанавливаем зависимости:

apt update

apt install -y \
    git \
    build-essential \
    dkms \
    linux-headers-$(uname -r) \
    iptables \
    resolvconf

Клонируем kernel module:

cd /root

git clone https://github.com/amnezia-vpn/amneziawg-linux-kernel-module.git

Устанавливаем через DKMS:

cd /root/amneziawg-linux-kernel-module/src

make dkms-install

Проверяем:

dkms status

Загружаем модуль:

modprobe amneziawg

Проверяем:

lsmod | grep amneziawg

2. Установка awg-tools

cd /root

git clone https://github.com/amnezia-vpn/amneziawg-tools.git
cd amneziawg-tools/src

make
make install

Проверяем:

awg --version
awg-quick --help

3. Конфигурация AWG

Создаем каталог:

mkdir -p /etc/amnezia

Создаем конфиг:

nano /etc/amnezia/awg0.conf

Пример:

[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

Важно:

Table = off

Мы не хотим, чтобы awg-quick заменял default route самой Ubuntu.

Права:

chmod 600 /etc/amnezia/awg0.conf

Поднимаем туннель:

awg-quick up awg0

Проверяем:

awg show
ip addr show awg0

Проверяем выход через VPN:

curl --interface awg0 https://ifconfig.io

или:

curl -4 --interface awg0 https://ipinfo.io/ip

Должен вернуться IP VPN-сервера.


4. Автозапуск AWG

systemctl enable awg-quick@awg0

Можно сразу включить:

systemctl enable --now awg-quick@awg0

Проверка:

systemctl status awg-quick@awg0

5. Статический IP Ubuntu

Предполагаем:

Ubuntu:   192.168.0.253/24
MikroTik: 192.168.0.3

Пример Netplan:

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

Применить:

netplan try

или:

netplan apply

Проверить:

ip -br addr
ip route

6. Включаем forwarding на Ubuntu

Временно:

sysctl -w net.ipv4.ip_forward=1

Постоянно:

cat >/etc/sysctl.d/99-router.conf <<EOF
net.ipv4.ip_forward=1
EOF

Применяем:

sysctl --system

Проверка:

sysctl net.ipv4.ip_forward

Должно быть:

net.ipv4.ip_forward = 1

7. Policy routing на Ubuntu

Поскольку Ubuntu сама должна использовать обычный интернет через MikroTik, а транзитный трафик от MikroTik должен уходить в AWG, создаем отдельную routing table.

Добавляем имя таблицы:

echo "100 awg" >> /etc/iproute2/rt_tables

Добавляем default route через AWG:

ip route add default dev awg0 table awg

Все пакеты, пришедшие через LAN-интерфейс ens18, отправляем в таблицу awg:

ip rule add iif ens18 lookup awg priority 100

Проверяем:

ip rule

Должно быть:

0:      from all lookup local
100:    from all iif ens18 lookup awg
32766:  from all lookup main
32767:  from all lookup default

Проверяем таблицу:

ip route show table awg

Ожидаем:

default dev awg0 scope link

8. iptables на Ubuntu

Разрешаем forwarding:

iptables -A FORWARD \
    -i ens18 \
    -o awg0 \
    -s 192.168.0.0/24 \
    -j ACCEPT

Обратный трафик:

iptables -A FORWARD \
    -i awg0 \
    -o ens18 \
    -d 192.168.0.0/24 \
    -m conntrack \
    --ctstate RELATED,ESTABLISHED \
    -j ACCEPT

NAT при выходе через AWG:

iptables -t nat -A POSTROUTING \
    -o awg0 \
    -s 192.168.0.0/24 \
    -j MASQUERADE

Проверяем:

iptables -L FORWARD -n -v
iptables -t nat -L POSTROUTING -n -v

9. MSS для AWG

Если awg0 использует MTU 1280, можно дополнительно ограничить MSS.

iptables -t mangle -A FORWARD \
    -i ens18 \
    -o awg0 \
    -p tcp \
    --tcp-flags SYN,RST SYN \
    -j TCPMSS \
    --set-mss 1200

Обратное направление:

iptables -t mangle -A FORWARD \
    -i awg0 \
    -o ens18 \
    -p tcp \
    --tcp-flags SYN,RST SYN \
    -j TCPMSS \
    --set-mss 1200

Проверка:

iptables -t mangle -L FORWARD -n -v

10. Сохранение iptables

Устанавливаем:

apt install -y iptables-persistent

Сохраняем:

netfilter-persistent save

Проверяем:

cat /etc/iptables/rules.v4

После изменения правил:

netfilter-persistent save

11. Автоматическое восстановление policy routing

iptables-persistent не сохраняет:

ip rule
ip route table awg

Их удобно добавлять через PostUp/PostDown в awg0.conf.

Пример:

[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

...

Тогда при:

systemctl start awg-quick@awg0

маршрутизация будет создаваться автоматически.

Проверить после перезапуска:

ip rule
ip route show table awg

12. MikroTik RouterOS 6: BGP instance

Создаем BGP instance:

/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.

/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

/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

Проверяем:

/routing bgp peer print status

15. Проверка полученных BGP-маршрутов

Например:

/ip route print detail where dst-address=149.154.160.0/20

Ожидаем:

ADb
dst-address=149.154.160.0/20
gateway=192.168.0.253
gateway-status=192.168.0.253 reachable
received-from=awg-routes

Главное:

gateway=192.168.0.253

и маршрут должен быть активным:

A

16. Проблема асимметричной маршрутизации

Без дополнительного SNAT возникает такая ситуация:

Windows 192.168.0.6
        |
        v
MikroTik 192.168.0.3
        |
        v
Ubuntu 192.168.0.253
        |
        v
AWG

Но ответ Ubuntu отправляет напрямую:

AWG
 |
 v
Ubuntu
 |
 +--------> 192.168.0.6

потому что Ubuntu и Windows находятся в одной /24.

Получается:

туда:
PC -> MikroTik -> Ubuntu -> AWG

обратно:
AWG -> Ubuntu -> PC

Это ломает симметрию TCP.


17. Универсальный SNAT на MikroTik

Нам нужно делать SNAT для любого трафика, чей выбранный gateway — 192.168.0.253.

Для этого используем route-dst.

Сначала маркируем соединение:

/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:

/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 присылает:

149.154.160.0/20

Input filter превращает маршрут в:

149.154.160.0/20 via 192.168.0.253

Клиент обращается:

192.168.0.6 -> 149.154.167.99

MikroTik выбирает:

next-hop = 192.168.0.253

route-dst это видит:

route-dst=192.168.0.253

соединению ставится:

connection-mark=via-awg

после чего SNAT:

192.168.0.6
       |
       v
192.168.0.3

Ubuntu теперь видит:

192.168.0.3 -> 149.154.167.99

и обратный пакет обязательно возвращается:

AWG
 |
 v
Ubuntu
 |
 v
MikroTik 192.168.0.3
 |
 v
Windows 192.168.0.6

19. Проверка с клиента

Например Telegram:

tracert 149.154.167.99

Должно быть примерно:

1  192.168.0.3
2  192.168.0.253
3  10.x.x.x
4  ...

TCP:

Test-NetConnection 149.154.167.99 -Port 443

Ожидаем:

TcpTestSucceeded : True

HTTPS:

curl.exe -4 -v https://web.telegram.org/

Ожидаем:

Connected to web.telegram.org
HTTP/1.1 200 OK

20. Проверка на Ubuntu

Посмотреть проходящий трафик:

tcpdump -ni ens18 'host 149.154.167.99 and tcp port 443'

При работающем SNAT источник должен быть:

192.168.0.3.xxxxx > 149.154.167.99.443

А не:

192.168.0.6.xxxxx > 149.154.167.99.443

Проверить AWG:

awg show

Проверить внешний IP самого туннеля:

curl --interface awg0 https://ipinfo.io/ip

21. Итоговая схема

                        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.