Skip to content

Instantly share code, notes, and snippets.

@r3code
Last active June 18, 2024 19:38
Show Gist options
  • Save r3code/624feab8ea3f3ec29d5cac33963d6701 to your computer and use it in GitHub Desktop.
Save r3code/624feab8ea3f3ec29d5cac33963d6701 to your computer and use it in GitHub Desktop.
Настройка VPS для VPN: IPSec/IKEv2 или Outline Server

Настройка VPS для VPN

Использую сервер на Ubuntu 20.04 LTS

Варианты для VPN

Тестировался на канале 100 Мбит/с (96/95 Мбит/с download/upload)

  • IKEv2 IPSec сервер - download: 9-10 Мбит/с, upload 29 Мбит/с
  • Outline VPN Server - download: 23-29 Мбит/с, upload 29-34 Мбит/с
  • Wireguard VPN server - download: 15-20 Мбит/с, upload 27-31 Мбит/с

Развертывание: готовый docker контейнер (нужна виртуализация KVM, OpenVZ не подходит)

Первоначальная настройка сервера

Скопировать свои SSH ключи на сервера

ssh-copy-id -i ~/.ssh/id_rsa.pub -o PubkeyAuthentication=no -p 22 user@server

В ситеме добавить ногово пользователя human с ограниченными правами в SSH

Настроим SSH сервер для более безопасной работы

  • Поменять порт SSH на 22022, чтобы меньше на извесные порты долбились.
  • Отключить возможность подключения по SSH пользователю root
  • Отключить возможность подключения с паролем, разрешить только подключени по rsa ключу

В файле sudo nano /etc/ssh/sshd_config задать настройки

Port 22022
PermitRootLogin no
PasswordAuthentication no
PermitEmptyPasswords no
IgnoreRhosts yes

Сохранить изменения. Перезапустить службу ssh: sudo service ssh restart и проверить статус sudo service ssh status (должно быть Active)

Известные проблемы

Иногда при подключении по ssh не удается полдключиться к серверу из-за ошибки

Received disconnect from $SERVER_IP port $SSH_PORT:2: Too many authentication failures
Disconnected from $SERVER_IP port $SSH_PORT

Чтобы это обойти подключаемся с флагом -o IdentitiesOnly=yes

ssh -o IdentitiesOnly=yes user@server -p 22

Часто такая ошибка встречается при большом количестве SSH ключей, при запуске SSH клиента, он пробует использовать все ключи по очереди. Поскольку ssh-сервер (sshd) на удаленном сервере ожидает определенный ключ идентификации и может иметь ограничение на число попыток, потому сервер отклоняет соединение, и ssh-клиент прерывается с вышеуказанной ошибкой.

Установка VPN сервера IKEv2/IPSec на VPS с Docker

Уставливаем https://github.com/hwdsl2/docker-ipsec-vpn-server

docker pull hwdsl2/ipsec-vpn-server

Запуск через Docker с файлом env

docker run \
    --name ipsec-vpn-server \
    --env-file ./ipsec-vpn-server.env \
    --restart=always \
    -v ikev2-vpn-data:/etc/ipsec.d \
    -v /lib/modules:/lib/modules:ro \
    -p 500:500/udp \
    -p 4500:4500/udp \
    -d --privileged \
    hwdsl2/ipsec-vpn-server

Пример файла минимальных настроек ipsec-vpn-server.env на 1 пользователя vpn:

# Note: All the variables to this image are optional.

VPN_IPSEC_PSK=тут 20 букв # общий ключ
VPN_USER=имя vpn пользователя
VPN_PASSWORD=пароль vpn пользователя

# Use a DNS name for the VPN server
# - The DNS name must be a fully qualified domain name (FQDN)
# VPN_DNS_NAME=vpn.example.com
# VPN_DNS_NAME=myvpn.servername.ru # если нет, испоьзуйте подключение по IP адресу

Скопируй файлы настроек из контейнера на сервер и дальше с сервера на свой ПК.

 sudo docker exec -it  ipsec-vpn-server ls /etc/ipsec.d/ | grep vpnclient
 sudo docker cp ipsec-vpn-server:/etc/ipsec.d/vpnclient.mobileconfig
 sudo docker cp ipsec-vpn-server:/etc/ipsec.d/vpnclient.p12
 sudo docker cp ipsec-vpn-server:/etc/ipsec.d/vpnclient.sswa

Установка VPN сервера Outline Server

https://arminproduction.medium.com/how-to-install-outline-server-on-ubuntu-2020-1-september-updatable-52ec3e2b8eaa

Скачать Outline Manager и выбрать «Настроить Outline где угодно», подключиться к серверу по SSH и выполнить команду для установки.

Подключить на 443 порт и 8080 управление сервером https://arminproduction.medium.com/how-to-install-outline-server-on-ubuntu-2020-1-september-updatable-52ec3e2b8eaa

Автоматически подставить IP как адрес API для управления сервером

sudo bash -c "$(wget -qO- https://raw.githubusercontent.com/Jigsaw-Code/outline-server/master/src/server_manager/install_scripts/install_server.sh)" --api-port=8080 --keys-port=443

Или можно задать свое DNS имя или указать IP явно

SERVER_HOST=myhost.com sudo bash -c "$(wget -qO- https://raw.githubusercontent.com/Jigsaw-Code/outline-server/master/src/server_manager/install_scripts/install_server.sh)" --hostname=$SERVER_HOST --api-port=8080 --keys-port=443

Затем установить и настроить файрвол

sudo apt-get install ufw

Задать правила
Формат ufw allow /<optional: protocol>

sudo ufw allow 8080/tcp
sudo ufw allow 8080/udp
sudo ufw allow 443/tcp
sudo ufw allow 22022 # my custom ssh port

Включить файрвол

sudo ufw allow ssh

Установка VPN сервера Wireguard Server

https://github.com/IAmStoxe/wirehole

Установить

git clone https://github.com/IAmStoxe/wirehole.git
cd wirehole

Запуск (в каталоге wirehole)

docker-compose up

Запуск в фоне (detached mode)

docker-compose up -d

В логах контейнера можно увидеть QR коды для подключения, файлы настроек для клиентов лежат внутри контейнера в /etc/ipsec.d/ Скопируй файлы из контейнера и перенеси на свой ПК с сервера, чтобы потом при их помощи настроить Wireguard клиент.

sudo docker cp ipsec-vpn-server:/etc/ipsec.d/vpnclient.* .

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment