Установка WireGuard на сервере Ubuntu 24.04

Установка WireGuard / Создаем ключи

Установка WireGuard

sudo apt update
sudo apt install wireguard

Создаем ключи

sudo mkdir -p /etc/wireguard
sudo chmod 600 /etc/wireguard
wg genkey | sudo tee /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key

 

Настройка конфигурации сервера

Наша конфигурация будет хранится в каталоге /etc/wireguard/ перейдем в каталог

cd /etc/wireguard

Но предлагаю использовать такую структуру:


root@ubtest:/etc/wireguard# tree
.
├── clients
│          └── client1
│                 ├── client_private.key
│                 ├── client_public.key
│                 ├── psk.key
│                 └── wg0-office.conf
├── server
│                 ├── server_private.key
│                 └── server_public.key
└── wg0.conf

Создаем конфигурационный файл сервера /etc/wireguard/wg0.conf

sudo vim /etc/wireguard/wg0.conf

Пример содержимого файла:


[Interface]

Address = 10.66.66.1/24

ListenPort = 52197

PrivateKey = <содержимое /etc/wireguard/server_private.key>

 

#Client1

[Peer]

PublicKey = <публичный ключ клиента>

PresharedKey = <прешаред-ключ>

AllowedIPs = 10.66.66.2/32

 

#Client2

[Peer]

PublicKey = <публичный ключ клиента>

PresharedKey = <прешаред-ключ>

AllowedIPs = 10.66.66.3/32


Настройка файервола и маршрутизации на сервере

Разрешаем пересылку пакетов

echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

Настройка iptables для NAT

sudo iptables -A FORWARD -i wg0 -j ACCEPT
sudo iptables -A FORWARD -o wg0 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Сохраняем правила iptables

sudo apt install iptables-persistent
sudo netfilter-persistent save
sudo netfilter-persistent reload

 

Настройка клиента WireGuard

Создаем ключи

wg genkey | tee client_private.key | wg pubkey > client_public.key

Создаем прешаред-ключ

wg genpsk > psk.key

Создаем конфигурационный файл клиента (например, wg0-client1.conf)

vim wg0-client1.conf

Пример содержимого файла:


[Interface]

PrivateKey = <содержимое client_private.key>

Address = 10.66.66.2/32

DNS = 8.8.8.8

[Peer]

PublicKey = <содержимое server_public.key>

PresharedKey = <содержимое psk.key>

Endpoint = 211.***.***.**:52197 # Внешний IP адрес сервера WireGuard

AllowedIPs = 10.66.66.1/32, 192.168.1.201/32 

# Это редкий случай и возможно редко применим, когда к примеру совпали сети сервера и клиента 192.168.1.0/24 ,

клиент находится в офисе где сеть 192.168.1.0/24 и ему нужен доступ к удаленному файловому серверу 192.168.1.201,

для этого указываем одиночный адрес для клиента 192.168.1.201 и так же доступ только одному адресу впн сети 10.66.66.1

#Ниже я приведу разные способы применения маршрутизации трафика

 


Запуск WireGuard

На сервере запускаем WireGuard

sudo wg-quick up wg0

Для автоматического запуска при загрузке

sudo systemctl enable wg-quick@wg0

 

Проброс порта на роутере

Настроем проброс порта 52197 на роутере на IP-адрес нашего сервера Ubuntu

 

Проверка и отладка

Проверка состояния WireGuard на сервере

sudo wg show

 

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

  1. Остановите интерфейс wg0:

    wg-quick down wg0
  2. Запустите интерфейс wg0 снова:

    wg-quick up wg0
     

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

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

Конфиг сервера

[Interface]
Address = 10.66.66.1/24
• Address: Это IP-адрес, который будет назначен интерфейсу WireGuard на сервере.
• 10.66.66.1/24: Это адрес в подсети 10.66.66.0 с маской 24 бита (255.255.255.0). Мы можем использовать любую сеть, которую хотим, например, 192.168.100.1/24. Важно, чтобы эта сеть не конфликтовала с другими сетями в вашей инфраструктуре.
ListenPort = 52197
• ListenPort: Порт, на котором сервер WireGuard будет слушать входящие соединения. Мы можем выбрать любой свободный порт.
PrivateKey = <содержимое /etc/wireguard/server_private.key>
• PrivateKey: Приватный ключ сервера. Этот ключ используется для шифрования трафика и аутентификации. Содержимое файла server_private.key вставляется сюда.
[Peer]
• Для каждого клиента в конфигурации сервера добавляется отдельный блок [Peer].
PublicKey = <публичный ключ клиента>
• PublicKey: Публичный ключ клиента, который будет подключаться к серверу. Этот ключ соответствует приватному ключу клиента.
PresharedKey = <прешаред-ключ>
• PresharedKey: (Опционально) Предварительно согласованный ключ, который добавляет дополнительный слой безопасности. Он должен быть одинаковым на клиенте и сервере.
AllowedIPs = 10.66.66.2/32
• AllowedIPs: Список IP-адресов, через которые клиент может взаимодействовать с сервером.
o 10.66.66.2/32: Адрес клиента в сети WireGuard. Маска /32 означает, что это одиночный IP-адрес.
o Эта строчка означает, что клиент будет использовать адрес 10.66.66.2 при подключении к VPN и все пакеты, направленные на этот IP, будут направляться через туннель WireGuard.
Разбор строк по отдельности:
[Interface]
Address: IP-адрес и маска подсети для интерфейса WireGuard на сервере.
ListenPort: Порт, на котором сервер WireGuard слушает входящие соединения.
PrivateKey: Приватный ключ сервера.
[Peer]
PublicKey: Публичный ключ клиента.
PresharedKey: Предварительно согласованный ключ для дополнительной безопасности (опционально).
AllowedIPs: Список IP-адресов, через которые клиент может взаимодействовать с VPN.

 

Пример конфигурации для нескольких клиентов:


[Interface]
Address = 192.168.100.1/24
ListenPort = 51820
PrivateKey = <содержимое /etc/wireguard/server_private.key>

# Клиент 1
[Peer]
PublicKey = <публичный ключ клиента 1>
PresharedKey = <прешаред-ключ клиента 1>
AllowedIPs = 192.168.100.2/32

# Клиент 2
[Peer]
PublicKey = <публичный ключ клиента 2>
PresharedKey = <прешаред-ключ клиента 2>
AllowedIPs = 192.168.100.3/32

# Клиент 3
[Peer]
PublicKey = <публичный ключ клиента 3>
AllowedIPs = 192.168.100.4/32



Вывод:
• Можем использовать любую сеть, которая не конфликтует с другими сетями в вашей инфраструктуре.
• В разделе [Peer] можно указать столько клиентов, сколько нам нужно.
• Адреса в формате x.x.x.x/32 означают, что это одиночные IP-адреса. Эти адреса назначаются клиентам и используются для маршрутизации трафика через VPN.

 

Разберем конфигурацию клиента и рассмотрим разные варианты настройки маршрутизации, чтобы понять, как управлять доступом к удаленной сети и интернет-трафику через VPN.


Конфигурация клиента

[Interface]
PrivateKey = <содержимое client_private.key>
Address = 10.66.66.2/32
DNS = 8.8.8.8
• PrivateKey: Приватный ключ клиента.
• Address: IP-адрес клиента в сети WireGuard. Маска /32 используется, потому что это одиночный адрес, назначаемый конкретному клиенту.
o Даже если основная сеть имеет маску /24, каждый клиент получает уникальный IP с маской /32 для идентификации конкретного устройства.
• DNS: Настройки DNS-сервера, который будет использовать клиент.

[Peer]
PublicKey = <содержимое server_public.key>
PresharedKey = <содержимое psk.key>
Endpoint = 211.***.***.**:52197 # Внешний IP адрес сервера WireGuard
AllowedIPs = 10.66.66.1/32, 192.168.1.201/32
• PublicKey: Публичный ключ сервера.
• PresharedKey: Предварительно согласованный ключ для дополнительной безопасности (опционально).
• Endpoint: Внешний IP-адрес сервера и порт, на который клиент будет подключаться.
• AllowedIPs: Список IP-адресов, маршруты к которым будут направляться через туннель VPN.


В данном примере клиент имеет доступ только к IP-адресам 10.66.66.1/32 и 192.168.1.201/32. Остальной трафик будет идти через обычный интернет-маршрут.

 

Варианты настройки маршрутизации


1. Доступ ко всей удаленной сети
Если вы хотите, чтобы клиент имел доступ ко всей удаленной сети (например, 10.66.66.0/24), вам нужно изменить AllowedIPs следующим образом:

[Peer]
PublicKey = <содержимое server_public.key>
PresharedKey = <содержимое psk.key>
Endpoint = 211.***.***.**:52197
AllowedIPs = 10.66.66.0/24
• AllowedIPs = 10.66.66.0/24: Это указывает, что клиент будет отправлять весь трафик, направленный на сеть 10.66.66.0/24, через VPN.


2. Доступ ко всей удаленной сети и интернет-трафик через VPN


Если вы хотите, чтобы весь интернет-трафик клиента также проходил через VPN, вам нужно добавить маршрут 0.0.0.0/0 в AllowedIPs:
[Peer]
PublicKey = <содержимое server_public.key>
PresharedKey = <содержимое psk.key>
Endpoint = 211.***.***.**:52197
AllowedIPs = 0.0.0.0/0
• AllowedIPs = 0.0.0.0/0: Это указывает, что весь трафик (интернет и внутренний) будет проходить через VPN.
Объяснение
1. Доступ ко всей удаленной сети:
Когда вы указываете AllowedIPs = 10.66.66.0/24, клиент будет отправлять трафик, предназначенный для любых адресов в сети 10.66.66.0/24, через VPN. Остальной трафик будет идти через обычное интернет-соединение.
2. Доступ ко всей удаленной сети и интернет-трафик через VPN:
Когда вы указываете AllowedIPs = 0.0.0.0/0, весь трафик клиента (включая интернет) будет направляться через VPN. Это полезно для обеспечения полной анонимности и защиты при использовании незащищенных сетей.


Примеры конфигураций


Пример 1: Доступ только ко всей удаленной сети

[Interface]
PrivateKey = <содержимое client_private.key>
Address = 10.66.66.2/32
DNS = 8.8.8.8

[Peer]
PublicKey = <содержимое server_public.key>
PresharedKey = <содержимое psk.key>
Endpoint = 211.***.***.**:52197
AllowedIPs = 10.66.66.0/24


Пример 2: Доступ ко всей удаленной сети и интернет-трафик через VPN

[Interface]
PrivateKey = <содержимое client_private.key>
Address = 10.66.66.2/32
DNS = 8.8.8.8

[Peer]
PublicKey = <содержимое server_public.key>
PresharedKey = <содержимое psk.key>
Endpoint = 211.***.***.**:52197
AllowedIPs = 0.0.0.0/0


Итог
• Маска /32 используется для назначения уникального IP-адреса каждому клиенту в сети WireGuard.
AllowedIPs контролирует, какой трафик будет направляться через VPN. Это позволяет гибко управлять доступом к удаленным ресурсам и маршрутизацией интернет-трафика.
• Чтобы клиент имел доступ ко всей удаленной сети, используйте подсеть (например, 10.66.66.0/24). Чтобы направлять весь интернет-трафик через VPN, используйте маршрут 0.0.0.0/0.