
為什麼使用 VPN?

公司要你從外面連內部資源,或者你在咖啡廳用公共 Wi-Fi 又不想裸奔?自架 VPN 是最實在的解法。這篇教你用 AWS EC2 從零架一台 OpenVPN server。
先講結論
在 AWS 上架 VPN,你需要搞定三件事:網路層(VPC + Subnet + IGW + Security Group)、OpenVPN server 安裝與設定、NAT 轉發 + 客戶端連線。整個過程大概 30 分鐘,但如果你對網路不熟,踩坑時間另計。
Step 1:把 AWS 網路層設好
這一步的目標很單純:讓你的 EC2 能上網、能被外面連到。
- 建 VPC:CIDR 設
10.0.0.0/16,IP 夠用就不用煩惱 - 開 Public Subnet:範圍
10.0.1.0/24,之後 VPN server 會放這裡 - 掛 Internet Gateway:建好 IGW → 附加到 VPC,這步忘了的話你的 subnet 就是個與世隔絕的孤島
- 設 Route Table:把
0.0.0.0/0指向 IGW,讓出站流量能出去 - 配 Security Group:入站開 UDP 1194(OpenVPN 用)和 ICMP(ping 測試用),出站全開
你有沒有遇過設好 Security Group 但就是連不上的情況?先檢查 Route Table 有沒有指到 IGW——這是最常被忽略的一步。
Step 2:安裝 OpenVPN
開一台 EC2 放在剛才的 Public Subnet 裡,SSH 進去開始裝:
# Amazon Linux
sudo yum update -y
sudo yum install openvpn easy-rsa -y
# Ubuntu
sudo apt update && sudo apt upgrade -y
sudo apt install openvpn easy-rsa -y產生憑證
這是整個流程最囉嗦的部分,但每一步都不能跳:
cd /etc/openvpn
sudo mkdir -p /etc/openvpn/easy-rsa/keys
sudo cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
sudo ./easyrsa init-pki
sudo ./easyrsa build-ca nopass
sudo ./easyrsa gen-req server nopass
sudo ./easyrsa sign-req server server
sudo ./easyrsa gen-dh
sudo ./easyrsa build-client-full client1 nopass
# 把憑證複製到 OpenVPN 目錄
sudo cp pki/ca.crt pki/private/server.key pki/issued/server.crt pki/dh.pem /etc/openvpn/gen-dh 這步會跑比較久(產生 Diffie-Hellman 參數),耐心等就好,不是當機不要按 Ctrl+C。
設定 server.conf
編輯 /etc/openvpn/server/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
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
push "route 10.0.1.0 255.255.255.0"
keepalive 10 120
data-ciphers AES-256-GCM:AES-128-GCM:AES-256-CBC:AES-128-CBC
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
verb 3user nobody 和 group nobody 是安全措施——萬一 OpenVPN 被打穿,攻擊者拿到的也只是最低權限的 nobody 帳號。記得把設定檔的擁有者也改掉:
sudo chown nobody:nobody /etc/openvpn/server/server.confStep 3:開啟 IP 轉發和 NAT
VPN 客戶端的流量要能透過你的 EC2 轉發出去,不然連上 VPN 也上不了網:
# 開啟 IP 轉發
sudo sysctl -w net.ipv4.ip_forward=1
# 設定 NAT:把 VPN 網段的流量偽裝成 EC2 的 IP 出去
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE設好之後確認一下:
sudo iptables -t nat -L POSTROUTING
ip route show我踩過的坑:
eth0不一定是你的網卡名稱。有些 AMI 用的是ens5或enX0,用ip addr先確認再設 NAT,不然流量轉不出去你會 debug 到天亮。
Step 4:啟動 & 測試
Server 端
sudo systemctl start openvpn-server@server.service
sudo systemctl enable openvpn-server@server.service
# 確認狀態
sudo systemctl status openvpn-server@server.service
sudo journalctl -u openvpn-server@server.serviceClient 端
先把憑證抓下來:
scp -i /path/to/your-key.pem ec2-user@<EC2_PUBLIC_IP>:/etc/openvpn/ca.crt .
scp -i /path/to/your-key.pem ec2-user@<EC2_PUBLIC_IP>:/etc/openvpn/easy-rsa/pki/issued/client1.crt .
scp -i /path/to/your-key.pem ec2-user@<EC2_PUBLIC_IP>:/etc/openvpn/easy-rsa/pki/private/client1.key .建立 client.ovpn:
client
dev tun
proto udp
remote <EC2_PUBLIC_IP> 1194
nobind
ca ca.crt
cert client1.crt
key client1.key連線測試:
sudo openvpn --config client.ovpn
# 連上之後 ping 看看
ping google.com能 ping 通就代表你的 VPN 已經活了。如果不通,按這個順序排查:Security Group → Route Table → iptables NAT → OpenVPN log。
自架 VPN 最大的價值不是省錢,是你終於知道流量怎麼走的——這個理解比任何付費 VPN 都值錢。