Wireguard удобный инструмент (хотя и легко определяеться на DPI, но мы сейчас не об этом) сегодня я хочу рассказать как с его помощью можно:
Подключаться к компьютерам за NAT (используя другой сервер с публичным IP)
Использовать интернет провайдера за NAT'ом (домашнего провайдера)
При этом - подключаясь - к одному серверу, а выходить в интернет через совершенно другой
Установка сервера WireGuard на сервере (зарубежном/Белый IP)
Приступим, для начала установим WireGuard на сервер, я предпочитаю использовать готовый скрипт: https://github.com/burghardt/easy-wg-quick
Скачаем данный скрипт
git pull https://github.com/burghardt/easy-wg-quick
Установим зависимости
sudo apt install wireguard-tools mawk grep iproute2 qrencode
Перейдем в папку скрипта и выдадим ему права на запуск:
cd easy-wg-quick
sudo chmod +x ./easy-wg-quick
Для создания нового клиента на вашем сервере нужно запустить скрипт с параметром имени клиента:
./easy-wg-quick client_name
Вы получите примерно следующий вывод:
No seqno.txt... creating one!
No wgpsk.key... creating one!
No wghub.key... creating one!
No wghub.conf... creating one!
Wireguard hub address is 10.13.1.140:51820 on wlp9s0.
Note: customize [Interface] section of wghub.conf if required!
Note: passing argument to script creates client configuration with supplied
name to help remembering which config was for which device. If you
didn't pass any argument you can still rename created file manually
with command:
mv -vi wgclient_10.conf wgclient_name.conf
No wgclient_10.conf... creating one!
█████████████████████████████████████████████████████████████████████████
█████████████████████████████████████████████████████████████████████████
████ ▄▄▄▄▄ █▀██ ▀▄▀▄█▄ ▀▄ █▀▀▄█▄▄▀ ▄▀██▀▀▀▀█▄ █▀▀▄█ ▄▀▀ █▄▀█ ▄▄▄▄▄ ████
████ █ █ █▀▄▀ ▀█▀▄▄▄ ▄ ▀█ ▄██▄█ ▀▀▄ ███▀▀▄▄ ▀ ▄▄▀███▄▀▀ ▀▄█ █ █ ████
████ █▄▄▄█ █▀▀▀██▀▄██ ▀▄███▀▀▀▀▄▄ ▄▄▄ ▄ ▀██ ▄█▀▀ █▀██▄▀█▄█ █▄▄▄█ ████
████▄▄▄▄▄▄▄█▄█▄▀ ▀▄▀▄▀ ▀▄▀▄█ █▄█ █ █▄█ █ █ ▀ ▀▄█ ▀▄▀ ▀▄▀ ▀▄█▄█▄▄▄▄▄▄▄████
████▄▄ █▄ ▄ ██ ▄▄▄█ ▀█▀▄ ▀▄█▄▄█▄▄ ▄ █ █▀▄▀▄▀█▄▀▄▀▀▄▄ █▄ ▀▄▀ ▀ █████
█████▀ ▄▀▀▄▀▀▄█▀ █▀ ▀▀▄▀█▄█▄ ▄▀▀▄▄▄█ ▄▀▀█ ▄ ▀▀▄ ▄▄▄ ▀ █▀▀▀██▀▄█ ▄███████
████ ▄███ ▄▀█▄▀█▄▀ ███▀▀▀▀▀▀▄ ▄ ▀ ██▀ ▄███ ▄ ▀ ▀ ▄▄▀▄█▀▄▀▀ █▀ ▄▄▀ ████
█████▀ ▀▀▄ ▄▀▄▀▄██▄█ ▀ ▀▄▀█ █ █▀▀▄ ▀█▀▄▀█▀▀▄▄█▀ ██▀█▄▄▀█▄ ▀ ▀██▀▄▀████
████▀▄▄▀▀ ▄▄▄▄▄█ ▀█ ▀▀ ▀█ █▀█ ▀▀▄ ▀█▀██▀█ ▄▀▀▀▀▄▀ █▀▄▄▄ █ ▀▀▀ ▄▄ █████
████▀▄▄██ ▄▀▀▀▀█▄▄▄ ▀▄█ ▀▀ ▄▄▄ █▀▄ █▄▄ ▄███▀▄▀██ ▀▀██ ▄ ▀▄ ▄██▀▄████
████▄ ███▄ ▀▄█ ▄▀▄▀▀▀▀▄▀▀▄▄▀ ▄ ▄▄▄▀▄▄█▄▄ ▀█▄▄▀▀▀▄▄▄▀ ▀▄██▀ ▄▄ ████
████ █▄▀▀ ▄██▀▄ █▄▀▄ ▀ █▀ ▄ ▄██▀█ ▄ ██▀▄▄▀ █ ▄▄█ ▀▀ ▄▀█ ▄ ██ ▀▀▄▄████
████ ▄ ▀▄▄▄█▄█▀█▄ ▀▀▀ ▀▀▄▄█ ▀▄▀██ ▀▄█ █ █▄ █▀▀▀ ▀██ ▀▀ ▀▄▀ ██▀████
█████▄ ▀▄▀▄█▄ ▄▄▀█ ▄█ █▄▄▀ ▄▄▀█ ▄█▄▄▄ ▀▀▀▀ ▄▄ █ ▀▄█▄ ▄▄▀▀ █ ▀▄▀▄▄████
████ █▀█▀▄▄▀▀▄ ███ ▀█▀▀▄█▄ ▄ ▄███▀▄▄▀▀ ▀▀▀▀ ▄ █▄▀▄▄▄▀▄▀ ██ █▀ █ ▀████
█████▄▄█ ▄▄▄ █ ▄ ▀█▀ ▄█▀█▄ █▀▄▄ ▄▄▄ ▄ █▄█▄ ██▀▄█▀██▀ ▄ ▄▄▄ ▀▀▄█████
████▀█▀▄ █▄█ █▄█▄▀▀█ █▄▄ ▀███▀███ █▄█ ▄▄▄▀▀█ ▄██▀▀ ▀▀▄▄▄▄▄ █▄█ ██▄▀████
████ ▀ ▄▄ ▀█ ▄█ █▀ ▄█▄█▄▄▀████ ▄ ▄ ▄▄▄███▄▀██▄▄▄▄▄▀▄▄██ ▄ ▄▄▄█ ▄████
████ ▀ ▄▄ ▄ ▄▄ ▄▀▄█▄▀▀ █▄█▀ ▀█▀▀█ █▀██▀▀███▄▀▀▀█▄█▀ ▄█▄ ▄█▄█▀▄ ▀████
████▄▀▄▄▀▄▄█▀▄▄ █▄▄█▀ ▄▀▀█▄ ▄█▀██ ███ █▄▄█▀█▄▀▀▄ ▀▄▀▄ ▀██ ▀▀ ▀▀▄████
████ ▄▀▄▀▄▀ ▄▀▄ ▄ ▀█▄█ ▀▀▄█▄▀█▀▀▄██▀ ▄▀▀▄ ▄█▄██▀ ▄█▄▄▄ ▀ ██▄▀██▀▄████
████▀█ ▄█▄▄▄▄██▄ ▄▄▄█ ▄▀▄▄█▄█▄▀▀▀ █▀ █▀▀▄▀█▀█▀█▀▄█▄ ▀█▄█▀ ▀▄█▄█ ▄▀ ▄████
████▄▀▀█▄▄▄▀▀█▄ ▀█ ▄▀▄ ▀▀█▄▀▄▄▄ ▄▀ ▀▀▀▄▀█ █▀█ ▄▀ ▀█▄ ▀▀█▀▄▄█ █▄█▄██▀████
████▀█▀▄ ▀▄▄ █▄ ▀█▄ ▀ ▄▄▀█▀█▀▄██▀▄ ▄█▀█▀██▀ ▀▄█ ▀██▀▄█▄█▀ █ █▀ █████
█████ █ ▄▄▄ █▀ ▀██ ▀▄ ▄ █████▀█ ▄▀ ▄▄▄█ ▄▄█▄▄ ▄ ▄▄▄█▀▄▄▄▄▄▄▀ ▄█▄▄ █████
████▄█▄ ▄▀▄ ▄▀█▀██▄▀▄█▄█▀ ▄ █▀██ ▀▄ ▄▄▀▀▀▀█▀█ █▄ ▀▀ █ █▀ ▀ ▄██▀▄████
████▄▄ █ █▄▄▄▄ █ ▄▄▀█▄▀█ ▀▄▀ ▄▄ ▀ ▄█ █▄▀▀▄█▀▄ ▀███▀▀ ▄██ █▄▄█▀█▄▄▄▀████
████▀█▄ █▄▄█ █▀ ▄ ▀██ ▀ ▀▄▄▄▄██▄█▄▄▄█▄▄▄▀▀▄▀▄█▀ ▄█ ▄▀▄ ▀█ ▄█ ▄▄▀▄▄████
█████▄▄█▄█▄█▀▄█ ▀ █▄ ▀▀▀▀▀█▄█▄▄ ▄█ ▄▄▄ ▀▄▀██▄▄▀█▄▀▀ █▄█ ▄█ ▄▄▄ █ █▀████
████ ▄▄▄▄▄ █▄██▀▀█▀██▀▀▄█ ▄▀ ▄█▄█▀ █▄█ █▀▀▄█▄ █▄█▄▀█▀ █ █▄█ ▀▀▀▄████
████ █ █ █ █ ▀▄█ ▀███▄██▄▄ ▄ █ ▄▄ ▄▄█ ▄▀▀█▀▄▄▀▀█▄▄▄▀▀▀█ █ ▄▄▄▀ █████
████ █▄▄▄█ █ ▀▄ █▄▀█▀ ▄███▄ █ ▄ ▀█▄ ▄▀ ▀▄▀▀▄ █▀ ▄ ▀▄█▀▄█▀▄▄███▄▀▀ █████
████▄▄▄▄▄▄▄█▄▄██▄▄█▄█▄█▄▄▄▄█▄▄▄██▄█████▄▄█▄▄▄█▄▄████████▄▄▄█▄████████████
█████████████████████████████████████████████████████████████████████████
█████████████████████████████████████████████████████████████████████████
Scan QR code with your phone or use "wgclient_10.conf" file.
Updating wghub.conf... done!
Important: Deploy updated wghub.conf configuration to wireguard with wg-quick:
sudo wg-quick down ./wghub.conf # if already configured
sudo wg-quick up ./wghub.conf
sudo wg show # to check status
Для проверки раборты - можно отсканировать QR телефоном с установленным клиентом WireGuard и добавить новое подключение.
Для запуска сервера wireguard выполните:
sudo wg-quick up ./wghub.conf
Для проверки создания выполним:
sudo wg show
После команды вы увидите туннель, при подключении устройства статус туннеля измениться.
Ура, теперь у нас есть рабочий сервер Wireguard и один подключенный клиент - телефон.
Теперь создадим новое подключение, для вашей Raspberry pi дома
./easy-wg-quick raspberrypi
Выведем полученный конфиг
cat wgclient_raspberrypi.conf
Данные для подключения скопируйте и сохраните, они нам понадабяться для указания их в Raspberrypi
Незабудем перезапустить сервис после изменения конфига и заодно добавим сервис в автозапуск:
sudo wg-quick down ./wghub.conf
sudo cp wghub.conf /etc/wireguard/wghub.conf
sudo systemctl enable wg-quick@wghub
sudo systemctl start wg-quick@wghub
И проверим успешность systemctl status wg-quick@wghub
Теперь при запросе статуса sudo wg show
вы увидите два туннеля.
WireGuard клиент на raspberry pi
Устанавливаем wireguard
sudo apt-get update
sudo apt install wireguard
Создаём файл с конфигом и вставляем туда, то что получили от вашего сервера:
sudo nano /etc/wireguard/wg0.conf
Важный момент! обратите внимание на секцию AllowedIPs
Мы же не хотим отправить весь трафик в туннель? тогда нужно поменять маску, пример конфигурации:
[Interface]
Address = 10.81.54.12/24
DNS = 1.1.1.1
PrivateKey = 12121212121dadada
MTU = 1280
[Peer]
PublicKey = fdsjkfslfjslfjlsfls=
PresharedKey = 242342klndslknfsflsnflsfs
AllowedIPs = 10.81.54.0/24
Endpoint = SERVER_IP:54203
PersistentKeepalive = 25
В пункте AllowedIPs вероятно у вас будет указано 0.0.0.0 ::1 - это означает, что весь трафик нужно подать в тунель. Для подачи только части трафика (мы же не хотим что бы домашняя малинка ходила в интернет через VPN) следует изменить этот пункт, сеть стоит взять из поля Address, т.е если у вас: Address = 10.81.54.12/24, то AllowedIPs = 10.81.54.0/24
После сохранения конфигурации давайте поднимем клиент на Raspberry:
sudo wg-quick up wg0
Теперь у нас должен быть рабочий тунель, который вы сможете увидеть в ifconfig
wg0: flags=209<UP,POINTOPOINT,RUNNING,NOARP> mtu 1280
inet 10.81.54.12 netmask 255.255.255.0 destination 10.81.54.12
Для проверки работы тунеля можно сделать ping с сервера на IP который вы увидели в ifconfig: ping 10.81.54.12
Если всё успешно, добавляем правила для автозапуска нашего сервиса на Raspberry:
sudo wg-quick down wg0
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
Теперь туннель будет стартовать при включении малинки.
На данном этапе у нас есть рабочий туннель Сервер <-----> Raspberry pi, и при подключении к серверу, можно подключиться к малинке, например по SSH.
Используем домашний интернет (ака wireguard chain)
А теперь давайте сделаем более сложную конструкцию, мы хотим подключаться к вашему серверу (который например - находиться в Германии), а выходить в интернет из вашей домашней сети (например из РФ).
Тут может прозвучать вопрос: Зачем?!
На самом деле такой вариант доступа может потребоваться для доступа к некотрым ресурсам, которые почему-то не хотят пускать из-за пределов своей страны.
Для реализации такого подключения нам потребуеться:
Установленный сервер Wireguard на вашем сервере (мы это сделали чуть выше)
Установленный клиент Wireguard на raspberry (это тоже мы сделали)
Установить сервер Wireguard на Raspberry
Перенаправить порты на Сервере
Установим сервер на Raspberry
Ход установки одинаковый с тем, что мы проделали вначале
sudo apt install wireguard-tools mawk grep iproute2 qrencode
git clone https://github.com/burghardt/easy-wg-quick.git
cd easy-wg-quick
sudo chmod +x ./easy-wg-quick
./easy-wg-quick phone_home_inet
Опять же на этом моменте установим себе на телефон новое подключение - к малинке.
Посмотрите на каком порту у вас создался сервис !, он нам понадобиться, далее мы будем считать, что wireguard на raspberry в режиме сервера слушает порт 3134
А теперь запустим сервис sudo wg-quick up ./wghub.conf
и проверим подключение с мобильного (телефон и raspberry должны быть в одной сети)
После успешного теста - добавим сервис в автозапуск
sudo cp wghub.conf /etc/wireguard/wghub.conf
sudo wg-quick down ./wghub.conf
sudo systemctl enable wg-quick@wghub
sudo systemctl start wg-quick@wghub
systemctl status wg-quick@wghub
Пробрасываем тонель Сервер--> Raspberry
Настала время самого интересного, собрать всё воедино, для этого нам потребуеться всего одна команда, установим socat
sudo apt install socat
Запустим:
socat UDP4-LISTEN:3134,fork,reuseaddr UDP4:10.81.54.12:3134
Разберем что тут происходит, данной командой мы просим socat
открыть UDP сокет и слушать его на сервере на порту 3134 и всё что туда попадёт - отправить на 10.81.54.12:3134
- это IP нашей малинки, который мы ей присвоили при установке соединение: Wireguard на сервере <----> Raspberry (клиент) А вот порт - это порт Wireguard сервера который запущен на Raspberry
Проверим работу - для этого в настройках соединения на вашем телефоне, укажите внешний IP вашего сервера, вместо локального (домашнего адреса) а вот порт должен остаться старый (тот что используеться сервером wireguard на raspberry).
После подключения и проверки IP адреса (лучше подключаться через LTE для проверки) вы увидите адрес вашего домашнего провайдера (там где стоит ваша Raspberry)
Осталось только добавить socat в автозапуск:
Выполним на сервере /etc/systemd/system/socat_home.service
Вставим туда:
[Unit]
Description=Forward UDP from 3134 to 3134 raspberry (bidirectional)
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/socat UDP4-LISTEN:3134,fork,reuseaddr UDP4:10.81.54.12:3134
Restart=always
Обновим список демонов и запустим сервис:
sudo systemctl daemon-reload
sudo systemctl enable socat_home.service
sudo systemctl start socat_home.service
# Проверим что всё ок.
sudo systemctl status socat_home.service
Ура, теперь у вас есть постоянный доступ к вашей домашней Raspberry и возможность подключаться к интернету через VPN используя IP домашней сети.