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ạ |
||
|---|---|---|
![]() |
![]() |
![]() |
Ví dụ:
Ảnh Minh hoạ |
||
|---|---|---|
![]() |
![]() |
![]() |
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ì?
lo là loopback 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.0 và 127.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
và 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


