คำสั่งเครือข่ายใน Linux: ip, ss, ping, traceroute, dig และ curl สำหรับตรวจสอบเครือข่าย
คำสั่งเครือข่ายหลักของ Linux ได้แก่ ip (ที่อยู่ อินเทอร์เฟซ และเส้นทาง), ss (พอร์ตที่เปิดและการเชื่อมต่อ), ping และ traceroute (ตรวจว่าโฮสต์เข้าถึงได้หรือไม่และแพ็กเก็ตวิ่งผ่านเส้นทางใด), dig (ตรวจ DNS) และ curl (ทดสอบบริการ HTTP) การวินิจฉัยควรทำทีละชั้น: อินเทอร์เฟซและที่อยู่, เส้นทาง, DNS, พอร์ต, แอปพลิเคชัน
คำสั่งเครือข่ายใน Linux ครอบคลุมงานตรวจสอบเครือข่ายเกือบทั้งหมดในชีวิตประจำวัน: ip แสดงที่อยู่และเส้นทาง, ss แสดงพอร์ตและการเชื่อมต่อที่เปิดอยู่, ping และ traceroute ตรวจว่าโฮสต์เข้าถึงได้หรือไม่, dig ตรวจ DNS และ curl ตรวจว่าบริการเว็บตอบกลับอย่างไร ด้านล่างเป็นชีตสรุปพร้อมแฟลกซ์ และลำดับขั้นตอนที่ใช้หาสาเหตุเมื่อ «เครือข่ายใช้ไม่ได้»
ชีตสรุป: คำสั่งเครือข่าย Linux ในตารางเดียว
| งาน | คำสั่ง |
|---|---|
| ที่อยู่ IP ของทุกอินเทอร์เฟซ | ip -br addr |
| สถานะอินเทอร์เฟซ (UP/DOWN) | ip -br link |
| ตารางเส้นทาง | ip route |
| แพ็กเก็ตถึงปลายทางผ่านเกตเวย์ใด | ip route get 8.8.8.8 |
| เพื่อนบ้านในเครือข่าย (ตาราง ARP) | ip neigh |
| พอร์ตที่กำลังรับการเชื่อมต่อและโปรเซสที่ใช้งาน | sudo ss -tulpn |
| การเชื่อมต่อ TCP ที่สร้างแล้ว | ss -tn state established |
| ตรวจว่าโฮสต์เข้าถึงได้หรือไม่ | ping -c 4 example.com |
| เส้นทางของแพ็กเก็ตไปยังโฮสต์ | traceroute example.com, mtr example.com |
| แปลงชื่อเป็นที่อยู่ IP | dig +short example.com |
| ถาม DNS เซิร์ฟเวอร์ที่กำหนด | dig @1.1.1.1 example.com |
| ตรวจคำตอบ HTTP | curl -I https://example.com |
| รายละเอียดการเชื่อมต่อและ TLS | curl -v https://example.com |
| พอร์ต TCP เปิดอยู่หรือไม่ | nc -zv host 443 |
| ชื่อโฮสต์ | hostnamectl, hostname -I |
ip: ที่อยู่ อินเทอร์เฟซ และเส้นทาง
คำสั่ง ip จากแพ็กเกจ iproute2 เข้ามาแทนที่ ifconfig และ route ที่เลิกใช้แล้ว คำสั่งย่อยพิมพ์สั้นได้: ip a เท่ากับ ip addr และ ip r เท่ากับ ip route แฟลก -br ให้ผลลัพธ์แบบย่อ และ -c ใส่สี
$ ip -br addr
lo UNKNOWN 127.0.0.1/8 ::1/128
eth0 UP 192.168.1.25/24 fe80::a00:27ff:fe4e:66a1/64
docker0 DOWN 172.17.0.1/16
ถ้าอินเทอร์เฟซไม่มีที่อยู่ในเครือข่ายที่ต้องการ หรืออยู่ในสถานะ DOWN ก็ไม่ต้องหาต่อในชั้นอื่น ปัญหาอยู่ที่ชั้นนี้แล้ว
วิธีเพิ่ม IP และเปิดอินเทอร์เฟซ
sudo ip link set eth0 up
sudo ip addr add 192.168.1.50/24 dev eth0
sudo ip addr del 192.168.1.50/24 dev eth0
การเปลี่ยนแปลงด้วย ip มีผลจนกว่าจะรีบูต หากต้องการค่าถาวรให้ตั้งค่าในระบบ: netplan บน Ubuntu, NetworkManager (nmcli) บน Fedora และ RHEL, systemd-networkd บนเซิร์ฟเวอร์
เส้นทางและเกตเวย์เริ่มต้น
$ ip route
default via 192.168.1.1 dev eth0 proto dhcp metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.25
$ ip route get 10.20.0.5
10.20.0.5 via 192.168.1.1 dev eth0 src 192.168.1.25 uid 1000
บรรทัด default via คือเกตเวย์ที่ทุกอย่างที่ไม่ตรงกับเส้นทางที่เจาะจงกว่าจะถูกส่งไป ถ้าไม่มีบรรทัดนี้ อินเทอร์เน็ตจะใช้ไม่ได้ แม้เครือข่ายภายในจะยังทำงานอยู่ เพิ่มเส้นทางได้ด้วย: sudo ip route add 10.20.0.0/16 via 192.168.1.254
ss: พอร์ตไหนเปิดอยู่และโปรเซสใดรับการเชื่อมต่อ
ss เข้ามาแทน netstat และทำงานเร็วกว่า ชุดแฟลกที่ใช้บ่อยที่สุดคือ ss -tulpn:
| แฟลก | ความหมาย |
|---|---|
-t / -u | TCP / UDP |
-l | เฉพาะซ็อกเก็ตที่กำลังรับการเชื่อมต่อ |
-p | แสดงโปรเซส (สำหรับโปรเซสของผู้ใช้อื่นต้องใช้ sudo) |
-n | ไม่แปลงพอร์ตและที่อยู่เป็นชื่อ |
-a | ทุกซ็อกเก็ต รวมถึงที่เชื่อมต่อแล้ว |
-s | สถิติรวม |
$ sudo ss -tulpn
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=812,fd=6))
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=640,fd=3))
tcp LISTEN 0 151 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=901,fd=21))
ให้สังเกตที่อยู่: 0.0.0.0 หมายความว่าบริการรับการเชื่อมต่อจากทุกอินเทอร์เฟซ ส่วน 127.0.0.1 รับเฉพาะจากเครื่องเดียวกัน นี่คือสาเหตุที่พบบ่อยว่าทำไมฐานข้อมูล «ไม่ตอบสนอง» เมื่อเชื่อมต่อจากเครื่องอื่น
วิธีหาว่าใครใช้พอร์ตนี้อยู่
sudo ss -ltnp 'sport = :8080'
sudo ss -tn dst 10.0.0.7 # การเชื่อมต่อไปยังที่อยู่เฉพาะ
ss -tan state time-wait | wc -l # มีซ็อกเก็ตในสถานะ TIME-WAIT กี่ตัว
ping: โฮสต์เข้าถึงได้หรือไม่
ping ส่งแพ็กเก็ต ICMP echo และแสดงเวลาตอบสนองและการสูญหายของแพ็กเก็ต ใน Linux คำสั่งนี้จะทำงานไม่สิ้นสุด จึงควรกำหนดจำนวนแพ็กเก็ตด้วยแฟลก -c
$ ping -c 4 8.8.8.8
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=12.4 ms
...
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 12.1/12.5/13.0/0.3 ms
แฟลกที่มีประโยชน์: -i 0.2 คือช่วงเวลาระหว่างแพ็กเก็ต, -W 2 คือ timeout ในการรอตอบ, -4 / -6 คือเวอร์ชันโปรโตคอล, -s 1472 -M do ใช้ตรวจ MTU โดยไม่ให้แยกแพ็กเก็ต โปรดจำว่าเซิร์ฟเวอร์และคลาวด์หลายแห่งบล็อก ICMP การไม่มีคำตอบจาก ping ยังไม่ได้หมายความว่าโฮสต์ใช้งานไม่ได้
traceroute และ mtr: แพ็กเก็ตหายที่ไหน
traceroute แสดงโหนดที่แพ็กเก็ตผ่านไปยังปลายทาง เครื่องหมายดอกจันที่บางฮอปนั้นเป็นเรื่องปกติ เพราะเราเตอร์ระดับกลางอาจไม่ตอบ สัญญาณที่น่ากังวลคือเมื่อหลังฮอปหนึ่งมีแต่เครื่องหมายดอกจันไปจนจบเส้นทาง
traceroute -n example.com # ไม่ใช้ชื่อ DNS ทำงานเร็วกว่า
sudo traceroute -T -p 443 example.com # ใช้ TCP แทน UDP ผ่านไฟร์วอลล์ได้ดีกว่า
tracepath example.com # ไม่ต้องใช้ root และแสดง MTU ด้วย
mtr รวม ping กับ traceroute และอัปเดตสถิติการสูญหายของทุกฮอปแบบเรียลไทม์ สำหรับสร้างรายงาน: mtr -rwc 50 example.com
dig: ตรวจ DNS
dig จากแพ็กเกจ dnsutils (ใน RHEL คือ bind-utils) เป็นเครื่องมือหลักสำหรับตรวจ DNS รูปแบบสั้นให้เฉพาะคำตอบ:
$ dig +short example.com
93.184.215.14
$ dig example.com MX +short
$ dig @8.8.8.8 example.com A # ถามเซิร์ฟเวอร์ที่กำหนด
$ dig -x 8.8.8.8 +short # การค้นกลับ (PTR)
$ dig +trace example.com # ไล่ตามสายโซ่จากเซิร์ฟเวอร์ราก
ในผลลัพธ์เต็ม ให้ดูค่า status: NOERROR หมายถึงพบระเบียน, NXDOMAIN หมายถึงไม่มีโดเมนนี้, SERVFAIL หมายถึงเซิร์ฟเวอร์ตอบไม่ได้ (มักเป็นปัญหาของ DNSSEC หรือเซิร์ฟเวอร์ต้นทางที่เข้าถึงไม่ได้) ถ้า dig @8.8.8.8 ตอบได้แต่ dig ธรรมดาตอบไม่ได้ ให้สงสัย resolver ในเครื่อง: ตรวจ /etc/resolv.conf และ resolvectl status
โปรดทราบว่า dig ไม่อ่าน /etc/hosts หากต้องการทดสอบการแปลงชื่อเหมือนที่แอปพลิเคชันทำ ให้ใช้ getent hosts example.com
curl: ตรวจ HTTP และ API
curl ตอบคำถามสุดท้ายว่า บริการตอบสนองหรือไม่ และส่งอะไรกลับมา
| คำสั่ง | ทำอะไร |
|---|---|
curl -I URL | เฉพาะ header (คำขอ HEAD) |
curl -v URL | แสดงรายละเอียด: DNS, การเชื่อมต่อ, TLS, header |
curl -L URL | ตามการ redirect |
curl -o file URL | บันทึกลงไฟล์ |
curl -X POST -H 'Content-Type: application/json' -d '{"a":1}' URL | ส่ง JSON |
curl -k URL | ไม่ตรวจสอบใบรับรอง (ใช้เฉพาะตอนดีบั๊ก) |
curl --resolve site.ru:443:10.0.0.5 https://site.ru | เข้าถึงเซิร์ฟเวอร์ที่กำหนดโดยข้าม DNS |
curl -s -o /dev/null -w '%{http_code} %{time_total}\n' URL | รหัสตอบกลับและเวลาที่ใช้ |
$ curl -s -o /dev/null -w '%{http_code} %{time_connect} %{time_total}\n' https://example.com
200 0.041 0.187
ข้อความผิดพลาดของ curl บอกชั้นที่มีปัญหาได้ค่อนข้างชัด: Could not resolve host คือ DNS, Connection refused คือพอร์ตปิดหรือไม่มีใครรับการเชื่อมต่อ, Connection timed out คือไฟร์วอลล์ตัดแพ็กเก็ตหรือไม่มีเส้นทาง, SSL certificate problem คือปัญหาที่ใบรับรอง
ลำดับการวินิจฉัย: เมื่อ «เครือข่ายใช้ไม่ได้»
- อินเทอร์เฟซและที่อยู่:
ip -br addrตรวจว่าอินเทอร์เฟซเป็น UP และมีที่อยู่ - เกตเวย์:
ip routeตรวจว่ามีdefault via; แล้วping -c 3 <เกตเวย์> - เครือข่ายภายนอกด้วย IP:
ping -c 3 1.1.1.1ถ้าทำงาน แสดงว่าการกำหนดเส้นทางปกติ - DNS:
dig +short example.comถ้าผลว่างหรือผิดพลาดทั้งที่ ping ด้วย IP ได้ ปัญหาอยู่ที่ resolver - พอร์ต:
nc -zv host 443หรือcurl -vในเซิร์ฟเวอร์ ใช้ss -tulpnตรวจว่าบริการรับการเชื่อมต่ออยู่หรือไม่ และที่อยู่ใด - ไฟร์วอลล์:
sudo nft list ruleset,sudo iptables -L -n,sudo ufw status - แอปพลิเคชัน:
curl -Iและ log ของบริการ (journalctl -u nginx)
ไล่จากชั้นล่างขึ้นบนและอย่าข้ามขั้นตอน วิธีนี้ช่วยให้รู้ว่าปัญหาอยู่ชั้นไหนภายในไม่กี่นาที แทนที่จะรีสตาร์ตทุกอย่างแบบสุ่ม
คำสั่งเก่าและคำสั่งใหม่
| คำสั่งเก่า (net-tools) | คำสั่งใหม่ที่ใช้แทน |
|---|---|
ifconfig | ip addr, ip link |
route -n | ip route |
arp -n | ip neigh |
netstat -tulpn | ss -tulpn |
nslookup | dig |
ในดิสโทรรุ่นใหม่ net-tools มักไม่ได้ติดตั้งมาเลย จึงควรคุ้นกับคำสั่งใหม่ตั้งแต่ตอนนี้
สรุป
สำหรับการวินิจฉัยประจำวัน คำสั่งเครือข่ายหลักของ Linux มีหกคำสั่ง ได้แก่ ip, ss, ping, traceroute, dig และ curl ตรวจทีละชั้น ได้แก่ ที่อยู่, เส้นทาง, DNS, พอร์ต และแอปพลิเคชัน แล้วคุณจะหาจุดที่ผิดพลาดได้รวดเร็ว การใช้คำสั่งเครือข่ายและการวิเคราะห์ปัญหาที่พบบ่อยในทางปฏิบัติมีอธิบายไว้ในคอร์ส Linux
คำถามที่พบบ่อย
ทำไมในระบบไม่มีคำสั่ง ifconfig?
คำสั่งนี้อยู่ในแพ็กเกจ net-tools ที่เลิกใช้แล้ว ซึ่งดิสโทรรุ่นใหม่ไม่ได้ติดตั้งมาให้ตามค่าเริ่มต้น ให้ใช้ ip addr หรือติดตั้ง net-tools ด้วยตนเอง
จะรู้ IP สาธารณะของตัวเองจากเทอร์มินัลได้อย่างไร?
รัน curl ifconfig.me หรือ curl -4 icanhazip.com บริการภายนอกจะคืนที่อยู่ที่คุณใช้ออกอินเทอร์เน็ต ส่วน ip addr แสดงเฉพาะที่อยู่ของอินเทอร์เฟซ ซึ่งมักเป็นที่อยู่ภายใน
ping ต่างจากการตรวจพอร์ตอย่างไร?
ping ตรวจว่าโฮสต์เข้าถึงได้ด้วย ICMP แต่ไม่บอกอะไรเกี่ยวกับบริการเฉพาะ หากต้องการดูว่าเซิร์ฟเวอร์รับการเชื่อมต่อบนพอร์ตหรือไม่ ใช้ nc -zv host พอร์ต หรือ curl
จะดูความเร็วและการใช้งานของอินเทอร์เฟซเครือข่ายได้อย่างไร?
ตัวนับไบต์และข้อผิดพลาดดูได้จาก ip -s link ส่วนการใช้งานแบบเรียลไทม์ใช้ยูทิลิตี iftop, nload หรือ bmon ส่วนความเร็วระหว่างสองเครื่องวัดด้วย iperf3
จะเปลี่ยน DNS เซิร์ฟเวอร์ชั่วคราวได้อย่างไร?
ในระบบที่ใช้ systemd-resolved ให้รัน sudo resolvectl dns eth0 1.1.1.1 สำหรับการทดสอบครั้งเดียว ง่ายกว่าคือระบุเซิร์ฟเวอร์ในคำสั่งเลย: dig @1.1.1.1 example.com
หัวข้อนี้สอนอย่างละเอียดพร้อมฝึกปฏิบัติในคอร์ส “Linux: с нуля до уверенного администрирования”
ไปที่คอร์ส