• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Wireguard VPN. Быстрая настройка

mainnick

HDD-drive
Пользователь
Регистрация
27.03.2020
Сообщения
30
Реакции
138
Детально описывать что такое Wireguard я не стану. В интернете написано много. Вкратце скажу, что это новый, модный, молодежный VPN, который считается достаточно надежным, быстрым и легко настраиваемым. Про первые два я ничего не скажу, а вот то что VPN настраивется очень легко я и собираюсь показать дальше.

Для начала необходимо настроить сервер Wireguard. Сервер можно настроить на домашнем ПК, роутере или на выделеном VPS. В этом примере я покажу настройку Wireguard сервера на бесплатном Amazon AWS с установленой Ubuntu 18.04 и клиентом под Android телефон.

---------------
Настройка сервера:

Добавляем официальный репозиторий Wireguard (если у вас Ubuntu версии выше чем 19.04 - этот пункт можно пропустить):
Код:
~$ sudo add-apt-repository ppa:wireguard/wireguard
Обновляем систему:
Код:
~$ sudo apt update
~$ sudo apt full-upgrade
Настраиваем часовой пояс на системе, чтобы правильно отображались логи:
Код:
~$ sudo dpkg-reconfigure tzdata
Устанавливаем заголовки ядра:
Код:
~$ sudo apt install linux-headers-$(uname -r)
Устанавливаем сервер Wireguard:
Код:
~$ sudo apt install wireguard
Генерируем приватный и публичный ключи для сервера Wireguard:
Код:
~$ wg genkey | tee server_private_key | wg pubkey > server_public_key
Генерируем приватный и публичный ключи для мобильного клиента:
Код:
~$ wg genkey | tee mobile_client_private_key | wg pubkey > mobile_client_public_key
Создаем и редактируем файл настройки Wireguard сервера wg0.conf:
Код:
~$ sudo nano /etc/wireguard/wg0.conf
В этот файл записываем следущее:

[Interface]
Address = 192.168.40.1
SaveConfig = false
PrivateKey = <вставьте приватный ключ для серевера>
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820

[Peer]
PublicKey = <вставьте публичный ключ для телефона>
AllowedIPs = 192.168.40.2

Всё что выделено жирным - настраиваем под себя
Сохраняем файл: Ctrl+S --> Ctrl+X

Делаем из системы маршрутизатор:
Код:
~$ sudo sysctl -w net.ipv4.ip_forward=1

Поднимаем Wireguard сервер:
Код:
~$ sudo wg-quick up wg0

Проверяем, что интерфейс wg0 поднялся и ждет клиентов:
Код:
~$ sudo wg

Добавляем в автозапуск, чтоб после перезагрузки системы сервер поднимался автоматически:
Код:
~$ sudo systemctl enable wg-quick@wg0.service


Всё! Вот так просто мы настроили серверную часть Wireguard.

---------------
Настройка клиента Wireguard на Adnroid телефоне:

Для телефона на Android устанавливаем соответствующий клиент в официальном Маркете.
Открываем приложение, далее нажимаем на "плюс" --> <IMPORT FROM FILE OR ARCHIVE>
И выбираем заранее подготовленый файл mobile.conf

Файл должен содержать следущее:

[Interface]
PrivateKey = <вставьте приватный ключ для телефона>
Address = 192.168.40.2
DNS = 1.1.1.1

[Peer]
PublicKey = <вставьте публичный ключ от сервера>
AllowedIPs = 0.0.0.0/0
Endpoint = <ipv4 адрес вашего сервера>:51820
PersistentKeepalive=25
Всё что выделено жирным - настраиваем под себя

На этом всё!


---------
В дополнение:

Настройка минимальной защиты сервера в виде firewall:
Код:
~$ sudo apt install ufw
~$ sudo ufw default deny incoming
~$ sudo ufw default allow outgoing
~$ sudo ufw allow 22/tcp # порт для ssh
~$ sudo ufw allow 51820/udp # порт для Wireguard
~$ sudo ufw enable
~$ sudo ufw status



Под спойлером файлы wg0.conf и mobile.conf с примером под мой сервер:

[CLIKE]wg0.conf
[Interface]
Address = 192.168.40.1
SaveConfig = false
PrivateKey = CFqnSuedJj6sTCXRoyqbg94LULgVYcPKgHuzRb6+lHI=
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i %i -j ACCEPT; ip6tab$
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i %i -j ACCEPT; ip6t$
ListenPort = 51820

[Peer]
PublicKey = 20li/aIdExkf+FMOxMa1kOo+6xj3U+RG23LKOtRo2j4=
AllowedIPs = 192.168.40.2

mobile.conf
[Interface]
PrivateKey = 8FpUTMO5h16GZRgdUznbb7JUCOdXMiKeuMAwh+enXEg=
Address = 192.168.40.2
DNS = 1.1.1.1

[Peer]
PublicKey = YWXNRGQJEIbMU0qoFLzzd2cGasRMbZKm4rAqTAoy7D0=
AllowedIPs = 0.0.0.0/0
Endpoint = 3.120.31.125:51820
PersistentKeepalive=25
[/CLIKE]



Не забываем! Несмотря на то что весь трафик теперь идет через ваш сервер - DNS запросы по прежнему ходят в открытую, и ваш провайдер по прежнему видит адреса сайтов на которые вы заходите.
 
Последнее редактирование:
[Interface]
Address = 192.168.40.1
....
Dns = 192.168.40.1 # если на сервере есть dns то заработает
Написал мануал по настройке собственного DNS. Так что да, вместо DNS = 1.1.1.1, теперь более актуально использовать 192.168.40.1, если настраивать.
Настройка DNS резорвера Unbound на Ubuntu 20.04
 
ты добавил
ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
зачем ?
также этот ufw
можно было написать пару правил через iptables
Если есть время, напиши как написать пару правил через iptables, чтобы остались открыты только порты под ssh и для wireguard

Еще один вопрос. Как сделать так чтобы при обрыве связи с сервером весь трафик блокировался.
Сейчас если связь обрывается, или выключаю на сервере wireguard то трафик блокируется. Но на 100%? И не включится ли он через некоторое время и не пойдет мимо?
 
Полезный скрипт, который делает примерно то же самое https://github.com/isystem-io/wireguard-aws
Для спокойствия за трафик имеет смысл взять роутер (или одноплатник) вроде mikrotik mAP, по желанию перешить на OpenWRT, создать на нем виртуальный интерфейс для VPN соединения и настроить роутинг клиентского трафика через него.
 
как написать пару правил через iptables, чтобы остались открыты только порты под ssh и для wireguard
Поставь себе пакет iptables-persistent, после этого при старте системы у тебя будут подхватываться правила по пути /etc/iptables/rules.v4 - для ipv4
и /etc/iptables/rules.v6 для ipv6 соответственно.
После, на сервере заблокируй трафик ipv6, сделать это можно прописав в /etc/iptables/rules.v6 следующее:
Код:
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
COMMIT
*raw
:PREROUTING DROP [0:0]
:OUTPUT DROP [0:0]
COMMIT
*nat
:PREROUTING DROP [0:0]
:INPUT DROP [0:0]
:OUTPUT DROP [0:0]
:POSTROUTING DROP [0:0]
COMMIT
*security
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
COMMIT
*mangle
:PREROUTING DROP [0:0]
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:POSTROUTING DROP [0:0]
COMMIT
Теперь измени /etc/iptables/rules.v4 следующим образом, чтобы сделать то, что ты хочешь:
Код:
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/24 -o YOUR_INTERFACE -j MASQUERADE
COMMIT

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A FORWARD -s 10.8.0.0/24 -j ACCEPT
-A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -m conntrack --ctstate INVALID -j DROP
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp -m tcp --dport YOUR_SSH_PORT -j ACCEPT
-A INPUT -p tcp -m tcp --dport YOUR_WIREGUARD_PORT -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
COMMIT
Где "YOUR_INTERFACE" имя твоего интерфейса(например eth0), "YOUR_SSH_PORT" - твой ssh порт, "YOUR_WIREGUARD_PORT" - твой wireguard порт.
Еще один вопрос. Как сделать так чтобы при обрыве связи с сервером весь трафик блокировался.
Так же ставь iptables-persistent на свою машину.
Блокируй ipv6 изменив /etc/iptables/rules.v6 на следующее:
Код:
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
COMMIT
И измени /etc/iptables/rules.v4 на следующее:
Код:
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A INPUT -s X.X.X.X -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -d X.X.X.X -p tcp --dport XXXX -j ACCEPT
-A INPUT -i YOUR_VIRTUAL_INTERFACE -j ACCEPT
-A OUTPUT -o YOUR_VIRTUAL_INTERFACE -j ACCEPT
COMMIT
Где "X.X.X.X" - адрес твоего сервера, "XXXX" - адрес порта wireguard на твоем сервере, "YOUR_VIRTUAL_INTERFACE" - твой виртуальный интерфейс(например tun1)
 
А как на linux'e настроить клиентскую, а не серверную, часть?


Очень просто. На примере Ubuntu 20.04:
Код:
sudo apt update
sudo apt install wireguard
sudo nano /etc/wireguard/wg0.conf

[Interface]
PrivateKey = <вставьте приватный ключ клиентской машины>
Address = 192.168.40.5

[Peer]
PublicKey = <вставьте публичный ключ от сервера>
AllowedIPs = 0.0.0.0/0
Endpoint = <ipv4 адрес вашего сервера>:51820
PersistentKeepalive=25

Код:
sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0.service
 
Вопрос по логам wireguard
Смотрел в инете и читал на официальном сайте что по дефолту никаких логов не ведется.
Можно только посмотреть отчеты по недавним хэндшейкам с помощью команды wg

Действительно так, или у кого-то есть другая информация?
 
На основе манаула mainnick по настройке wireguard и unbound, и правил для iptables от g0bl написал на bash+python скрипт для авто настройки wireguard на сервере

-----

Что делает скрипт:

- Включает и настраивает автоматическое обновление пакетов безопасности системы
unattended upgrades
- Добавляет в систему пользователя u2998 и включает его в группу sudo
- Настраивает SSH:
Меняет стандартный (22) порт на 55933
Запрещает доступ root пользователю по SSH
- Настраивает wireguard и генерирует ключи для сервера и клиента
- Настраивает DNS сервер unbound, чтобы DNS запросы шли внутри wireguard туннеля
- Создает правила для iptables, которые оставляют открытыми только порты
55933 для SSH
57800 для wireguard


СКАЧАТЬ
 
Несмотря на то что весь трафик теперь идет через ваш сервер - DNS запросы по прежнему ходят в открытую, и ваш провайдер по прежнему видит адреса сайтов на которые вы заходите.
Это уже можно решить с помощью DNSCrypt, DNS-over-HTTРS или другими вариациями.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
На хабре есть статья сравнения wg и OpenVPN и там автор пишет о конфиденциальности данных, что wg в явном виде хранит ip адреса пользователей. Это действительно так и как это лечить?
 
На хабре есть статья сравнения wg и OpenVPN и там автор пишет о конфиденциальности данных, что wg в явном виде хранит ip адреса пользователей. Это действительно так и как это лечить?
При выполнении команды wg на сервере, выводится список ип подключенных клиентов. Но при ребуте сервака он стирается. Есть ли другие места где записывается ИП клиента не вкурсе
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх