# Wireguard

Способы установки для разных ОС описаны на сайте проекта https://www.wireguard.com/install/

## Сервер

_Debian 11_

Все действия выполняются от root

```bash
sudo -i
```

Установить пакет wireguard

```bash
apt install wireguard
```

Включить IPv4 маршрутизацию (раскомментировать строку)

```bash
sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
```

Проверить, что изменения внесены

```bash
sysctl -p
```

Для повышения безопасности изменить права на создаваемые файлы в директории `/etc/wireguard` на 600 (rw- --- ---)

```bash
umask 077 /etc/wireguard
```

Сгенерировать закрытый и публичный ключи

```bash
wg genkey | tee /etc/wireguard/privatekey

cat /etc/wireguard/privatekey | wg pubkey | tee /etc/wireguard/publickey
```

Создать конфигурационный файл сервера

```bash
vim /etc/wireguard/wg0.conf
```

**ВАЖНО обратить внимание на название сетевого интерфейса в правилах iptables**</br>
**здесь указан сетевой интерфейс ens3**

```
[Interface]
# скопировать сгенерированный закрытый ключ
PrivateKey = SERVER PRIVATE KEY

# назначить IP адрес VPN
Address = 10.10.10.1/24

# сохранить конфигурацию
SaveConfig = true

# вкл./откл. подмену IP для VPN - ЗАМЕНИТЬ ИМЯ ИНТЕРФЕЙСА!!!
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE

# назначить порт для VPN (по-умолчанию: 51820)
ListenPort = 34567
```

### Автозагрузка сервера Wireguard

```bash
systemctl enable wg-quick@wg0
```

***

## Клиенты

### 1. Linux Fedora 35

Установить пакет wireguard

```bash
dnf -y install wireguard
```

Для повышения безопасности изменить права на создаваемые файлы в директории `/etc/wireguard` на 600 (rw- --- ---)

```bash
umask 077 /etc/wireguard
```

Сгенерировать закрытый и публичный ключи

```bash
wg genkey | tee /etc/wireguard/privatekey

cat /etc/wireguard/privatekey | wg pubkey | tee /etc/wireguard/publickey
```

Создать конфигурационный файл клиента

```bash
vim /etc/wireguard/wg-client-01.conf
```

```
[Interface]
# скопировать сгенерированный закрытый ключ
PrivateKey = CLIENT PRIVATE KEY

# назначить IP адрес VPN клиента
Address = 10.10.10.2/32

[Peer]
# публичный ключ сервера
PublicKey = SERVER PUBLIC KEY

# внешний IP-адрес:порт сервера
Endpoint = 51.83.180.248:34567

# Сети, которые необходимо маршрутизировать в VPN
# в данном случае весь трафик
AllowedIPs = 0.0.0.0/0
```

## Регистрация клиента на сервере

### Способ 1

_этот способ стоит использовать в выключенном VPN интерфейсе_

Добавить в конфигурацию сервера раздел с данными клиента

```bash
vim /etc/wireguard/wg0.conf
```

```
[Peer]
# Название клиента (для себя, чтобы понять, что это за клиент)

# публичный ключ клиента
PublicKey = 2AurHow1SuDVb4tZWhCBfrjnVQ6SU0y43i2nD/dweV8=

# IP-адрес, который назначается клиенту в сети VPN
AllowedIPs = 10.10.10.2/32
```

После добавления всех клиентов, можно запускать сервер

```bash
wg-quick up wg0
```

Проверить подключенных клиентов можно командой `wg`

```bash
root@server:~$ wg
interface: wg0
  public key: kAB3+ToYz623wttZXdWm2QGsjyGdTzXqg8jgNiyMlCc=
  private key: (hidden)
  listening port: 34567

peer: Ut2vPI67f+nuCv5bI4nod+BMMn5qgroJfoI/XjUtthE=
  endpoint: 109.173.124.76:54878
  allowed ips: 10.10.10.2/32
  latest handshake: 17 seconds ago
  transfer: 18.68 MiB received, 312.21 MiB sent
```

### Способ 2

_этот способ стоит использовать при включённом VPN интерфейсе_

На сервере ввести команду

_общий вид_

```bash
wg set <wireguard-interface> peer <client-publickey> allowed-ips <client-vpn-ip/mask>
```

Пример

```bash
wg set wg0 peer 2AurHow1SuDVb4tZWhCBfrjnVQ6SU0y43i2nD/dweV8= allowed-ips 10.10.10.2/32
```

После регистрации клиента на сервере можно запустить wireguard на клиенте

```bash
wg-quick up wg-client-01
```

### 2. Клиент Android

В качестве клиента используется официальное приложение - [WireGuard](https://play.google.com/store/apps/details?id=com.wireguard.android&gl=PL).

Принцип настройки ничем не отличается от настройки предыдущего клиента, также необходимо сгенерировать закрытый и публичный ключ и создать конфигурацию.

Для удобства эти шаги можно выполнить на сервере

Создать соответствующую директорию

```bash
mkdir /etc/wireguard/mobile-s10e
cd /etc/wireguard/mobile-s10e
```

Сгенерировать закрытый и публичный ключи

```bash
wg genkey | tee /etc/wireguard/mobile-s10e/privatekey

cat /etc/wireguard/mobile-s10e/privatekey | wg pubkey | tee /etc/wireguard/mobile-s10e/publickey
```

Создать конфигурационный файл клиента

```bash
vim /etc/wireguard/mobile-s10e/wg-client-mobile.conf
```

```
[Interface]
# скопировать сгенерированный закрытый ключ
PrivateKey = CLIENT PRIVATE KEY

# назначить IP адрес VPN клиента
Address = 10.10.10.3/32

[Peer]
# публичный ключ сервера
PublicKey = SERVER PUBLIC KEY

# внешний IP-адрес:порт сервера
Endpoint = 51.83.180.248:34567

# Сети, которые необходимо маршрутизировать в VPN
# в данном случае весь трафик
AllowedIPs = 0.0.0.0/0
```

Добавить конфигурацию клиента на сервер

```bash
wg set wg0 peer <CLIENT-PUBLIC-KEY> allowed-ips 10.10.10.3/32
```

Для удобства переноса конфигурации на телефон, на сервер необходимо установить приложение генератор QR кодов

```bash
apt install qrencode
```

Перенос конфигурации на телефон

На сервере ввести команду генерирующую QR код на основе конфигурации, которую подготовили ранее для телефона

```bash
qrencode -t ansiutf8 < /etc/wireguard/mobile-s10e/wg-client-mobile.conf
```

На экране отобразится QR код, который необходимо импортировать через приложение WireGuard на телефоне

### 3. Клиент Windows

Установить приложение с официального сайта https://download.wireguard.com/windows-client/wireguard-installer.exe

Как и с конфигурацией для Android, её удобно создать на сервере и затем импортировать в приложение на Windows

Создать соответствующую директорию

```bash
mkdir /etc/wireguard/win1
cd /etc/wireguard/win1
```

Сгенерировать закрытый и публичный ключи

```bash
wg genkey | tee /etc/wireguard/win1/privatekey

cat /etc/wireguard/win1/privatekey | wg pubkey | tee /etc/wireguard/win1/publickey
```

Создать конфигурационный файл клиента

```bash
vim /etc/wireguard/win1/wg-client-win1.conf
```

```
[Interface]
# скопировать сгенерированный закрытый ключ
PrivateKey = CLIENT PRIVATE KEY

# назначить IP адрес VPN клиента
Address = 10.10.10.4/32

[Peer]
# публичный ключ сервера
PublicKey = SERVER PUBLIC KEY

# внешний IP-адрес:порт сервера
Endpoint = 51.83.180.248:34567

# Сети, которые необходимо маршрутизировать в VPN
# в данном случае весь трафик
AllowedIPs = 0.0.0.0/0
```

Добавить конфигурацию клиента на сервер

```bash
wg set wg0 peer <CLIENT-PUBLIC-KEY> allowed-ips 10.10.10.4/32
```

Любым удобным способом необходимо перенести конфигурационный файл на windows. Это можно сделать с помощью WinSCP или вывести в консоль сервера с помощью cat конфигурацию клиента и создать соответствующий файл на windows. Затем этот конфигурационный файл импортировать в приложение.
