Lệnh mạng Linux: ip, ss, ping, traceroute, dig và curl để chẩn đoán mạng
Các lệnh mạng Linux chính gồm ip (địa chỉ, giao diện và route), ss (cổng và kết nối đang mở), ping và traceroute (máy đích có phản hồi không và đường đi tới đó), dig (kiểm tra DNS) và curl (gửi yêu cầu tới dịch vụ HTTP). Nên chẩn đoán theo từng tầng: giao diện và địa chỉ, route, DNS, cổng, rồi phản hồi của ứng dụng.
Lệnh mạng Linux đáp ứng gần như toàn bộ nhu cầu chẩn đoán hằng ngày: ip cho biết địa chỉ và route, ss cho biết cổng và kết nối đang mở, ping và traceroute kiểm tra máy đích có truy cập được không, dig kiểm tra DNS, còn curl cho biết dịch vụ web trả về gì. Dưới đây là bảng tra cứu kèm các tùy chọn quan trọng, và thứ tự kiểm tra giúp tìm nguyên nhân khi "mạng không hoạt động".
Bảng tra cứu nhanh các lệnh mạng Linux
| Việc cần làm | Lệnh |
|---|---|
| Địa chỉ IP của tất cả giao diện | ip -br addr |
| Trạng thái giao diện (UP/DOWN) | ip -br link |
| Bảng route | ip route |
| Gói tin tới địa chỉ sẽ đi qua gateway nào | ip route get 8.8.8.8 |
| Các máy láng giềng (bảng ARP) | ip neigh |
| Cổng đang lắng nghe và tiến trình | sudo ss -tulpn |
| Kết nối TCP đã thiết lập | ss -tn state established |
| Kiểm tra máy đích có truy cập được không | ping -c 4 example.com |
| Đường đi của gói tin tới máy đích | traceroute example.com, mtr example.com |
| Phân giải tên thành địa chỉ | dig +short example.com |
| Hỏi một DNS server cụ thể | dig @1.1.1.1 example.com |
| Kiểm tra phản hồi HTTP | curl -I https://example.com |
| Chi tiết kết nối và TLS | curl -v https://example.com |
| Cổng TCP có mở không | nc -zv host 443 |
| Tên máy | hostnamectl, hostname -I |
ip: địa chỉ, giao diện và route
Lệnh ip thuộc gói iproute2 đã thay thế ifconfig và route cũ. Các lệnh con có thể viết tắt: ip a tương đương ip addr, ip r tương đương ip route. Tùy chọn -br cho kết quả gọn, còn -c tô màu kết quả.
$ 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
Nếu giao diện không có địa chỉ thuộc mạng cần dùng, hoặc đang ở trạng thái DOWN, không cần tìm tiếp ở các tầng trên: vấn đề nằm ngay ở tầng này.
Thêm địa chỉ IP và bật giao diện
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
Thay đổi bằng ip chỉ tồn tại đến lần khởi động lại. Cấu hình lâu dài đặt trong cấu hình hệ thống: netplan trên Ubuntu, NetworkManager (nmcli) trên Fedora và RHEL, systemd-networkd trên máy chủ.
Route và gateway mặc định
$ 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
Dòng default via là gateway mà mọi thứ không khớp với route cụ thể hơn sẽ đi qua. Nếu không có dòng này, sẽ không có Internet dù mạng nội bộ vẫn hoạt động. Thêm route: sudo ip route add 10.20.0.0/16 via 192.168.1.254.
ss: cổng nào đang mở và ai đang lắng nghe
ss thay thế netstat và chạy nhanh hơn. Tổ hợp thường dùng nhất là ss -tulpn:
| Tùy chọn | Ý nghĩa |
|---|---|
-t / -u | TCP / UDP |
-l | chỉ các socket đang lắng nghe |
-p | hiển thị tiến trình (xem tiến trình của người khác cần sudo) |
-n | không chuyển cổng và địa chỉ thành tên |
-a | tất cả socket, kể cả đã thiết lập |
-s | thống kê tổng hợp |
$ 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))
Hãy chú ý địa chỉ: 0.0.0.0 nghĩa là dịch vụ nhận kết nối từ mọi giao diện, còn 127.0.0.1 chỉ nhận kết nối nội bộ. Đây là nguyên nhân hay gặp khiến cơ sở dữ liệu "không phản hồi" từ máy khác.
Ai đang chiếm cổng
sudo ss -ltnp 'sport = :8080'
sudo ss -tn dst 10.0.0.7 # kết nối tới một địa chỉ cụ thể
ss -tan state time-wait | wc -l # có bao nhiêu socket ở trạng thái TIME-WAIT
ping: máy đích có truy cập được không
ping gửi các gói ICMP echo và hiển thị thời gian phản hồi cùng tỷ lệ mất gói. Trên Linux, ping chạy không dừng, nên hãy đặt số gói bằng -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
Một số tùy chọn hữu ích: -i 0.2 là khoảng cách giữa các gói, -W 2 là thời gian chờ phản hồi, -4/-6 chọn phiên bản giao thức, -s 1472 -M do kiểm tra MTU mà không phân mảnh gói. Lưu ý nhiều máy chủ và nền tảng đám mây chặn ICMP: không có phản hồi ping chưa chắc có nghĩa là máy đích không hoạt động.
traceroute và mtr: gói tin bị mất ở đâu
traceroute hiển thị các nút mạng trên đường tới đích. Dấu sao ở một số chặng là bình thường, vì router trung gian có thể không trả lời. Dấu hiệu đáng lo là khi sau một chặng nào đó toàn bộ là dấu sao.
traceroute -n example.com # không phân giải DNS, nhanh hơn
sudo traceroute -T -p 443 example.com # dùng TCP thay vì UDP, đi qua tường lửa dễ hơn
tracepath example.com # không cần root, đồng thời hiển thị MTU
mtr kết hợp ping và traceroute, cập nhật thống kê mất gói theo từng chặng theo thời gian thực. Để xuất báo cáo: mtr -rwc 50 example.com.
dig: kiểm tra DNS
dig thuộc gói dnsutils (bind-utils trên RHEL) là công cụ chính để kiểm tra DNS. Dạng rút gọn chỉ trả về kết quả:
$ dig +short example.com
93.184.215.14
$ dig example.com MX +short
$ dig @8.8.8.8 example.com A # hỏi một server cụ thể
$ dig -x 8.8.8.8 +short # bản ghi ngược (PTR)
$ dig +trace example.com # đi theo chuỗi từ các root server
Trong kết quả đầy đủ, hãy xem trường status: NOERROR nghĩa là đã tìm thấy bản ghi, NXDOMAIN nghĩa là tên miền không tồn tại, SERVFAIL nghĩa là server không trả lời được (thường do DNSSEC hoặc máy chủ có thẩm quyền không truy cập được). Nếu dig @8.8.8.8 trả lời được nhưng dig thường thì lỗi nằm ở bộ phân giải cục bộ: hãy kiểm tra /etc/resolv.conf và resolvectl status.
Lưu ý dig không đọc /etc/hosts. Để kiểm tra việc phân giải tên đúng như ứng dụng sẽ làm, dùng getent hosts example.com.
curl: kiểm tra HTTP và API
curl trả lời câu hỏi cuối cùng: dịch vụ có phản hồi không và nó trả về gì.
| Lệnh | Chức năng |
|---|---|
curl -I URL | chỉ lấy tiêu đề (yêu cầu HEAD) |
curl -v URL | chi tiết: DNS, kết nối, TLS, tiêu đề |
curl -L URL | đi theo các chuyển hướng |
curl -o file URL | lưu vào tệp |
curl -X POST -H 'Content-Type: application/json' -d '{"a":1}' URL | gửi JSON |
curl -k URL | không kiểm tra chứng chỉ (chỉ dùng khi gỡ lỗi) |
curl --resolve site.ru:443:10.0.0.5 https://site.ru | kết nối tới một máy chủ cụ thể, bỏ qua DNS |
curl -s -o /dev/null -w '%{http_code} %{time_total}\n' URL | mã phản hồi và thời gian |
$ curl -s -o /dev/null -w '%{http_code} %{time_connect} %{time_total}\n' https://example.com
200 0.041 0.187
Thông báo lỗi của curl cho biết lỗi nằm ở tầng nào: Could not resolve host là lỗi DNS, Connection refused là cổng đóng hoặc không có ai lắng nghe, Connection timed out là tường lửa chặn gói hoặc không có route, SSL certificate problem là lỗi chứng chỉ.
Thứ tự chẩn đoán khi "mạng không hoạt động"
- Giao diện và địa chỉ:
ip -br addr— giao diện ở trạng thái UP và có địa chỉ. - Gateway:
ip route— có dòngdefault via;ping -c 3 <gateway>. - Mạng bên ngoài theo IP:
ping -c 3 1.1.1.1. Nếu chạy được, định tuyến đã ổn. - DNS:
dig +short example.com. Nếu rỗng hoặc lỗi trong khi ping theo IP vẫn chạy, vấn đề nằm ở bộ phân giải. - Cổng:
nc -zv host 443hoặccurl -v. Trên máy chủ, dùngss -tulpnđể xem dịch vụ có đang lắng nghe và trên địa chỉ nào. - Tường lửa:
sudo nft list ruleset,sudo iptables -L -n,sudo ufw status. - Ứng dụng:
curl -Ivà nhật ký dịch vụ (journalctl -u nginx).
Hãy đi từ dưới lên và không bỏ bước nào: như vậy chỉ trong vài phút bạn sẽ xác định được lỗi nằm ở tầng nào, thay vì khởi động lại mọi thứ một cách ngẫu nhiên.
Lệnh cũ và lệnh mới
| Lệnh cũ (net-tools) | Lệnh thay thế hiện đại |
|---|---|
ifconfig | ip addr, ip link |
route -n | ip route |
arp -n | ip neigh |
netstat -tulpn | ss -tulpn |
nslookup | dig |
Các bản phân phối mới thường không cài sẵn net-tools, nên hãy làm quen với lệnh mới.
Tóm lại
Để chẩn đoán hằng ngày, sáu lệnh mạng Linux là đủ: ip, ss, ping, traceroute, dig và curl. Hãy kiểm tra theo từng tầng — địa chỉ, route, DNS, cổng, ứng dụng — và lỗi sẽ được tìm ra nhanh chóng. Các lệnh mạng và cách xử lý những sự cố thường gặp được thực hành trong khóa học Linux.
Câu hỏi thường gặp
Tại sao hệ thống không có lệnh ifconfig?
Lệnh này thuộc gói net-tools đã cũ, và các bản phân phối hiện đại không cài nó mặc định. Hãy dùng ip addr hoặc tự cài net-tools.
Làm sao xem địa chỉ IP công cộng của mình từ terminal?
Chạy curl ifconfig.me hoặc curl -4 icanhazip.com: dịch vụ bên ngoài sẽ trả về địa chỉ mà bạn đang dùng để ra Internet. Lệnh ip addr chỉ hiển thị địa chỉ của giao diện, thường là địa chỉ nội bộ.
Ping khác gì với kiểm tra cổng?
ping kiểm tra máy đích có phản hồi ICMP hay không, nhưng không cho biết dịch vụ cụ thể có hoạt động không. Để kiểm tra máy chủ có nhận kết nối trên một cổng hay không, dùng nc -zv host cổng hoặc curl.
Làm sao xem tốc độ và lưu lượng của một giao diện mạng?
Số byte và lỗi được hiển thị bằng ip -s link, còn lưu lượng theo thời gian thực dùng các công cụ như iftop, nload hoặc bmon. Băng thông giữa hai máy đo bằng iperf3.
Làm sao đổi tạm thời DNS server?
Trên hệ thống dùng systemd-resolved, chạy sudo resolvectl dns eth0 1.1.1.1. Để kiểm tra nhanh một lần, dễ hơn là chỉ định server ngay trong lệnh: dig @1.1.1.1 example.com.
Chủ đề này được giảng chi tiết kèm thực hành trong khóa học “Linux: с нуля до уверенного администрирования”.
Đến khóa học