Add awg+mikrotik.md
This commit is contained in:
+866
@@ -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.
|
||||
Reference in New Issue
Block a user