Как стать автором
Обновить

WireGuard для подключения к домашней Raspberry pi и использование домашнего интернета удалённо

Время на прочтение7 мин
Количество просмотров17K

Wireguard удобный инструмент (хотя и легко определяеться на DPI, но мы сейчас не об этом) сегодня я хочу рассказать как с его помощью можно:

  1. Подключаться к компьютерам за NAT (используя другой сервер с публичным IP)

  2. Использовать интернет провайдера за NAT'ом (домашнего провайдера)
    При этом - подключаясь - к одному серверу, а выходить в интернет через совершенно другой


Установка сервера WireGuard на сервере (зарубежном/Белый IP)

Приступим, для начала установим WireGuard на сервер, я предпочитаю использовать готовый скрипт:

Скачаем данный скрипт
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)

А теперь давайте сделаем более сложную конструкцию, мы хотим подключаться к вашему серверу (который например - находится в Германии), а выходить в интернет из вашей домашней сети (например из РФ).

Тут может прозвучать вопрос: Зачем?!

На самом деле такой вариант доступа может потребоваться для доступа к некотрым ресурсам, которые почему-то не хотят пускать из-за пределов своей страны.

Для реализации такого подключения нам потребуеться:

  1. Установленный сервер Wireguard на вашем сервере (мы это сделали чуть выше)

  2. Установленный клиент Wireguard на raspberry (это тоже мы сделали)

  3. Установить сервер Wireguard на Raspberry

  4. Перенаправить порты на Сервере

Установим сервер на 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 домашней сети.

Теги:
Хабы:
Всего голосов 7: ↑5 и ↓2+3
Комментарии5

Публикации

Истории

Работа

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань