DEV Community

diPhantxm
diPhantxm

Posted on

Как я поднял свой VPN

Как поднять свой VPN?

У меня нет за спиной 10 летнего опыта в системном администрировании или DevOps, я просто рассказываю как это делал я. Спасибо!

Зачем я вообще решил сделать свой VPN? 1. Я хочу быть уверен, что никто не пишет логи и не знает куда и что я отправил. 2. Я могу пользоваться ВПН без ограничений на количество устройств, скорости и объема траффика. 3. Если скинуться группой, то выйдет дешевле.

Что же, приступим к запуску персонального VPN. Расскажу как это делал я:

Для начала нам нужен какой-нибудь хостинг с локацией, которую мы хотим. Например, можно купить сервер на aeza.net. Берем виртуальную машину на Ubuntu.
Дальше нам нужно зайти на эту машину и настроить ее. Обычно на хостингах нам будет дан ip сервера и пароль от root. Заходим по ssh

ssh root@<ip>
Enter fullscreen mode Exit fullscreen mode

Тут у нас попросит пароль, копируем и вставляем его (пароль не будет отображаться при вставке, не будет даже звездочек, это нормально)

Первым делом я бы настроил доступ к машине и какой-нибудь фаервол. Создадим своего юзера, под которым будем заходить на машину в будущем:

useradd -G root -m diphantxm -s /bin/bash
Enter fullscreen mode Exit fullscreen mode

Запретим вход на машину под рутом, разрешим аутентификацию по публичному ключу и запретим вход по паролю:

sed -i "s/PermitRootLogin yes/PermitRootLogin no/g" /etc/ssh/sshd_config
sed -i "s/PubkeyAuthentication no/PubkeyAuthentication yes/g" /etc/ssh/sshd_config
sed -i "s/PasswordAuthentication yes/PasswordAuthentication no/g" /etc/ssh/sshd_config
Enter fullscreen mode Exit fullscreen mode

Положим наш ssh ключ на машину в /root/.ssh/authorized_keys и порестратим ssh:

systemctl restart ssh.service
Enter fullscreen mode Exit fullscreen mode

Теперь на машину заходим только под своим юзером:

ssh -l diphantxm <ip>
Enter fullscreen mode Exit fullscreen mode

Настроим фаервольные правила. По умолчанию запретим весь входящий траффик, откроем порт для подключения по ssh и порт 443 для нашего приложения.

ufw default deny incoming
ufw default allow outgoing
ufw allow OpenSSH
ufw allow 22
ufw allow 443
ufw enable
ufw reload
Enter fullscreen mode Exit fullscreen mode

Дальше нам нужен инструмент, который будет роутить наш траффик. Самые популярные из них это v2ray или xray, поэтому будем использовать их. Скачиваем:

wget https://github.com/XTLS/Xray-core/releases/download/v25.3.6/Xray-linux-64.zip
unzip Xray-linux-64.zip
chmod +x xray
mv xray /usr/bin/xray
Enter fullscreen mode Exit fullscreen mode

Теперь для удобства создадим systemd сервис. Для этого можно просто скопировать файл сервиса и положить его в /lib/systemd/system/xray.service

echo "[Unit]
Description=XRay Service
After=network.target nss-lookup.target

[Service]
User=root
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
NoNewPrivileges=true
ExecStart=/usr/bin/xray run -config /etc/xray/config.json
Restart=on-failure
RestartPreventExitStatus=23

[Install]
WantedBy=multi-user.target"
Enter fullscreen mode Exit fullscreen mode

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

xray x25519
Enter fullscreen mode Exit fullscreen mode

Приватный ключ нужен для настройки нашей тулзы, а публичный понадобится для подключения клиентам до нашего сервера.

Для правильной работы Xray напишем конфиг. Тут мы должны указать какие клиенты могут к нам подключиться, по какому порту, куда и как их роутить и прочее. Ниже минимальный конфиг для начала работы. В нем нужно указать id клиента в формате uuid v4 и только клиенты с этим id смогут подключаться к нашему прокси.

{
    "inbounds": [
        {
            "tag": "input",
            "port": 443,
            "listen": "0.0.0.0",
            "protocol": "vless",
            "settings": {
                "clients": [
                    {
                        "id": "<СЮДА ВСТАВЛЯЕМ ЛЮБУЮ СТРОКУ ВИДУ xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx>"
                    }
                ],
                "decryption": "none"
            },
            "streamSettings": {
                "network": "tcp",
                "security": "reality",
                "realitySettings": {
                    "show": false,
                    "dest": "github.com:443",
                    "privateKey": "<СЮДА ВСТАВЛЯЕМ НАШ ПРИВАТНЫЙ КЛЮЧ>",
                    "serverNames": ["github.com"],
                    "shortIds": [""],
                    "type": "tcp"
                }
            }
        }
    ],
    "outbounds": [
        {
            "protocol": "freedom",
            "tag": "direct",
            "settings": {
                "domainStrategy": "UseIP"
            }
        },
        {
            "protocol": "blackhole",
            "tag": "block"
        }
    ]
}
Enter fullscreen mode Exit fullscreen mode

Запускаем Xray:

systemctl start xray.service
Enter fullscreen mode Exit fullscreen mode

Наша прокся слушает порт 443, теперь нужно к нему подключиться.

Подключиться к нему можно с любого устройства, но нужны специальные приложения:
На Android/IOS: V2Box
На Windows: V2rayN

Разберем на примере IOS:
Приложение будет выглядеть следующим образом:

image

Мы являемся клиентом нашего прокси сервера, поэтому нам нужно написать еще один конфиг, теперь для клиентской части. В приложении нужно нажать на + и выбрать "Add manual config", в выпавшем списке выбираем наш транспортный протокол "VLESS". Заполняем его, пример моего конфига есть ниже:

image image

Вуаля, наш ВПН готов, можно пользоваться :)
Надеюсь моя статья была хоть немного полезна тем, кому это могло быть интересным!

image

Ну а если вам лень всем этим заниматься, то можно попробовать мой VPN через бота в тг: DipVPN

Top comments (0)