Pritunl 은 OpenVPN(그리고 최근 버전은 WireGuard)을 엔진으로 쓰면서 웹 관리 화면을 얹은 VPN 서버다. 사용자 · 조직 · 서버를 화면에서 만들고 클라이언트 프로파일을 내려받게 하므로, easy-rsa 로 인증서를 손으로 굽고 client.ovpn 을 나눠 주던 작업이 없어진다.
구조상 특징이 두 가지다.
MongoDB 를 쓰기 때문에 배포 형태에 따라 라이선스 판단이 필요할 수 있다. 사내에서 쓰는 것은 문제없다 — MongoDB SSPL 라이선스 판단.
공식 경로는 배포판 저장소를 등록해 패키지로 설치하는 것이다. Pritunl 이 OpenVPN · iptables · 커널 네트워크 설정을 직접 다루므로, 컨테이너보다 호스트에 설치하는 쪽이 문제가 적다.
설치 스크립트와 저장소 정의는 배포판·버전마다 다르므로 공식 설치 페이지에서 해당 항목을 그대로 가져온다 — https://docs.pritunl.com/docs/installation
설치 후 기동 순서는 MongoDB 가 먼저다.
systemctl enable --now mongod
systemctl enable --now pritunl
MongoDB 가 다른 호스트에 있으면 접속 문자열을 알려 준다.
pritunl set-mongodb "mongodb://pritunl:${MONGO_PASSWORD}@db.example.com:27017/pritunl"
systemctl restart pritunl
공식 Docker 이미지는 제공되지 않는다. Docker Hub 의 pritunl/pritunl 은 존재하지 않아 pull 이 거부되고, pritunl/pritunl-zero 는 다른 제품이다 — Pritunl Zero 는 VPN 서버가 아니라 제로 트러스트 접근 게이트웨이다. 이것으로 바꿔 띄우면 VPN 서버가 뜨지 않는다.
컨테이너로 돌려야 한다면 커뮤니티 이미지를 쓰되 다음을 확인한다.
--cap-add=NET_ADMIN 과 --device=/dev/net/tun 을 준다.services:
mongo:
image: mongo:8.0
restart: always
volumes:
- mongo-data:/data/db
pritunl:
image: <커뮤니티 이미지>
restart: always
depends_on:
- mongo
network_mode: host
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun
volumes:
- pritunl-data:/var/lib/pritunl
volumes:
mongo-data:
pritunl-data:
depends_on 은 컨테이너가 떴다는 것만 보장하고 MongoDB 가 접속을 받을 준비가 됐는지는 보지 않는다. 첫 기동에서 Connection refused 가 나면 Pritunl 만 다시 띄운다.
웹 화면은 HTTPS 443 으로 열린다. 처음 접속하면 setup key 를 묻는다.
pritunl setup-key
pritunl default-password
컨테이너면 앞에 docker exec -it pritunl 을 붙인다.
setup key 를 넣고 MongoDB 주소를 확인한 뒤, 출력된 기본 관리자 계정으로 로그인해 비밀번호를 바꾼다.
그다음 화면에서 만드는 순서는 조직 → 사용자 → 서버 → 조직 연결 → 서버 시작이다. 서버를 만들 때 지정하는 가상 네트워크 대역이 사내 대역과 겹치지 않게 한다.
Settings 의 Public Address 를 실제 접속 주소로 맞춘다. 클라이언트 프로파일에 이 값이 박히므로, 여기가 사설 IP 로 남아 있으면 외부에서 받은 프로파일이 연결되지 않는다. VIP 를 쓴다면 VIP 를 적는다.
웹 UI 포트가 다른 서비스와 겹치면 두 곳을 같이 바꿔야 한다. 설정만 바꾸고 컨테이너 포트 매핑을 그대로 두면 접속이 안 된다.
pritunl set app.server_port 8443
pritunl set app.redirect_server_port 8080
80 포트로 오는 HTTP 요청을 HTTPS 로 넘기는 리다이렉트 서버가 필요 없으면 꺼 버린다. 로그에 router: Starting fallback main process redirect server 가 반복된다면 80 을 다른 프로세스가 이미 쓰고 있다는 뜻이다.
pritunl set app.redirect_server false
systemctl restart pritunl
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-port=1194/udp
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
--add-masquerade 를 빼면 접속은 되는데 내부망으로 나가지 못한다. 커널 포워딩도 켜져 있어야 한다.
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/90-vpn.conf
sysctl --system
노드를 여러 대 두려면 모두 같은 MongoDB(복제 세트 권장)를 바라보게 하고, 각 노드를 같은 서버 객체에 붙인다. Pritunl 자체가 노드 간 분배를 처리하므로 앞단에 별도의 L4 장비를 두지 않아도 된다. 다만 클라이언트가 바라보는 주소는 하나여야 하므로, VIP 나 DNS 라운드로빈으로 단일 진입점을 만든다.
MongoDB 가 단일 장애점이 된다. 노드를 이중화했는데 MongoDB 가 한 대면 가용성이 올라가지 않는다.
인증서 체계와 설정 구조가 달라 기존 server.conf 와 발급된 인증서를 그대로 가져올 수 없다. 조직과 사용자를 다시 만들고 프로파일을 새로 배포해야 한다. 전환 기간에는 두 서버를 다른 포트로 같이 띄워 두고 사용자를 옮긴 뒤 옛 서버를 내린다.