2026年4月17日 星期五

OPENVPN架設&登入設置二階段驗證

使用Docker架設OPENVPN

1.建立目錄及docker-compose
mkdir ovpn  

vi docker-compose.yml
services:
  openvpn:
    image: kylemanna/openvpn
    container_name: openvpn
    ports:
      - "1194:1194/udp"  #OPENVPN預設PORT
    volumes:
      - ./ovpn-data:/etc/openvpn
    cap_add:
      - NET_ADMIN
    restart: always
2.產生設定檔 (UDP設定自己的公網ip)  -2 代表啟用二階段驗證
docker compose run --rm openvpn ovpn_genconfig -u udp://你的公網IP -2

3.初始化憑證 (需輸入密碼,一次性設定)
docker compose run --rm openvpn ovpn_initpki

#初始化需要設定的內容
  • 1.Enter New CA Key Passphrase: 輸入自訂密碼
  • 2.Re-Enter New CA Key Passphrase: 再輸入一次自訂密碼
  • 3.尋問這台VPN的名稱: hulk(自取)
  • 4.Enter pass phrase for /etc/openvpn/pki/private/ca.key:  再輸入一次自訂密碼


4.製作一個名為common-client 的共用憑證 nopass(因為設定為共用證書檔所以證書不用密碼)
docker compose run --rm openvpn easyrsa build-client-full common-client nopass

5.將證書等資訊封裝成一個.ovpn檔案 (之後連線用這個檔案)
docker compose run --rm openvpn ovpn_getclient common-client > company_common.ovpn

6.啟動容器
docker compose up -d

7.安裝 Google 的驗證器程式和 Bash Shell
docker exec -it openvpn apk add google-authenticator bash

8.寫入自定義的驗證腳本
docker exec -i openvpn sh -c 'cat << "EOF" > /usr/local/bin/ovpn_otp_auth
#!/bin/bash
USERNAME=$(sed -n "1p" "$1")
FULL_PASS=$(sed -n "2p" "$1")
OTP_CODE=$(echo "$FULL_PASS" | grep -oE "[0-9]{6}\$")

if [ -f "/etc/openvpn/otp/${USERNAME}.google_authenticator" ]; then
    echo -e "y\n$OTP_CODE\n" | /usr/bin/google-authenticator --secret="/etc/openvpn/otp/
${USERNAME}.google_authenticator" -C -t -d -r3 -R30 -S30 -w3 > /tmp/otp_result 2>&1 exit $? else exit 0 fi EOF'

9.賦予腳本執行權限
docker exec -it openvpn chmod +x /usr/local/bin/ovpn_otp_auth

10.建立存放員工 OTP 密鑰的資料夾
mkdir -p /ovpn/ovpn-data/otp
chmod 777 /ovpn/ovpn-data/otp

11.註解掉預設的插件,避免與我們的自定義腳本衝突
sed -i 's/^plugin/#plugin/g' ./ovpn-data/openvpn.conf

12.當有人連線,執行 /usr/local/bin/ovpn_otp_auth 這個腳本來檢查身份
echo "auth-user-pass-verify /usr/local/bin/ovpn_otp_auth via-file" >> ./ovpn-data/openvpn.conf

13.允許 OpenVPN 呼叫外部的可執行腳本
echo "script-security 2" >> ./ovpn-data/openvpn.conf

14.確保Log 裡能正確記錄是哪個員工連進來的
echo "username-as-common-name" >> ./ovpn-data/openvpn.conf

15.重啟容器
docker compose restart openvpn

16.進入容器建立帳號及&帳號產生QR code
docker exec -it openvpn bash
adduser hulk (員工名) 

ovpn_otp_user hulk (員工名)

#產出的QRcode可以掃圖登入二階驗證,或是用secret key方式加入二階驗證
Microsoft Authenticator跟Google Authenticator都可以使用


openvpn連線測試

1.匯入驗證包的company_common.ovpn檔案
2.輸入方式

3.連線成功




沒有留言:

張貼留言