Bài 10: Firewall và quản lý port Linux
Bài này giúp anh hiểu port, service listen, UFW/firewalld và cách mở/đóng truy cập an toàn trên server.
- Port là gì và cách kiểm tra port đang mở.
- Dùng UFW trên Ubuntu/Debian.
- Dùng firewalld trên Rocky/Alma/RHEL.
- Tránh tự khóa SSH khi bật firewall.
Chốt ý nhanh
| Chủ đề | Điểm cần nhớ |
|---|---|
| Firewall | Không phải để chặn cho có, mà để chỉ mở đúng thứ cần mở. |
| Port | Mỗi port mở ra nên gắn với một service và lý do rõ ràng. |
| An toàn thay đổi | Khi sửa rule từ xa, luôn giữ một phiên SSH sống để tránh tự khóa mình. |
1. Port là gì?
Port giống “cửa” của service. SSH thường 22, HTTP 80, HTTPS 443, MySQL 3306, PostgreSQL 5432. Không phải port nào cũng nên public ra Internet.
2. Kiểm tra port đang listen
ss -tulpn sudo ss -tulpn | grep LISTEN
LISTEN nghĩa là service đang chờ kết nối. Cột local address cho biết service bind trên IP nào.
3. Lab với UFW
sudo ufw status verbose sudo ufw allow 22/tcp sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable sudo ufw status numbered
Nếu SSH port không phải 22, phải allow đúng port trước khi enable.
4. Lab với firewalld
sudo firewall-cmd --state sudo firewall-cmd --list-all sudo firewall-cmd --add-service=http --permanent sudo firewall-cmd --add-service=https --permanent sudo firewall-cmd --reload
5. Tình huống thực tế
# UFW giới hạn SSH theo IP ví dụ sudo ufw allow from 1.2.3.4 to any port 22 proto tcp
6. Lỗi thường gặp
- Bật firewall trước khi allow SSH.
- Mở database ra public.
- Service không chạy nhưng tưởng firewall chặn.
- Firewall mở nhưng cloud security group vẫn chặn.
7. Quy trình debug port không vào được
- Service có chạy không:
systemctl status. - Port có listen không:
ss -tulpn. - Firewall OS có allow không.
- Cloud security group có allow không.
- DNS có trỏ đúng IP không.
8. Bài tập
- Liệt kê các port đang listen trên máy lab.
- Xác định service nào dùng port 22/80/443.
- Viết rule firewall chỉ mở SSH và HTTP/HTTPS.
Phần thực hành mở rộng: firewall theo tư duy “default deny”
Người mới rất hay mở hết cho nhanh, rồi quên đóng lại. Bài này cần giúp người học hình thành tư duy đúng: chỉ mở đúng cổng cần thiết, đúng nguồn cần thiết, trong đúng thời gian cần thiết.
Lab 1: Nhìn service đang listen trước khi mở firewall
ss -tulpn
sudo lsof -i -P -n | grep LISTEN | head -30
Trước khi viết rule, phải biết máy đang có service nào thật sự lắng nghe.
Lab 2: ufw cơ bản trên Ubuntu
sudo ufw status verbose
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status numbered
Nếu là máy remote, tuyệt đối đừng bật firewall mà chưa allow SSH trước.
Lab 3: firewalld cơ bản trên Rocky/Alma
sudo firewall-cmd --state
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --add-service=ssh --permanent
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
Lab 4: Kiểm tra từ bên trong và bên ngoài
ss -tulpn | grep -E ':22|:80|:443'
curl -I http://127.0.0.1
nc -vz 127.0.0.1 22
Nếu có một máy khác trong lab, hãy test từ ngoài vào để thấy sự khác nhau giữa service listen và firewall cho phép.
Lab 5: Mở port theo IP nguồn
Nếu công cụ hỗ trợ, hãy tập thói quen chỉ cho IP quản trị đi vào SSH thay vì mở toàn Internet. Đây là một thay đổi nhỏ nhưng giá trị bảo mật rất lớn.
Tình huống thực tế
Một web server chỉ cần mở 80/443 cho công chúng, còn SSH nên giới hạn tối đa. Database như MySQL/PostgreSQL thường không nên mở public nếu app và DB ở cùng mạng riêng.
Lỗi phổ biến
- Mở port trên firewall nhưng service chưa listen.
- Service listen đúng nhưng quên mở firewall/security group.
- Xóa rule SSH khi đang quản trị từ xa.
- Mở cả dải port rộng mà không có lý do rõ ràng.
Kết bài
Firewall là lớp rất cơ bản nhưng cực kỳ quan trọng của vận hành server. Nếu anh nắm chắc bài này, anh sẽ bắt đầu có thói quen nhìn hạ tầng theo hướng “cái gì thực sự cần public, cái gì phải giữ kín”. Bài tiếp theo sẽ mở rộng từ port sang lớp mạng và DNS, tức là cách dữ liệu thực sự đi qua hệ thống.
