Firewall và Bảo Mật Mạng
Một dịch vụ lắng nghe trên cổng (Bài 6) là một "cánh cửa". Firewall quyết định ai được gõ cửa nào. Đây là lớp phòng thủ mạng cơ bản nhất — và là chỗ vô số sự cố "không kết nối được" (bị firewall chặn) lẫn lỗ hổng (mở quá rộng) phát sinh. Bài này giải thích firewall hoạt động ra sao và các dạng bạn gặp.
Firewall làm gì
Firewall lọc lưu lượng mạng dựa trên bộ luật (rules). Mỗi luật xét các yếu tố:
- Hướng: vào (inbound) hay ra (outbound).
- Giao thức: TCP, UDP, ICMP...
- Cổng: 22, 80, 443...
- Địa chỉ nguồn/đích: một IP, một dải (CIDR — Bài 2), hay mọi nơi.
- Hành động: cho qua (allow/accept), chặn (deny/drop), hay từ chối (reject).
Gói tin tới ──► [ Firewall: khớp luật nào? ]
├─ TCP cổng 22 từ IP công ty → ALLOW
├─ TCP cổng 443 từ mọi nơi → ALLOW
└─ còn lại → DROP (mặc định)
Nguyên tắc quan trọng nhất: default-deny
Cách cấu hình firewall an toàn là default-deny (mặc định chặn): chặn hết, rồi chỉ mở những gì thực sự cần. Ngược lại với "default-allow" (mở hết, chặn vài cái) — vốn nguy hiểm vì bạn dễ quên chặn một cổng.
Đây chính là tư duy "allowlist" lặp lại trong các series trước: Security Group ở AWS (series AWS Bài 3) chỉ có luật cho phép, mặc định chặn; nguyên tắc "chỉ mở port cần" khi tạo EC2. Quy tắc vàng: mở tối thiểu — ví dụ web server chỉ cần 443 (và 80 để chuyển hướng) cho mọi nơi, còn 22 (SSH) chỉ cho IP của bạn (nhớ Bài 14 series Linux).
Firewall có trạng thái (stateful)
Firewall hiện đại là stateful — nó nhớ các kết nối đang mở. Khi bạn (từ server) chủ động kết nối ra ngoài (ví dụ gọi API, tải gói), firewall tự cho lưu lượng phản hồi đi vào, không cần luật riêng. Bạn chỉ cần khai báo luật cho lưu lượng khởi tạo.
Đây là lý do (nhớ series AWS) Security Group "stateful": mở inbound 443 thì phản hồi tự ra được, không cần mở outbound tương ứng. Firewall stateless (cũ, như Network ACL của AWS) thì phải khai cả hai chiều — dễ sai hơn.
Firewall trên Linux: iptables và nftables
Nhân Linux lọc gói qua framework netfilter, điều khiển bằng:
- iptables — công cụ cổ điển, vẫn rất phổ biến.
- nftables — thế hệ mới thay thế iptables (cú pháp gọn hơn, hiệu năng tốt hơn). Các distro mới dùng nó bên dưới.
iptables tổ chức luật theo chain (chuỗi) ứng với hướng lưu lượng:
INPUT gói tin gửi TỚI máy này (vd ai đó kết nối vào server)
OUTPUT gói tin máy này gửi ĐI
FORWARD gói tin đi XUYÊN QUA máy này (khi máy làm router/NAT)
Ví dụ luật iptables (chỉ để đọc hiểu — server thật thường dùng frontend dễ hơn ở dưới):
# cho phép SSH (22) từ một dải IP cụ thể
iptables -A INPUT -p tcp --dport 22 -s 203.0.113.0/24 -j ACCEPT
# cho phép HTTPS từ mọi nơi
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# chặn còn lại (default-deny)
iptables -P INPUT DROP
Đọc: -A INPUT thêm luật vào chain INPUT, -p tcp --dport 22 cho TCP cổng 22, -s nguồn, -j ACCEPT/DROP hành động. -P INPUT DROP đặt chính sách mặc định của chain là chặn.
Lưu ý môi trường: iptables/nftables là Linux. Trên macOS firewall là
pf(Packet Filter, dùngpfctl) — khác cú pháp nhưng cùng ý tưởng. Vì server hầu hết là Linux, bài tập trung iptables/nftables.
ufw: firewall đơn giản cho người mới
Cú pháp iptables khó nhớ. ufw (Uncomplicated Firewall) là lớp vỏ đơn giản trên Ubuntu/Debian:
ufw default deny incoming # mặc định chặn vào (default-deny)
ufw default allow outgoing # cho phép đi ra
ufw allow 443/tcp # mở HTTPS
ufw allow from 203.0.113.0/24 to any port 22 # SSH chỉ từ dải IP đó
ufw enable
ufw status # xem luật hiện có
Với phần lớn server đơn lẻ, ufw là đủ và ít sai. (firewalld là lựa chọn tương tự trên họ Red Hat.)
Firewall mạng và cloud: security group
Ngoài firewall trên từng máy (host firewall như iptables/ufw), còn firewall ở tầng mạng:
- Cloud Security Group (AWS, GCP, Azure) — firewall ảo gắn vào instance/VM, cấu hình qua giao diện/API thay vì lệnh trong máy. Stateful, default-deny. Đây là cái bạn dùng nhiều nhất trên cloud (nhớ series AWS).
- Network firewall / NACL — lọc ở biên mạng/subnet, áp cho cả nhóm máy.
Thực tế thường có nhiều lớp: security group ở cloud + firewall trên host + có thể WAF (Web Application Firewall) lọc tấn công tầng 7 (HTTP). Phòng thủ nhiều lớp (defense in depth): một lớp sai sót còn lớp khác đỡ.
Liên hệ gỡ lỗi
Rất nhiều ca "service chạy mà không ai vào được" là do firewall:
1. Dịch vụ có nghe đúng cổng? → ss -tlnp (Bài 13 series Linux)
2. Firewall HOST có mở cổng đó? → ufw status / iptables -L
3. Security Group / NACL có mở? → kiểm tra trên cloud console
4. Tới được từ ngoài không? → nc -zv <host> <cổng> từ máy khác (Bài 6, 12)
Nhớ: gói tin có thể bị chặn ở nhiều lớp. "telnet/nc tới cổng bị timeout" thường là firewall drop (im lặng); "connection refused" thường là không có dịch vụ nghe (firewall cho qua nhưng không ai trả lời).
Tổng kết
Firewall lọc lưu lượng theo hướng, giao thức, cổng, IP nguồn/đích với hành động allow/deny. Nguyên tắc cốt lõi: default-deny — chặn hết, chỉ mở cái cần (mở tối thiểu). Firewall stateful tự cho phản hồi của kết nối đã mở. Trên Linux: iptables/nftables (chain INPUT/OUTPUT/FORWARD), hoặc ufw cho gọn; trên cloud: security group. Thực tế dùng nhiều lớp. Khi gỡ lỗi kết nối, kiểm tra firewall ở mọi lớp; phân biệt "timeout" (bị drop) với "connection refused" (không ai nghe).
Firewall kiểm soát ai vào được. Bài 11 chuyển sang phân phối lưu lượng tới nhiều server để chịu tải lớn: load balancer và reverse proxy.