Проблема с настройкой VPN WireGuard
Мне нужно создать VPN такой, чтобы
- У клиентов были стические IP адреса.
- Клиенты могли взаимодействовать друг с другом и сервером,
- Клиенты могли выходить в интернет из-под VPN.
- Также, хотелось бы настроить собственный DNS и приватные домены (обрабатываемые NginX).
Конфигурационные сервера у меня такой:
[Interface]
Address = 10.0.0.1/24, fd86:ea04:1115::1/64
ListenPort = 5555
PrivateKey = xxxxx
[Peer]
PublicKey = xxxxx
AllowedIPs = 0.0.0.0/0
А это конфигурации клиента:
[Interface]
PrivateKey = xxxxx
ListenPort = 5555
Address = 10.0.0.2/32
DNS = 8.8.8.8
[Peer]
PublicKey = xxxxx
AllowedIPs = 0.0.0.0/0, ::/0
Но при попытке загрузить конфигурации сервера через wg setconf wg0 /etc/wireguard/wg0.conf я получаю такую ошибку:
Line unrecognized: `Address=10.0.0.1/24,fd86:ea04:1115::1/64'
Configuration parsing error
Поэтому я закомментировал ту строку. Но это вероятно заставляет WG выбирать себе и клиентам случайные IP адреса.
Для запуска WireGuard я выполняю такие команды:
ip link add dev wg0 type wireguard
ip address add dev wg0 10.0.0.1/24
ip link set up dev wg0
После, команда wg даёт такой вывод:
interface: wg0
public key: xxxxx
private key: (hidden)
listening port: 5555
peer: xxxxx
endpoint: <my IP address>:6228
allowed ips: 0.0.0.0/0
latest handshake: 2 minutes, 11 seconds ago
transfer: 26.02 KiB received, 248 B sent
С клиента (моя MacOS с WireGuard GUI) у меня получается подключиться, но:
- Нет соединения с интернетом. Я даже не могу пинговать сервер по глобальному адресу, хотя по приватному
10.0.0.1получается. - Я могу подключиться к VPN даже если укажу в конфиге клиента другой порт. Думаю, это значит, что он не подключается на самом деле.
Как мне заставить WireGuard работать нужным образом? И что не так с моими конфигами??
PS. На сервере нет ни iptables, ни файерволов, так что это не может быть проблемой. Также, в файле /etc/sysctl.conf я указал net.ipv4.ip_forward=1 и net.ipv6.conf.all.forwarding=1, и выполнил systemctl restart systemd-networkd.
Версии ПО. ОС: Ubuntu 18.04.1 LTS, Kernel: 4.15.0-20-generic, WG: wireguard-tools v1.0.20200206.
Ответы (1 шт):
Итак, за несколько дней, ночей и убитых серверов, я наконец разобрался со всем :)
Во-первых, стоит заметить, что утилиты
wgиwg-quickработают с конфигами по-разному (видимо,wgне поддерживает последние форматы конфига). Поэтому вместоwg setconf wg0 /etc/wireguard/wg0.confя стал использоватьwg-quickпосредствомsystemctl.Во-вторых, моё добавление
net.ipv4.ip_forward=1к файлу/etc/sysctl.confне заработало даже выполняяsystemctl daemon-reload ; systemctl restart systemd-networkd. Мне надо было ещё отправить конфиг в ядро ОС командойsysctl -p /etc/sysctl.conf. Это наконец позволило клиентам взаимодействовать друг с другом и обращаться к интернету из-под VPN.Стоит заметить, что для всех запией
Addressлучше указывать маску подсети в 32 бита, т.к она обозначает конкретный IP адрес, а не диапазон.Также, мне удалось настроить собственный DNS используя BIND9 для создания кастомного домена в своей сети. И поднять NginX с прослушиванием по адресу в локальной сети и дополнительной проверкой IP отправителя для ограничения доступа только для клиентов VPN'а.
В итоге, конфиги у меня получились такие:
Сервер
[Interface]
Address = 10.0.0.1/32
ListenPort = 5555
PrivateKey = ___some_private_key___
# Это нужно только если на сервере установлен `ufw`
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = ___some_public_key___
AllowedIPs = 10.0.0.1/32
Client
[Interface]
PrivateKey = ___some_private_key___
ListenPort = 5555
Address = 10.0.0.1/32
[Peer]
PublicKey = ___some_public_key___
AllowedIPs = 10.0.0.0/24
Endpoint = ___some_ip_address__:5555