Like Share Discussion Bookmark Smile

J.J. Huang   2025-11-17   Linode OpenVPN   瀏覽次數:次   DMCA.com Protection Status

Cloud | OpenVPN Server 建置手冊(Linode + VLAN 架構)

💬 前言

這篇文章是一份技術筆記,紀錄我在 Linode 上建置 OpenVPN Server + VLAN 架構 的過程。
內容僅涵蓋核心流程與設定檔,沒有完整的手把手教學或大量圖片,主要方便自己與後續需要的人快速參考與重現。

📝 筆記

建立 Linode VM(vpn-server)

  1. 登入 Linode 控制台
  2. 點選「Create → Linode」
  3. 設定以下參數:
    • Region:選擇離用戶最近的地區
      • 例:JP, Tokyo 3 (jp-tyo-3)
    • Image:Ubuntu 22.04 LTS
    • Linode Plan:Shared CPU → 最小即可(如 Nanode 1 GB)
    • Labelvpn-server
    • Root Password:設定安全密碼
    • VLAN
      • VLAN 名稱vlan100
      • IPAM Address (optional)192.168.100.10/24
  4. 建立完成後,記下公網 IP(供 VPN Client 連線)
  5. 關閉 Linode 的自動網路設定(Auto-configure networking)
    • 在 Linode 控制台中,點選該 VM → Configurations → Edit
    • 找到「Network Helper」或「Auto-configure networking」選項,取消勾選

      📝 這樣可以避免 Linode 在開機時自動覆蓋你的 /etc/network/interfaces 或 netplan 設定;避免自動插入 iptables NAT/MASQUERADE 規則,確保你的手動防火牆設定不被干擾;適合需要自訂 VLAN、VPN、防火牆、靜態 IP 的架構

  6. 修改後請重新啟動 VM 讓設定生效

連線至 VM

1
ssh root@<你的公網 IP>

安裝 OpenVPN(使用 Nyr 腳本)

1
2
3
wget https://git.io/vpn -O openvpn-install.sh
chmod +x openvpn-install.sh
./openvpn-install.sh

安裝過程會互動式詢問:

基本上一路「Enter」即可。

  • IP 位址:預設為偵測到的公網 IP,通常可直接按 Enter
  • 通訊協定:建議選 UDP
  • Port:預設 1194,可自訂
  • DNS:可選 Google DNS(8.8.8.8)或其他
  • Client 名稱:不輸入預設為:client.ovpn。

    📝 輸入如 global,將產生 global.ovpn

修改 .ovpn 檔案

1
vim /root/client.ovpn

新增 auth-user-pass

範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
client
dev tun
proto udp
remote 172.237.30.171 1194
resolv-retry infinite
nobind
persist-key
persist-tun
auth-user-pass
remote-cert-tls server
auth SHA512
ignore-unknown-option block-outside-dns
verb 3
...

修改 server.conf 檔案

1
vim /etc/openvpn/server/server.conf

在最末端增加下列三行:

1
2
3
auth-user-pass-verify /etc/openvpn/check_user.sh via-env
script-security 3
push "route 192.168.100.0 255.255.255.0"

⚠️ push "route 192.168.100.0 255.255.255.0" 中的虛參考 VLAN 的設定值做更改。

新增 check_user.sh 檔案

1
vim /etc/openvpn/check_user.sh

內容:

1
2
3
4
5
6
#!/bin/bash
if grep -q "$username:$password" /etc/openvpn/userlist.txt; then
exit 0
else
exit 1
fi

調整 check_user.sh 檔案權限

1
chmod +x /etc/openvpn/check_user.sh

新增 userlist.txt 檔案

1
vim /etc/openvpn/userlist.txt

內容:

1
2
3
4
5
aa:abc123
bb:abc123
cc:abc123
dd:abc123
ee:abc123

📝 每組帳號格式為 帳號:密碼 並換行。

調整 userlist.txt 檔案權限

1
chmod +x /etc/openvpn/userlist.txt

重新啟動 OpenVPN 服務

1
systemctl restart openvpn-server@server.service

觀察啟動狀態:

1
systemctl status openvpn-server@server.service

📝 Active: active (running) 表示為啟動。


🔥 防火牆設定

啟用 IP 轉送

1
echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf

📝 echo 輸出應該為 net.ipv4.ip_forward = 1

如不為 1,才需要執行

1
2
sysctl -w net.ipv4.ip_forward=1
sed -i '/^net.ipv4.ip_forward=/d' /etc/sysctl.conf

清除所有 NAT 表規則

觀看目前 iptables nat 設定:

1
iptables -t nat -L -n -v

清除所有 NAT 表規則:

1
iptables -t nat -F

聯外:VPN Client → 公網(Google、YouTube 等)

1
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 192.168.100.0/24 -o eth0 -j MASQUERADE

📝 當 VPN 用戶(10.8.0.0/24)要連到非 LAN(192.168.100.0/24)網段,並且封包是從 eth0 出口送出時,將來源 IP 改成 eth0 的 IP。

VLAN 內部:VPN Client → nginx-server(192.168.100.20)

1
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -d 192.168.100.0/24 -j SNAT --to-source 192.168.100.10

📝 當 VPN 用戶(10.8.0.0/24)要連到內部網段(192.168.100.0/24)時,將他們的來源 IP 改成 192.168.100.10,讓 LAN 內設備以為是本地設備發出的請求。

清除所有 FORWARD 規則

觀看目前 iptables FORWARD 設定:

1
iptables-save | grep FORWARD

清除所有 FORWARD 規則

1
iptables -F FORWARD

FORWARD 規則:允許 VPN 與 VLAN 雙向通訊

1
2
3
iptables -A FORWARD -s 10.8.0.0/24 -d 192.168.100.0/24 -j ACCEPT
iptables -A FORWARD -s 192.168.100.0/24 -d 10.8.0.0/24 -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

📝 允許 VPN 子網 10.8.0.0/24 的用戶連線到內部網段 192.168.100.0/24,並允許 LAN 回應或主動連線回 VPN。

下載 .ovpn 檔案

在 VM 上傳至本地端:

1
scp root@<你的公網 IP>:/root/client.ovpn .

或使用 cat 顯示內容後複製:

1
cat /root/client.ovpn

⚠️ 該檔案會用於 Client 連線使用,請妥善保管。


🧰 自建 DNS Server

安裝 dnsmasq

1
2
apt update
apt install dnsmasq -y

編輯 dnsmasq 設定檔

編輯設定檔:

1
vim /etc/dnsmasq.conf

加入以下內容:

1
2
3
4
5
6
7
8
9
10
11
# 讓 dnsmasq 同時服務本機與 VLAN
listen-address=127.0.0.1,192.168.100.10

# 自訂 DNS domain
domain=internal.local

# 定義 VLAN 內部主機名稱
address=/mainapp.internal.local/192.168.100.20

# 外部查詢轉送給 Google DNS
server=8.8.8.8

⚠️ domain 可以自己定義修改。
📝 address 可以自定義子網域名。

停用 systemd-resolved,釋放 port 53

1
2
3
4
systemctl disable systemd-resolved
systemctl stop systemd-resolved
rm /etc/resolv.conf
echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf

重啟 dnsmasq 並設定開機自動啟動:

1
2
3
systemctl restart dnsmasq
systemctl enable dnsmasq
systemctl status dnsmasq

編輯 OpenVPN server 設定

1
vim /etc/openvpn/server/server.conf

新增兩行:(注意新增位置)

1
2
push "dhcp-option DNS 192.168.100.10"
push "dhcp-option DOMAIN internal.local"

範例:

1
2
3
4
5
6
# 推送 DNS 設定(順序很重要)
push "dhcp-option DNS 192.168.100.10"
push "dhcp-option DNS 172.237.4.15"
push "dhcp-option DNS 172.237.4.17"
push "dhcp-option DNS 172.237.4.19"
push "dhcp-option DOMAIN internal.local"

⚠️ 注意 domain 需與 /etc/dnsmasq.conf 內設定一致。

重啟 OpenVPN

1
systemctl restart openvpn-server@server

防火牆允許 VPN Client 查詢 DNS

1
2
3
#iptables -A INPUT -p udp --dport 1194 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -s 10.8.0.0/24 -d 192.168.110.10 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -s 10.8.0.0/24 -d 192.168.110.10 -j ACCEPT

儲存規則(讓開機自動套用)

使用 iptables-persistent 套件:

1
apt install iptables-persistent -y

⚠️ 安裝過程中會提示你是否要儲存目前的規則,選「是」。

手動儲存指令:

1
netfilter-persistent save

📝 紀錄的位置:/etc/iptables/rules.v4

👌 結語

本文主要紀錄了在 Linode 上建置 OpenVPN Server + VLAN 架構 的過程,包含 VM 建置、OpenVPN 安裝、使用者驗證、防火牆規則、以及自建 DNS 的配置。
這不是完整的教學,而是一份技術筆記,重點在於 核心流程與注意事項,方便自己與後續需要的人快速理解並重現架構。

⚠️ 提醒

  • 請依照自身需求調整 IP、網段與防火牆規則。
  • 建議搭配 Linode 官方文件與 OpenVPN 官方指南,確保設定符合最新版本與安全最佳實踐。
  • 若使用 Linode 的免費額度,記得設定提醒事項,在時效內刪除 VPS 或資源,避免額外扣款。

這份筆記的目的在於提供一個可重現的基礎架構,讓 VPN Client 能安全存取 VLAN 內部服務,並保持網路隔離與安全性。