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
Создаем ключи
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 интерфейс, чтобы новые настройки вступили в силу. Вы можете сделать это следующими командами:
Остановите интерфейс wg0:
Запустите интерфейс 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.