Back

วิธีตั้งค่า WireGuard VPN Server ด้วย Docker & WG‑Easy แบบง่ายๆ

by Weerapat Aphiphuwong

ในยุคที่การเข้าถึงเครือข่ายจากระยะไกลกลายเป็นเรื่องสำคัญ ไม่ว่าจะเพื่อเข้าถึงไฟล์จากที่บ้าน เข้าระบบกล้องวงจรปิด หรือทำงานจากต่างสถานที่ การมี 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