Netplan: ตั้งค่า IP, Gateway และ DNS บน Ubuntu Server

ตั้งค่า Netplan บน Ubuntu Server กำหนด IP คงที่ Gateway และ DNS เพิ่มการ์ดเครือข่ายภายใน ทดสอบด้วย netplan try ที่ย้อนค่ากลับเอง และกัน cloud-init เขียนทับ

โดย ทีมงาน THAI DATA CLOUD อ่าน 12 นาที

แชร์FacebookXLINELinkedIn
Netplan — Netplan: ตั้งค่า IP, Gateway และ DNS บน Ubuntu Server
Netplan: ตั้งค่า IP, Gateway และ DNS บน Ubuntu Server

คำตอบสั้น ๆ: ตั้งค่า 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
แผนภาพ Netplan อ่านไฟล์ YAML จาก cloud-init และผู้ดูแล แล้วส่งค่าให้ systemd-networkd และ systemd-resolved ตั้งการ์ดสาธารณะและภายใน
ไฟล์ทุกไฟล์ใน /etc/netplan/ ถูกอ่านรวมกัน ไฟล์ของ cloud-init อาจถูกเขียนใหม่ทุกครั้งที่บูต

ขั้นตอนที่ 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 และเตรียมรีบูตไว้

ผลคำสั่ง netplan try ที่รอให้กด Enter ภายใน 120 วินาที ตามด้วย ip -br addr และ default route ที่ตั้งด้วย Netplan
ถ้าไม่กด Enter ภายในเวลาที่กำหนด Netplan จะย้อนกลับเป็นค่าเดิมให้เอง

ขั้นตอนที่ 5: เพิ่มการ์ดเครือข่ายภายใน

เมื่อเพิ่มการ์ดเครือข่ายภายในให้เครื่อง เช่น เพื่อเชื่อมเว็บกับฐานข้อมูลโดยไม่ผ่านอินเทอร์เน็ต ให้เพิ่มการ์ดที่สองในไฟล์ YAML เดิมโดย ไม่ใส่ default route ที่การ์ดนี้ ถ้ามี default route สองเส้น แพ็กเก็ตขาออกจะเลือกทางผิดเป็นช่วง ๆ และอาการจะดูเหมือนเครือข่ายหลุดแบบสุ่ม

    ens4:
      match:
        macaddress: "52:54:00:ab:cd:ef"
      set-name: ens4
      dhcp4: false
      addresses:
        - 10.0.0.11/24
      routes:
        - to: 10.20.0.0/16
          via: 10.0.0.1

วางบล็อกนี้ใต้ ethernets: ระดับเดียวกับ ens3 บล็อก routes จำเป็นเฉพาะเมื่อต้องไปถึง subnet ภายในอื่นผ่านเราเตอร์ ถ้าทุกเครื่องอยู่ใน 10.0.0.0/24 เดียวกันไม่ต้องใส่ ถ้าการ์ดภายในรับ IP จาก DHCP ให้ใช้ dhcp4: true คู่กับ dhcp4-overrides: {use-routes: false, use-dns: false} เพื่อไม่ให้ DHCP แจก default route และ DNS ซ้ำกับการ์ดหลัก

ตารางเปรียบเทียบการตั้งค่า Netplan ของการ์ดสาธารณะและการ์ดเครือข่ายภายใน ทั้ง IP, default route, route เพิ่มเติม, DNS และกรณีใช้ DHCP
default route และ DNS ควรอยู่ที่การ์ดหลักเพียงใบเดียว การ์ดภายในใส่เฉพาะ route ที่จำเป็น

ขั้นตอนที่ 6: ตรวจ DNS ผ่าน systemd-resolved

บน Ubuntu Server ไฟล์ /etc/resolv.conf เป็น symbolic link ไปยัง stub ของ systemd-resolved ซึ่งชี้ไปที่ 127.0.0.53 เสมอ ห้ามแก้ไฟล์นี้ตรง ๆ เพราะจะถูกเขียนทับ ให้กำหนด DNS ใน nameservers ของ Netplan แล้วตรวจผลด้วยคำสั่งเหล่านี้

resolvectl status ens3
resolvectl query example.com
ls -l /etc/resolv.conf

ส่วน Current DNS Server และ DNS Servers ต้องตรงกับที่ตั้งไว้ ถ้ายังเป็นค่าเดิม ให้รัน sudo netplan apply อีกครั้ง การตรวจระเบียน DNS จากภายนอกดูเพิ่มเติมได้ใน คู่มือตรวจสอบ DNS ด้วย nslookup และ dig

ขั้นตอนที่ 7: ยืนยันผลหลังรีบูต

ค่าที่ทดสอบผ่าน netplan try แล้วอาจยังหายหลังรีบูตถ้า cloud-init ยังทำงานอยู่ ให้รีบูตหนึ่งครั้งในช่วงที่กระทบผู้ใช้น้อย แล้วตรวจซ้ำ

sudo reboot
# หลังเครื่องกลับมา
ip -br addr
ip route
sudo netplan get
netplan status

netplan get แสดงค่าที่รวมจากทุกไฟล์แล้ว ใช้ตรวจว่าไม่มีไฟล์อื่นแอบทับค่า ส่วน netplan status มีใน Netplan รุ่นใหม่อย่างของ Ubuntu 24.04 ถ้า 22.04 แจ้งว่าไม่รู้จักคำสั่ง ให้ใช้ networkctl status แทน ถ้า IP, route หรือ DNS ไม่ตรง ให้ดูว่ามีไฟล์ใหม่ใน /etc/netplan/ หรือไม่ และตรวจว่าไฟล์ 99-disable-network-config.cfg ยังอยู่ ถ้าเครือข่ายภายในยังติดต่อกันไม่ได้ ไล่ปัญหาต่อได้ด้วย คู่มือ ping, traceroute และ mtr

เช็กลิสต์ก่อนและหลังแก้ไฟล์ Netplan ตั้งแต่สำรองไฟล์ ตรวจด้วย netplan generate ทดสอบด้วย netplan try จนถึงสิ่งที่ไม่ควรทำ
ทดสอบจาก Console ด้วย netplan try แล้วรีบูตยืนยันหนึ่งครั้ง จึงถือว่าเสร็จ

ปัญหาที่พบบ่อยเกี่ยวกับ Netplan

ตั้ง IP ใน Netplan แล้วหายหลังรีบูตทุกครั้ง แก้อย่างไร?

cloud-init สร้างไฟล์ 50-cloud-init.yaml ใหม่ทุกครั้งที่บูต ถ้าแก้ไฟล์นั้นโดยตรงค่าจะหาย ให้สร้างไฟล์ 99-disable-network-config.cfg ตามขั้นตอนที่ 2 แล้วเก็บค่าไว้ในไฟล์ของคุณเอง

netplan apply แล้ว SSH หลุด กลับมาอย่างไร?

เข้าผ่าน Console แล้วคัดลอกไฟล์จาก /root/netplan-backup กลับมาที่ /etc/netplan/ ลบไฟล์ใหม่ที่ผิด แล้วรัน sudo netplan apply ครั้งหน้าให้ใช้ netplan try แทน apply เพื่อให้ย้อนกลับเองได้

Netplan เตือนว่า gateway4 has been deprecated ต้องแก้หรือไม่?

ควรแก้ ค่าเดิมยังใช้ได้ในตอนนี้ แต่เอกสารแนะนำให้ย้ายไปใช้ routes: - to: default via: … ซึ่งรองรับหลาย route และไม่ขัดกันเมื่อเพิ่มการ์ด

ใส่ DNS ใน Netplan แล้ว แต่ cat /etc/resolv.conf ยังเห็น 127.0.0.53 ผิดหรือไม่?

ไม่ผิด 127.0.0.53 คือ stub ของ systemd-resolved ที่รับคำขอแล้วส่งต่อไปยัง DNS ที่คุณตั้ง ให้ตรวจค่าจริงด้วย resolvectl status

ถ้าต้องการให้ทีมงานช่วยออกแบบเครือข่ายภายในระหว่างเซิร์ฟเวอร์ หรือย้ายค่าเครือข่ายโดยไม่ให้ระบบหยุด ติดต่อทีมงาน THAI DATA CLOUD ได้ และดูบริการเครือข่ายภายในสำหรับเชื่อมหลายเครื่องเข้าด้วยกันได้ที่หน้า Private Network

อ่านเพิ่มเติมเกี่ยวกับ Netplan

แชร์FacebookXLINELinkedIn

มีคำถามเรื่องบริการ? ติดต่อทีมงาน