Cách kiểm tra địa chỉ IP trên Linux: ip addr, hostname -I, curl
- 30 tháng 10, 2026
- 09:00
- Bởi Adrien Roche
- Mạng

Kiểm tra địa chỉ IP trên Linux bằng ip addr
Lệnh trả lời câu hỏi "địa chỉ IP của tôi là gì" trên mọi bản phân phối Linux hiện nay là ip, thuộc gói iproute2. Nó được cài sẵn trên mọi bản phân phối lớn, chạy được không cần root, và là thứ mà các lệnh khác trong hướng dẫn này bọc lại hoặc đã bị nó thay thế. Dạng cơ bản liệt kê mọi interface cùng tất cả địa chỉ của chúng:
ip addr show
ip a # same thing, shorterTrên một máy chủ chỉ có một card mạng, kết quả trông như sau (các dòng thời hạn valid_lft đã được lược bớt):
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff
inet 203.0.113.25/24 brd 203.0.113.255 scope global eth0
inet6 2001:db8:1::25/64 scope global
inet6 fe80::5054:ff:fe12:3456/64 scope linkCách đọc:
- Tên interface.
lolà loopback, luôn là127.0.0.1, chỉ truy cập được từ chính máy đó. Card thật ở đây làeth0; với cơ chế đặt tên interface cố định (predictable), nó xuất hiện dưới dạngens3,enp0s3hoặceno1, còn card không dây bắt đầu bằngwl. inetlà địa chỉ IPv4,inet6là IPv6. Hậu tố/24là độ dài prefix theo ký hiệu CIDR, cách viết hiện đại của netmask255.255.255.0.scope globalnghĩa là định tuyến được ra ngoài máy này;scope link(dòngfe80::) chỉ có hiệu lực trên đoạn mạng kết nối trực tiếp;scope hostlà loopback.state UPkèmLOWER_UPnghĩa là interface đã bật và có kết nối vật lý.state DOWNhoặcNO-CARRIERlà lý do thường gặp khiến một interface không có địa chỉ nào.
Các biến thể hữu ích:
ip -4 addr # IPv4 only
ip -6 addr # IPv6 only
ip -br -4 addr # one line per interface
ip -4 addr show dev eth0 # a single interfaceDạng rút gọn (-br) là cách nhanh nhất để kiểm tra địa chỉ IP trên Linux khi có nhiều interface, tình huống bình thường trên một VPS chạy Docker:
$ ip -br -4 addr
lo UNKNOWN 127.0.0.1/8
eth0 UP 203.0.113.25/24
docker0 DOWN 172.17.0.1/16hostname -I: chỉ hiện địa chỉ
Khi chỉ cần địa chỉ, hostname -I (chữ I hoa) in mọi địa chỉ đã cấu hình trên một dòng, cách nhau bằng dấu cách, không gồm loopback và IPv6 link-local:
$ hostname -I
203.0.113.25 2001:db8:1::25Có hai điểm cần lưu ý. hostname -i viết thường là một lệnh khác: nó phân giải hostname của máy qua /etc/hosts và DNS, mà trên Debian và Ubuntu thường cho ra 127.0.1.1. Và hostname -I in địa chỉ không theo thứ tự đảm bảo nào, kể cả các bridge ảo như docker0, nên hostname -I | awk '{print $1}' là lối tắt cho người đọc, không phải một "IP chính" đáng tin cậy cho script. Tùy chọn này không thuộc chuẩn POSIX: Debian, Ubuntu, Fedora và RHEL có nó, còn các image tối giản dựa trên BusyBox như Alpine có thể không có.
ifconfig, nmcli và networkctl
ifconfig (lỗi thời, net-tools)
ifconfig là lệnh mà các hướng dẫn cũ hay dùng. Nó thuộc net-tools, đã bị thay thế bởi iproute2 từ nhiều năm nay và không còn trong bản cài mặc định của các phiên bản Ubuntu, Debian và Fedora/RHEL hiện tại. Nếu nó trả về command not found, hãy chuyển sang ip hoặc cài gói:
sudo apt install net-tools # Debian / Ubuntu
sudo dnf install net-tools # Fedora / RHEL / Rocky / Alma$ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 203.0.113.25 netmask 255.255.255.0 broadcast 203.0.113.255
inet6 fe80::5054:ff:fe12:3456 prefixlen 64 scopeid 0x20<link>Dễ đọc, nhưng có một hạn chế thật sự: ifconfig chỉ hiện một địa chỉ IPv4 cho mỗi interface. Các địa chỉ phụ thêm bằng ip addr add, vốn phổ biến trên VPS có nhiều IP công khai, sẽ không hiện ra.
nmcli và networkctl
Máy desktop và máy chủ họ Fedora/RHEL quản lý mạng bằng NetworkManager; Ubuntu Server dùng netplan chạy trên systemd-networkd, và nhiều image VPS cũng theo mô hình này. Mỗi bên có một công cụ trạng thái hiện địa chỉ, gateway và DNS trong cùng một khối:
nmcli device show eth0
nmcli -g IP4.ADDRESS device show eth0 # NetworkManager: just the address field
networkctl status eth0 # systemd-networkdTùy chọn -g (--get-values) in giá trị trần của một trường, kể cả độ dài prefix, rất tiện cho script. Nếu không chắc máy đang dùng bộ công cụ mạng nào, hoặc thậm chí đó là bản phân phối và phiên bản nào, hãy xác định phiên bản hệ điều hành từ dòng lệnh trước; câu trả lời sẽ quyết định công cụ nào có sẵn.
Tìm địa chỉ IP công khai bằng curl
Mọi thứ ở trên đều báo địa chỉ được cấu hình trên interface. Trên hầu hết VPS, IPv4 công khai được gán trực tiếp cho interface, nên đó cũng là địa chỉ internet nhìn thấy. Ở nhà, ở văn phòng hoặc trên một số nền tảng cloud, interface mang một địa chỉ riêng thuộc các dải RFC 1918 (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) và router hoặc NAT 1:1 sẽ chuyển đổi nó khi đi ra ngoài. Cách đáng tin cậy duy nhất để thấy phía công khai là hỏi một dịch vụ bên ngoài:
curl -4 icanhazip.com
curl -4 ifconfig.me/ip
curl -4 https://api.ipify.org
curl -6 icanhazip.com # public IPv6, if the host has oneCác tùy chọn -4 và -6 buộc dùng một họ địa chỉ, điều quan trọng trên máy dual-stack: nếu không có chúng, curl có thể ưu tiên IPv6 và trả về một địa chỉ bạn không ngờ tới. icanhazip.com do Cloudflare vận hành từ năm 2021 và trả về văn bản thuần. Hãy hiểu câu trả lời là "địa chỉ mà lưu lượng của tôi đi ra": nếu đứng sau VPN hoặc proxy, đó là địa chỉ của nút thoát, không phải của nhà mạng bạn.
IPv6: global và link-local
Hầu như mọi interface Linux đều hiện ít nhất một dòng inet6, và nó thường bị nhầm là địa chỉ IPv6 công khai. Dòng bắt đầu bằng fe80:: và được đánh dấu scope link là link-local: mọi interface tự động tạo một địa chỉ như vậy, nó chỉ có hiệu lực trên mạng kết nối trực tiếp và không bao giờ truy cập được từ internet. Một địa chỉ IPv6 công khai được đánh dấu scope global và bắt đầu bằng 2 hoặc 3, vì không gian global unicast là 2000::/3.
ip -6 addr show scope global
ip -6 route show defaultNếu lệnh đầu tiên không in ra gì, máy không có IPv6 định tuyến được và curl -6 sẽ thất bại. Các địa chỉ global bổ sung gắn cờ temporary trên máy desktop đến từ tiện ích mở rộng quyền riêng tư (privacy extensions); máy chủ tắt chúng để địa chỉ ổn định cho DNS và quy tắc tường lửa.
Gateway mặc định, route và DNS
Bản thân một địa chỉ không cho biết máy có kết nối được tới đâu hay không. Bảng định tuyến mới cho biết điều đó, và ip route (dạng ngắn ip r) in nó ra:
$ ip route
default via 203.0.113.1 dev eth0 proto static
203.0.113.0/24 dev eth0 proto kernel scope link src 203.0.113.25Dòng default via là gateway mặc định, router mà mọi gói tin đi qua khi không có route cụ thể hơn nào khớp. Dòng thứ hai do kernel thêm vào khi địa chỉ được cấu hình; trường src của nó là địa chỉ mà máy ưu tiên dùng làm nguồn trên mạng đó. Mẹo hữu ích nhất ở đây dựa trên điều này: hỏi kernel xem nó sẽ dùng địa chỉ nào cho một đích cụ thể.
$ ip route get 1.1.1.1
1.1.1.1 via 203.0.113.1 dev eth0 src 203.0.113.25 uid 1000
cacheGiá trị src đó, theo định nghĩa, chính là địa chỉ đi ra internet của máy, bất kể có những interface, bridge hay tunnel nào. Với DNS, /etc/resolv.conf vẫn là nơi cần xem, nhưng trên hệ thống chạy systemd-resolved (Ubuntu từ bản 18.04, Fedora gần đây) nó chỉ chứa stub cục bộ 127.0.0.53; các resolver thượng nguồn thật được hiển thị bởi resolvectl status, hoặc bởi các trường IP4.DNS của nmcli device show trên máy dùng NetworkManager.
Script: đưa địa chỉ IP vào một biến
Kết quả tương tác được thiết kế cho người đọc; script cần một địa chỉ duy nhất không kèm gì khác. Các mẫu sau hoạt động ổn định, từ đơn giản nhất đến chắc chắn nhất:
# One interface, IPv4, prefix length stripped
IP=$(ip -4 -o addr show dev eth0 | awk '{print $4}' | cut -d/ -f1)
# Robust: the source address used to reach the internet
IP=$(ip route get 1.1.1.1 | awk '{for (i=1; i<=NF; i++) if ($i == "src") {print $(i+1); exit}}')
# Same thing with JSON output and jq
IP=$(ip -j route get 1.1.1.1 | jq -r '.[0].prefsrc')
# Public IP, with a timeout so the script never hangs offline
PUBLIC_IP=$(curl -4 -s --max-time 5 https://icanhazip.com)Tùy chọn -o khiến ip in mỗi địa chỉ trên một dòng, giúp giữ đúng vị trí trường cho awk; thêm head -n 1 nếu interface có nhiều địa chỉ IPv4. Tùy chọn -j chuyển ip sang xuất JSON, rồi jq chọn trường theo tên. Hãy ưu tiên cách này cho bất cứ thứ gì chạy trên nhiều máy: tên interface khác nhau giữa các máy, còn tên trường thì không.
| Lệnh | Hiển thị gì | Phù hợp nhất cho |
|---|---|---|
ip addr / ip -br -4 addr | Mọi interface, tất cả địa chỉ, trạng thái | Dùng hằng ngày, bức tranh đầy đủ |
hostname -I | Tất cả địa chỉ trên một dòng | Xem nhanh |
ip route get 1.1.1.1 | Địa chỉ nguồn dùng để ra internet | Script, máy nhiều interface |
ifconfig | Một IPv4 mỗi interface (lỗi thời) | Hệ thống cũ, hướng dẫn cũ |
curl -4 icanhazip.com | IPv4 công khai như internet nhìn thấy | NAT, VPN, xác nhận địa chỉ VPS |
Điều gì khác trên VPS
Trên VPS có IPv4 riêng, ip -4 addr, hostname -I và curl -4 icanhazip.com đều nên trả về cùng một địa chỉ, vì IP công khai được cấu hình thẳng trên interface, không có NAT ở giữa. Khi chúng không khớp, có thứ gì đó nằm trên đường đi: NAT phía nhà cung cấp, một VPN client bị bỏ quên, hoặc một bridge Docker chiếm vị trí đầu tiên trong hostname -I.
Khi đã xác nhận địa chỉ, hãy kiểm tra hai điều. Thứ nhất, nó có thực sự truy cập được không và trên những cổng nào, đây là câu hỏi khác với việc nó đã được cấu hình hay chưa: kiểm tra các cổng đang mở trên máy chủ Linux từ bên trong bằng ss -tulpn và từ bên ngoài bằng nmap. Thứ hai, reverse DNS. Tra cứu bản ghi PTR cho địa chỉ của bạn:
dig -x 203.0.113.25 +shortMột VPS mới thường trả về tên chung chung của nhà cung cấp, hoặc không trả về gì cả. Nếu máy chủ gửi mail hoặc cung cấp bất kỳ dịch vụ công khai nào, hãy đặt hostname và reverse DNS sao cho khớp nhau; đặc biệt mail gửi đi thường xuyên bị từ chối khi bản ghi PTR và tên HELO không thống nhất.
Các lệnh này trở thành phản xạ nhanh nhất trên một máy chủ có địa chỉ chỉ của riêng bạn và không thay đổi. Một VPS Linux của rdp.monster đi kèm IPv4 riêng, toàn quyền root, CPU và RAM riêng, băng thông không giới hạn (sử dụng hợp lý) và không cần KYC, chấp nhận tiền mã hóa, chỉ từ $8.99/tháng. Máy chủ hoạt động khoảng 10 giây sau khi thanh toán được xác nhận, nên lệnh ip -br -4 addr đầu tiên bạn chạy trên nó chỉ cách bạn một khoảnh khắc.
Câu hỏi thường gặp
Vì sao hostname -I hiện nhiều hơn một địa chỉ IP?
hostname -I in tất cả địa chỉ trên tất cả interface trừ loopback và IPv6 link-local, nên một máy có Docker, libvirt, VPN client hoặc card mạng thứ hai sẽ hiện nhiều địa chỉ. docker0 góp 172.17.0.1, virbr0 thường là 192.168.122.1, và máy dual-stack thêm địa chỉ IPv6 global của nó. Thứ tự không được đảm bảo. Khi cần địa chỉ mà lưu lượng thực sự đi ra, hãy chạy ip route get 1.1.1.1 và đọc trường src của nó.Vì sao ifconfig báo command not found trên Ubuntu?
ifconfig thuộc gói net-tools, đã bị thay thế bởi iproute2 và không có trong bản cài mặc định của các phiên bản Ubuntu, Debian và Fedora/RHEL hiện tại. Lệnh thay thế là ip addr, có sẵn ở mọi nơi. Nếu một script hoặc thói quen cũ thực sự cần nó, hãy cài gói bằng sudo apt install net-tools hoặc sudo dnf install net-tools, nhưng nhớ rằng ifconfig chỉ hiện một IPv4 cho mỗi interface và ẩn các địa chỉ phụ thêm bằng ip addr add.Vì sao hostname -i trả về 127.0.1.1?
hostname -i hoàn toàn không kiểm tra mạng: nó phân giải hostname của hệ thống giống như mọi ứng dụng khác, qua /etc/hosts rồi đến DNS. Trình cài đặt Debian và Ubuntu thêm một dòng ánh xạ hostname tới 127.0.1.1 để máy có thể phân giải tên của chính nó mà không cần mạng, và dòng đó chính là kết quả trả về. Hãy dùng dạng I viết hoa, hostname -I, vốn đọc địa chỉ thật của interface, hoặc ip -4 addr để xem đầy đủ chi tiết.Làm sao tìm địa chỉ IP của các thiết bị khác trong mạng?
ip neigh show (hoặc arp -a nếu đã cài net-tools). Để có bức tranh đầy đủ, hãy quét ping toàn subnet: nmap -sn 192.168.1.0/24 liệt kê mọi máy phản hồi, kèm tên khi reverse DNS cung cấp. Thay bằng dải mạng của chính bạn, có thể đọc từ route scope link trong ip route. Trên VPS việc này hiếm khi hữu ích, và quét các địa chỉ lân cận có thể vi phạm điều khoản của nhà cung cấp.Adrien Roche, Biên tập viên hạ tầng & hosting
Kỹ sư hệ thống với hơn 10 năm vận hành các hệ thống Windows Server và Linux. Adrien phụ trách tài liệu hạ tầng của rdp.monster và viết các hướng dẫn về RDP, hosting VPS, quản trị máy chủ, mạng và công cụ bảo vệ quyền riêng tư.




