人在外面時,如果想用筆電或手機安全地管理家中的 Linux 主機、NAS 或其他只開放內網的設備,最乾淨的做法之一,是在家中放一台長時間開機的 OpenVPN 伺服器。
這篇文章不是只教你看到「Connected」。真正完成的標準是:關閉 VPN 時,外部設備無法使用家中的私有 IP;只開 OpenVPN、而且使用真正的外部網路時,可以連到指定主機;伺服器重開機後也會自行恢復。
本文以 Debian/Ubuntu 類 Linux 為例。路由器選單名稱會因品牌不同而異,但判斷方法相同。文中的 IP、網域和名稱都是範例,請替換成自己的值。
本文依實際架設、真正外網連線與重開機驗收經驗整理;不是只把官方指令重新排列。每個環境的路由器、網段與既有防火牆不同,請先理解每一步的目的,再依自己的環境調整。
這是一篇自架 OpenVPN Community Edition 的教學,不是 OpenVPN Access Server。操作前請先備份現有防火牆與網路設定;若主機已有 Docker、UFW、nftables 或其他 VPN,必須先盤點,不能直接覆寫規則。
先把目標和角色寫清楚
本文使用以下範例:
- 外部用戶端:一台 Windows 筆電,人在外面時連手機熱點或外部 Wi-Fi。
- VPN 伺服器:家中常開的 Linux 微電腦,固定內網 IP 為
192.168.50.10。 - 另一台受控設備:家中 Linux 主機,內網 IP 為
192.168.50.20。 - 家中 LAN:
192.168.50.0/24。 - OpenVPN 虛擬網段:
10.8.0.0/24。 - 對外協定與連接埠:
UDP 1194。 - DDNS:
vpn.example.net。
連線路徑應該只有一條:
外部筆電
→ 網際網路
→ 家中公網 IP 的 UDP 1194
→ 路由器轉發至 192.168.50.10:1194
→ OpenVPN 伺服器
→ 192.168.50.0/24 內網設備
如果你只需要連 VPN 伺服器本身,最後一段內網轉送可以省略;如果要連 NAS、另一台微電腦或整個 LAN,就必須設定 IP forwarding、路由與防火牆。
第一關:先確認你真的能接收外部連線
在動 OpenVPN 前,先回答三個問題。
1. VPN 伺服器的內網 IP 是否固定?
在 Linux 上查看位址與預設路由:
ip -br address
ip route
再到路由器的 DHCP 設定,為這台主機建立固定租約,讓它每次都取得 192.168.50.10。否則路由器今天把 UDP 1194 轉到 .10,主機明天變成 .11,VPN 就會失效。
2. 路由器 WAN 是公網 IP 還是私有 IP?
在路由器管理頁查看 WAN/Internet IP,再用瀏覽器查目前公網 IP。若兩者相同,通常只有一層 NAT;若路由器 WAN 顯示下列範圍,代表上面還有另一層路由器或業者 NAT:
10.0.0.0/8172.16.0.0/12192.168.0.0/16100.64.0.0/10(常見於 CGNAT,但也可能是某些虛擬網路介面)
不要只看到 100.x.x.x 就下結論。先查它出現在路由器 WAN、Windows 路由表,還是 Tailscale 等虛擬網卡。
3. 是否存在雙 NAT 或 CGNAT?
若家中路徑是「上游設備 → 自己的路由器 → Linux」,就要做兩次轉發:
公網 UDP 1194
→ 上游設備的下游路由器 WAN IP:1194
→ 自己路由器的 192.168.50.10:1194
「開啟 1194」這句話不夠精確。你真正需要的是:UDP 1194 的 port forwarding/虛擬伺服器規則,目的地為下一層設備的固定 IP 與 UDP 1194。
若上游是電信業者的 CGNAT,而你無法取得可接收入站連線的公網 IPv4,單靠家中路由器無法完成傳統 OpenVPN 入站連線。此時要向業者申請公網 IPv4,或改用不依賴入站轉發的架構。
安裝 OpenVPN 與 Easy-RSA
登入要作為 VPN 入口的 Linux 主機:
sudo apt update
sudo apt install openvpn easy-rsa
確認版本與 systemd 服務名稱:
openvpn --version
systemctl list-unit-files 'openvpn*'
以下使用 Easy-RSA 建立自己的憑證授權中心(CA)。CA 私鑰可以簽發所有用戶端憑證,重要性高於一般設定檔,應使用強密碼保護並另外備份。更嚴謹的環境應把 CA 放在離線設備;家用環境若暫時和 VPN 伺服器放在一起,也至少要限制檔案權限。
make-cadir ~/easy-rsa
cd ~/easy-rsa
./easyrsa init-pki
./easyrsa build-ca
建立伺服器金鑰、簽署伺服器憑證,並產生 Diffie-Hellman 參數:
./easyrsa gen-req server nopass
./easyrsa sign-req server server
./easyrsa gen-dh
openvpn --genkey secret pki/tls-crypt.key
建立第一台用戶端的金鑰與憑證。每一台筆電或手機應使用不同名稱與不同憑證,不要多人共用同一份設定檔:
./easyrsa gen-req laptop-01 nopass
./easyrsa sign-req client laptop-01
./easyrsa gen-crl
把伺服器需要的檔案放進 /etc/openvpn/server/:
sudo install -d -m 750 /etc/openvpn/server
sudo install -m 644 pki/ca.crt /etc/openvpn/server/ca.crt
sudo install -m 644 pki/issued/server.crt /etc/openvpn/server/server.crt
sudo install -m 600 pki/private/server.key /etc/openvpn/server/server.key
sudo install -m 644 pki/dh.pem /etc/openvpn/server/dh.pem
sudo install -m 600 pki/tls-crypt.key /etc/openvpn/server/tls-crypt.key
sudo install -m 644 pki/crl.pem /etc/openvpn/server/crl.pem
建立伺服器設定
先確認 OpenVPN 要從哪張實體網卡進入家中 LAN:
ip route show default
常見名稱可能是 eth0、enp1s0 或 end0。先記下來,後面的 NAT 規則會用到。
建立 /etc/openvpn/server/server.conf:
port 1194
proto udp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/dh.pem
tls-crypt /etc/openvpn/server/tls-crypt.key
crl-verify /etc/openvpn/server/crl.pem
topology subnet
server 10.8.0.0 255.255.255.0
push "route 192.168.50.0 255.255.255.0"
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
auth SHA256
keepalive 10 120
persist-key
persist-tun
user nobody
group nogroup
explicit-exit-notify 1
status /var/log/openvpn/status.log
verb 3
這裡的 push "route ..." 是告訴用戶端:前往家中 LAN 的流量要走 VPN。若你的 LAN 不是 192.168.50.0/24,必須修改;若外部所在網路恰好也使用相同網段,路由會衝突,最好先把家中 LAN 改成較不常見的私有網段。
OpenVPN 2.6 會協商資料通道加密演算法。除非必須支援非常舊的用戶端,不要為了相容性重新啟用已淘汰的 Blowfish。
開啟 Linux 轉送
建立獨立的 sysctl 設定:
sudo sh -c 'printf "%s\n" "net.ipv4.ip_forward=1" > /etc/sysctl.d/99-openvpn-forward.conf'
sudo sysctl --system
sysctl net.ipv4.ip_forward
最後一行應顯示:
net.ipv4.ip_forward = 1
設定防火牆與 NAT
這一步最容易因既有環境不同而出錯。先查看目前狀態,不要直接清空規則:
sudo nft list ruleset
sudo iptables-save
以下是以 iptables 表達的最小規則。請把 eth0 換成剛才查到的 LAN 網卡名稱:
sudo iptables -A INPUT -p udp --dport 1194 -j ACCEPT
sudo iptables -A FORWARD -i tun0 -o eth0 -s 10.8.0.0/24 -d 192.168.50.0/24 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o tun0 -s 192.168.50.0/24 -d 10.8.0.0/24 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
其中 MASQUERADE 讓內網設備把 VPN 用戶端的流量視為來自 VPN 伺服器,因此不必逐台替家中設備增加回程路由。若你想保留每個 VPN 位址的真實來源,可以不用 NAT,但必須在家中路由器增加 10.8.0.0/24 → 192.168.50.10 的靜態路由。
確認規則可用後,再安裝持久化工具並儲存。安裝過程若詢問是否保存目前 IPv4 規則,選擇是:
sudo apt install iptables-persistent
sudo netfilter-persistent save
sudo netfilter-persistent reload
若系統由 UFW、firewalld、Docker 或原生 nftables 管理防火牆,應把等效規則合併進原有管理工具,而不是讓多套工具互相覆蓋。
啟動並檢查 OpenVPN
Debian/Ubuntu 的伺服器設定放在 /etc/openvpn/server/server.conf 時,常見 unit 名稱是 openvpn-server@server:
sudo systemctl enable --now openvpn-server@server
sudo systemctl status openvpn-server@server --no-pager
sudo ss -lunp | grep ':1194'
sudo journalctl -u openvpn-server@server -n 100 --no-pager
必須同時看到:
- systemd 顯示
active (running)。 ss顯示 OpenVPN 正在監聽 UDP 1194。- journal 沒有找不到憑證、私鑰權限或設定語法錯誤。
「服務有啟動」不代表路由器、外網和內網轉送都已正常,它只完成伺服器本機這一關。
設定路由器轉發與 DDNS
在最靠近 OpenVPN 伺服器的路由器新增規則:
外部連接埠:1194
內部 IP:192.168.50.10
內部連接埠:1194
協定:UDP
若有雙 NAT,上游設備也要把 UDP 1194 轉發到下游路由器的 WAN IP。兩層設備的目的 IP 都應固定。
如果公網 IP 會變,設定 DDNS,例如 vpn.example.net。DDNS 更新程式必須能取得真正公網 IP;設定後用外部 DNS 查詢確認:
getent ahostsv4 vpn.example.net
解析結果應等於當下的家中公網 IP。DDNS 只負責「網域跟著 IP 更新」,不會自動替你完成 port forwarding。
製作用戶端設定檔
建立 laptop-01.ovpn,先放入基本設定:
client
dev tun
proto udp
remote vpn.example.net 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA256
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
verb 3
<ca>
貼上 pki/ca.crt 的完整內容
</ca>
<cert>
貼上 pki/issued/laptop-01.crt 的完整憑證內容
</cert>
<key>
貼上 pki/private/laptop-01.key 的完整內容
</key>
<tls-crypt>
貼上 pki/tls-crypt.key 的完整內容
</tls-crypt>
.ovpn 內含用戶端私鑰,等同進入家中網路的鑰匙。只透過可信方式傳給指定設備,不要貼到群組、公開雲端、Git repository 或部落格。匯入 OpenVPN Connect 後,原始檔仍應妥善保存或安全刪除。
Windows、macOS、Android 與 iOS 都可以使用 OpenVPN Connect 匯入這份設定。每台設備應各有一份憑證,例如 laptop-01、iphone-01,日後才能只撤銷遺失的那一台。
必須在真正外網驗收
這是整篇最重要的一段。測試前先隔離所有變因:
- 筆電離開家中 Wi-Fi,改連手機熱點或外部 Wi-Fi。
- 完全退出 Tailscale、ZeroTier、其他 OpenVPN profile 與公司 VPN。
- 確認沒有另一張網卡仍連著家中網路。
先讓 OpenVPN 保持 Disconnect,測試:
ssh user@192.168.50.10
ssh user@192.168.50.20
兩者都應逾時或不可達。接著只開這次建立的 OpenVPN profile,確認狀態為 Connected,再測相同兩行;此時兩台都應能連線。
若 OpenVPN 關閉時仍能連到內網,不要宣告成功。先在 Windows 檢查:
route print
tracert 192.168.50.20
Get-NetAdapter
若第一跳出現在 Tailscale 的 100.64.0.0/10 位址,通常表示流量正走另一條 VPN,而不是剛建立的 OpenVPN。
最後重開 VPN 伺服器:
sudo reboot
等主機恢復後,再從外網連一次,並確認:
systemctl is-enabled openvpn-server@server
systemctl is-active openvpn-server@server
只有以下項目全部通過,才算交付完成:
- VPN 關閉時,外部設備無法存取家中私有 IP。
- 只開 OpenVPN 時,可以連到 VPN 伺服器。
- 可以連到需要的其他內網設備。
- DDNS 指向目前公網 IP。
- 伺服器重開機後,OpenVPN 自動恢復。
- 其他 VPN 已退出,測試結果沒有替代路徑干擾。
常見故障怎麼查
OpenVPN Connect 一直逾時
按順序檢查:
- DDNS 是否解析到目前公網 IP。
- 上游與下游路由器是否都正確轉發 UDP 1194。
- VPN 伺服器是否仍持有固定內網 IP。
ss -lunp是否真的監聽 UDP 1194。- 防火牆是否允許 UDP 1194。
- 上游是否為無法自行轉發的 CGNAT。
UDP 沒有像 TCP 一樣簡單可靠的「連接埠是否開啟」網頁測試。最可信的方式是在伺服器查看封包是否抵達:
sudo tcpdump -ni any udp port 1194
從外部嘗試連線時若完全沒有封包,問題多半在 DDNS、上游或 port forwarding;若封包有抵達但握手失敗,再查 OpenVPN journal、憑證與加密設定。
顯示 Connected,卻連不到其他內網設備
檢查:
sysctl net.ipv4.ip_forward
sudo iptables -S FORWARD
sudo iptables -t nat -S POSTROUTING
ip route
常見原因是忘了 push route、未開 IP forwarding、FORWARD 被防火牆擋住,或缺少 NAT/回程靜態路由。
某些外部網路可以,某些不行
先檢查外部網路是否和家中 LAN 使用相同網段。例如兩邊都是 192.168.1.0/24 時,用戶端可能把家中 IP 誤認為目前所在地的區網設備。長期做法是把家中 LAN 改成較不常見且不重疊的私有網段。
兩個 VPN 同時開啟
作業系統會依路由的前綴長度與 metric 選路,不一定走你以為的那一條。驗收時永遠一次只保留一個 VPN;正式使用若必須並存,則要明確設計路由優先順序。
用戶端遺失時撤銷憑證
假設遺失的是 laptop-01:
cd ~/easy-rsa
./easyrsa revoke laptop-01
./easyrsa gen-crl
sudo install -m 644 pki/crl.pem /etc/openvpn/server/crl.pem
sudo systemctl restart openvpn-server@server
因為伺服器設定包含 crl-verify,更新 CRL 後,被撤銷的憑證就不能再登入。不要只刪除自己電腦上的 .ovpn,因為遺失設備內仍可能保留副本。
安全收尾
- 不要公開路由器密碼、Wi-Fi 密碼、QR code、CA 私鑰、用戶端私鑰或完整
.ovpn。 - 不要把 SSH、路由器管理頁或其他管理介面直接暴露到公網;只對外開放必要的 UDP 1194。
- 每台用戶端使用獨立憑證,遺失時才能單獨撤銷。
- 備份 CA、Easy-RSA PKI、伺服器設定與防火牆規則,備份本身也要加密並限制存取。
- 定期安裝安全更新,並查看 OpenVPN journal 是否有異常連線。
- 修改設定前先保存現有狀態;不要用清空整套防火牆規則的方式解決單一問題。
這次架設真正教會我的事
VPN 最難的通常不是安裝套件,而是先分清楚設備角色與每一層網路。只要漏掉雙 NAT、動態 IP、回程路由或另一套 VPN,畫面就可能看似成功,實際流量卻走錯路。
可靠的工作順序應該是:
確認目標
→ 畫出拓撲
→ 盤點 NAT 與既有 VPN
→ 部署伺服器
→ 設定路由與防火牆
→ 設定轉發與 DDNS
→ 隔離其他通道
→ 用真正外網驗收
不要把「Connected」當作完成,也不要把推測寫成已確認。當 VPN 關閉與開啟的結果都符合預期,而且重開機後仍能工作,這條遠端入口才真正值得信任。