คำตอบสั้น ๆ: ตั้งค่า Netplan บน Ubuntu Server กำหนด IP คงที่ Gateway และ DNS เพิ่มการ์ดเครือข่ายภายใน ทดสอบด้วย netplan try ที่ย้อนค่ากลับเอง และกัน cloud-init เขียนทับ
คู่มือนี้อธิบาย Netplan ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
Netplan คือระบบตั้งค่าเครือข่ายของ Ubuntu Server ตั้งแต่รุ่น 18.04 เป็นต้นมา ผู้ดูแลเขียนค่าการ์ดเครือข่ายเป็นไฟล์ YAML ใน /etc/netplan/ แล้วระบบจะแปลงเป็นคอนฟิกของ systemd-networkd (บนเซิร์ฟเวอร์) หรือ NetworkManager (บนเดสก์ท็อป) ให้เอง ไฟล์ /etc/network/interfaces แบบเดิมจึงไม่มีผลบน Ubuntu รุ่นใหม่อีกแล้ว
คู่มือนี้เหมาะกับผู้ดูแล Ubuntu Server บนคลาวด์ที่ต้องกำหนด IP แบบคงที่ เพิ่มการ์ดเครือข่ายภายใน (private network) เปลี่ยน DNS หรือแก้ปัญหาค่าที่ตั้งไว้หายหลังรีบูต เมื่อทำครบ คุณจะเขียนไฟล์ Netplan ที่ถูกต้อง ทดสอบด้วย netplan try ซึ่งย้อนค่ากลับเองถ้าเครือข่ายหลุด และกันไม่ให้ cloud-init เขียนทับค่าของคุณ
สิ่งที่ต้องเตรียม
- Ubuntu Server 22.04 ขึ้นไป รูปแบบไฟล์ในคู่มือนี้ใช้ได้กับ Netplan ที่มากับ Ubuntu 22.04 และ 24.04
- ค่าเครือข่ายที่ถูกต้องจากผู้ให้บริการ ได้แก่ IP, ขนาด subnet (เช่น /24), Gateway และ DNS บนคลาวด์ต้องใช้ IP ที่ระบบกำหนดให้เครื่องนั้นเท่านั้น ระบบคลาวด์ส่วนใหญ่ทิ้งแพ็กเก็ตจาก IP ที่ไม่ได้ผูกกับการ์ดเครือข่าย
- ทางเข้าเครื่องที่ไม่ผ่านเครือข่าย เช่น Console ผ่าน Web UI เพราะถ้าตั้งค่าผิด SSH จะหลุดทันที
- สิทธิ์ root หรือ sudo
ขั้นตอนที่ 1: ดูค่าเครือข่ายปัจจุบันและไฟล์ Netplan ที่มีอยู่
จดค่าที่ใช้งานได้อยู่ตอนนี้ไว้ก่อนแก้ทุกครั้ง เพื่อใช้เทียบและย้อนกลับ
ip -br addr
ip -br link
ip route show default
resolvectl status | grep -A3 "Link"
ls -l /etc/netplan/
sudo cat /etc/netplan/*.yaml
จาก ip -br link ให้จดชื่อการ์ด เช่น ens3 หรือ enp1s0 และ MAC address ของแต่ละการ์ด ถ้ามีไฟล์ 50-cloud-init.yaml และบรรทัดแรกเขียนว่าไฟล์นี้สร้างจากข้อมูลของ datasource แปลว่า cloud-init เป็นผู้สร้าง และจะเขียนทับไฟล์นี้ได้เมื่อมีการรีบูตหรือเปลี่ยนค่าบนแพลตฟอร์ม ระบบอ่านทุกไฟล์ในโฟลเดอร์ตามลำดับชื่อ ไฟล์ที่ชื่อมาทีหลังมีผลทับค่าที่ซ้ำกัน
ขั้นตอนที่ 2: สำรองไฟล์และหยุดไม่ให้ cloud-init เขียนทับ
สำรองไฟล์เดิมไว้นอกโฟลเดอร์ /etc/netplan/ เพราะทุกไฟล์ที่ลงท้ายด้วย .yaml ในโฟลเดอร์นั้นถูกอ่านทั้งหมด ในโฟลเดอร์นั้น ถ้าเก็บสำเนาไว้ข้างกันจะถูกนำมาใช้ด้วย
sudo mkdir -p /root/netplan-backup
sudo cp -a /etc/netplan/*.yaml /root/netplan-backup/
ถ้าต้องการตั้งค่าเครือข่ายเองแบบถาวร ให้บอก cloud-init ว่าไม่ต้องจัดการเครือข่ายอีก โดยสร้างไฟล์ตามที่ cloud-init แนะนำไว้ในหัวไฟล์ของมันเอง
echo 'network: {config: disabled}' | sudo tee /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
ข้อควรระวัง เมื่อปิดส่วนนี้แล้ว ถ้าภายหลังมีการเปลี่ยน IP หรือเพิ่มการ์ดจากพอร์ทัลของผู้ให้บริการ ระบบจะไม่ปรับไฟล์ให้อัตโนมัติ คุณต้องแก้ไฟล์ YAML เองทุกครั้ง ถ้าเครื่องได้ IP จาก DHCP อยู่แล้วและไม่ต้องการเปลี่ยน ไม่จำเป็นต้องทำขั้นตอนนี้
ขั้นตอนที่ 3: เขียนไฟล์ Netplan สำหรับ IP คงที่
สร้างไฟล์ใหม่ /etc/netplan/60-static.yaml แล้วย้ายไฟล์ของ cloud-init ออกไปเก็บไว้ (ถ้าทำขั้นตอนที่ 2 แล้ว) เพื่อไม่ให้มีสองไฟล์กำหนดการ์ดเดียวกัน YAML ใช้การเว้นวรรคแสดงโครงสร้าง ห้ามใช้ Tab และต้องเว้นวรรคให้ตรงระดับทุกบรรทัด
network:
version: 2
renderer: networkd
ethernets:
ens3:
match:
macaddress: "52:54:00:12:34:56"
set-name: ens3
dhcp4: false
addresses:
- 203.0.113.10/24
routes:
- to: default
via: 203.0.113.1
nameservers:
addresses: [1.1.1.1, 8.8.8.8]
search: [example.com]
ใช้ routes กับ to: default แทน gateway4 แบบเก่า ซึ่งรุ่นใหม่แจ้งว่าเลิกใช้แล้ว การใส่ match ด้วย MAC address ช่วยให้ชื่อการ์ดไม่สลับกันเมื่อเพิ่มการ์ดใหม่ จากนั้นตั้งสิทธิ์ไฟล์ให้อ่านได้เฉพาะ root เพราะ Netplan รุ่นใหม่ เช่นใน Ubuntu 24.04 จะเตือน Permissions for /etc/netplan/60-static.yaml are too open ถ้าคนอื่นอ่านไฟล์ได้
sudo mv /etc/netplan/50-cloud-init.yaml /root/netplan-backup/50-cloud-init.yaml.disabled
sudo chmod 600 /etc/netplan/60-static.yaml
sudo netplan generate
netplan generate ตรวจไวยากรณ์และแปลงไฟล์โดยยังไม่ใช้ค่าจริง ถ้ามีข้อผิดพลาดจะบอกชื่อไฟล์ บรรทัด และคอลัมน์ เช่น 60-static.yaml:9:7: Error in network definition ให้แก้จนคำสั่งนี้ไม่มีข้อความผิดพลาด รายการคีย์ทั้งหมดดูได้ที่ YAML configuration reference ของ Netplan
ขั้นตอนที่ 4: ทดสอบด้วย netplan try ก่อนใช้จริง
รันคำสั่งนี้จาก Console ไม่ใช่จาก SSH ถ้าเป็นไปได้ netplan try จะใช้ค่าใหม่ทันทีแล้วรอให้คุณกด Enter ยืนยันภายใน 120 วินาที (ค่าเริ่มต้น) ถ้าไม่กด เช่น เพราะ SSH หลุดไปแล้ว ระบบจะย้อนกลับเป็นค่าเดิมให้เอง
sudo netplan try --timeout 120
ระหว่างรอ ให้เปิดหน้าต่าง SSH ใหม่ไปที่ IP ใหม่ หรือทดสอบ ping -c 3 203.0.113.1 จาก Console ถ้าเชื่อมต่อได้จึงกด Enter ยืนยัน แล้วใช้ค่าให้ถาวรด้วย sudo netplan apply การย้อนกลับอัตโนมัติไม่ครอบคลุมทุกกรณี เช่น การสร้างหรือลบ bond และ bridge ซึ่งอาจค้างอยู่หลังย้อนกลับ งานลักษณะนั้นควรทำจาก Console และเตรียมรีบูตไว้