จัดการ WireGuard ด้วย systemd บน Linux
เปลี่ยนอุโมงค์ WireGuard ที่สั่งเองด้วยมือให้เป็นบริการที่ดูแลได้ ครอบคลุมยูนิต wg-quick ลำดับตอนบูต drop-in การรีโหลด ตัวตรวจสุขภาพ และ systemd-networkd
อ่าน 10 นาทีอัปเดตเมื่อ 15 ต.ค. 2569โดย XPASS Editorial Team

การเปิดอุโมงค์ WireGuard ด้วยมือผ่าน wg-quick up wg0 เหมาะกับการทดสอบครั้งแรก แต่ไม่ใช่วิธีอยู่ร่วมกับอุโมงค์ในระยะยาว อินเทอร์เฟซหายทุกครั้งที่รีบูต ไม่มีอะไรช่วยเริ่มใหม่เมื่อเครือข่ายสะดุด และไม่มีบันทึกให้ย้อนอ่านเมื่อมันล้มตอนตีสาม ในดิสโทรสมัยใหม่เกือบทุกตัว คำตอบติดตั้งอยู่แล้ว นั่นคือ systemd บทความนี้แสดงวิธีรัน WireGuard เป็นบริการที่มีการจัดการ จัดลำดับตอนบูตให้ถูก รีโหลดอย่างปลอดภัย และไล่ปัญหาด้วย journal
เนื้อหาสมมติว่าคุณมีไฟล์ config ที่ใช้งานได้แล้วและพอคุ้นกับเทอร์มินัล ถ้ายังเลือกโปรโตคอลอยู่ อ่าน WireGuard เทียบกับ OpenVPN ก่อน และดูแนวคิดทั่วไปที่ โปรโตคอล VPN คืออะไร คีย์และที่อยู่ทั้งหมดด้านล่างเป็นค่าตัวอย่าง
สองวิธีรัน WireGuard ภายใต้ systemd
มีสองเส้นทางที่รองรับ และควรเลือกอย่างตั้งใจ
| วิธี | หลักการ | เหมาะกับ |
|---|---|---|
| บริการ wg-quick | ยูนิตแม่แบบรันสคริปต์ wg-quick ซึ่งสร้างอินเทอร์เฟซ ใส่ที่อยู่และเส้นทาง และเรียกเครื่องมือ DNS | โน้ตบุ๊ก การตั้งค่าเร็ว คู่มือส่วนใหญ่ |
| systemd-networkd | ไฟล์ .netdev และ .network ธรรมดาอธิบายอินเทอร์เฟซ แล้ว daemon เครือข่ายสร้างให้ |
เซิร์ฟเวอร์ ระบบตายตัว รวมการตั้งค่าเครือข่ายไว้ที่เดียว |
วิธีแรกพบบ่อยที่สุดมาก จึงเริ่มที่นั่นแล้วค่อยกลับมาที่วิธีที่สอง ไม่ว่าเลือกแบบใด อย่าจัดการอินเทอร์เฟซเดียวกันด้วยทั้งสองวิธี ถ้านิยาม wg0 ไว้ใน networkd แล้วยังรัน wg-quick@wg0 อีก ทั้งสองจะแย่งกันตั้งที่อยู่

ตั้งค่าบริการ wg-quick
วาง config ไว้ที่ /etc/wireguard/wg0.conf ไฟล์นี้มีคีย์ส่วนตัว จึงควรตั้งสิทธิ์เข้มงวด
sudo chown root:root /etc/wireguard/wg0.conf
sudo chmod 600 /etc/wireguard/wg0.conf
WireGuard เองก็เตือนเมื่อ config อ่านได้ทุกคน และมีเหตุผล จากนั้นเปิดใช้งานและเริ่มบริการในคำสั่งเดียว
sudo systemctl enable --now wg-quick@wg0
ชื่อหลัง @ คือชื่อไฟล์ config ไม่รวม .conf ดีไซน์แบบแม่แบบนี้ทำให้อุโมงค์ที่สองใน office.conf เป็นเพียง wg-quick@office รันพร้อมกันหลายตัวได้ ตราบที่ที่อยู่และเส้นทางไม่ชนกัน
ตรวจผลด้วยสามคำสั่ง
systemctl status wg-quick@wg0ดูว่ายูนิต active หรือไม่ เนื่องจากเป็นยูนิตแบบ one-shot ที่คงสถานะหลังจบงาน ปกติจะขึ้นactive (exited)ซึ่งถูกต้อง ไม่ใช่ข้อผิดพลาดsudo wg showแสดงอินเทอร์เฟซ peer และที่สำคัญคือบรรทัดlatest handshakeการจับมือภายในไม่กี่นาทีล่าสุดแปลว่าทราฟฟิกไหล ถ้าไม่มีบรรทัดนี้ แปลว่า peer ไม่เคยตอบip -brief address show wg0ยืนยันว่าได้รับที่อยู่แล้ว
หยุดอุโมงค์ด้วย systemctl stop wg-quick@wg0 ป้องกันการเริ่มตอนบูตด้วย systemctl disable wg-quick@wg0 การหยุดยูนิตจะรันขั้นตอนรื้อถอนที่คู่กัน รวมถึงคำสั่ง PostDown ใน config
เริ่มหลังเครือข่ายพร้อม
ความล้มเหลวที่พบบ่อยที่สุดคืออุโมงค์ที่เริ่มด้วยมือได้ แต่ล้มตอนบูต เพราะบริการเริ่มก่อนเครือข่ายพร้อม หรือชื่อโฮสต์ของ Endpoint ยัง resolve ไม่ได้ ทางแก้คือไฟล์ override แบบ drop-in ซึ่งไม่หายเมื่ออัปเดตแพ็กเกจเพราะไม่แตะไฟล์ยูนิตต้นฉบับ สร้างด้วย
sudo systemctl edit wg-quick@wg0
แล้ววาง
[Unit]
Wants=network-online.target
After=network-online.target nss-lookup.target
[Service]
Restart=on-failure
RestartSec=15
บันทึก แล้วรัน sudo systemctl daemon-reload และรีสตาร์ทบริการ บรรทัด Wants และ After จะรอให้เครือข่ายเชื่อมต่อ บนระบบเดสก์ท็อปต้องแน่ใจว่าบริการ wait ของ daemon เครือข่ายที่ใช้เปิดอยู่ ไม่เช่นนั้น target จะถึงเร็วเกินไป Restart=on-failure ใช้กับยูนิตแบบ one-shot ได้บน systemd รุ่นค่อนข้างใหม่ และให้โอกาสอุโมงค์อีกครั้งหากครั้งแรกล้ม ถ้าเห็นข้อความว่าค่านี้ถูกเมิน แปลว่า systemd รุ่นเก่า ให้ใช้ตัวจับเวลาตรวจสุขภาพที่อธิบายด้านล่างแทน
อีกเคล็ดลับ การใช้ที่อยู่ IP จริงใน Endpoint ตัดการค้นหาชื่อออกจากจุดที่อาจล้มทั้งหมด ข้อแลกเปลี่ยนคือต้องแก้ไฟล์เมื่อที่อยู่เซิร์ฟเวอร์เปลี่ยน
ผูกบริการอื่นเข้ากับอุโมงค์
หลายครั้งอุโมงค์ไม่ใช่เป้าหมาย แต่เป็นถนนของสิ่งอื่น เช่นโปรแกรมดาวน์โหลด งานสำรองข้อมูล หรือคอนเทนเนอร์ systemd แสดงความสัมพันธ์นี้ได้ เพื่อไม่ให้บริการที่พึ่งพาทำงานโดยไม่มีอุโมงค์ สร้าง drop-in ให้บริการนั้น เช่น sudo systemctl edit mybackup.service
[Unit]
After=wg-quick@wg0.service
BindsTo=wg-quick@wg0.service
After กำหนดลำดับ ส่วน BindsTo แรงกว่า Requires ถ้ายูนิตอุโมงค์หยุดหรือล้ม systemd จะหยุดบริการที่พึ่งพาด้วย ซึ่งทำหน้าที่คล้าย kill switch ระดับบริการเล็ก ๆ เพราะงานนั้นส่งทราฟฟิกผ่านเส้นธรรมดาต่อไม่ได้ขณะอุโมงค์ล่ม ดูภาพกว้างของแนวคิดที่ Kill Switch ของ VPN คืออะไร โปรดสังเกตว่านี่หยุดบริการหนึ่งตัว ไม่ได้บล็อกทุกโปรแกรมในเครื่อง
อ่าน journal
เมื่อมีอะไรล้ม journal คือจุดแรกที่ควรดู คำสั่งเหล่านี้ครอบคลุมเกือบทุกกรณี
journalctl -u wg-quick@wg0 -bแสดงทุกอย่างที่ยูนิตบันทึกตั้งแต่บูตล่าสุดjournalctl -u wg-quick@wg0 -fติดตามบรรทัดใหม่สด ๆ ขณะรีสตาร์ทบริการอีกเทอร์มินัลjournalctl -u wg-quick@wg0 --since "10 min ago"จำกัดช่วงเวลาsystemctl status wg-quick@wg0 -lพิมพ์บรรทัดท้ายพร้อมสถานะการออก
ข้อความทั่วไปและความหมาย
| ข้อความหรืออาการ | สาเหตุที่น่าจะเป็น | วิธีแก้ |
|---|---|---|
Name or service not known |
Endpoint ยัง resolve ไม่ได้ | จัดลำดับหลัง network-online หรือใช้ IP |
RTNETLINK answers: File exists |
อินเทอร์เฟซหรือเส้นทางมีอยู่แล้ว | หยุดเซสชัน wg-quick ที่เปิดด้วยมือก่อน |
resolvconf: command not found |
มีบรรทัด DNS = แต่ไม่มีเครื่องมือ resolver |
ติดตั้งตัวให้ resolvconf หรือเอาบรรทัดออก |
| ยูนิต active แต่ไม่มี handshake | คีย์ผิด พอร์ตผิด หรือ UDP ถูกบล็อก | เทียบ public key ตรวจไฟร์วอลล์และพอร์ต |
Configuration file ... is world accessible |
สิทธิ์ไฟล์เปิดกว้างเกินไป | chmod 600 ไฟล์ |
รีโหลดโดยไม่รื้ออุโมงค์
การรีสตาร์ทยูนิตตัดทุกการเชื่อมต่อที่ใช้อุโมงค์ สำหรับการแก้ทั่วไป เช่นเพิ่ม peer หรือเปลี่ยนช่วงที่อนุญาต WireGuard ใช้ส่วนต่างสดได้ รูปแบบที่ใช้บ่อยคือ
sudo wg syncconf wg0 <(sudo wg-quick strip wg0)
wg-quick strip ตัดบรรทัดเฉพาะของ wg-quick เช่น Address, DNS และ PostUp ทิ้ง เหลือค่า WireGuard ล้วนที่ wg syncconf เข้าใจ เซสชันเดิมดำเนินต่อและเปลี่ยนเฉพาะส่วนที่ต่าง สิ่งที่ wg-quick จัดการเอง คือที่อยู่ เส้นทาง DNS และ hook ยังต้อง systemctl restart ถ้าอยากให้ systemctl reload ทำเรื่องนี้ ให้เพิ่ม drop-in ที่มีบรรทัด ExecReload= รันคำสั่งข้างต้นผ่าน /bin/bash -c

ตัวจับเวลาตรวจสุขภาพเล็ก ๆ
อุโมงค์อาจเงียบไปโดยไม่มีบริการไหนล้ม เช่นหลังโน้ตบุ๊กตื่นบนเครือข่ายอื่น ตัวจับเวลาง่าย ๆ สังเกตและรีสตาร์ทอุโมงค์ได้ สร้าง /etc/systemd/system/wg-check.service
[Unit]
Description=Check WireGuard tunnel
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'ping -c 2 -W 3 10.8.0.1 || systemctl restart wg-quick@wg0'
และ /etc/systemd/system/wg-check.timer
[Unit]
Description=Run the WireGuard check every minute
[Timer]
OnBootSec=2min
OnUnitActiveSec=1min
[Install]
WantedBy=timers.target
เปลี่ยน 10.8.0.1 เป็นที่อยู่ที่ตอบเฉพาะผ่านอุโมงค์ เช่นที่อยู่ภายในของ peer เปิดใช้ด้วย sudo systemctl enable --now wg-check.timer การรีสตาร์ทอุโมงค์ทำให้การเชื่อมต่อที่เปิดอยู่สะดุด จึงควรตั้งช่วงเวลาให้กว้างพอและเลือกวิธีตรวจที่เชื่อถือได้ ping อาจล้มได้เมื่อเซิร์ฟเวอร์บล็อก ICMP ซึ่งในกรณีนั้นให้ใช้วิธีตรวจแบบอื่น
ทางเลือกแบบเนทีฟ systemd-networkd
ถ้าเซิร์ฟเวอร์ของคุณใช้ systemd-networkd อยู่แล้ว คุณอธิบาย WireGuard ในไฟล์ชุดเดียวกับทุกอย่างและข้าม wg-quick ได้ สร้าง /etc/systemd/network/50-wg0.netdev
[NetDev]
Name=wg0
Kind=wireguard
[WireGuard]
PrivateKeyFile=/etc/systemd/network/wg0.key
ListenPort=51820
[WireGuardPeer]
PublicKey=PEER_PUBLIC_KEY
Endpoint=203.0.113.10:51820
AllowedIPs=10.8.0.0/24
PersistentKeepalive=25
และ /etc/systemd/network/50-wg0.network
[Match]
Name=wg0
[Network]
Address=10.8.0.2/24
ให้ไฟล์คีย์อ่านได้เฉพาะ root และกลุ่ม systemd-network เช่นสิทธิ์ 0640 เจ้าของ root:systemd-network ใช้ด้วย sudo networkctl reload และตรวจด้วย networkctl status wg0 กับ wg show เส้นทางแบบ networkd ไม่รัน shell hook แบบ PostUp ดังนั้นของเสริมอย่างกฎไฟร์วอลล์ควรอยู่ในยูนิตแยก สำหรับการตั้งค่า full tunnel ให้ศึกษาตัวเลือกเรื่อง firewall mark และตาราง route ในคู่มือ systemd.netdev และ systemd.network ก่อนพึ่งพา
ข้อผิดพลาดที่พบบ่อย
- รัน
wg-quick upด้วยมือพร้อมกับยูนิต systemd - ปล่อยให้ config อ่านได้ทุกคน
- เข้าใจว่า
active (exited)คือความล้มเหลว สำหรับยูนิตนี้มันคือสถานะปกติที่ดี - แก้ไฟล์ยูนิตของแพ็กเกจโดยตรงแทนที่จะใช้
systemctl edit - ลืม
daemon-reloadหลังแก้ยูนิต - ใช้ endpoint แบบชื่อโฮสต์โดยไม่มีลำดับรอเครือข่าย
- ใช้ช่วงที่อยู่ส่วนตัวที่ชนกับเครือข่ายที่บ้าน ให้เลือกบล็อกอื่นจาก RFC 1918
สรุป
การรัน WireGuard เป็นบริการ systemd ให้การเริ่มตอนบูต ลำดับหลังเครือข่าย บันทึกใน journal และความสัมพันธ์ที่ชัดเจนสำหรับบริการที่พึ่งพามัน ใช้ wg-quick@ชื่อ เพื่อความง่าย ใช้ drop-in จัดลำดับและรีสตาร์ท ใช้ wg syncconf เมื่อแก้สด และใช้ journalctl เพื่อเข้าใจความล้มเหลว สำหรับเซิร์ฟเวอร์ที่อยู่ใน systemd-networkd อยู่แล้ว ไฟล์เนทีฟช่วยเก็บทุกอย่างไว้ด้วยกัน
หากต้องการแอปสำเร็จรูปบน Linux คู่มือติดตั้งบน Linux อธิบายการติดตั้ง VPNclient ฟรี และ หน้าราคา แสดงตัวเลือกที่มี
คำถามที่พบบ่อย
wg-quick@wg0 ในคำสั่ง systemctl หมายความว่าอะไร
wg-quick@.service เป็นยูนิตแบบแม่แบบ ข้อความหลังเครื่องหมาย @ คือชื่อไฟล์ config ดังนั้น wg-quick@wg0 จะอ่าน /etc/wireguard/wg0.conf และสร้างอินเทอร์เฟซ wg0 ส่วนไฟล์ office.conf จะควบคุมด้วย wg-quick@office
ทำให้ WireGuard เริ่มทำงานตอนบูตได้อย่างไร
รัน sudo systemctl enable --now wg-quick@wg0 ส่วน enable สร้างลิงก์สำหรับตอนบูต ส่วน now สั่งเริ่มทันที ตรวจด้วย systemctl is-enabled wg-quick@wg0 และ wg show
แก้ config โดยไม่ตัดอุโมงค์ได้ไหม
ได้สำหรับการเปลี่ยน peer และคีย์ส่วนใหญ่ ใช้ wg syncconf wg0 กับผลลัพธ์ของ wg-quick strip wg0 ซึ่งใช้เฉพาะส่วนที่ต่างโดยไม่รื้ออินเทอร์เฟซ แต่การเปลี่ยนที่อยู่ เส้นทาง และ DNS ยังต้องรีสตาร์ททั้งตัว
ทำไมบริการล้มตอนบูตแต่เริ่มทีหลังด้วยมือแล้วใช้ได้
มักเพราะเริ่มก่อนที่เครือข่ายจะพร้อม หรือ resolve ชื่อโฮสต์ใน Endpoint ไม่ได้ ให้จัดลำดับหลัง network-online.target ด้วย drop-in หรือใช้ที่อยู่ IP จริงเป็น endpoint
ควรใช้ wg-quick หรือ systemd-networkd
wg-quick ง่ายกว่าและคู่มือส่วนใหญ่อิงตัวนี้ ส่วน systemd-networkd เก็บทุกอย่างไว้ในไฟล์ชุดเดียวกับการตั้งค่าเครือข่ายอื่น เหมาะกับเซิร์ฟเวอร์และระบบที่ตั้งค่าตายตัว เลือกอย่างใดก็ได้ แต่อย่าใช้ทั้งสองกับอินเทอร์เฟซเดียวกัน
แหล่งอ้างอิง
เกี่ยวกับผู้เขียน

Bob Kanokphon Thongdee
- ผู้ก่อตั้ง XPASS VPN
- ผู้ร่วมก่อตั้ง eSIMonline.asia
- ประสบการณ์ด้านการตลาดออนไลน์มากกว่า 7 ปี
- ผู้ก่อตั้ง Cojourney Visa และ Cojourney Travel
ต้องใช้ VPN ช่วงเดินทางหรือช่วงงานยุ่ง?
XPASS ขายแพ็กเกจแบบเติมเงินตามจำนวนวัน จ่ายครั้งเดียว ไม่มีการต่ออายุอัตโนมัติ
ดูแพ็กเกจอ่านต่อ

ความปลอดภัยของ VPN
WireGuard กับ OpenVPN ต่างกันอย่างไร
WireGuard และ OpenVPN สร้างอุโมงค์เข้ารหัสเหมือนกัน แต่ต่างกันที่การออกแบบ ความซับซ้อน และความยืดหยุ่น บทความนี้เปรียบเทียบให้เข้าใจง่าย
อ่าน 9 นาที

พื้นฐาน VPN
โปรโตคอล VPN คืออะไร
โปรโตคอล VPN กำหนดกฎว่าอุปกรณ์และเซิร์ฟเวอร์ VPN เชื่อมต่อและปกป้องข้อมูลอย่างไร นี่คือความหมายแบบเข้าใจง่าย พร้อมข้อแลกเปลี่ยนสำคัญ
อ่าน 9 นาที

แก้ปัญหา
ทดสอบ WireGuard ต้องวัดค่าอะไรบ้าง
ปริมาณข้อมูลเป็นเพียงหนึ่งในหกสิ่งที่ควรวัดบนอุโมงค์ WireGuard บทความนี้มีวิธีทดสอบที่ทำซ้ำได้ ตัวอย่างคำนวณ และกับดักที่ทำให้ผลเพี้ยน
อ่าน 10 นาที

ความปลอดภัยของ VPN
VPN Kill Switch คืออะไร
Kill switch ช่วยไม่ให้อุปกรณ์ของคุณใช้การเชื่อมต่อที่ไม่มีการป้องกันอย่างเงียบ ๆ เมื่อ VPN หลุด บทความนี้อธิบายหลักการและวิธีตรวจสอบ
อ่าน 12 นาที

แก้ปัญหา
VPN เชื่อมต่อไม่ได้ แก้ได้ทีละขั้น
ลำดับการตรวจที่ชัดเจนเมื่อ VPN เชื่อมต่อไม่ได้ ตั้งแต่สถานะพาส ข้อมูลล็อกอิน Wi-Fi และเน็ตมือถือ สิทธิ์ของแอป ไฟร์วอลล์ แอปที่ชนกัน ไปจนถึงข้อความผิดพลาด
อ่าน 8 นาที