熱門分類
載入中…
目錄0%

🐧 Linux OpenVPN Server 架設完整指南:PKI 憑證、雙向驗證、Client 配置與路由導向一次搞懂

    🐧 Linux OpenVPN Server 架設完整指南:PKI 憑證、雙向驗證、Client 配置與路由導向一次搞懂

    在企業環境裡,安全又好維護的遠端連線方案 幾乎是標配,其中最常見的就是基於 TLS 的 OpenVPN SSL VPN。它透過 PKI 憑證 實作雙向驗證,搭配靈活的路由設計, 可以把總部內網安全地「延伸」到遠端辦公室、居家 VPN 使用者、甚至行動裝置。

    這篇會從架構概念 → 安裝設定 → 憑證管理 → Client 設定 → 路由導向與安全強化 一條龍帶過, 讓你能在 Linux 上部署一套可實戰使用的 OpenVPN Server。

    📑 目錄

    一、OpenVPN 與 SSL VPN 概念整理

    OpenVPN 是基於 OpenSSL / TLS 的 VPN 實作,走在 TCP/UDP 之上, 透過 憑證與金鑰 對雙方進行身分驗證與加密溝通。常見對比:

    • IPsec VPN:在 IP 層運作,適合站對站(Site-to-Site)與硬體設備整合。
    • SSL VPN(OpenVPN):在 TCP/UDP 層運作,較容易穿透防火牆與 Proxy,對 End-User 友善。

    OpenVPN 的幾個關鍵特性:

    • PKI 雙向驗證:Client 與 Server 都持有憑證,避免帳號密碼洩漏風險。
    • 彈性拓樸:支援 tun(三層路由)與 tap(二層橋接)。
    • 跨平台:Linux / Windows / macOS / Android / iOS 都有 Client。
    • 容易搭配既有防火牆:可使用 1194/UDP,也可直接跑在 443/TCP。

    二、環境假設與拓樸架構

    以下用一個常見的中小企業場景作為示意:

            Internet
               |
        [ 公網 IP: 1.2.3.4 ]
            OpenVPN Server (Linux)
            LAN: 192.168.10.0/24
               |
      ┌────────┴─────────┐
      |                  |
    內部主機 A       檔案伺服器、AD、GitLab ...
    • OpenVPN Server:Linux(例如 Ubuntu 22.04),LAN 介面 192.168.10.10
    • VPN 網段10.8.0.0/24 分配給遠端 Client。
    • Client 需求
      • 連線後可存取公司內網 192.168.10.0/24
      • 部分使用者需要「全通道」上網走公司出口;其他人只導內網。

    三、OpenVPN 與 easy-rsa 安裝

    以下以 Debian/Ubuntu 系列為例,其他發行版可對應替換套件名稱。

    # 更新套件庫
    sudo apt update
    
    # 安裝 OpenVPN 與 easy-rsa(PKI 工具)
    sudo apt install -y openvpn easy-rsa

    安裝後主要檔案位置:

    • /usr/sbin/openvpn:OpenVPN 伺服器程式。
    • /etc/openvpn/:預設設定、憑證存放位置。
    • /usr/share/easy-rsa/:easy-rsa 範本腳本。

    四、PKI 架設:CA、Server 與 Client 憑證

    建議使用 獨立目錄 來管理 PKI 憑證,避免混雜。以下示範以 easy-rsa 3 架設自建 CA:

    # 建立 PKI 目錄
    mkdir -p ~/openvpn-pki
    cd ~/openvpn-pki
    
    # 複製 easy-rsa 腳本
    cp -r /usr/share/easy-rsa/* .
    
    # 初始化 PKI
    ./easyrsa init-pki
    
    # 建立 CA(會詢問密碼與 CN)
    ./easyrsa build-ca
    
    # 建立 Server 憑證與金鑰
    ./easyrsa gen-req server nopass
    ./easyrsa sign-req server server
    
    # 建立 Client 憑證與金鑰(可為每位用戶建立一組)
    ./easyrsa gen-req client01 nopass
    ./easyrsa sign-req client client01
    
    # 產生 Diffie-Hellman 參數(只需一次)
    ./easyrsa gen-dh
    
    # 建立 CRL(憑證廢止清單)
    ./easyrsa gen-crl

    完成後你會得到以下重要檔案:

    • pki/ca.crt:CA 憑證(給所有端點使用)。
    • pki/issued/server.crt:Server 憑證。
    • pki/private/server.key:Server 金鑰(務必妥善保護)。
    • pki/issued/client01.crtpki/private/client01.key:Client 憑證與金鑰。
    • pki/dh.pem:Diffie-Hellman 參數。
    • pki/crl.pem:憑證廢止清單。

    接著將這些檔案複製到 OpenVPN 目錄:

    sudo cp pki/ca.crt /etc/openvpn/
    sudo cp pki/issued/server.crt /etc/openvpn/
    sudo cp pki/private/server.key /etc/openvpn/
    sudo cp pki/dh.pem /etc/openvpn/
    sudo cp pki/crl.pem /etc/openvpn/

    如果要使用 tls-auth / tls-crypt 來防護掃描,可再產生一組金鑰:

    # 產生共享金鑰,用於 tls-auth 或 tls-crypt
    sudo openvpn --genkey secret /etc/openvpn/ta.key

    五、Server 端設定:埠號、加密、路由與雙向驗證

    大部分發行版會使用 /etc/openvpn/server.confserver/server.conf 作為 Server 設定檔。下方是一個常見的範例:

    📄 範例:/etc/openvpn/server.conf
    port 1194
    proto udp
    dev tun
    
    # 憑證與金鑰
    ca /etc/openvpn/ca.crt
    cert /etc/openvpn/server.crt
    key /etc/openvpn/server.key
    dh /etc/openvpn/dh.pem
    
    # 可選:防掃描與 DoS(Client 端亦需設定)
    tls-auth /etc/openvpn/ta.key 0
    # 或使用 tls-crypt
    # tls-crypt /etc/openvpn/ta.key
    
    # 加密與認證
    cipher AES-256-GCM
    auth SHA256
    tls-version-min 1.2
    remote-cert-eku "TLS Web Client Authentication"
    
    # VPN 網段
    server 10.8.0.0 255.255.255.0
    
    # 向 Client push 的設定:DNS 與內網路由
    push "redirect-gateway def1 bypass-dhcp"   # 全通道(可依需要調整)
    push "route 192.168.10.0 255.255.255.0"
    push "dhcp-option DNS 192.168.10.10"
    
    # 啟用 Client 間互通(如不需要可註解)
    client-to-client
    
    # 保留 Client IP 映射(靜態分配可搭配 ccd)
    ifconfig-pool-persist /etc/openvpn/ipp.txt
    
    # 權限與安全
    user nobody
    group nogroup
    persist-key
    persist-tun
    
    # 日誌與狀態
    status /var/log/openvpn-status.log
    log-append /var/log/openvpn.log
    verb 3
    
    # 憑證廢止清單(CRL)
    crl-verify /etc/openvpn/crl.pem

    啟用並設為開機自動啟動:

    # Systemd 服務名稱在不同發行版可能略有差異
    sudo systemctl enable --now openvpn@server.service
    
    # 確認服務狀態
    sudo systemctl status openvpn@server.service

    六、防火牆與 IP 轉送設定(iptables / nftables)

    1. 啟用 IP Forwarding(系統層)

    # 臨時啟用(重開機後會失效)
    sudo sysctl -w net.ipv4.ip_forward=1
    
    # 永久啟用
    echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
    sudo sysctl -p

    2. iptables 範例(NAT 與允許 1194/UDP)

    # 允許 VPN 連線埠
    sudo iptables -A INPUT -p udp --dport 1194 -j ACCEPT
    
    # 對 VPN 網段做 NAT,透過 eth0 對外上網
    # 請將 eth0 替換為實際對外網卡名稱
    sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
    
    # 視需求允許內部網段訪問
    sudo iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
    sudo iptables -A FORWARD -d 10.8.0.0/24 -j ACCEPT
    
    # 存檔(Ubuntu 可用)
    sudo apt install -y iptables-persistent
    sudo netfilter-persistent save

    3. nftables 範例(若已全面使用 nft)

    table ip nat {
      chain postrouting {
        type nat hook postrouting priority 100;
        oif "eth0" ip saddr 10.8.0.0/24 counter masquerade
      }
    }
    
    table ip filter {
      chain input {
        type filter hook input priority 0;
        iif "eth0" udp dport 1194 accept
      }
    
      chain forward {
        type filter hook forward priority 0;
        ip saddr 10.8.0.0/24 accept
        ip daddr 10.8.0.0/24 accept
      }
    }

    七、Client 設定:.ovpn 檔、跨平台使用

    建議為每位使用者產生一份 專屬 .ovpn 檔案,將憑證與金鑰內嵌, 方便直接匯入 OpenVPN 客戶端。

    1. 組合 Client 所需檔案

    • ca.crt
    • client01.crt
    • client01.key
    • ta.key(若 Server 使用 tls-auth / tls-crypt)

    2. Client 設定檔範例:client01.ovpn

    📄 範例:client01.ovpn
    client
    dev tun
    proto udp
    remote 1.2.3.4 1194    # 1.2.3.4 請換成你的公網 IP 或 FQDN
    resolv-retry infinite
    nobind
    
    persist-key
    persist-tun
    
    cipher AES-256-GCM
    auth SHA256
    remote-cert-tls server
    
    # 若 Server 使用 tls-auth
    key-direction 1
    
    verb 3
    
    <ca>
    -----BEGIN CERTIFICATE-----
    (貼上 ca.crt 內容)
    -----END CERTIFICATE-----
    </ca>
    
    <cert>
    -----BEGIN CERTIFICATE-----
    (貼上 client01.crt 內容)
    -----END CERTIFICATE-----
    </cert>
    
    <key>
    -----BEGIN PRIVATE KEY-----
    (貼上 client01.key 內容)
    -----END PRIVATE KEY-----
    </key>
    
    <tls-auth>
    (貼上 ta.key 內容)
    </tls-auth>

    3. 各平台使用方式簡述

    • Windows:安裝「OpenVPN GUI」,將 client01.ovpn 放到 C:\Program Files\OpenVPN\config,以系統匣圖示連線。
    • macOS:使用 Tunnelblick 或 Viscosity,直接匯入 .ovpn 檔。
    • Linux 桌面:可使用 NetworkManager 外掛,或直接 sudo openvpn --config client01.ovpn
    • Android / iOS:安裝「OpenVPN Connect」或「OpenVPN for Android」,透過檔案或 QR Code 匯入。

    八、路由導向實戰:全通道、分流、只導內網

    OpenVPN 的路由導向是實務上的關鍵,決定「Client 連線後流量如何走」。常見三種模式:

    1. 全通道(全流量走 VPN)

    Server 端 server.conf 中使用:

    push "redirect-gateway def1 bypass-dhcp"

    所有 Client 的預設路由會改為指向 VPN,適合需要統一出口管控(例如上網過濾、集中檢測)的情境。

    2. 分流:只導內網,其餘走本地 ISP

    不使用 redirect-gateway,只 Push 內部網段:

    # server.conf 片段
    push "route 192.168.10.0 255.255.255.0"

    這樣 Client 只有在存取公司內網時才經過 VPN,瀏覽一般網站則走自己本地的網路。

    3. 進階:依使用者分組分流

    若要某些使用者全通道、某些使用者只導內網,可搭配 Client-Specific Configuration(CCD)

    # server.conf
    client-config-dir /etc/openvpn/ccd
    
    # /etc/openvpn/ccd/client01
    # 專屬給 client01 的設定,可以額外 push 路由
    push "redirect-gateway def1 bypass-dhcp"
    
    # /etc/openvpn/ccd/client02
    # 只導內網
    push "route 192.168.10.0 255.255.255.0"

    九、安全強化清單:加密、權限、憑證與日誌

    OpenVPN 若要投入正式環境,建議額外留意以下幾點:

    • 憑證與金鑰權限server.key 僅允許 root 讀取, chmod 600 並限制目錄權限。
    • TLS 版本與加密套件:使用 tls-version-min 1.2 以上, cipher 建議 AES-256-GCMCHACHA20-POLY1305
    • CRL 與憑證廢止:用完離職員工或異常裝置,記得撤銷憑證:
    # 撤銷 client01 憑證
    cd ~/openvpn-pki
    ./easyrsa revoke client01
    ./easyrsa gen-crl
    
    # 更新到 OpenVPN 目錄
    sudo cp pki/crl.pem /etc/openvpn/
    sudo systemctl restart openvpn@server.service
    • 防暴力掃描
      • 盡量使用 UDP,必要時才改 443/TCP。
      • 搭配 tls-authtls-crypt,未帶金鑰的封包會被丟掉。
      • 可結合 Fail2Ban 監控 /var/log/openvpn.log
    • 最小權限原則:使用 user nobody / group nogroup, 並限制 Server 本機防火牆規則。

    十、常見錯誤與排查技巧

    OpenVPN 排錯以「看 Log + 測路由」為主,幾個常見問題與檢查方式如下。

    1. Client 連不上

    • 檢查 Server 防火牆:
      sudo ss -lunpt | grep 1194
      sudo iptables -L -n | grep 1194
    • 確認公網 IP / FQDN 是否正確,ISP 是否封鎖該埠。

    2. 連得上 VPN,但內網無法連

    • 確認 Server 是否有啟用 IP Forwarding、NAT 是否存在。
    • Client 上查看路由表:
    # Windows
    route print
    
    # Linux / macOS
    ip route

    3. 憑證錯誤或 TLS 失敗

    • Log 中若出現 TLS Error: TLS key negotiation failed,通常是 ca / cert / key / tls-auth 不一致或時間不同步。
    • 確認 Client 與 Server 系統時間是否相差過大。

    4. 如何查看目前連線使用者?

    sudo cat /var/log/openvpn-status.log

    會列出目前連線的 Client、對應 IP、連線時間、流量統計等資訊。

    🧭 行動清單

    ✅ 在測試環境完成 OpenVPN / easy-rsa 安裝與 PKI 建立
    ✅ 依公司內網規劃,設定合適的 VPN 網段與 IP Forwarding
    ✅ 建立至少一組正式的 Server.conf 並啟用 systemd 服務
    ✅ 為每位使用者生成專屬 .ovpn 檔並測試跨平台連線
    ✅ 根據實際需求選擇「全通道 / 分流 / 只導內網」的路由策略
    ✅ 建立 CRL 管理流程,離職或遺失裝置時可立即撤銷憑證
    ✅ 搭配防火牆與 Fail2Ban 等工具,持續監控 OpenVPN 日誌與異常

    — WWFandy・Linux VPN 筆記

    🔗 分享這篇 LINE Facebook X

    沒有留言:

    字級