🐧 Linux OpenVPN Server 架設完整指南:PKI 憑證、雙向驗證、Client 配置與路由導向一次搞懂
在企業環境裡,安全又好維護的遠端連線方案 幾乎是標配,其中最常見的就是基於 TLS 的 OpenVPN SSL VPN。它透過 PKI 憑證 實作雙向驗證,搭配靈活的路由設計, 可以把總部內網安全地「延伸」到遠端辦公室、居家 VPN 使用者、甚至行動裝置。
這篇會從架構概念 → 安裝設定 → 憑證管理 → Client 設定 → 路由導向與安全強化 一條龍帶過, 讓你能在 Linux 上部署一套可實戰使用的 OpenVPN Server。
📑 目錄
- 一、OpenVPN 與 SSL VPN 概念整理
- 二、環境假設與拓樸架構
- 三、OpenVPN 與 easy-rsa 安裝
- 四、PKI 架設:CA、Server 與 Client 憑證
- 五、Server 端設定:埠號、加密、路由與雙向驗證
- 六、防火牆與 IP 轉送設定(iptables / nftables)
- 七、Client 設定:.ovpn 檔、Windows / macOS / Linux / 行動裝置
- 八、路由導向實戰:全通道、分流、只導內網
- 九、安全強化清單:加密、權限、憑證與日誌
- 十、常見錯誤與排查技巧
- 🧭 行動清單
- 🔗 延伸閱讀
一、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.crt與pki/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.conf 或 server/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.crtclient01.crtclient01.keyta.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-GCM或CHACHA20-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-auth或tls-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 日誌與異常
🔗 延伸閱讀
- 🐧 Linux 防火牆基礎教學:iptables 與 nftables 規則設定
- 🔐 Linux SSH 安全強化:金鑰登入、Fail2Ban 與 Port Security
- 🛡 Linux 從安裝到上線:帳號、權限與服務加固實戰
- 🌐 Nginx 反向代理與 HTTPS 終結:搭配 VPN 打造安全入口
— WWFandy・Linux VPN 筆記
沒有留言: