14 KiB
Настройка 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.