RDP Monster

Cách kiểm tra địa chỉ IP trên Linux: ip addr, hostname -I, curl

Cách kiểm tra địa chỉ IP trên Linux: ip addr, hostname -I, curl

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, shorter

Trê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 link

Cách đọc:

  • Tên interface. lo là 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ạng ens3, enp0s3 hoặc eno1, còn card không dây bắt đầu bằng wl.
  • inet là địa chỉ IPv4, inet6 là IPv6. Hậu tố /24 là độ dài prefix theo ký hiệu CIDR, cách viết hiện đại của netmask 255.255.255.0.
  • scope global nghĩa là định tuyến được ra ngoài máy này; scope link (dòng fe80::) chỉ có hiệu lực trên đoạn mạng kết nối trực tiếp; scope host là loopback.
  • state UP kèm LOWER_UP nghĩa là interface đã bật và có kết nối vật lý. state DOWN hoặc NO-CARRIER là 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 interface

Dạ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/16

hostname -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::25

Có 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-networkd

Tù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 one

Cá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 default

Nế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.25

Dò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
    cache

Giá 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ệnhHiển thị gìPhù hợp nhất cho
ip addr / ip -br -4 addrMọi interface, tất cả địa chỉ, trạng tháiDùng hằng ngày, bức tranh đầy đủ
hostname -ITất cả địa chỉ trên một dòngXem nhanh
ip route get 1.1.1.1Địa chỉ nguồn dùng để ra internetScript, máy nhiều interface
ifconfigMột IPv4 mỗi interface (lỗi thời)Hệ thống cũ, hướng dẫn cũ
curl -4 icanhazip.comIPv4 công khai như internet nhìn thấyNAT, 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 +short

Mộ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?

Lệnh này liệt kê mọi địa chỉ đã cấu hình trên mọi interface, kể cả các bridge ảo.
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 net-tools, gói mà các bản phân phối hiện tại không còn cài mặc định.
Lệnh 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?

-i viết thường phân giải hostname qua /etc/hosts, nơi các hệ thống dựa trên Debian ánh xạ nó tới 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?

Đọc bảng neighbour bằng ip neigh, hoặc quét subnet bằng nmap -sn.
Các thiết bị mà máy bạn vừa trao đổi gói tin gần đây nằm trong bộ đệm ARP/neighbour, hiển thị bằ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ư.

Đăng ký chương trình đại lý của chúng tôi

Thông tin của bạn

Nếu bạn có bất kỳ câu hỏi nào, liên hệ với chúng tôi tại đây !
Họ và tên(Bắt buộc)
Nhập địa chỉ email của bạn, bạn cần có tài khoản trên dashboard.rdp.monster !

Công ty của bạn

Nhập địa chỉ website của bạn nếu có
Giải thích ngắn gọn cách bạn sẽ bán dịch vụ cho khách hàng. Ví dụ: trò chuyện với mọi người trên các diễn đàn.

Đến quái vật cũng mê cookie!

Chúng tôi sử dụng cookie để cải thiện trải nghiệm duyệt web của bạn, hiển thị quảng cáo hoặc nội dung phù hợp và phân tích lưu lượng truy cập. Khi nhấn "Chấp nhận", bạn đồng ý với việc chúng tôi sử dụng cookie.