====== 安裝 DockOVPN 的 OpenVPN Docker 方案 ====== 可參考 **[[ovpn-admin]]** * 因為之前主要的 OpenVPN Docker 方案(Exp. [[https://hub.docker.com/r/kylemanna/openvpn/|kylemanna/openvpn]], [[https://hub.docker.com/r/linuxserver/openvpn-as|linuxserver/openvpn-as]] 似乎都已不再更新, 因此找了 [[https://github.com/dockovpn/dockovpn|DockOVPN]] 來安裝使用 * 目前 DockOVPN 版本是 v1.13.0 (Release:2023-10-28) 系統算是穩定, 但實際使用還是需要一些手動程序 * 安裝環境 : * VM : 1vCore, 1G RAM, 16G SSD * OS : Alpine 3.18 + Docker Compose * 參考 [[tech/alpine_docker]] **Alpine 3.19 需要執行以下指令** modprobe ip_tables echo 'ip_tables' >> /etc/modules 執行後需要重新開機 ===== 安裝設定 ===== * 因應維護管理設定 OpenVPN Server 的方便性, 預計將以下目錄或設定檔掛載出來 * /opt/Dockovpn -> ./Dockovpn * /opt/Dockovpn_data -> ./Dockovpn_data * /etc/openvpn/server.conf -> ./Dockovpn/config/server.conf * VPN Server : vpn.ichiayi.com * docker-compose.yml version: '3' services: dockovpn: image: alekslitvinenk/openvpn:v1.13.0 cap_add: - NET_ADMIN ports: - 80:8080/tcp - 1194:1194/udp - 5555:5555/tcp environment: - HOST_ADDR=vpn.ichiayi.com - HOST_TUN_PORT=1194 container_name: dockovpn #volumes: # - ./Dockovpn:/opt/Dockovpn # - ./Dockovpn_data:/opt/Dockovpn_data # - ./Dockovpn/config/server.conf:/etc/openvpn/server.conf restart: always **第一次執行時, volumes 部分必須要註解起來, 否則會出錯** * 第一次啟動 docker compose up -d * 啟動後將 Dockovpn 與 Dockovpn_data 複製出來 docker cp dockovpn:/opt/Dockovpn . docker cp dockovpn:/opt/Dockovpn_data . * 將 Dockovpn 內的 genclient.sh 與 functions.sh 用 github 最新版本取代 wget https://github.com/dockovpn/dockovpn/raw/master/scripts/genclient.sh -O ./Dockovpn/genclient.sh wget https://github.com/dockovpn/dockovpn/raw/master/scripts/functions.sh -O ./Dockovpn/functions.sh * 依照實際需要修改 server.conf vi ./Dockovpn/config/server.conf port 1194 proto udp dev tun cipher AES-256-GCM auth SHA512 keepalive 10 120 persist-key persist-tun crl-verify /etc/openvpn/crl.pem ca /etc/openvpn/ca.crt dh /etc/openvpn/dh.pem tls-auth /etc/openvpn/ta.key 0 key /etc/openvpn/MyReq.key cert /etc/openvpn/MyReq.crt ifconfig-pool-persist ipp.txt status openvpn-status.log verb 4 management 0.0.0.0 5555 server 10.8.0.0 255.255.255.0 push "redirect-gateway def1 bypass-dhcp" #push "dhcp-option DNS 1.1.1.1" #push "dhcp-option DNS 8.8.8.8" push "route 192.168.11.0 255.255.255.0" push "route 172.16.0.0 255.255.255.0" push "route 172.16.1.0 255.255.255.0" push "route 172.16.2.0 255.255.255.0" push "route 172.16.12.0 255.255.255.0" #duplicate-cn #ncp-ciphers AES-256-GCM:AES-256-CBC #tls-server #tls-version-min 1.2 * 將 vloumes 掛上, 重啟 dockovpn vi ./docker-compose.yml : container_name: dockovpn volumes: - ./Dockovpn:/opt/Dockovpn - ./Dockovpn_data:/opt/Dockovpn_data - ./Dockovpn/config/server.conf:/etc/openvpn/server.conf restart: always docker compose up -d ==== FAQ ==== === 1.如果不想要 client 將 openvpn server 當 default gateway === vi Dockovpn/config/server.conf 將 redirect-gateway 註解掉 : #push "redirect-gateway def1 bypass-dhcp" : === 2.如果想要讓 openvpn server 服務 Listen 在 TCP/443 === - 修改 docker-compose.yml 將 port 由 1194:1194/udp 改成 443:443/tcp : ports: - 80:8080/tcp - 443:443/tcp - 5555:5555/tcp environment: - HOST_ADDR=vpn.ichiayi.com - HOST_TUN_PORT=443 : - 修改 Dockovpn/config/server.conf 內 port 與 proto 的設定 port 443 proto tcp dev tun : - 修改 Dockovpn/config/client.ovpn 內 proto 的設定 : proto tcp : - 重新啟動 docker compose docker compose up -d === 3. 如果想要將 openvpn server 的 VPN IP 由預設 10.8.0.0/24 改成其他的網段 Exp. 10.9.0.0/24 === - 更新 Dockovpn/start.sh (用這檔案取代 https://github.com/tryweb/dockovpn/blob/master/scripts/start.sh)((已發出 PR https://github.com/dockovpn/dockovpn/pull/232)) wget https://github.com/tryweb/dockovpn/raw/master/scripts/start.sh -O ./Dockovpn/start.sh - 修改 docker-compose.yml 增加環境變數 OVPN_IP_NET=10.9.0.0/24 : environment: - HOST_ADDR=vpn.ichiayi.com - HOST_TUN_PORT=443 - HOST_TUN_PROTO=tcp - OVPN_IP_NET=10.9.0.0/24 : - 修改 Dockovpn/config/server.conf 內 server 的設定 : server 10.9.0.0 255.255.255.0 : - 重新啟動 docker compose docker compose up -d === 4. 如果發現用戶端無法連線, 出現 VERIFY ERROR: depth=0, error=CRL has expired === * 表示 CRL 自動更新異常, 需要重新產生 - 進入 dockovpn 容器內 docker exec -it dockovpn bash - 切換到憑證目錄手動更新 CRL 檔 cd /opt/Dockovpn_data/ easyrsa gen-crl - 重新啟動 dockovpn 服務 docker compose restart ===== 新增與刪除 VPN Client 憑證 ===== ==== 新增 VPN Client 憑證 ==== * Exp. 新增 test1 docker exec dockovpn ./genclient.sh n test1 * 可以在 ./Dockovpn_data/clients 目錄看到建立 test1 ls -lt ./Dockovpn_data/clients ==== 刪除 VPN Client 憑證 ==== * Exp. 刪除 test1 docker exec dockovpn ./rmclient.sh test1 rm -rf ./Dockovpn_data/clients/test1 * 可以在 ./Dockovpn_data/pki/index.txt 看到被廢止憑證註記 R cat ./Dockovpn_data/pki/index.txt ===== 查看目前線上的 VPN Client ===== * cat ./Dockovpn/openvpn-status.log ===== 安裝 openvpn-snmp-stats 強化監控 ===== * 參考 - https://github.com/tryweb/-openvpn-snmp-stats/tree/alpine3 * 安裝 openvpn.py apk add --update --no-cache python3 ln -sf python3 /usr/bin/python mkdir -p /opt/openvpn-snmp-stats/db cd /opt/openvpn-snmp-stats wget https://raw.githubusercontent.com/tryweb/-openvpn-snmp-stats/alpine3/openvpn.py chmod a+x openvpn.py 安裝後可以先執行驗證 Exp. openvpn-61:~# /opt/openvpn-snmp-stats/openvpn.py {"errorString": "", "error": 0, "version": 1, "data": {"tun0": {"iv9614": {"minutes_since_last_handshake": 506, "bytes_rcvd": 106350, "bytes_sent": 78677}, "jonathan_pixel5": {"minutes_since_last_handshake": 535, "bytes_rcvd": 23584, "bytes_sent": 37931}, "jonathan": {"minutes_since_last_handshake": 536, "bytes_rcvd": 7086888, "bytes_sent": 41041820}, "UNDEF": {"minutes_since_last_handshake": 495, "bytes_rcvd": 0, "bytes_sent": 0}}}} * 設定 snmpd.conf vi /etc/snmp/snmpd.conf : extend wireguard /opt/openvpn-snmp-stats/openvpn.py service snmpd restart ===== 參考網址 ===== * https://github.com/dockovpn/dockovpn * https://github.com/dockovpn/dockovpn/issues/184 {{tag>openvpn vpn}}