ติดตั้ง OpenVPN Server บน VPS Ubuntu: คู่มือฉบับสมบูรณ์
OpenVPN เป็น VPN solution แบบ open-source ที่ใช้งานกันมากที่สุดในระดับองค์กร รองรับ client บนทุก platform ตั้งค่า flexible ได้ และใช้ TLS encryption เต็มรูปแบบ บทความนี้จะตั้ง OpenVPN server ตั้งแต่ต้นบน VPS Ubuntu 22.04 พร้อม Certificate Authority ของตัวเองเพื่อความปลอดภัยสูงสุด
ติดตั้ง OpenVPN และ Easy-RSA
sudo apt update && sudo apt install openvpn easy-rsa -y
# ดู version
openvpn --version | head -1
สร้าง Certificate Authority (CA)
Easy-RSA ช่วยจัดการ certificate lifecycle ทั้งหมด — สร้าง CA, ออก server/client cert และ revoke ได้:
# สร้าง directory สำหรับ PKI
make-cadir /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
# เริ่มต้น PKI
./easyrsa init-pki
# สร้าง CA (กำหนด Common Name เช่น "MyVPN-CA")
./easyrsa build-ca nopass
สร้าง Server Certificate และ DH Parameters
cd /etc/openvpn/easy-rsa
# สร้าง server certificate
./easyrsa gen-req server nopass
./easyrsa sign-req server server
# สร้าง Diffie-Hellman parameters (ใช้เวลา 1-2 นาที)
./easyrsa gen-dh
# สร้าง TLS auth key สำหรับป้องกัน DoS และ replay attacks
openvpn --genkey secret /etc/openvpn/easy-rsa/pki/ta.key
# copy ไฟล์ที่จำเป็นไปยัง /etc/openvpn/
cp pki/ca.crt pki/issued/server.crt pki/private/server.key \
pki/dh.pem pki/ta.key /etc/openvpn/
สร้าง Server Config
sudo nano /etc/openvpn/server.conf
# /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
# IP range สำหรับ VPN clients
server 10.8.0.0 255.255.255.0
# ส่ง route ไปยัง client
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 1.1.1.1"
push "dhcp-option DNS 8.8.8.8"
# TLS hardening
tls-auth /etc/openvpn/ta.key 0
cipher AES-256-GCM
auth SHA256
tls-version-min 1.2
keepalive 10 120
max-clients 20
user nobody
group nogroup
persist-key
persist-tun
# Logging
status /var/log/openvpn/status.log
log-append /var/log/openvpn/openvpn.log
verb 3
# สร้าง log directory
sudo mkdir -p /var/log/openvpn
เปิด IP Forwarding และตั้ง NAT
# เปิด IP forwarding (persistent)
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# ตรวจสอบ network interface
ip route show | grep default
# ดู interface name เช่น eth0 หรือ ens3
# ตั้ง iptables NAT (เปลี่ยน eth0 ให้ตรงกับ interface จริง)
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
# บันทึก iptables ให้คง persist หลัง reboot
sudo apt install iptables-persistent -y
sudo netfilter-persistent save
Start OpenVPN Server
sudo systemctl start openvpn@server
sudo systemctl enable openvpn@server
sudo systemctl status openvpn@server
สร้าง Client Certificate และ .ovpn Profile
cd /etc/openvpn/easy-rsa
# สร้าง client certificate (ทำซ้ำสำหรับแต่ละ user)
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1
#!/bin/bash
# script สร้างไฟล์ .ovpn สำเร็จรูป
CLIENT="client1"
SERVER_IP="YOUR_VPS_IP"
EASYRSA_DIR="/etc/openvpn/easy-rsa"
OUTPUT="/root/${CLIENT}.ovpn"
cat > $OUTPUT << EOF
client
dev tun
proto udp
remote $SERVER_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-GCM
auth SHA256
key-direction 1
verb 3
$(cat $EASYRSA_DIR/pki/ca.crt)
$(openssl x509 -in $EASYRSA_DIR/pki/issued/${CLIENT}.crt)
$(cat $EASYRSA_DIR/pki/private/${CLIENT}.key)
$(cat /etc/openvpn/ta.key)
EOF
echo "Created: $OUTPUT"
.ovpn ให้ user ผ่าน channel ที่ปลอดภัย (ไม่ผ่าน email แบบ plain text) เพราะในไฟล์มี private key ของ client อยู่ด้วย
ตรวจสอบว่า OpenVPN ทำงานถูกต้อง
# ดูสถานะ service
systemctl status openvpn@server
# ดู VPN tunnel interface (ควรมี tun0)
ip addr show tun0
# ดู client ที่เชื่อมต่ออยู่
cat /var/log/openvpn/status.log
# ดู log ล่าสุด
tail -30 /var/log/openvpn/openvpn.log
ping 10.8.0.1 จาก client — ถ้า ping ผ่านแสดงว่า VPN tunnel ทำงานแล้ว จากนั้นทดสอบ internet access ด้วย curl ifconfig.me — ควรได้ IP ของ VPS แทน IP จริงของ client
แก้ปัญหาที่พบบ่อย
Error: "TLS handshake failed" เมื่อ client เชื่อมต่อ
มักเกิดจาก tls-auth key ไม่ตรงกัน หรือ key-direction ผิด ตรวจสอบว่า server ใช้ key-direction 0 และ client ใช้ key-direction 1:
# ตรวจสอบ server config
grep "key-direction\|tls-auth" /etc/openvpn/server.conf
# ตรวจสอบ client config ใน .ovpn file
grep "key-direction" client1.ovpn
# ต้องเป็น: key-direction 1
# ดู log error เพิ่มเติม
grep "TLS\|VERIFY" /var/log/openvpn/openvpn.log | tail -20
Client เชื่อมต่อได้แต่ internet ไม่ผ่าน VPN
IP forwarding หรือ NAT rule ยังไม่ถูกต้อง ตรวจสอบ:
# ตรวจสอบ IP forwarding
cat /proc/sys/net/ipv4/ip_forward
# ต้องได้: 1
# ตรวจสอบ NAT rule
sudo iptables -t nat -L POSTROUTING -n
# ต้องมี MASQUERADE rule สำหรับ 10.8.0.0/24
# ตรวจสอบ client ว่า redirect-gateway ทำงาน
ip route show | head -5 # ทำจาก client ที่เชื่อมต่อแล้ว
Error: "Cannot open TUN/TAP dev /dev/net/tun"
VPS บางเจ้า disable TUN/TAP device โดย default ต้องเปิดผ่าน control panel ของ provider:
# ตรวจสอบว่ามี TUN module
lsmod | grep tun
# โหลด TUN module (ถ้ายังไม่มี)
sudo modprobe tun
# ตรวจสอบ device
ls -la /dev/net/tun
Client certificate ถูก revoke แล้วแต่ยังเชื่อมต่อได้
ต้องตั้ง CRL (Certificate Revocation List) ใน server config และอัพเดท crl.pem ทุกครั้งที่ revoke:
cd /etc/openvpn/easy-rsa
./easyrsa revoke client1
./easyrsa gen-crl
cp pki/crl.pem /etc/openvpn/
# เพิ่มใน server.conf
echo "crl-verify /etc/openvpn/crl.pem" >> /etc/openvpn/server.conf
systemctl restart openvpn@server
คำถามที่พบบ่อย
OpenVPN ต่างจาก WireGuard อย่างไร ควรใช้อันไหน?
WireGuard เร็วกว่า ตั้งค่าง่ายกว่า และ overhead น้อยกว่า เหมาะกับ personal VPN OpenVPN เก่ากว่าแต่ mature กว่า รองรับ client ได้หลากหลาย มี feature ครบกว่า (certificate revocation, logging, multi-user management) และหลายองค์กรไว้ใจมากกว่าเพราะใช้กันมานาน ถ้าเพิ่งเริ่มและต้องการความง่าย แนะนำ WireGuard ถ้าต้องการ enterprise features แนะนำ OpenVPN
OpenVPN server 1 เครื่องรองรับ client ได้กี่คน?
ขึ้นอยู่กับ bandwidth และ CPU ของ VPS โดยทั่วไป VPS 2 vCPU / 2GB RAM รองรับ concurrent connection ได้ 20-50 คน ถ้า traffic เบา (ไม่ได้ใช้ทุกคนพร้อมกัน) อาจรองรับได้ถึง 100+ user accounts แต่ active ไม่เกิน 20-30 คนพร้อมกัน
จะเพิ่ม user ใหม่โดยไม่ต้อง restart server ได้ไหม?
ได้ OpenVPN server ไม่ต้อง restart เมื่อออก certificate ใหม่ เพียงสร้าง client certificate ใหม่ด้วย easy-rsa แล้วสร้าง .ovpn profile ส่งให้ user เชื่อมต่อได้ทันที server ที่รันอยู่ไม่กระทบ