Добавил контейнер с VPN серовером Pritunl + обновил все используемые image + упростил развертывание

This commit is contained in:
nd4y 2024-12-03 02:24:02 +03:00
parent fcb0fae379
commit 221b38ff90
25 changed files with 237 additions and 277 deletions

3
.env Normal file
View File

@ -0,0 +1,3 @@
PRITUNL_IMAGE_TAG=ghcr.io/jippi/docker-pritunl:1.32.3805.95-jammy
NGINX_IMAGE_TAG=nginx:1.27
FPM_IMAGE_TAG=php:8.3-fpm

1
.gitattributes vendored
View File

@ -1 +0,0 @@
*.zip filter=lfs diff=lfs merge=lfs -text

2
.github/FUNDING.yml vendored
View File

@ -1,2 +0,0 @@
github: simonmicro
patreon: simonmicro

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
mounts/*

View File

@ -1,78 +1,57 @@
### Назначение ### Назначение
Адаптация проекта https://github.com/simonmicro/Pritunl-Fake-API для развертывания API сервера Pritunl на том же сервере, где запущен VPN сервер Pritunl. Адаптация проекта https://github.com/simonmicro/Pritunl-Fake-API для развертывания Pritunl + Pritunl FakeAPI с помощью Docker Compose
### Как это работает ### Как это работает
1. В Docker запускается вебсервер с FakeAPI сервера лицензирования Pritunl 1. В контейнерах Docker запускаются:
2. В конфигурационных файлах Pritunl подменяется адрес API сервера лиценизирования Pritunl на `pritunl-fakeapi.local` 1. `pritunl-server` сам VPN сервер + установленная в контейнере MongoDB
3. В /etc/hosts вносится запись `127.0.0.1 pritunl-fakeapi.local` 2. `pritunl-fakeapi-nginx` Реализация API сервера лицензирования Pritunl
4. Используются самоподписанные сертификаты для обеспечения TLS между Pritunl и FakeAPI сервером лицензирования 3. `pritunl-fakeapi-fpm` Реализация API сервера лицензирования Pritunl
2. В docker compose подменяется адреса серверов лицензирования `app.pritunl.com` и `auth.pritunl.com` на адрес контейнера с nginx
3. Генерируются сертификат CA и серверные сертификаты для доменных имен `app.pritunl.com` и `auth.pritunl.com`. CA сертификат добавляется в доверенные в контейнере `pritunl-server`. Серверные сертификаты добавляются в качестве серверных в контейнер `pritunl-fakeapi-nginx`
4. Используются сгенерированные самоподписанные сертификаты для обеспечения TLS между Pritunl и FakeAPI сервером лицензирования
### Протестировано на версиях ### Протестировано
- Ubuntu Server 22.04 LTS pritunl/now 1.32.3552.76-0ubuntu1~jammy Только использование OpenVPN клиента. Работа с официальным клиентом Pritunl не тестировалась.
- Ubuntu Server 20.04 LTS pritunl/now 1.32.3504.68-0ubuntu1~focal
при использовании клиента OpenVPN. Использование официального клиента Pritunl не тестировалось.
### Требования ### Требования
1. Версия ОС и пакета из списка [Протестировано на версиях](#протестировано-на-версиях) 1. Установленный Docker и Docker Compose в соотвествии с документацией https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository . Пакеты docker.io и docker-compose не поддерживаются.
2. Установленный Docker и Docker Compose в соотвествии с документацией https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository . Пакеты docker.io и docker-compose не поддерживаются. 2. Пользователь с доступом к Docker без sudo `sudo usermod -aG docker ${USER}`
3. Пользователь с доступом к Docker без sudo `sudo usermod -aG docker ${USER}`
4. Установленный Pritunl с бесплатной лицензией
5. Порт веб интерфейса Pritunl сменен со стандартного 443 на любой свободный, кроме 80 и 443
### Установка ### Установка
1. (Рекомендуется) зафиксировать версию Pritunl 1. Клонировать репозиторий /opt/pritunl-fakeapi . Можно использовать любой путь на сервере. /opt/pritunl-fakeapi используется в примерах команд ниже.
```
sudo apt-mark hold pritunl*
```
2. Клонировать репозиторий /opt/pritunl-fakeapi . Можно использовать любой путь на сервере. /opt/pritunl-fakeapi используется в примерах команд ниже.
``` ```
sudo mkdir /opt/pritunl-fakeapi -p && \ sudo mkdir /opt/pritunl-fakeapi -p && \
sudo chown ${USER}:${USER} /opt/pritunl-fakeapi && \ sudo chown ${USER}:${USER} /opt/pritunl-fakeapi && \
git clone https://github.com/nd4y/Pritunl-Fake-API.git /opt/pritunl-fakeapi git clone https://github.com/nd4y/Pritunl-Fake-API.git /opt/pritunl-fakeapi
``` ```
3. (Рекомендуется) сгенерировать сертификаты удостоверяющего центра и сервера. оманды для выпуска сертификатов протестированы на OpenSSL 1.1.1w (Debian 10) и OpenSSL 1.1.1f (Ubuntu 22.04 LTS) 2. Рекомендуется сгенерировать сертификаты удостоверяющего центра и сервера. Вы можете использовать уже сгененированные сертификаты из этого репозитория, однако, это может негативно отразиться на безопастности решения. Рекомендуется генерировать новые сертификаты для каждой инсталляции. Команды для выпуска сертификатов протестированы на OpenSSL 1.1.1w (Debian 11) и OpenSSL 1.1.1f (Ubuntu 22.04 LTS).
1. Перейти в каталог и удалить имеющиеся сертификаты `cd /opt/pritunl-fakeapi/mounts/nginx/certs && rm -f *.pem` 1. Перейти в каталог и удалить имеющиеся сертификаты `cd /opt/pritunl-fakeapi/build/certs && rm -f *.pem`
2. Выпустить сертификат удостоверяющго центра 2. Выпустить сертификат удостоверяющго центра
``` ```
openssl req -x509 -newkey rsa:4096 -keyout ca.key.pem -out ca.crt.pem -sha256 -days 3650 -nodes -subj "/CN=Self-Signed Root Certification Authority" openssl req -x509 -newkey rsa:4096 -keyout ca.key.pem -out ca.crt.pem -sha256 -days 3650 -nodes -subj "/CN=Self-Signed Root Certification Authority"
``` ```
3. Выпустить запрос на сертификат сервера 3. Выпустить запрос на сертификат сервера
``` ```
openssl req -newkey rsa:4096 -nodes -days 3650 -keyout tls.key.pem -out tls.req.pem -subj "/CN=Self-Signed Server Certificate" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:pritunl-fakeapi.local")) openssl req -newkey rsa:4096 -nodes -days 3650 -keyout tls.key.pem -out tls.req.pem -subj "/CN=Self-Signed Server Certificate" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:app.pritunl.com,DNS:auth.pritunl.com"))
``` ```
4. Подписать запрос на сертификат сервера сертификатом удоствоверяющего центра 4. Подписать запрос на сертификат сервера сертификатом удоствоверяющего центра
``` ```
openssl x509 -req -in tls.req.pem -CA ca.crt.pem -CAkey ca.key.pem -out tls.crt.pem -CAcreateserial -days 3650 -extensions SAN -extfile <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:pritunl-fakeapi.local")) openssl x509 -req -in tls.req.pem -CA ca.crt.pem -CAkey ca.key.pem -out tls.crt.pem -CAcreateserial -days 3650 -extensions SAN -extfile <(printf "[SAN]\nsubjectAltName=DNS:app.pritunl.com,DNS:auth.pritunl.com")
``` ```
5. Удалить файл приватного ключа удостоверяющего центра, файл запроса сертификата сервера и srl файл. 5. Удалить файл приватного ключа удостоверяющего центра, файл запроса сертификата сервера и srl файл.
``` ```
rm -f ca.key.pem tls.req.pem ca.crt.srl rm -f ca.key.pem tls.req.pem ca.crt.srl
``` ```
В каталоге `/opt/pritunl-fakeapi/build/certs` должны быть 3 файла:
1. ca.crt.pem - Сертификат CA, выпустивший tls.crt.pem. При сборке копируется в контейнер `pritunl-server`
2. tls.crt.pem - Сертификат, подписанный ca.crt.pem и имеющий в SAN DNS:app.pritunl.com,DNS:auth.pritunl.com . При сборке копируется в контейнер `pritunl-fakeapi-nginx`
3. tls.key.pem - Закрытый ключ к сертификату подписанному ca.crt.pem и имеющий в SAN DNS:app.pritunl.com,DNS:auth.pritunl.com . При сборке копируется в контейнер `pritunl-fakeapi-nginx`
4. Отключить использование VPN сервером Pritunl порта 80/TCP 3. Запустить контейнеры
``` ```
sudo pritunl set app.redirect_server false cd /opt/pritunl-fakeapi && docker compose up -d --build
``` ```
5. Запустить контейнеры 4. Получить первичные логин и пароль для входа, выполнив команду `docker compose exec pritunl pritunl default-password`
``` 5. Перейти в Web Interface Pritunl `http://SERVER_IP:80`, введя логин и пароль, полученные на предыдущем шаге, где SERVER_IP - IP адрес (или доменное имя) хоста, на который выполнялась установка.
cd /opt/pritunl-fakeapi && docker compose up -d 6. В веб интерфейсе Pritunl активировать подписку, введя ключ активации `active ultimate`
```
6. Установить сертификат удостоверяющего центра в доверенные для Pritunl
```
cat /opt/pritunl-fakeapi/mounts/nginx/certs/ca.crt.pem | sudo tee -a /usr/lib/pritunl/usr/lib/python3.9/site-packages/certifi/cacert.pem
```
7. Добавить запись в /etc/hosts
```
echo "127.0.0.1 pritunl-fakeapi.local" | sudo tee -a /etc/hosts
```
8. Запустить скрипт setup.py
```
chmod +x /opt/pritunl-fakeapi/setup.py && sudo /opt/pritunl-fakeapi/setup.py
```
В скрипте выбрать [I]nstall и в качестве "new API endpoint" указать `pritunl-fakeapi.local`
9. Перезапустить Pritunl
```
sudo systemctl restart pritunl
```
10. В веб интерфейсе Pritunl активировать подписку, введя ключ активации `active ultimate`

31
build/certs/ca.crt.pem Normal file
View File

@ -0,0 +1,31 @@
-----BEGIN CERTIFICATE-----
MIIFRzCCAy+gAwIBAgIUUFrsw42+OcJCcUTwaqnIQpYnjq8wDQYJKoZIhvcNAQEL
BQAwMzExMC8GA1UEAwwoU2VsZi1TaWduZWQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1
dGhvcml0eTAeFw0yNDEyMDIyMjUxMzBaFw0zNDExMzAyMjUxMzBaMDMxMTAvBgNV
BAMMKFNlbGYtU2lnbmVkIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIi
MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC+x/clgusvFOV6TEQ4yvTDwXlJ
YOCFd9548dFUguYYvh/avRgstAPqykh34vWEbx+nNkqNeQtPU5D2Umz+uw9vsUL5
0ILibJeR7pQP5o/UH380naTlqGrkXwj+o5im4QnV8valMb7zmIrNrqmI4uPy86UP
EpDXJC0JYKD8LEtC0nOoRbbcpBhrKumbwFOLCeM+t4r1HbRcpUpomTxSg4RR9uKk
qv3vvQaOnj07vncubr6k1Jlb/G3ytXV58y3Zym9/rjomfbrACrsrLS3QO0NlIHGe
M1IKWefbT1SFbg3BDX8X2I7qOxcZXovhcTCykklYyroJ8oGsagfalxnJSUzIMiTb
1G0+R6Pp//xyCnbXVKO+WU4i1tDuronFHR+5pLwVvzmVaWJA3yYlHvLfcbjnzFYM
05qw34ai/IM27geMjDGpy+EApibFqETIBLgmrV/A81zElPAObqppVTLUOdPCkNzF
Gx6++M+3UUz6Iq3Efhcv+zqW8zNJPwMCw0IKnbpodGXCIQBr/7t4ZY1qXXCHQDZq
FmnrBSG6JhDOsb9A6rjQhvshV2e4aqWrYT4jS9YFHGfNTSy9TNKByTpV3gbb9E5p
CPmElqWZzCi+Ut3tU8BX8e/2ky8rtNWWVDPzg3l7vrVRtXYgnLHOL8nGPnsHKv9r
1FVnojFZjS3hNH7D2QIDAQABo1MwUTAdBgNVHQ4EFgQUDCkdSHzC7aXzu9C3KtDT
+RnwZF8wHwYDVR0jBBgwFoAUDCkdSHzC7aXzu9C3KtDT+RnwZF8wDwYDVR0TAQH/
BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAFx2XgHNSMpmZQSIs2EYb5DVo0pZF
QjFlw4FJylSI8okxnkQEZHCAGzN4zM2U9hyZjSZKTnPL3uGgzn+YdzM2nVM6BsCy
DAoZn+ksJInKxfMgmX2c3T1cZN/sD7jEbiUuJfuthX1AdVCR1Bp5NkKwxy7VO8xE
RtO7zjnqGYb1ip64fJe48fRMSJnt4ZFUrOLC0ysu9qGk317Oiurg6AzWARvMxHHw
NwyWRWAtmoG7m5CEgrwQh0fzVC3tdgvo7MybV2dCYRCwGD0J+mDAzkctiAFUd5jh
u3KSnOkiXWb2VELB19KTxmdfkm993ikVs/0YrQXWIByqMHlJTdIVGdx38LcOvyel
QP7u47yYeT0Y62gOxOvE3GQtxjhinWHkgSWjIUN8jY+DEqO5o5t37epPmSLcOlwC
3IBPewtTZiA8tf2cByct/dDaozEhmHHdyWeM/F3+TMnfBl6bDjAAv/20UHy0Y8MR
KJRr76gkmASm5E+vhbc8pFmh/kA/Ofkd8s5iEC7sJtpREVimdJca4oAqlNPo2gcY
jd0Bn0cSk8r3zsw9QV0xASjjDFWNl/q/jkZMqbNaCnq6lrac0EP82RD8XQrK4S3U
I3jI1JIrdH+rNbDN4EZ9JuJDaBwR9ZG8IYb7136Sd7f71fUgDyVYxrTl9LiZzn1w
fxjsTZ7WmGv1ar8=
-----END CERTIFICATE-----

31
build/certs/tls.crt.pem Normal file
View File

@ -0,0 +1,31 @@
-----BEGIN CERTIFICATE-----
MIIFWjCCA0KgAwIBAgIUNnxszI9lbHQvpRHMbcZ+/Vf4eaowDQYJKoZIhvcNAQEL
BQAwMzExMC8GA1UEAwwoU2VsZi1TaWduZWQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1
dGhvcml0eTAeFw0yNDEyMDIyMjUxNTBaFw0zNDExMzAyMjUxNTBaMCkxJzAlBgNV
BAMMHlNlbGYtU2lnbmVkIFNlcnZlciBDZXJ0aWZpY2F0ZTCCAiIwDQYJKoZIhvcN
AQEBBQADggIPADCCAgoCggIBAKSWx99Fss9E2UIjVSFaihQABGXIkcIzL5LRvepa
EKtbhriGRXu05tVUp3SJmlyVi5ld95EwtNnrAZG8vdUXt9lZy6KEKdmeqEgpsJsR
vWJ9RVZ6lJNfjELU79Sc2v5vrIO7H4n5rme4Ad5qi6Y+AAuzfKV3Z6VcPi6v+N57
+swwD9QOjwpqIuBNZBgA5ROLWJF4kTw75N/ELwx88XcQ55TMGVZcbBkpKjdqNX0M
PLyz/7INQHK1Wr5bm49rpumgfng8RSKBtRQyrxpTa1hWhFRpLJGjHaQBblkVqVct
6sjTvx5uJ1pyR5uw2riIy7h35NTLeG1FHSkpb+cl/3kfkZMwzVEf5Ah1ymuHi2Wh
+LFHa7Ux0hkFHnLnMCcQbJN3TxJWqAK9i24/gx+KYn0ujpuCGhAL5GpQf7R55Eb0
qVe9XOIAoPSg9wkp6EHvbSR/+iUsJZTcnSQ5Dy2elDzpGLv5Q4kwuze0xaGwyWEm
Q9AwD6V6YB2oog9SDukF4hOHKsZsSNIDrJM7vF1PfNW1jFYl4i9Grz7raNLoVH5o
BET6/Voqw5QeyeyGP2radCfIg/RbjMkgZcJ34NTVRp0ootp+7Q1hRmFVebZJhwIm
uXEq7aZol1JU2MY/m8GgOZHL5MKp9U/dd72YFIpPwbER4ZySoycm1dzagdR8HVMM
hnn1AgMBAAGjcDBuMCwGA1UdEQQlMCOCD2FwcC5wcml0dW5sLmNvbYIQYXV0aC5w
cml0dW5sLmNvbTAdBgNVHQ4EFgQUUpBREp9DdWmsSOLB13NKkqyM6OgwHwYDVR0j
BBgwFoAUDCkdSHzC7aXzu9C3KtDT+RnwZF8wDQYJKoZIhvcNAQELBQADggIBAIKN
IfpffSYKrxe0MUo8LZvcXnMMzov3gEE2RF3eI7DT82QChBB0idtnHtK5uxr+tKwc
7B+PBAigRM8sfjNj7xoZaj8OlwRSTk51vQrOh42foQDW5F41LHV9mKunjVQakwr1
+REcdlaJA4XqnXYWMtGEs/HziSyC+TkzPBzyJZY7JwDNCURxsZDQk7j1CRI/p6hJ
tUloxU+tfsA47DxuwOTQOokFlYgGBnnIjsuVC7OGodVa2qh4oJRPznUkZT+MWYMf
WpXYD55qHpyG69YKDc8oLfp+zJBggwHjnEVV542gIxe1S21D+1d6wf0VpTAivJsb
t2Vf4e7709LaPqNQIOQNlcL2Vg6m4yIhHE4V0ksepSqpA0oFDzViDdHnPGIo/3qH
p3TEPwl1HOy8Fz6MKykHQLtIHsr+zUF1wNV0p/zBLl29kubweEKwEKPRnsLDYmOn
d38YNggP/7p1bIYbl2O+vhF+qzc3AZhlycaZsfLGNmGSRy7SGvCgegsHR45URchb
wA9opvCxfJ7Oa+0DfxijVRjndCMuwSAWRLLBfHo/8ElVj/AdCj4TSGYlhIWWxgzj
HSmGw+C90zWnjoLM60s+qEs2R/IZW3Wd4kbF6i/+DR0vbGpD/JBIK2YO6fZJM54d
mt1IwwKWhEEwYkoPyyu1yfIlOP7ybp57D9vTYrxx
-----END CERTIFICATE-----

52
build/certs/tls.key.pem Normal file
View File

@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
wx0eiAK3j7cQmI0VYkGfGXP7NT5UOOw=
-----END PRIVATE KEY-----

4
build/fpm.dockerfile Normal file
View File

@ -0,0 +1,4 @@
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY ./html /var/www/html

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

6
build/nginx.dockerfile Normal file
View File

@ -0,0 +1,6 @@
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY ./certs/tls.crt.pem ./certs/tls.key.pem /etc/nginx/certs/
COPY ./nginx.conf /etc/nginx/nginx.conf
COPY ./html /var/www/html

11
build/pritunl.dockerfile Normal file
View File

@ -0,0 +1,11 @@
ARG BASE_IMAGE
FROM $BASE_IMAGE
# Install curl
ENV DEBIAN_FRONTEND=noninteractive
RUN apt update && apt install -y curl && rm -rf /var/lib/apt/lists/*
# Copy FakeAPI CA certificate to python truststore
COPY ./certs/ca.crt.pem .
RUN cat ca.crt.pem | tee -a /usr/lib/pritunl/usr/lib/python3.9/site-packages/certifi/cacert.pem; rm -f ca.crt.pem

View File

@ -1,14 +1,30 @@
networks:
pritunl-network:
driver: bridge
external: false
services: services:
nginx: nginx:
image: nginx@sha256:0f04e4f646a3f14bf31d8bc8d885b6c951fdcf42589d06845f64d18aec6a3c4d container_name: pritunl-fakeapi-nginx
build:
context: ./build
dockerfile: nginx.dockerfile
args:
BASE_IMAGE: ${NGINX_IMAGE_TAG}
restart: always restart: always
volumes: privileged: false
- "${PWD}/mounts/nginx/html:/var/www/html:ro" environment: []
- "${PWD}/mounts/nginx/certs:/etc/nginx/certs:ro" volumes: []
- "${PWD}/mounts/nginx/conf/nginx.conf:/etc/nginx/nginx.conf" secrets: []
ports: networks:
- "80:80" pritunl-network:
- "443:443" aliases:
- app.pritunl.com
- auth.pritunl.com
ports: []
depends_on:
fpm:
condition: service_started
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/"] test: ["CMD", "curl", "-f", "http://localhost:80/"]
interval: 10s interval: 10s
@ -17,10 +33,54 @@ services:
start_period: 5s start_period: 5s
links: links:
- fpm - fpm
fpm: fpm:
image: php:fpm@sha256:245576beb9a87cecac8027e92866d8ed37687023d1efea79a7fc34828d228797 container_name: pritunl-fakeapi-fpm
build:
context: ./build
dockerfile: fpm.dockerfile
args:
BASE_IMAGE: ${FPM_IMAGE_TAG}
restart: always restart: always
ports: privileged: false
- ":9000" environment: []
volumes: []
secrets: []
networks:
pritunl-network:
ports: []
depends_on: []
healthcheck:
test: ["CMD-SHELL", "timeout 5 bash -c 'cat < /dev/null > /dev/tcp/localhost/9000' || exit 1"]
interval: 10s
timeout: 5s
retries: 3
start_period: 1s
pritunl:
container_name: pritunl-server
build:
context: ./build
dockerfile: pritunl.dockerfile
args:
BASE_IMAGE: ${PRITUNL_IMAGE_TAG}
privileged: true
restart: always
environment: []
volumes: volumes:
- "${PWD}/mounts/nginx/html:/var/www/html:ro" - ${PWD}/mounts/pritunl/mongodb:/var/lib/mongodb
- ${PWD}/mounts/pritunl/config/pritunl:/var/lib/pritunl
secrets: []
networks:
pritunl-network:
ports:
- '80:80' # WebUI
- '443:443' # WebUI
- '62001-62099:62001-60999/udp' # ovpn
healthcheck:
test: ["CMD", "curl", "-f", "-k", "-L", "http://localhost:80/"]
interval: 10s
timeout: 5s
retries: 3
start_period: 5s

View File

@ -1,31 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFRzCCAy+gAwIBAgIUUmbn9VW2/Yt5JsPXdN8SUE9AOvIwDQYJKoZIhvcNAQEL
BQAwMzExMC8GA1UEAwwoU2VsZi1TaWduZWQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1
dGhvcml0eTAeFw0yNDA2MTExNDMzNTNaFw0zNDA2MDkxNDMzNTNaMDMxMTAvBgNV
BAMMKFNlbGYtU2lnbmVkIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIi
MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQD5jz1tcASmQpMTsqWX+VzevSfo
v4dHo9YUipA60Zu8NR0x1hCoVJp42fChotfvzFbhKpDqoeE3eOYSi18y9GYx4gYV
vBsgBc6UoPOkbTB6brlf13fZOHSnfoWcEsXPSu71pXND3UWPn7gE5NsQs3UW+O6m
+dhn6w6cNpZc8/mtH3CwW+klaH3xw1XUe43TyzSM9M8KWBg7CIam7Ba64o2ubB0b
5otccqWcupLyE63ZGpaRn0a4RweCQfUERin5YSaed8fyY/mEte+bF4qNXqGksItv
sCAOI8+5mS7ckicawt+DHst53PnwstaZVDvtWADG6uQr0eV9knTmKJPk8EkpsdQr
bTCfBrfvh88kV5kDZi5prHVhTPTMdLkQNwFfZN5vqEfKHKB7AX+T0K4SNf4rvrDb
eqLQOvpcifX7y9khZ2n2HXFKzOUsy+LRVl95iwcfLetOFrefEi0z4II0t1glKPlz
8r09eSvQu5pLeeQZgnzB0zUDFGqPfY0coVCdSfQ+d7waNy/vZRhfhIhUCuj+u/Dw
KV0fQA9lkFND2hccXfS1tMcmQpGT/Jwdd83Y9vHKEcuigd0iemK0wYzO0xEF4WWt
zmkesMKZ+RAmUPUgjvbFXUvjZwoCvMSAoOOIlbBBe1wDMfxVeK3t/6WohDPqZpnp
H+zY5fz2c8wl4jeEvQIDAQABo1MwUTAdBgNVHQ4EFgQUwPDuKN4xNpMci7miVNiQ
b0wQCC8wHwYDVR0jBBgwFoAUwPDuKN4xNpMci7miVNiQb0wQCC8wDwYDVR0TAQH/
BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAM/CVbY6qLfhPtWGFGiplqJ+yLR0I
x5+W3OEzt+z8kewFlBBGZkNr9t2m5BiwoegbsmD92popDTRY+ToveqYOaTFMSuCL
9ETNs4PH4f0LPJk66Pco8V+9MolG+QCjSPWr2fiPFycc+N/w/kgl8fCnRT7vU9rB
Kov9MXOfX9OIWbx3JkVaDmMLAoNyjVrctedWMy2PRLbMzJn0wOIKYDVcXl4MwnVy
1aMXUnsjHRQ+gxiQER89+IqKNhtPzZbz8gZtnpikXTPT7gcjQ7wJfooU5j0BeDDg
isQ6CUb9QtOXnZ5G5c6H0bbq/vNXCEOtjevN1BNVbzA4V9wISc2OayTBheqfgx7a
CzFgCCGzRyt4gfQdovKdNfhl0TEhXuSbqvX3RdDlVPM912gaKY9NIFt2Jb5lScS6
2Lw9VVQ1cm+Wz/UQiId3v1wuQIwqNlOGsGVCb01JCAVorYGOGC5uY8gQq0+8x375
9llC/CROYB9B8CEUAoYkcSsFxRfmE5hfyOemiq4hmSx89vHkpaQHaXV/ZxwG72A9
PTSlgd4l1axW2XOtUzmrBddbdrKMFdUjWBAAGi87NkEMq8sGzsXQnBKIe7Doiau5
Ml363nYCawY8jQOf4UO6ZtUhIjOgKECl7BiED7eotsphOIYH0daUF1E4EvZoydX7
RU8CdysiQ0OM0Kk=
-----END CERTIFICATE-----

View File

@ -1,30 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFDjCCAvagAwIBAgIUMIBPMbZBY9ZnJ+owpUTVnu/oHAEwDQYJKoZIhvcNAQEL
BQAwMzExMC8GA1UEAwwoU2VsZi1TaWduZWQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1
dGhvcml0eTAeFw0yNDA2MTExNDM0MDJaFw0zNDA2MDkxNDM0MDJaMCkxJzAlBgNV
BAMMHlNlbGYtU2lnbmVkIFNlcnZlciBDZXJ0aWZpY2F0ZTCCAiIwDQYJKoZIhvcN
AQEBBQADggIPADCCAgoCggIBAOTDXbD3WRf/pWa158xYQpTWWgeW67YPXtRnkEBh
B0ztTCui4YbeSBL7y+CeGgfVE5XN+V0aAt0YAZvo5ffHzhd6HXgyhIObo0VHtX1s
P9I/Z9PbdxeOEuJXU0J/0lkAIuv7nhnxDy+qoJ8b01g7fuTvepGwHJZiZXDYiT7k
lb60tqg95JFsdQtMyZrHCYNcSQZK6AkRiouqbCQimYCO1N7SRtcgtaathFDAHTvk
Afne2SvGeO3rxVe5swoXGYjz2aQAPy7lfZgdYsRKPznwxNYPkXq8jx4Pxh0DsyQV
aHFjYRszIot/V8gVePzbDlE7JrpnPuzooMDPqASXkmjk9NDkpxhjmXPmTiOxa8c5
QAVwB94C+VtHmUomHVAbmj0XM7YOxQDn8wVOeWi0nVj2LGptsSylePsrg242pGwi
83Z87emOEYzvDFFd2hReoHDz3Fp97X/xydyUawTRRx0RtM5Lljps3aGJlSiNIBiy
yQbTxoOmEFVGTOAnv0mG4y9tfttJKxZ0RNYnDKnUDfglfdL60zkBmZqM3XsivLlw
k8/lxgSWsK83iFRQHJ9/GB8wPjmpf5+9y6CZ3LS2ax+hY2IB/z2xYX1s4ZuCEx9N
dSiet1+ueyyax/YigBqqq+2MTiV9W1+1EPa0tQHIwOQQpfN99i7yzUlmFo2HRNhR
BjkzAgMBAAGjJDAiMCAGA1UdEQQZMBeCFXByaXR1bmwtZmFrZWFwaS5sb2NhbDAN
BgkqhkiG9w0BAQsFAAOCAgEAmtFS/A6XSHEZM/8DzOl/beQXtAvhHZGfEX4IFhTq
ov6mGbN5hmSOGaT6C/LrEp1Y6d/K0xlxQQu3t4sWnM+R7CwgBdP0NLEZxtbx+WOq
LZVpGH9+wBsk6flPtUFtcrI1z6YB6RebRvC6ZlzYfhoQpUub9aYHrGyV1F8aYy+d
cmFlQx3F++UG+m1/WVer7WVLUJAOwBfr2BoFdUne5d9Wkhdh8nYFztxpgkdqb8FO
p5g4XFV4fM2zxSwICJWbcwr5VLDGKc2YDuXI195XmHiaC19C0MPH3aJ4VmvPmBWp
eiG8kUtCHzYrXyRu35AlobweT/MIaO54RGHuSAGJ4a1BdU+41mhvheScu//+g5gS
oicR8PaAm6FGc4px8sCYlXxkvWEChOF6KiuwhAYr1kEWcy0UIeERm/h99nsjAzYw
+aQF6eJG9hRXw5DInCv0ll5QZqsQqxFwm7vkGpBLUK7b1Xcel3aPqrl/mhxDUrwi
pvygH3mlCZWx/F5J3Lv7u+toc2cWFQ3CpN0/aYkV/d16BjAiz+9V/is5OwSf02Nq
HrcBt9rUoTtM/vIffijhSxgT0zd5IxMkmtDqf+VrWa0Z1jU/cFdztk24aVxOFnPc
lTiqzzDRXUdiQ7uRcEDnw9E+nLi1fGbxa2GKTjdq+AxbaOOD95FHq3rlE65aMoB3
B9E=
-----END CERTIFICATE-----

View File

@ -1,52 +0,0 @@
-----BEGIN PRIVATE KEY-----
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
nRwpKtDIScnPoUXH1TyjLz9R75GFO5US
-----END PRIVATE KEY-----

102
setup.py
View File

@ -1,102 +0,0 @@
#!/usr/bin/env python3
import os
import glob
import time
import base64
import argparse
originalApiServer = 'app.pritunl.com'
originalAuthServer = 'auth.pritunl.com'
defaultApiServer = 'pritunl-api.simonmicro.de'
searchIn = [*glob.glob('/usr/lib/python3*'), '/usr/lib/pritunl/', '/usr/share/pritunl/www/', '/usr/lib/pritunl/', '/usr/share/pritunl/www/']
print(" ____ _ _ _ _____ _ _ ____ ___ ")
print(" | _ \ _ __(_) |_ _ _ _ __ | | | ___|_ _| | _____ / \ | _ \_ _|")
print(" | |_) | '__| | __| | | | '_ \| | | |_ / _` | |/ / _ \ / _ \ | |_) | | ")
print(" | __/| | | | |_| |_| | | | | | | _| (_| | < __/ / ___ \| __/| | ")
print(" |_| |_| |_|\__|\__,_|_| |_|_| |_| \__,_|_|\_\___| /_/ \_\_| |___|")
print(" ")
sel = None
interactive = True
parser = argparse.ArgumentParser()
parser.add_argument('--install', type=str, default='DEFAULT', nargs='?', help='Do not ask and install new API endpoint.')
parser.add_argument('--reset', type=str, default='DEFAULT', nargs='?', help='Do not ask and remove new API endpoint.')
parser.add_argument('--api-server', type=str, default=defaultApiServer, help='Set new API server.')
args = parser.parse_args()
newApiServer = args.api_server if args.api_server.strip() != '' else defaultApiServer
if args.install != 'DEFAULT':
interactive = False
newApiServer = args.install if args.install is not None else newApiServer
sel = 'I'
if args.reset != 'DEFAULT':
interactive = False
newApiServer = args.reset if args.reset is not None else newApiServer
sel = 'R'
if interactive:
while sel not in ['I', 'R', 'B', 'Q']:
sel = input('[I]nstall, [R]eset, [B]uy Pritunl, [Q]uit? ').upper()
print()
def doTheReplace(fromApiStr, toApiStr, fromAuthStr, toAuthStr):
print(f'Okay. We will change "{fromApiStr}" to "{toApiStr}" and "{fromAuthStr}" to "{toAuthStr}" now...')
numFiles = 0
for i in range(len(searchIn)):
print(f'[{i+1}/{len(searchIn)}] Replacing in {searchIn[i]}...')
for p, d, f in os.walk(searchIn[i]):
for ff in f:
try:
fh = open(os.path.join(p, ff), 'r')
lines = fh.read()
fh.close()
newLines = lines.replace(fromApiStr, toApiStr)
newLines = newLines.replace(fromAuthStr, toAuthStr)
# Special case for changes from c1772d9b3268f91de409ad552e3d4d54d5ae1125
newLines = newLines.replace(base64.b64encode(f'https://{fromApiStr}/subscription'.encode()).decode(), base64.b64encode(f'https://{toApiStr}/subscription'.encode()).decode())
if newLines != lines:
numFiles += 1
fh = open(os.path.join(p, ff), 'w')
fh.writelines(newLines)
fh.close()
except UnicodeDecodeError:
# Brrr - binary files...
pass
print(f'Modified {numFiles} files in {len(searchIn)} paths.')
if sel == 'I':
if interactive:
print(f'By default, the Pritunl API endpoint is hosted at "{originalApiServer}".')
print(f'In case you want to use your own instance, you also have to support HTTPS!')
print(f'Note, that the SSO implementation of Pritunl is hosted at their servers (closed source) and will just be "disabled".')
ownApiServer = input(f'Please enter the new API endpoint [{newApiServer}]: ')
if ownApiServer == '':
ownApiServer = newApiServer
else:
ownApiServer = newApiServer
doTheReplace(originalApiServer, ownApiServer, originalAuthServer, ownApiServer + '/auth/')
print('Please make sure to restart the Pritunl daemon now and please support the developer.')
elif sel == 'R':
if interactive:
print(f'To properly revert any changes to your Pritunl server, this script must exactly know what (custom) API endpoint you have choosen.')
ownApiServer = input(f'Please enter the current API endpoint [{newApiServer}]: ')
if ownApiServer == '':
ownApiServer = newApiServer
print('Make sure to REMOVE ANY FAKED SUBSCRIPTION KEY (by not entering an other command - just remove them). You have now 30 seconds time to hit CTRL+C and do this.')
time.sleep(30)
else:
ownApiServer = newApiServer
doTheReplace(ownApiServer, originalApiServer, ownApiServer + '/auth/', originalAuthServer)
print('Please make sure to restart the Pritunl daemon now.')
elif sel == 'B':
print('Sure thing, buddy... Why did you try to use this?')
print('Visit https://pritunl.com/ for you own license!')
try:
import webbrowser
webbrowser.open('https://pritunl.com/')
print('Let me help you...')
except:
pass
elif sel == 'Q':
print('Bye!')