#การตั้งค่า IP Address บน CentOS ด้วย nmcli

การตั้งค่า IP Address เป็นงานพื้นฐานที่ผู้ดูแลระบบ Linux ควรรู้ โดยเฉพาะเมื่อต้องเตรียม Web Server, Database Server, Docker Host หรือ Kubernetes Node ที่ต้องมีหมายเลข IP คงที่

บทความนี้อธิบายการตั้งค่าเครือข่ายบน CentOS Stream 9/10 ด้วย nmcli ซึ่งเป็นเครื่องมือแบบ Command Line สำหรับควบคุม NetworkManager วิธีนี้สามารถใช้กับ CentOS 8 และระบบตระกูล RHEL รุ่นใหม่ได้ด้วย

ข้อควรระวัง: หากกำลังเชื่อมต่อเซิร์ฟเวอร์ผ่าน SSH การเปลี่ยน IP, Gateway หรือ Network Profile อาจทำให้การเชื่อมต่อหลุด ควรมี Console ของผู้ให้บริการ Cloud, KVM หรือหน้าเครื่องสำหรับกู้คืนระบบ

#สิ่งที่ต้องเตรียม

ตัวอย่างในบทความจะใช้ข้อมูลต่อไปนี้

รายการ ค่าตัวอย่าง
Network Interface ens160
Connection Profile System ens160
IP Address 192.168.1.100/24
Default Gateway 192.168.1.1
DNS Server 1.1.1.1, 8.8.8.8

ให้เปลี่ยนค่าตัวอย่างให้ตรงกับเครือข่ายจริงก่อนใช้คำสั่ง

#1. ตรวจสอบเวอร์ชันของ CentOS

cat /etc/centos-release

หรือ

cat /etc/os-release

#2. ตรวจสอบ Network Interface

แสดงสถานะอุปกรณ์เครือข่ายทั้งหมด

nmcli device status

ตัวอย่างผลลัพธ์

DEVICE   TYPE      STATE      CONNECTION
ens160   ethernet  connected  System ens160
lo       loopback  connected  lo

ในตัวอย่างนี้

  • ชื่อ Network Interface คือ ens160
  • ชื่อ Connection Profile คือ System ens160

ชื่อของ Interface อาจเป็น ens160, ens33, enp0s3, eth0 หรือชื่ออื่น ขึ้นอยู่กับเครื่องและระบบ Virtualization

ตรวจสอบ Connection Profile เพิ่มเติมได้ด้วยคำสั่ง

nmcli connection show

DEVICE และ CONNECTION อาจมีชื่อไม่เหมือนกัน คำสั่ง nmcli connection modify ต้องระบุ ชื่อ Connection Profile ไม่ใช่ชื่อ Interface เสมอไป

#3. ตรวจสอบ IP Address ปัจจุบัน

ip address show

ตรวจสอบเฉพาะ Interface ที่ต้องการ

ip address show ens160

ตรวจสอบ Default Gateway

ip route

ตรวจสอบรายละเอียดที่ NetworkManager ใช้งาน

nmcli device show ens160

#4. ตั้งค่า Static IPv4

สมมติว่าชื่อ Connection Profile คือ System ens160 ให้ใช้คำสั่งต่อไปนี้

sudo nmcli connection modify "System ens160" \
  ipv4.method manual \
  ipv4.addresses 192.168.1.100/24 \
  ipv4.gateway 192.168.1.1 \
  ipv4.dns "1.1.1.1 8.8.8.8"

ความหมายของค่าที่กำหนด

Property ความหมาย
ipv4.method manual ใช้ IPv4 แบบ Static
ipv4.addresses IP Address และ Prefix Length
ipv4.gateway Default Gateway
ipv4.dns DNS Server หนึ่งรายการหรือมากกว่า

ค่า /24 เทียบเท่ากับ Subnet Mask 255.255.255.0

หากต้องการให้ใช้เฉพาะ DNS ที่กำหนดและไม่รับ DNS อัตโนมัติจาก DHCP ให้เพิ่มคำสั่ง

sudo nmcli connection modify "System ens160" ipv4.ignore-auto-dns yes

#5. เปิดใช้งานค่าที่แก้ไข

sudo nmcli connection up "System ens160"

การเปิด Connection Profile ใหม่อาจทำให้ SSH หลุด หากเปลี่ยน IP Address ต้องเชื่อมต่อกลับด้วย IP ใหม่

ตรวจสอบสถานะ NetworkManager

sudo systemctl status NetworkManager

หาก NetworkManager ยังไม่ทำงาน ให้เปิดใช้งานด้วยคำสั่ง

sudo systemctl enable --now NetworkManager

โดยทั่วไปไม่จำเป็นต้อง Restart NetworkManager ทั้ง Service เพราะ nmcli connection up สามารถนำค่าของ Connection Profile มาใช้ได้โดยตรง

#6. ตรวจสอบผลลัพธ์

ตรวจสอบ IP Address

ip -4 address show ens160

ตรวจสอบ Routing Table

ip route

ตรวจสอบค่าจาก NetworkManager

nmcli connection show "System ens160"

ทดสอบเชื่อมต่อ Default Gateway

ping -c 4 192.168.1.1

ทดสอบเชื่อมต่ออินเทอร์เน็ตโดยไม่พึ่ง DNS

ping -c 4 1.1.1.1

ทดสอบ DNS

getent hosts example.com

หาก ping 1.1.1.1 สำเร็จ แต่ getent hosts example.com ไม่แสดงผล ปัญหามักเกี่ยวข้องกับ DNS

#7. เปลี่ยนกลับเป็น DHCP

หากต้องการให้ระบบรับ IP Address, Gateway และ DNS จาก DHCP Server อัตโนมัติ ให้ใช้คำสั่งต่อไปนี้

sudo nmcli connection modify "System ens160" \
  ipv4.method auto \
  ipv4.addresses "" \
  ipv4.gateway "" \
  ipv4.dns "" \
  ipv4.ignore-auto-dns no

จากนั้นเปิด Connection Profile ใหม่

sudo nmcli connection up "System ens160"

#8. สร้าง Connection Profile ใหม่

กรณี Interface ยังไม่มี Connection Profile สามารถสร้างใหม่ได้ดังนี้

sudo nmcli connection add \
  type ethernet \
  ifname ens160 \
  con-name static-ens160 \
  ipv4.method manual \
  ipv4.addresses 192.168.1.100/24 \
  ipv4.gateway 192.168.1.1 \
  ipv4.dns "1.1.1.1 8.8.8.8"

เปิดใช้งาน Connection Profile

sudo nmcli connection up static-ens160

ตั้งค่าให้เชื่อมต่ออัตโนมัติเมื่อบูตเครื่อง

sudo nmcli connection modify static-ens160 connection.autoconnect yes

หาก Interface เดียวกันมีหลาย Profile ควรตรวจสอบว่า Profile ใดถูกเปิดใช้งานอยู่ เพื่อป้องกันการใช้ค่าผิดชุด

nmcli --fields NAME,TYPE,DEVICE,AUTOCONNECT connection show

#9. ตั้งค่าด้วย nmtui

ผู้ที่ไม่สะดวกใช้คำสั่งยาวสามารถใช้ Text User Interface ของ NetworkManager ได้

sudo nmtui

จากนั้นดำเนินการดังนี้

  1. เลือก Edit a connection
  2. เลือก Connection Profile ที่ต้องการ
  3. เปลี่ยน IPv4 CONFIGURATION เป็น Manual
  4. กำหนด Address, Gateway และ DNS Server
  5. เลือก OK และกลับไปหน้าแรก
  6. เลือก Activate a connection แล้วเปิด Connection Profile ใหม่

ตรวจสอบผลลัพธ์ด้วย ip address, ip route และ nmcli device show

#10. การตั้งค่า IP ชั่วคราวด้วยคำสั่ง ip

คำสั่ง ip สามารถเพิ่ม IP Address ให้ Interface ได้ทันที

sudo ip address add 192.168.1.100/24 dev ens160

เพิ่มหรือเปลี่ยน Default Route

sudo ip route replace default via 192.168.1.1 dev ens160

อย่างไรก็ตาม ค่าที่ตั้งด้วยวิธีนี้อาจหายเมื่อ Restart NetworkManager หรือรีบูตเครื่อง จึงเหมาะสำหรับการทดลองหรือแก้ปัญหาชั่วคราว หากต้องการค่าถาวรควรตั้งผ่าน nmcli

#11. ตำแหน่งไฟล์ Configuration

ใน CentOS Stream รุ่นใหม่ NetworkManager จัดเก็บ Connection Profile แบบ Keyfile ไว้ที่

/etc/NetworkManager/system-connections/

ไฟล์เหล่านี้อาจมีข้อมูลสำคัญและมี Permission จำกัด ไม่ควรแก้ไขด้วย Text Editor หากไม่จำเป็น การใช้ nmcli ช่วยลดความผิดพลาดและทำให้ NetworkManager รับรู้การเปลี่ยนแปลงอย่างถูกต้อง

หากมีการแก้ไฟล์ด้วยตนเอง ต้องสั่งให้ NetworkManager โหลด Connection Profile ใหม่

sudo nmcli connection reload

จากนั้นจึงเปิด Profile ที่ต้องการ

sudo nmcli connection up "System ens160"

#หมายเหตุสำหรับ CentOS 7

CentOS 7 สามารถใช้ nmcli ได้เช่นกัน แต่ระบบเดิมจำนวนมากอาจยังจัดเก็บค่าที่ไฟล์ลักษณะนี้

/etc/sysconfig/network-scripts/ifcfg-ens160

หาก NetworkManager ทำงานอยู่ แนะนำให้ใช้ nmcli เป็นหลัก เพื่อหลีกเลี่ยงความไม่สอดคล้องระหว่างค่าที่แก้ในไฟล์กับ Connection Profile ที่กำลังใช้งาน

CentOS Linux 7 สิ้นสุดระยะการสนับสนุนทั่วไปแล้ว จึงควรวางแผนอัปเกรดไปยังระบบที่ยังได้รับการอัปเดตด้านความปลอดภัย

#การแก้ปัญหาเบื้องต้น

#ปัญหา: ระบุชื่อ Connection ผิด

ตรวจสอบชื่อที่ถูกต้องด้วยคำสั่ง

nmcli connection show

แล้วนำค่าจากคอลัมน์ NAME ไปใช้กับ nmcli connection modify และ nmcli connection up

#ปัญหา: Connection Profile ไม่ผูกกับ Interface

sudo nmcli connection modify "System ens160" connection.interface-name ens160
sudo nmcli connection up "System ens160"

#ปัญหา: มี IP Address ซ้ำในเครือข่าย

ตรวจสอบว่า IP ที่กำหนดไม่ถูกอุปกรณ์อื่นใช้งาน และควรกำหนด Static IP นอกช่วงที่ DHCP Server แจกอัตโนมัติ หรือทำ DHCP Reservation ให้เครื่องนั้น

#ปัญหา: ติดต่อเครื่องในวง LAN ได้ แต่ออกอินเทอร์เน็ตไม่ได้

ตรวจสอบ Default Gateway

ip route

ควรมีรายการลักษณะดังนี้

default via 192.168.1.1 dev ens160

#ปัญหา: ติดต่อด้วย IP ได้ แต่เปิดชื่อโดเมนไม่ได้

ตรวจสอบ DNS ที่ NetworkManager ส่งให้ระบบ

nmcli device show ens160 | grep -E 'IP4.DNS|IP6.DNS'

จากนั้นทดสอบ Resolve ชื่อโดเมน

getent hosts example.com

#ปัญหา: Firewall ปิดกั้น Service

การเปลี่ยน IP สำเร็จไม่ได้หมายความว่า Service ทุกตัวจะเข้าถึงได้ ตรวจสอบ Firewall ด้วยคำสั่ง

sudo firewall-cmd --state
sudo firewall-cmd --list-all

ตัวอย่างการอนุญาต SSH แบบถาวร

sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload

#คำสั่งสรุปสำหรับตั้ง Static IP

# 1. ตรวจสอบชื่อ Interface และ Connection Profile
nmcli device status
nmcli connection show

# 2. กำหนด Static IP
sudo nmcli connection modify "System ens160" \
  ipv4.method manual \
  ipv4.addresses 192.168.1.100/24 \
  ipv4.gateway 192.168.1.1 \
  ipv4.dns "1.1.1.1 8.8.8.8"

# 3. เปิดใช้งานค่าที่แก้ไข
sudo nmcli connection up "System ens160"

# 4. ตรวจสอบผลลัพธ์
ip -4 address show ens160
ip route
getent hosts example.com

#สรุป

การตั้งค่า IP บน CentOS Stream ควรจัดการผ่าน NetworkManager โดยใช้ nmcli เพราะสามารถกำหนด Static IP, DHCP, Gateway และ DNS ได้อย่างเป็นระบบ และค่าจะคงอยู่หลังรีบูต สิ่งสำคัญที่สุดคือการตรวจสอบชื่อ Connection Profile ให้ถูกต้อง เตรียมช่องทาง Console สำรองเมื่อแก้ไขผ่าน SSH และทดสอบทั้ง IP, Route และ DNS หลังเปลี่ยนค่า

#แหล่งข้อมูลเพิ่มเติม