ชีตสรุป

คำสั่งเครือข่ายใน Linux: ip, ss, ping, traceroute, dig และ curl สำหรับตรวจสอบเครือข่าย

อัปเดต: · Skillaria.Top

คำสั่งเครือข่ายหลักของ 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
แปลงชื่อเป็นที่อยู่ IPdig +short example.com
ถาม DNS เซิร์ฟเวอร์ที่กำหนดdig @1.1.1.1 example.com
ตรวจคำตอบ HTTPcurl -I https://example.com
รายละเอียดการเชื่อมต่อและ TLScurl -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 / -uTCP / 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 คือปัญหาที่ใบรับรอง

ลำดับการวินิจฉัย: เมื่อ «เครือข่ายใช้ไม่ได้»

  1. อินเทอร์เฟซและที่อยู่: ip -br addr ตรวจว่าอินเทอร์เฟซเป็น UP และมีที่อยู่
  2. เกตเวย์: ip route ตรวจว่ามี default via; แล้ว ping -c 3 <เกตเวย์>
  3. เครือข่ายภายนอกด้วย IP: ping -c 3 1.1.1.1 ถ้าทำงาน แสดงว่าการกำหนดเส้นทางปกติ
  4. DNS: dig +short example.com ถ้าผลว่างหรือผิดพลาดทั้งที่ ping ด้วย IP ได้ ปัญหาอยู่ที่ resolver
  5. พอร์ต: nc -zv host 443 หรือ curl -v ในเซิร์ฟเวอร์ ใช้ ss -tulpn ตรวจว่าบริการรับการเชื่อมต่ออยู่หรือไม่ และที่อยู่ใด
  6. ไฟร์วอลล์: sudo nft list ruleset, sudo iptables -L -n, sudo ufw status
  7. แอปพลิเคชัน: curl -I และ log ของบริการ (journalctl -u nginx)

ไล่จากชั้นล่างขึ้นบนและอย่าข้ามขั้นตอน วิธีนี้ช่วยให้รู้ว่าปัญหาอยู่ชั้นไหนภายในไม่กี่นาที แทนที่จะรีสตาร์ตทุกอย่างแบบสุ่ม

คำสั่งเก่าและคำสั่งใหม่

คำสั่งเก่า (net-tools)คำสั่งใหม่ที่ใช้แทน
ifconfigip addr, ip link
route -nip route
arp -nip neigh
netstat -tulpnss -tulpn
nslookupdig

ในดิสโทรรุ่นใหม่ 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: с нуля до уверенного администрирования”

ไปที่คอร์ส