0

Lab 6 — Networking Fundamentals

1. Mục tiêu

Ở Lab 5, chúng ta đã biết cách SSH vào một server từ xa.

Nhưng khi SSH không kết nối được, hoặc application không truy cập được, câu hỏi tiếp theo là:

Network đang có vấn đề ở đâu?

Trong lab này, chúng ta sẽ xây dựng nền tảng networking cần thiết cho DevOps.

Sau lab này, bạn có thể:

  • Hiểu IP Address.
  • Hiểu Network Interface.
  • Hiểu Port.
  • Hiểu TCP/UDP.
  • Hiểu Gateway và Routing.
  • Kiểm tra kết nối giữa các server.
  • Kiểm tra port đang mở.
  • Debug các lỗi network cơ bản.
  • Hiểu được đường đi của một request.

2. Networking hoạt động như thế nào?

Khi máy tính A muốn kết nối tới application trên máy B:

Ảnh Minh hoạ
Screenshot 2026-08-06 at 15.56.23.png image.png Screenshot 2026-08-06 at 15.56.23.png

Ví dụ:

Ảnh Minh hoạ
Screenshot 2026-08-06 at 15.56.23.png image.png Screenshot 2026-08-06 at 15.56.23.png

Có thể hiểu:

IP   → Tìm máy nào?
Port → Tìm application nào trên máy đó?

Đây là một trong những khái niệm quan trọng nhất của networking.


3. IP Address

Kiểm tra IP của server:

ip addr

Hoặc ngắn gọn:

ip a

Bạn có thể thấy:

inet 192.168.1.100/24

Trong đó:

192.168.1.100
        ↓
IP Address

IP dùng để định danh một network interface trong một mạng.


4. Network Interface

Một server có thể có nhiều network interface.

Ví dụ:

ip link

Kết quả:

lo
eth0

Hoặc trên một số hệ thống:

lo
ens33
enp0s3

lo là gì?

loloopback interface.

IP thường gặp:

127.0.0.1

Có thể hiểu:

127.0.0.1
   ↓
Chính máy hiện tại

Ví dụ:

curl http://127.0.0.1:8080

Request không đi ra Internet.


5. Private IP và Public IP

Trong mạng nội bộ, bạn thường gặp:

10.0.0.0/8
172.16.0.0/12
192.168.0.0/16

Ví dụ:

192.168.1.100

đây là private IP.

Mô hình:

Internet
    │
    ▼
Router
    │
    ├── 192.168.1.10
    ├── 192.168.1.20
    └── 192.168.1.100

Các máy trong LAN có thể giao tiếp với nhau bằng private IP.


6. CIDR /24 nghĩa là gì?

Bạn có thể gặp:

192.168.1.100/24

/24 biểu thị network prefix.

Trong trường hợp này:

Network:
192.168.1.0/24

Thông thường các địa chỉ trong mạng sẽ nằm trong:

192.168.1.0
        ↓
192.168.1.1
        ↓
...
        ↓
192.168.1.254

Không cần học subnetting quá sâu ở lab này.

Điều quan trọng cần hiểu:

CIDR cho biết một IP thuộc network nào và network đó có phạm vi địa chỉ ra sao.


7. Default Gateway

Kiểm tra:

ip route

Ví dụ:

default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0

Có thể hiểu:

192.168.1.100
      │
      │ Không biết đường đi
      ▼
192.168.1.1
      │
      ▼
   Gateway
      │
      ▼
   Internet

Gateway là nơi máy gửi traffic tới những network mà nó không kết nối trực tiếp.


8. Routing Table

Command:

ip route

Ví dụ:

default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0

Có thể đọc:

192.168.1.0/24
    ↓
Đi trực tiếp qua eth0

Mọi network khác
    ↓
Gửi tới 192.168.1.1

Tư duy quan trọng

Khi máy không kết nối được server:

Có route tới server không?

Kiểm tra bằng:

ip route

hoặc:

ip route get 192.168.1.100

Command thứ hai rất hữu ích vì nó cho biết Linux sẽ sử dụng interface/gateway nào để đi tới một IP cụ thể.


9. Thực hành — Kiểm tra Network

Chạy lần lượt:

hostname -I
ip addr
ip link
ip route
ip route get 8.8.8.8

Hãy tự trả lời:

IP của server là gì?

Interface nào đang sử dụng?

Default gateway là gì?

Traffic tới Internet đi qua interface nào?

10. Ping

ping dùng để kiểm tra khả năng reachability bằng ICMP.

Ví dụ:

ping 192.168.1.1

Hoặc:

ping 8.8.8.8

Nếu nhận được:

64 bytes from 8.8.8.8

thì máy có thể gửi và nhận ICMP response từ địa chỉ đó.


11. Ping không phải là tất cả

Một lỗi rất phổ biến:

ping server → OK
SSH → không được

Điều này hoàn toàn có thể xảy ra.

Ví dụ:

ICMP
  ↓
Allowed

TCP 22
  ↓
Blocked

Vì vậy:

Ping thành công không có nghĩa application/service đang hoạt động.

Đây là một nguyên tắc troubleshooting rất quan trọng.


12. Port là gì?

Một máy có thể chạy rất nhiều application:

Server
 │
 ├── SSH       :22
 ├── HTTP      :80
 ├── HTTPS     :443
 ├── Spring    :8080
 └── PostgreSQL:5432

IP xác định server.

Port xác định service/application.

Ví dụ:

192.168.1.100:8080
       │       │
       │       └── Port
       └────────── IP

13. TCP và UDP

Hai protocol transport phổ biến:

TCP
UDP

TCP

Có connection.

Client
  │
  │ Establish connection
  ▼
Server

Ưu điểm:

  • Reliable.
  • Ordered.
  • Có retransmission.

Các service phổ biến:

SSH
HTTP
HTTPS
PostgreSQL

thường sử dụng TCP.

UDP

Không yêu cầu connection theo cách của TCP.

Thường dùng trong:

DNS
DHCP
Streaming
Một số realtime applications

Ở lab này, chỉ cần nhớ:

TCP ưu tiên reliability, UDP ưu tiên sự đơn giản và ít overhead.


14. Kiểm tra Port bằng ss

Đây là command rất quan trọng:

ss -lnt

Ý nghĩa:

-l → listening
-n → numeric
-t → TCP

Ví dụ:

LISTEN 0 128 0.0.0.0:22
LISTEN 0 128 0.0.0.0:8080

Server đang listen:

22
8080

Muốn xem process:

sudo ss -lntp

Ví dụ:

LISTEN 0 128 0.0.0.0:8080 users:(("java",pid=1234))

Bây giờ ta biết:

Port 8080
   ↓
Java
   ↓
PID 1234

Đây là một command cực kỳ hữu ích khi debug server.


15. 0.0.0.0127.0.0.1

Đây là lỗi người mới gặp rất nhiều.

Giả sử application listen:

127.0.0.1:8080

Nó chỉ nhận request từ chính server.

Server
 └── 127.0.0.1:8080
       ↑
    Local only

Nếu listen:

0.0.0.0:8080

application có thể nhận connection trên các IPv4 interface phù hợp:

Internet / LAN
      │
      ▼
0.0.0.0:8080
      │
      ▼
Application

Ví dụ thực tế

Bạn chạy:

curl http://localhost:8080

trên server:

OK

Nhưng từ máy khác:

curl http://192.168.1.100:8080

lại:

Connection refused

Hãy kiểm tra:

sudo ss -lntp | grep 8080

Nếu thấy:

127.0.0.1:8080

thì đây có thể chính là nguyên nhân.


16. Thực hành — Tạo HTTP Server

Nếu máy có Python:

mkdir ~/network-lab
cd ~/network-lab
echo "Hello Network" > index.html

Chạy:

python3 -m http.server 8080

Mở terminal khác:

curl http://localhost:8080

Kết quả:

Hello Network

Kiểm tra:

ss -lntp | grep 8080

Bạn sẽ thấy Python đang listen trên port 8080.


17. Test từ máy khác

Nếu có Machine A và Machine B:

Machine A
192.168.1.10
      │
      │ HTTP :8080
      ▼
Machine B
192.168.1.100

Trên Machine B:

python3 -m http.server 8080

Trên Machine A:

curl http://192.168.1.100:8080

Nếu thành công:

Hello Network

Bạn vừa kiểm tra được:

Network
   ↓
  IP
   ↓
 TCP
   ↓
Port 8080
   ↓
Application

18. curl — Công cụ cực kỳ quan trọng

curl không chỉ dùng để tải file.

Trong DevOps, nó được dùng rất nhiều để test API và network.

Ví dụ:

curl http://localhost:8080

Kiểm tra HTTP status:

curl -I http://localhost:8080

Ví dụ:

HTTP/1.0 200 OK

Xem chi tiết connection:

curl -v http://localhost:8080

Bạn có thể thấy:

* Connected to localhost
> GET /
< HTTP/1.0 200 OK

Trick thực tế

Khi debug API:

curl -v http://server:8080/api/todos

thường hữu ích hơn việc chỉ mở browser.


19. Kiểm tra Port từ Client

Có thể dùng:

nc -vz 192.168.1.100 8080

Nếu thành công:

Connection to 192.168.1.100 8080 port [tcp/*] succeeded!

Nếu fail:

Connection refused

hoặc:

Operation timed out

Hai lỗi này có ý nghĩa khác nhau.

Connection refused

Thường có nghĩa:

Server reachable
       ↓
Port không có service listen

hoặc connection bị reject ở đâu đó.

Connection timed out

Thường nghĩ tới:

Firewall
Network
Routing
Security Group

20. traceroute

Khi muốn biết traffic đi qua những router nào:

traceroute 8.8.8.8

Một số hệ thống có thể cần cài:

sudo apt install traceroute

Bạn có thể thấy:

1  192.168.1.1
2  10.0.0.1
3  ...
4  ...

Mỗi dòng là một hop.

Không phải tất cả router đều trả lời traceroute, nên * * * không nhất thiết đồng nghĩa network đang hỏng.


21. DNS chưa học ở Lab này

Ở lab này, hãy tạm sử dụng IP:

192.168.1.100

Thay vì:

api.example.com

Vì Lab 7 sẽ tập trung riêng vào:

DNS

Mục tiêu hiện tại là hiểu:

IP
 ↓
Port
 ↓
Service

trước khi thêm DNS vào.


22. Bài tập tổng hợp

Giả sử có:

Machine A
192.168.1.10

Machine B
192.168.1.100

Trên Machine B chạy:

python3 -m http.server 8080

Trên Machine A hãy thực hiện:

Bước 1

ping 192.168.1.100

Bước 2

ip route get 192.168.1.100

Bước 3

nc -vz 192.168.1.100 8080

Bước 4

curl -v http://192.168.1.100:8080

Bước 5

Quay lại Machine B:

sudo ss -lntp | grep 8080

Hãy giải thích được toàn bộ flow:

Machine A
   │
   │ IP
   ▼
Network
   │
   │ TCP :8080
   ▼
Machine B
   │
   ▼
Python HTTP Server

23. Challenge — Tự tạo lỗi Network

Đây là phần quan trọng nhất của lab.

Scenario 1 — Sai Port

Chạy:

python3 -m http.server 8080

Nhưng client thử:

curl http://192.168.1.100:8081

Debug:

nc -vz 192.168.1.100 8081

Sau đó:

sudo ss -lntp

Tìm nguyên nhân.


Scenario 2 — Application chỉ listen localhost

Chạy:

python3 -m http.server --bind 127.0.0.1 8080

Trên server:

curl http://localhost:8080

sẽ thành công.

Nhưng từ Machine A:

curl http://192.168.1.100:8080

có thể fail.

Kiểm tra:

ss -lntp | grep 8080

Bạn sẽ thấy:

127.0.0.1:8080

Thay vì:

0.0.0.0:8080

24. Network Troubleshooting Flow

Khi:

Application không truy cập được

hãy debug từ thấp lên cao:

          Client
             │
             ▼
      Có IP/interface?
             │
             ▼
        Có route?
             │
             ▼
       Ping server?
             │
             ▼
       Port có mở?
             │
             ▼
   Service có listen?
             │
             ▼
     Application OK?

Command tương ứng:

ip addr
ip route
ping <server-ip>
nc -vz <server-ip> <port>
ss -lntp
curl -v http://<server>:<port>

Đây là flow bạn nên ghi nhớ.


25. Một số lỗi phổ biến

Lỗi Khả năng
Network is unreachable Không có route
Connection refused Port không có service hoặc bị reject
Connection timed out Firewall/network/routing
No route to host Routing hoặc network
Could not resolve host DNS
curl localhost OK nhưng IP fail Service chỉ listen localhost
Ping OK nhưng TCP fail Port/firewall/service

26. Kinh nghiệm thực tế

1. Luôn debug từ Layer thấp lên

Đừng bắt đầu bằng application.

Hãy:

Interface
 ↓
IP
 ↓
Route
 ↓
Connectivity
 ↓
Port
 ↓
Service
 ↓
Application

2. localhost không có nghĩa là server accessible từ bên ngoài

Đây là một lỗi rất phổ biến:

curl localhost:8080
       ↓
OK

nhưng:

curl server-ip:8080
       ↓
FAIL

Kiểm tra:

ss -lntp

3. ping không kiểm tra port

Không nên kết luận:

ping OK
→ Application OK

Đúng hơn:

ping
→ kiểm tra ICMP reachability

nc
→ kiểm tra TCP port

curl
→ kiểm tra HTTP application

4. ss là command nên nhớ

Khi server có vấn đề:

sudo ss -lntp

có thể trả lời rất nhanh:

Port nào đang mở?
Process nào đang listen?
Application đang bind vào IP nào?

27. Liên hệ với Docker và Kubernetes

Những khái niệm hôm nay sẽ xuất hiện liên tục sau này.

Docker:

Container
   │
   │ Port
   ▼
Host

Ví dụ:

docker run -p 8080:8080 app

Kubernetes:

Pod
 │
 │ containerPort
 ▼
Service
 │
 │ Port
 ▼
Client

Ingress:

Client
  │
  │ HTTP
  ▼
Ingress
  │
  ▼
Service
  │
  ▼
Pod

Nếu bạn không hiểu:

IP
Port
Interface
Routing
TCP

thì việc debug Kubernetes networking sau này sẽ rất khó.


28. Checklist

Sau Lab 6, bạn nên tự trả lời được:

✓ IP Address là gì?
✓ Network Interface là gì?
✓ 127.0.0.1 là gì?
✓ Private IP là gì?
✓ CIDR /24 có ý nghĩa gì?
✓ Default Gateway là gì?
✓ Routing Table dùng để làm gì?
✓ Port là gì?
✓ TCP và UDP khác nhau thế nào?
✓ 0.0.0.0 khác 127.0.0.1 thế nào?
✓ ss dùng để làm gì?
✓ ping kiểm tra cái gì?
✓ nc kiểm tra cái gì?
✓ curl -v giúp debug gì?
✓ Connection refused khác timeout thế nào?
✓ Vì sao ping OK nhưng SSH/HTTP vẫn fail?

Kết quả cần đạt

Bạn nên có khả năng nhìn vào một lỗi:

curl http://192.168.1.100:8080
Connection refused

không đoán mò.

Thay vào đó:

1. Có IP?
      ↓
2. Có route?
      ↓
3. Server reachable?
      ↓
4. Port 8080 có listen?
      ↓
5. Listen trên 127.0.0.1 hay 0.0.0.0?
      ↓
6. Process nào đang listen?
      ↓
7. Application có thực sự hoạt động?

Đây chính là nền tảng networking mà bạn sẽ sử dụng khi làm Docker, Kubernetes, Ansible, Azure, Application Gateway và troubleshooting production.

Lab tiếp theo: Lab 7 — DNS & HTTP, chúng ta sẽ đi từ curl http://192.168.1.100:8080 đến cách một request thực tế đi qua Domain → DNS → IP → Port → Web Server → Application, đồng thời học các công cụ như dig, nslookup, curl và cách debug lỗi DNS/HTTP.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí