Add awg+mikrotik.md

This commit is contained in:
2026-08-11 21:30:26 +05:00
commit 4396ef1cdc
+866
View File
@@ -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 <<EOF
net.ipv4.ip_forward=1
EOF
```
Применяем:
```bash
sysctl --system
```
Проверка:
```bash
sysctl net.ipv4.ip_forward
```
Должно быть:
```text
net.ipv4.ip_forward = 1
```
---
# 7. Policy routing на Ubuntu
Поскольку Ubuntu сама должна использовать обычный интернет через MikroTik, а транзитный трафик от MikroTik должен уходить в AWG, создаем отдельную routing table.
Добавляем имя таблицы:
```bash
echo "100 awg" >> /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.