Pritunl: запуск VPN в Kubernetes

Thank you for reading this post, don't forget to subscribe!

Pritunl – VPN-сер­вер с пач­кой допол­ни­тель­ных воз­мож­но­стей по без­опас­но­сти и управ­ле­нию доступами.

По сути – явля­ет­ся про­сто обёрт­кой над OpenVPN, добав­ляя к нему такие себе Access Control Lists в виде Орга­ни­за­ций, юзе­ров и роутов.

Зада­ча – раз­вер­нуть тесто­вый инстанс Pritunl в Kubernetes, что бы потро­гать его изнутри.

для уста­нов­ки исполь­зу­ем Helm-чарт от Dysnix.

Созда­ём неймспейс:

kubectl create ns pritunl-local

Добав­ля­ем репозиторий:

helm repo add dysnix https://dysnix.github.io/charts

И уста­нав­ли­ва­ем чарт с Pritunl:

helm -n pritunl-local install pritunl dysnix/pritunl

Про­ве­ря­ем поды:

Полу­ча­ем логин-пароль из мастер-пода:

kubectl exec -t -i --namespace pritunl-local pritunl-54dd47dc4d-672xw pritunl default-password


Нахо­дим Сервисы:

kubectl -n pritunl-local get svc

Тут LoadBalancer pritunl – для досту­па кли­ен­тов к сер­ве­ру ВПН, а сер­вис pritunl-web ClusterIP – для досту­па к веб-интерфейсу.

Про­бра­сы­ва­ем порт к Веб:

kubectl -n pritunl-local port-forward svc/pritunl-web 8443:443

Откры­ва­ем https://localhost:8443:

Логи­ним­ся, и попа­да­ем в началь­ные настройки:

Тут в Public Address будет авто­ма­том задан пуб­лич­ный адрес хоста, на кото­ром запу­щен сам При­тунл, и потом будет под­став­лять­ся в кли­ент­ские кон­фи­ги как адрес хоста VPN.

Так как Pritunl у нас рабо­та­ет в Kubernetes, кото­рый рабо­та­ет в VirtualBox, кото­рый рабо­та­ет на Linux на обыч­ном домаш­нем PC – то нам он не под­хо­дит, но к нему вер­нём­ся поз­же. Пока мож­но оста­вить, как есть.

Осталь­ные настрой­ки нам пока не интересны.

Настройка Pritunl VPN

Organization, Users

Для объ­еди­не­ния юзе­ров есть Груп­пы – но они в пол­ной вер­сии, её уви­дим потом.

Так­же, юзе­ров мож­но сгруп­пи­ро­вать через Organizations.

Пере­хо­дим в Users, добав­ля­ем Organization:

PIN, email – опци­о­наль­ны, сей­час не нужны.

Pritunl Server и роуты

Пере­хо­дим в Servers, добав­ля­ем новый:

Тут:

  • DNS Server: к како­му ДНС будем отправ­лять клиентов
  • Port, Protocol: порт и про­то­кол для OpenVPN, кото­рый будет запу­щен “внут­ри” При­тун­ла и будет при­ни­мать под­клю­че­ния от наших юзеров
  • Virtual Network: сеть, из пула адре­сов кото­рой будем выде­лять при­ват­ные IP для клиентов

Virtual Network я бы выде­лил 172.16.0.0 – тогда у нас домаш­няя сеть, сеть Кубе­ра и кли­ент­ские IP будут раз­ли­чать­ся – удоб­нее будет деба­жить, см. IPv4 Private Address Space and Filtering.

При этом важ­но, что бы порт Сер­ве­ра тут сов­па­дал с пор­том и про­то­ко­лом на LoadBalancer – 1194 TCP.

Т.е. запрос с рабо­чей маши­ны пой­дет по маршруту:

  • 192.168.3.0/24 – домаш­няя сеть
  • попа­дёт в сеть VirtualBox 192.168.59.1/24
  • пой­дёт на LoadBalancer в сети Кубе­ра 10.96.0.0/12
  • а LoadBalancer отро­утит запрос в Kubernetes Pod, в кото­ром у нас OpenVPN слу­ша­ет TCP порт 1194

Про­ве­ря­ем сам LoadBalancer:

kubectl -n pritunl-local get svc pritunl

Port 1194 – TCP. Со ста­ту­сом Pending раз­бе­рём­ся чуть позже.

Ука­зы­ва­ем Virtual Network, порт и про­то­кол для Server:

Далее, под­клю­ча­ем Орга­ни­за­цию со все­ми её пользователями:

 

Стар­ту­ем сервер:

Про­ве­ря­ем про­цесс и порт в Kubernetes Pod – видим наш OpenVNP Сер­вер на пор­ту 1194:

kubectl -n pritunl-local exec -ti pritunl-54dd47dc4d-672xw -- netstat -anp | grep 1194

И идём фик­сить LoabBalancer.

minikube tunnel

minikube tunnel

Про­ве­ря­ем Loadbalancer:
kubectl -n pritunl-local get svc pritunl

Появил­ся EXTERNAL-IP – про­ве­ря­ем подключение:

Воз­вра­ща­ем­ся к основ­ным Settings, ука­зы­ва­ем Public Address == LoadBalancer IP :

OpenVPN – подключение к серверу

Пере­хо­дим в Users, кли­ка­ем Download profile:

Рас­па­ко­вы­ва­ем архив:
tar xfp local-user.tar

И под­клю­ча­ем­ся с помо­щью обыч­но­го OpenVPN клиента:

sudo openvpn --config local-org_local-user_local-server.ovpn

Но сей­час сеть рабо­тать не будет:

Так как у нас в ВПН роут в 0.0.0.0/0 направ­лен через тот же хост, на кото­ром соб­ствен­но ВПН и рабо­та­ет – полу­ча­ет­ся “коль­цо”.

Пере­хо­дим в Servers, оста­нав­ли­ва­ем сер­вер и уда­ля­ем Default route:

Кли­ка­ем Add Route – доба­вим марш­рут к 1.1.1.1 через наш ВПН, а все осталь­ные запро­сы с кли­ен­та будут идти обыч­ны­ми маршрутами:

Запус­ка­ем под­клю­че­ние заново:

sudo openvpn --config local-org_local-user_local-server.ovpn

 

Про­ве­ря­ем роуты на хост-машине, локально:


И про­ве­ря­ем сеть – запрос пошёл через VPN: