ในยุคที่การเข้าถึงเครือข่ายจากระยะไกลกลายเป็นเรื่องสำคัญ ไม่ว่าจะเพื่อเข้าถึงไฟล์จากที่บ้าน เข้าระบบกล้องวงจรปิด หรือทำงานจากต่างสถานที่ การมี VPN ส่วนตัวจึงเป็นสิ่งที่ตอบโจทย์ทั้งด้านความปลอดภัยและความสะดวก
บทความนี้จะแนะนำวิธีการตั้งค่า WireGuard VPN Server แบบง่าย ๆ ด้วย Docker และ WG-Easy ซึ่งจะช่วยให้สามารถบริหารจัดการ VPN ได้ผ่าน Web Interface และพร้อมใช้งานได้ภายในเวลาไม่กี่นาที เหมาะสำหรับทั้งใช้งานที่บ้านหรือในสำนักงาน
1. เตรียมเครื่อง Host ไม่ว่าจะเป็น VM Server หรือ Raspberry pi ก็สามารถทำได้ครับ
เลือกเครื่องที่ใช้ Ubuntu / Debian หรือระบบ Linux อื่นๆ แต่ในตัวอย่างเราจะใช้ Ubuntu ครับ
อัพเดทระบบให้เป็นระบบล่าสุด
sudo apt update
sudo apt upgrade
ติดตั้ง curl
sudo apt install curl -y
ติดตั้ง Docker และ Docker Compose
curl -sSL https://get.docker.com | sh

ตัวอย่างการติดตั้ง Docker และ Docker Compose
2. เพิ่มผู้ใช้งาน(user)ปัจจุบันของเข้าไปในกลุ่มที่ชื่อว่า docker
หลังจากที่ติดตั้ง Docker เสร็จเรียบร้อยแล้ว เพิ่มผู้ใช้งาน(user)ปัจจุบันเข้าไปในกลุ่มที่ชื่อว่า docker การเพิ่มผู้ใช้เข้าไปในกลุ่ม docker จะช่วยให้สามารถสั่ง เริ่มต้น (start) หรือ หยุด (stop) คอนเทนเนอร์ Docker(เช่น WireGuard)ได้ โดยไม่ต้องใช้คำสั่ง sudo ทุกครั้ง
sudo usermod -aG docker $USER
3. การเปลี่ยนแปลงสิทธิ์ของผู้ใช้งานใน Linux จำเป็นต้อง ออกจากระบบ (logout) แล้ว เข้าสู่ระบบใหม่ (login)
หลังจากที่ได้เพิ่มผู้ใช้งานเข้าไปในกลุ่ม docker บนระบบ Linux แล้วการเปลี่ยนแปลงนี้ จะยังไม่ทำงานทันทีจนกว่าจะ ออกจากระบบแล้วกลับเข้ามาใหม่
logout
หรือจะ รีสตาร์ทเครื่อง ไปเลยก็ได้
sudo reboot
4. ตั้งค่าอุปกรณ์ให้สามารถเข้าถึงได้จากภายนอกเครือข่าย (Internet)
ตอนนี้เรากำลังตั้งค่า VPN (WireGuard) จุดสำคัญคือ อุปกรณ์ที่รัน VPN server ต้องสามารถเข้าถึงได้จากภายนอกเครือข่าย
สิ่งที่ต้องทำมีดังนี้:
- ตั้งค่า IP แบบ Static ให้กับเครื่องที่ใช้รัน VPN Server เช่น 192.168.1.100 ให้ IP ไม่เปลี่ยน
- ทำ Port Forwarding ที่เราเตอร์ เปิดพอร์ต 51820 (ซึ่งเป็นพอร์ตที่ WireGuard ใช้) และระบุ Protocol เป็น UDP ให้ชี้มาที่ IP เครื่องที่รัน WireGuard เช่น 192.168.1.100
หมายเหตุ: การตั้งค่าเราเตอร์แต่ละรุ่นไม่เหมือนกัน โปรดดูที่เร้าเตอร์

ตัวอย่างการ forword port ที่เราเตอร์
5. สร้างโฟลเดอร์สำหรับเก็บไฟล์ Compose และการตั้งค่า WireGuard
ในขั้นตอนนี้ เราจะสร้างโฟลเดอร์สำหรับ:
เก็บ ไฟล์ Docker Compose
และเก็บ ไฟล์การตั้งค่าทั้งหมดของ WireGuard
sudo mkdir -p /opt/stacks/wireguard
6. เข้าไปยังโฟลเดอร์ที่เราสร้างขึ้น
หลังจากที่สร้างโฟลเดอร์เรียบร้อยแล้ว เราจำเป็นต้องสั่งเปลี่ยนตำแหน่งการทำงาน (Change Directory) ไปยังโฟลเดอร์นั้น
cd /opt/stacks/wireguard

ตัวอย่างการเข้าโฟลเดอร์ที่เราสร้างขึ้น
7. สร้างรหัสแฮช (Password Hash) สำหรับรหัสผ่านที่ใช้เข้าสู่หน้าเว็บ
ใน Terminal ให้รันคำสั่งนี้:
docker run --rm -it ghcr.io/wg-easy/wg-easy wgpw '[PASSWORD]'
หมายเหตุ: ให้เปลี่ยน [PASSWORD] เป็นรหัสผ่านที่ต้องการใช้จริงๆ
เช่น docker run --rm -it ghcr.io/wg-easy/wg-easy wgpw 'Test1234'
PASSWORD_HASH='$2b$12$coPqCsPtcFO.Ab99xylBNOW4.Iu7OOA2/ZIboHN6/oyxca3MWo7fW'
หลังรันคำสั่งนี้ ระบบจะแสดงค่าแฮชของรหัสผ่าน (Password Hash)ให้เก็บค่าแฮชไว้ ออกมาแบบตัวอย่าง ซึ่งค่าที่ได้นี้ เราจะนำไปใช้ในไฟล์ docker-compose.yml เพื่อความปลอดภัยของรหัสผ่านในการตั้งค่า WG-Easy ต่อไป
8. แก้ไขค่า Password Hash ก่อนนำไปใช้ในไฟล์ตั้งค่า
สิ่งที่ต้องทำ:
ลบเครื่องหมาย single quotes ' ' ทั้งสองข้างออก
เพิ่มเครื่องหมาย $ อีกหนึ่งตัว ต่อหลังเครื่องหมาย $ ทุกตัวที่มีในรหัสแฮช จะได้ดังตัวอย่างแบบนี้
PASSWORD_HASH=$$2b$$12$$coPqCsPtcFO.Ab99xylBNOW4.Iu7OOA2/ZIboHN6/oyxca3MWo7fW
9. สร้างไฟล์ compose.yaml
sudo nano compose.yaml
10. ภายในไฟล์ ให้พิมพ์ข้อความต่อไปนี้ (แก้ไขค่าที่กำหนดตามความเหมาะสม)
services:
wg-easy:
container_name: wg-easy
image: ghcr.io/wg-easy/wg-easy
environment:
- PASSWORD_HASH=$$2b$$12$$coPqCsPtcFO.Ab99xylBNOW4.Iu7OOA2/ZIboHN6/oyxca3MWo7fW # แทนที่ด้วย hash รหัสผ่านที่ได้
- WG_HOST=203.0.113.10 # แทนที่ด้วย IP หรือโดเมน (IP ภายนอกที่ใช้เข้าถึง VPN)
volumes:
- ./config:/etc/wireguard
- /lib/modules:/lib/modules
ports:
- "51820:51820/udp" # เปิดพอร์ต UDP สำหรับ WireGuard
- "51821:51821/tcp" # พอร์ต TCP สำหรับเว็บอินเทอร์เฟซ
restart: unless-stopped
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.src_valid_mark=1

ตัวอย่างการสร้าง docker compose
คำอธิบายส่วนสำคัญ
- PASSWORD_HASH ให้ใส่ค่าแฮชรหัสผ่านที่สร้างไว้ในขั้นตอนก่อนหน้า(อย่าลืมเพิ่มเครื่องหมาย $$)
- WG_HOST คือ IP สาธารณะ หรือ โดเมนเนม ที่ใช้เข้าถึงVPN ต้องเป็น public ipเท่านั้น กรณีที่ไม่มีต้องใช้ ddns ของ ISP นั้นๆ
- volumes คือ การเชื่อมโยงโฟลเดอร์ ./config ในเครื่อง host กับที่เก็บ config ภายใน container
- ports ให้เปิดพอร์ต UDP 51820 สำหรับ VPN และพอร์ต TCP 51821 สำหรับเว็บอินเทอร์เฟซ WG-Easy
- restart: unless-stopped ให้ container เริ่มทำงานใหม่โดยอัตโนมัติเมื่อระบบรีบูตหรือ container หยุดทำงานโดยไม่ตั้งใจ
- cap_add และ sysctls คือ การตั้งสิทธิ์และค่าการทำงานเครือข่ายเพื่อให้ WireGuard ทำงานได้ถูกต้อง
จากนั้น:
กด Ctrl + O เพื่อบันทึกไฟล์ แล้วกด Enter
กด Ctrl + X เพื่อออกจากโปรแกรม nano
11. หลังจากที่เราเขียนไฟล์ Docker Compose เสร็จแล้ว ให้เริมต้น Docker
docker compose up -d
12. ทดสอบเข้าใช้งานผ่านหน้าเว็บ
http://[IPADDRESS]:51821

ตัวอย่างการเข้าใช้งานผ่านหน้าเว็บ
เพียงแค่นี้เราก็จะมี VPN Server ไว้ใช้สำหรับการเข้ามาที่ บ้านหรือที่ทำงานแล้ว ขอบคุณที่อ่านไว้โอกาสหน้าเดี๋ยวผมมาแบ่งปันความรู้อีกนะครับ
แหล่งที่มา: pimylifeup.com/wireguard-docker