Настройка WireGuard на MikroTik и подключение клиентов на Android, Raspberry Pi (Raspbian, Ubuntu)

Не буду перечислять преимущества и недостатки WireGuard, о них можно почитать в интернетах, главное, что WireGuard позволяет реализовать зашифрованное VPN подключение для передачи данных, производителен т.к. работает на уровне ядра и прост в настройке.
В MikroTik настройка WireGuard появилась в седьмой версии RouterOS.
- Настройка WireGuard сервера на MikroTik
- Настройка WireGuard подключения MikroTik - MikroTik
- Настройка WireGuard подключения MikroTik - Android
- Настройка WireGuard подключения MikroTik - Raspberry Pi (Raspbian, Ubuntu)
Настройка WireGuard сервера на MikroTik
Понятие сервер в отношении к WireGuard имеет достаточно условное значение, программное обеспечение может быть как сервером, так и клиентом, главное условие чтобы хост, выступающий в качестве сервера, мог принимать входящие подключения.
Создаем новый интерфейс, переходим на вкладку WireGuard -> WireGuard -> +
. В открывшемся окне в поле Name
вводим понятное наименование интерфейса (например, для какого устройства создается данное подключение), по необходимости меняем порт подключения в поле Listen Port
, нажимаем кнопку OK
, поля Private Key
и Public Key
заполнятся автоматически.
Присвоим IP адрес созданному интерфейсу WireGuard, переходим в раздел IP -> Addresses -> +
. В открывшемся окне в поле Address
указываем IP адрес созданного интерфейса, в поле Inteface
выбираем созданный WireGuard интерфейс. Т.к. подключение у нас будет точка - точка, то целесообразно для каждого подключения нарезать маски /30. Использовать маску /24 нет смысла, поскольку к одному WireGuard интерфейсу не получится создать и подключить несколько пиров, получается, что для каждого подключаемого устройства придется создавать отдельный интерфейс с пиром (по крайней мере, у меня при создании второго пира на интерфейсе у меня падало предыдущее подключение, лечилось только отключением второго пира и перезапуском подключения).
На фаерволе разрешаем входящие подключения по указанному в поле Listen Port
порту. IP -> Firewall -> Filter Rules -> +
, в создаваемом новом правиле на вкладке General
указываем:
- Chain - Input
- Protocol - 17 (udp)
- Dst. Port - порт, указанный в настройках WireGuard интерфейса, по умолчанию 13231
- In. Interface - интерфейс, принимающий соединение, обычно это интерфейс смотрящий в сеть интернет (WAN).
На вкладке Action
в поле Action
выбираем accept
.
Созданное правило размещаем выше запрещающих.
Любителям командной строки:
/interface/wireguard/add name=wireguard-map listen-port=13231 mtu=1420 /ip/address/add address=10.9.36.1/30 interface=wireguard-map /ip/firewall/filter/add action=accept chain=input protocol=udp dst-port=13231 in-interface=ether1
Настройка WireGuard подключения MikroTik - MikroTik
Аналогично настройке сервера создаем новый интерфейс на клиенте, переходим на вкладку WireGuard -> WireGuard -> +
. В открывшемся окне в поле Name
вводим понятное наименование интерфейса, нажимаем кнопку OK
, поля Private Key
и Public Key
заполнятся автоматически.
Как и для сервера присваиваем созданному интерфейсу на клиенте IP адрес, IP -> Addresses -> +
.
После создания интерфейсов, на сервере и клиенте необходимо создать пиры для подключения, в которых будет указано:
- Для сервера: публичный ключ (Public Key) клиента
- Для клиента: публичный ключ сервера и адрес сервера
На сервере создаем пир для подключения клиента, переходим WireGuard -> Peers -> +
. Заполняем:
- Interface - созданный ранее интерфейс WireGuard на сервере
- Public Key - публичный ключ сгенерированный ранее на клиенте
- Allowed Address - список разрешенных IP адресов, которые будут ходить в туннеле. Можно ограничиться только определенным набором адресов либо для прохождения всего трафика указать 0.0.0.0/0 для IPv4 и ::/0 для IPv6
- Persistant Keepalive - время, через которое будет отправляться пустой пакет для поддержания работы туннеля
По аналогии на клиенте создаем пир для подключения к серверу, переходим WireGuard -> Peers -> +
. Заполняем:
- Interface - созданный ранее интерфейс WireGuard на клиенте
- Public Key - публичный ключ сгенерированный ранее на сервере
- Endpoint - адрес сервера
- Endpoint Port - порт, котором сервер WireGuard принимает подключения
- Allowed Address - список разрешенных IP адресов, которые будут ходить в туннеле. Можно ограничиться только определенным набором адресов либо для прохождения всего трафика указать 0.0.0.0/0 для IPv4 и ::/0 для IPv6
- Persistant Keepalive - время, через которое будет отправляться пустой пакет для поддержания работы туннеля
После сохранения настроек, если всё настроено верно, при успешном подключении на вкладке Peers
в поле Last Handshake
начнется отсчет времени.
Настройка WireGuard подключения MikroTik - Android
На сервере создаем новый интерфейс как описано в разделе «Настройка WireGuard сервера на MikroTik». Если это не первый WireGuard интерфейс на MikroTik, то в настройках надо будет указать другой порт для приема подключений, т.к. порты, используемые созданными интерфейсами уже будут заняты. Так же для нового порта не забываем открыть фаервол.
На Android устанавливаем программу WireGuard, запускаем и нажимаем синюю кнопку +
расположенную внизу. Выбираем пункт Создать с нуля
.
Сначала создаем новый интерфейс, вводим понятное «Наименование» подключения, в поле «Приватный ключ» нажимаем кнопку для генерации Private Key и Public Key, в поле «Адреса» вводим IP адрес интерфейса туннеля.
Создаем новый пир нажав ниже на надпись «Добавить пир». В параметрах добавляемого пира указываем:
- Публичный ключ - публичный ключ сгенерированный ранее на сервере
- Постоянное соединение - время, через которое будет отправляться пустой пакет для поддержания работы туннеля в секундах
- Конечная точка - адрес и порт сервера WireGuard, записывается как ADDR:PORT
- Разрешенные адреса - список разрешенных IP адресов, которые будут ходить в туннеле. Можно ограничиться только определенным набором адресов либо для прохождения всего трафика указать 0.0.0.0/0 для IPv4 и ::/0 для IPv6
Сохраняем настройки.
На сервере так же создаем пир в разделе WireGuard -> Peers -> +
. Заполняем:
- Interface - созданный ранее интерфейс WireGuard на сервере
- Public Key - публичный ключ, сгенерированный ранее на клиенте Android
- Allowed Address - список разрешенных IP адресов, которые будут ходить в туннеле. Можно ограничиться только определенным набором адресов либо для прохождения всего трафика указать 0.0.0.0/0 для IPv4 и ::/0 для IPv6
- Persistant Keepalive - время, через которое будет отправляться пустой пакет для поддержания работы туннеля
В приложение на Android активируем WireGuard подключение переключателем.
После сохранения настроек, если всё настроено верно, при успешном подключении на вкладке Peers
в поле Last Handshake
на сервере начнется отсчет времени. В приложении при успешном подключении в свойствах подключения будет отсчет времени в пункте «Последнее рукопожатие».
Настройка WireGuard подключения MikroTik - Raspberry Pi (Raspbian, Ubuntu)
Для установки WireGuard на Raspberry Pi используем следующие команды:
# apt update # apt install wireguard
WireGuard использует пару ключей - приватный и публичный. Для их генерации выполняем:
# wg genkey | tee private.key | wg pubkey > public.key
Создаем конфигурационный файл /etc/wireguard/wg0.conf
со следующим содержимым:
[Interface] PrivateKey = <содержимое файла private.key> Address = 10.16.23.34/30 DNS = 10.16.23.33 [Peer] PublicKey = <публичный ключ сервера> AllowedIPs = 0.0.0.0/0 EndPoint = <IP_адрес_сервера>:<порт сервера> PersistentKeepalive = 30
- PrivateKey - содержимое файла private.key
- PublicKey - публичный ключ сервера
- EndPoint - адрес и порт сервера WireGuard, записывается как ADDR:PORT
Проверяем подключение:
# wg-quick up wg0
При успешном подключении увидим что то такое:
[#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 10.16.23.34/30 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] resolvconf -a wg0 -m 0 -x [#] wg set wg0 fwmark 51820 [#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820 [#] ip -4 rule add not fwmark 51820 table 51820 [#] ip -4 rule add table main suppress_prefixlength 0 [#] sysctl -q net.ipv4.conf.all.src_valid_mark=1 [#] nft -f /dev/fd/63
Отключаем WireGuard:
# wg-quick down wg0
Делаем чтобы WireGuard автоматически запускался как сервис при загрузке системы:
# systemctl enable wg-quick@wg0
Запускаем сервис WireGuard:
# systemctl start wg-quick@wg0
После настройки и запуска сервиса проверяем статус подключения командой:
# wg
Если всё настроено правильно, вы увидите информацию о подключении, включая публичные ключи и передаваемый трафик.
interface: wg0 public key: uDsNRyXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXEK5CRg= private key: (hidden) listening port: 38589 fwmark: 0xca6c peer: E2iRAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXOjoWk= endpoint: 1XX.XX3.X6X.XXX:15555 allowed ips: 0.0.0.0/0 latest handshake: 2 seconds ago transfer: 92 B received, 356 B sent persistent keepalive: every 30 seconds
Настройки со стороны сервера MikroTik делаются аналогично описанному выше для Android.