WireGuard - бесплатное open source решение для настройки безопасной виртуальной частной сети (VPN). Поскольку WireGuard реализован в пространстве ядра, он обладает высокой скоростью работы и достаточно прост в настройке. Кроме того, он доступен на всех современных платформах Linux, Windows, macOS, BSD, iOS, Android, а в качестве защиты данных используется асимметричное шифрование с открытым и закрытым ключом.
Установка и настройка WireGuard на стороне сервера
Обновим apt-репозиторий и установим WireGuard:
# обновим индекс
$ sudo apt update -y
# установим wireguard
$ sudo apt install -y wireguard
Перейдем в папку wireguard:
$ cd /etc/wireguard/
Далее необходимо сгенерировать открытый и закрытый ключ с помощью команды wg:
$ wg genkey | tee /etc/wireguard/private.key | wg pubkey | tee /etc/wireguard/public.key
Здесь команда wg genkey генерирует секретный ключ и передает его команде tee, которая сохраняет ключ в файл private.key и передаёт его на вход команде wg pubkey, которая на основе полученного секретного ключа, генерирует публичный ключ и передаёт его команде tee, которая сохраняет полученный ключ в файл public.key и распечатывает его в терминале.
Затем создаем файл конфигурации /etc/wireguard/wg0.conf и добавляем в него следующее содержимое:
[Interface]
# Приватный ключ из файла private.key
PrivateKey = <private_key>
# Адрес VPN-сервера в частной сети
Address = 10.0.0.1/24
# Порт, который будет слушать VPN-сервер
ListenPort = 53840
# Команда, которая будет выполнена при старте VPN сервера
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# Команда, которая будет выполнена при выключении VPN сервера
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
В данном конфиге необходимо только указать <private_key> из файла с приватным ключом.
Далее нам необходимо включить маршрутизацию, чтобы была возможность пересылать пакеты между интерфейсами. Для этого в файле /etc/sysctl.conf необходимо раскомментировать или добавить если нет следующую строку:
net.ipv4.ip_forward = 1
Затем необходимо применить новые настройки:
$ sysctl -p
Теперь добавим службу в автозагрузку:
$ systemctl enable wg-quick@wg0.service
Это позволит автоматически запускаться серверу wireguard после перезагрузки или выключения сервера linux. Запускаем наш VPN сервер:
$ systemctl start wg-quick@wg0.service
Теперь сервер должен быть запущен. Мы можем проверить его статус одной из следующих команд:
# проверить статус службы
$ systemctl status wg-quick@wg0.service
# показать статус сервера wg
$ wg show
Наш VPN сервер запущен. Далее нам необходимо настроить конфигурацию для подключения клиентов.
Настройка сервера WireGuard для подключения клиентов
Чтобы мы могли подключить нашего первого клиента к только что созданному VPN, потребуется сгенерировать ключи для клиента, по аналогии с тем, как мы выполняли генерацию ключей для сервера:
# сгенерируем приватный ключ
$ wg genkey | tee /etc/wireguard/petrov_private.key
# сгенерируем публичный ключ
$ cat /etc/wireguard/petrov_private.key | wg pubkey | tee /etc/wireguard/petrov_public.key
После этого, содержимое нашей директории /etc/wireguard/ будет иметь следующий вид:
├── private.key
├── public.key
├── petrov_private.key
├── petrov_public.key
├── wg0.conf
Теперь нам необходимо отредактировать наш конфигурационный файл /etc/wireguard/wg0.conf и дополнить его следующим содержимым:
[Peer]
# Публичный ключ клиента
PublicKey = <petrov_public>
# IP-адрес в частной сети, который будет присвоен клиенту
AllowedIPs = 10.0.0.2/32
После этого нам надо перезагрузить наш VPN сервер:
# перезапускаем службу
$ systemctl restart wg-quick@wg0
# проверяем статус службы
$ systemctl status wg-quick@wg0
Если все хорошо, то теперь мы можем переходить к настройке машины нашего клиента.
Настройка клиента WireGuard на Ubuntu
Для начала на нашей клиентской машине необходимо также установить wireguard если его нет:
$ sudo apt install wireguard
После установки нам необходимо создать конфигурационный файл в папке /etc/wireguard/wg0.conf со следующим содержимым:
[Interface]
# Приватный ключ клиента. В нашем случае petrov_private.key
PrivateKey = <petrov_private>
# IP-адрес клиента, который настроен на wg сервере
Address = 10.0.0.2/32
# DNS, который будет использовать при подключении
DNS = 8.8.8.8
[Peer]
# Публичный ключ сервера
PublicKey = <server-public_key>
# IP адрес и порт удалённого сервера
Endpoint = <server-ip>:53840
# Если указаны все нули — весь трафик клиента будет проходить через wg сервер
AllowedIPs = 0.0.0.0/0
# Интервал проверки соединения между клиентом и сервером (секунды)
PersistentKeepalive = 20
После создания конфигурационного файла мы можем запустить наш VPN с помощью утилиты wg-quick:
# запуск vpn сервера
$ sudo wg-quick up wg0
# остановка vpn сервера
$ sudo wg-quick down wg0
здесь wg0 это имя нашего конфигурационного файла.
Если все настройки указаны верно, то наш клиент должен быть успешно подключен к нашему VPN серверу через который будет проходить весь трафик. А также у нас должен будет измениться наш публичный ip адрес, на ip адрес нашего сервера.
Настройка клиента WireGuard на Windows
Для настройки wireguard на windows сначала потребуется скачать установочный файл с официального сайта wireguard.com и установить.
Затем нам потребуется создать конфигурационный файл по аналогии с файлом, который мы настраивали для Ubuntu. Его название не имеет значение, поэтому мы можем просто создать файл, к примеру wgvpn.conf со следующим содержимым:
[Interface]
# Приватный ключ клиента. В нашем случае petrov_private.key
PrivateKey = <petrov_private>
# IP-адрес клиента, который настроен на wg сервере
Address = 10.0.0.2/32
# DNS, который будет использовать при подключении
DNS = 8.8.8.8
[Peer]
# Публичный ключ сервера
PublicKey = <server-public_key>
# IP адрес и порт удалённого сервера
Endpoint = <server-ip>:53840
# Если указаны все нули — весь трафик клиента будет проходить через wg сервер
AllowedIPs = 0.0.0.0/0
# Интервал проверки соединения между клиентом и сервером (секунды)
PersistentKeepalive = 20
После этого мы можем импортировать наш файл в wireguard (рис.1)
Рис.1Далее нам остается только нажать кнопку Подключить и если мы верно указали все настройки, то VPN должен начать работать (рис.2).
Рис.2Чтобы проверить, что наш трафик идет через VPN мы можем проверить наш публичный ip адрес через который мы выходит в интернет, он должен соответствовать ip адресу нашего сервера.