VPS của bạn có IP công khai và theo mặc định, mọi port đều mở. ufw là cách đơn giản, an toàn để đóng những cánh cửa bạn không dùng — mà không bao giờ phải đụng tới iptables.
← / → để chuyển slide · chuyển EN/VI bên dưới · góc nhìn người vận hành — tư duy trước, vài ví dụ nhỏ
Ngay khi bạn mua, máy của bạn có một IP công khai — và theo mặc định, không có firewall nào đứng trước nó.
VPS của bạn có địa chỉ dạng 203.0.113.10. Bất kỳ ai cũng có thể gửi packet tới bất kỳ port nào trên đó — mà bot thì biết mọi địa chỉ tồn tại.
VPS mặc định không có firewall: SSH :22, MySQL :3306, Postgres :5432, Redis :6379 — dịch vụ nào đang nghe, cả thế giới đều chạm tới được.
Bot quét toàn bộ internet tìm port mở cả ngày lẫn đêm. Redis hay database bị lộ sẽ bị tìm thấy trong vài giờ — và bot đã mang sẵn exploit.
Website của bạn nên vẫn chạm tới được — còn database và SSH thì không. Cần một thứ đứng ở phía trước, quyết định theo từng port ai được vào.
Chưa có firewall — mọi dịch vụ đều đáp lời bất kỳ ai gõ cửa.
Cũng chính máy bạn sẽ dùng để ship app — nhưng ngay lúc này, một người lạ ở bất cứ đâu cũng nói chuyện thẳng được với MySQL. Đó là vấn đề bài này giải quyết.
Một firewall tốt là thứ vô hình: cài một lần, mở đúng những cánh cửa cần thiết, rồi không bao giờ phải nghĩ tới — cho tới khi có thứ bất ngờ xuất hiện trong log.
Một công cụ, ba tính chất: dễ, an toàn theo mặc định, và stateful. Hiểu được ba điều này, mọi lệnh đều trở nên hiển nhiên.
ufw (Uncomplicated Firewall) là lớp vỏ dòng lệnh thân thiện phía trên bộ lọc packet thật — iptables và nftables. Nó dịch các luật một dòng của bạn thành thứ kernel thực sự thực thi. Bạn không bao giờ cần đụng vào ngôn ngữ lọc thô.
Ngay khi chạy ufw enable, thế trận đổi sang: từ chối mọi thứ đi vào, cho phép mọi thứ đi ra. Từ đó, bạn chỉ mở đúng những cánh cửa cụ thể cần thiết.
Nó theo dõi các kết nối: nếu máy của bạn mở đầu cuộc trò chuyện, câu trả lời sẽ được cho qua tự động. Chính điều đó làm 'từ chối mọi thứ đi vào' trở nên an toàn — ngay sau đây sẽ thấy vì sao.
Trên VPS Ubuntu điển hình, ufw được cài sẵn và đang nằm đó, chưa bật — chờ bạn kích hoạt. Một lệnh sau đó, VPS của bạn ngừng đáp lời người lạ.
Sau ufw enable, mọi kết nối đi vào từ bên ngoài đều bị từ chối — trừ khi bạn đã thêm luật allow rõ ràng cho port đó. Câu trả lời mặc định với người lạ là 'không'.
Đó là toàn bộ mô hình bảo mật trong một câu: không gì đi vào được, trừ khi chính bạn mở cánh cửa đó.
VPS của bạn vẫn tự do nói chuyện với thế giới bên ngoài — apt update, tra DNS, app của bạn gọi API hay database bên ngoài. Luồng đi ra mặc định vẫn mở.
Nhờ đó site của bạn vẫn chạy — trong khi những cánh cửa mà thế giới có thể bước qua thì vẫn khoá.
Bạn bấm, browser yêu cầu một trang. Hai chiều lưu lượng — ufw xử lý khác nhau, và có lý do chính đáng.
Người gác cổng giữ cuốn sổ những ai mình đã cho ra. Bất cứ thứ gì quay về trên các cuộc trò chuyện đó đều được qua mà không cần hỏi lần hai. Người lạ gõ cửa trước vẫn nhận câu 'không'.
Kernel giữ một bảng các kết nối đang hoạt động: 'laptop → 203.0.113.10:443, mở 5 giây trước, đang nói chuyện'. Mỗi packet trước tiên được đối chiếu với bảng đó, chứ không phải một danh sách luật mù quáng.
Hãy tưởng tượng ufw như một toà nhà có lễ tân nghiêm: không ai vào được trừ khi bạn mời. Nhưng nếu bạn ra ngoài mua cà phê, barista có thể đưa bạn vào thẳng — thẻ của bạn đã có trong danh sách khách.
App của bạn gọi API bên ngoài, apt kéo update, browser tải trang của bạn. Tính stateful chính là thứ để tất cả những điều đó vẫn chạy, trong khi 'từ chối mọi thứ đi vào' giữ trận tuyến trước người lạ.
Năm động từ đáp ứng 95% công việc firewall hằng ngày: enable, status, allow, deny, delete — kèm một dòng cho mặc định toàn cục.
Bật firewall lên — ngay lập tức, và ở mỗi lần khởi động. Trước khi lệnh này chạy, ufw chỉ là cuốn sổ không có người gác: luật đã có, nhưng chưa lọc được gì cả.
Hiện ufw đang active hay không và liệt kê mọi luật đang hiệu lực, kèm hành động (ALLOW / DENY) và chiều. Đây là thứ đầu tiên bạn gõ sau mỗi lần thay đổi.
Cùng một khung nhìn, thêm chính sách mặc định đi vào/đi ra và trạng thái logging. Tiện để kiểm tra nhanh 'mọi thứ có đúng như tôi nghĩ không?'.
Chú ý dòng cảnh báo — đó là ufw đang thật thà với bạn về SSH (quy tắc vàng sẽ có sau).
Mở một cánh cửa: lưu lượng trên port đó được vào từ mọi nơi. Dùng được số port (22/tcp, 8080/tcp) hoặc tên dịch vụ (OpenSSH, 'Nginx Full'). Thêm /udp cho dịch vụ nói chuyện bằng UDP.
Đóng một cánh cửa rõ ràng. Hữu ích khi mặc định đã là từ chối — nó ghi lại ý đồ của bạn, và tạo chỗ để log những tiếng ồn hoặc cho phép một IP cụ thể sau này.
Gỡ một luật bạn đã thêm trước đó: ufw delete allow 3306/tcp. Delete không phải 'từ chối' — nó trả port về đúng điều mà chính sách mặc định nói.
Mỗi luật là một dòng trong cuốn sổ của ufw. Đó là toàn bộ mô hình dữ liệu — không có file config phải đi tìm, không cần restart. Cuốn sổ được lưu trên đĩa và nạp lại khi khởi động.
# turn it on (now + at every boot)
sudo ufw enable
# what's actually active?
ufw status
# the daily drivers
ufw allow 22/tcp # SSH, by port number
ufw allow OpenSSH # same rule, by service name
ufw allow 'Nginx Full' # 80 + 443 in one go
ufw deny 3306/tcp # MySQL: no outside traffic
ufw delete deny 3306/tcp # undo that rule
Mọi thứ ở đây đều một dòng, có thể hoàn tác, và hiện ngay trong ufw status. Không file config, không restart.
SSH cộng hai port web. Đó là toàn bộ firewall cho hầu hết dự án nhỏ — không mở gì thêm.
Câu 'người lạ nhận câu không' cho toàn cục. Đây là chính sách làm cho mọi thứ không được cho phép rõ ràng đều không chạm tới được. Nó đã là mặc định sau khi enable — nhưng nói rõ ra là thói quen tốt.
Câu 'VPS của bạn có thể chạm tới thế giới'. Luồng đi ra vẫn mở để update, tra DNS và các API call của app vẫn chạy.
Hãy xem nó như chính sách cho mọi port bạn hay quên: 3306, 5432, 6379, 10000… Mọi thứ không có allow rõ ràng đều thừa hưởng 'từ chối đi vào'. Cái đuôi dài đó chính là thứ scanner nhắm tới.
Cách nhìn toàn bộ chuyện trong một câu — và sai lầm duy nhất khiến bạn mất cả tối.
Ba cánh cửa mở cho những ai cần; mọi thứ khác nhận câu 'không' trước khi chạm được tới dịch vụ.
Scanner cứ gõ cửa 3306 và 5432 — và nhận lại con số không. User của bạn nhận được website, và chỉ có bạn nhận được shell.
Thay đổi firewall là nguy hiểm: một deny hay delete sai có thể cắt đứt SSH của chính bạn — mà không có 'hoàn tác' từ bên ngoài.
Bạn quản trị VPS qua SSH. Nếu một luật chặn :22, bạn không vào được — kể cả để sửa. Lúc đó phải sửa qua web console của nhà cung cấp (VNC/rescue), chậm và bực mình.
Trước ufw enable — hay bất kỳ deny/delete nào — hãy chắc rằng đã có luật allow cho port SSH của bạn. Nếu SSH chạy trên port không chuẩn, đó chính là port phải allow.
Mở MỘT terminal THỨ HAI trước khi siết chặt, và thử xem vẫn connect được không. Nếu phiên mới chết, phiên cũ vẫn còn trong — bạn có 30 giây để xoá luật hỏng.
Bốn nước đi, đúng thứ tự này, mỗi lần đều như vậy.
ufw allow 22/tcp (hoặc port mà SSH của bạn đang nghe). Luật này phải tồn tại trước khi mọi thứ khác bị siết chặt.
sudo ufw enable — thế trận mặc định bật lên: từ chối vào, cho ra. Luật SSH của bạn giữ bạn ở trong.
Từ máy của bạn, mở thêm một phiên SSH. Connect được? Bạn an toàn để tiếp tục. Không được? Phiên đầu vẫn còn sống — sửa luật ngay từ đó.
Thêm allow cho dịch vụ thật, deny những gì cần đóng, và đọc ufw status để xác nhận trạng thái cuối khớp với ý đồ — mỗi lần đều vậy.
Bắt đầu ghi lại mọi packet bị drop hoặc reject: IP nguồn, port đích, protocol. Đó là bằng chứng pháp y về ai đang dò máy bạn và khi nào.
Mục ghi vào kernel log — /var/log/kern.log — dạng 'IN=eth0 ... PROTO=TCP DPT=3306 ... REJECT'. tail -f nó và xem scanner làm việc.
ufw logging on là mặc định sau khi enable, và overhead trên VPS nhỏ là không đáng kể. Ngày nào một port bị quật tung, bạn sẽ mừng vì cuốn sổ đã mở.
Cơ chế thật trong kernel: chains, tables, luật thô. Cực kỳ mạnh, cực kỳ dài dòng — và chỉ một typo là tự chặn mình ra ngoài.
Lớp vỏ một dòng thân thiện, tự viết đúng những luật kernel đó cho bạn, giữ mặc định hợp lý, và hoàn tác dễ không kém. Với 95% công việc VPS, bạn dừng lại ở ufw.
ufw là người gác cổng trước các dịch vụ của bạn: mở đúng những cánh cửa cần, và để phần còn lại của internet gõ cửa một bức tường khoá kín.
ufw enable → allow SSH của bạn → xác minh từ terminal thứ hai → allow 80/443 → phần còn lại cứ đóng. Ship app đi; người gác cổng trông coi cửa.