→ From Coder to Shipper
From Coder to Shipper · Hạ tầng

ufw — người gác cổng cho VPS của bạn

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ỏ

Vấn đề

VPS mới toanh mở toang với cả internet

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ó.

IP công khai

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.

Mọi port đều mở theo mặc định

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.

Scanner không ngủ

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.

Bạn cần cánh cửa có khoá

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.

Bức tranh

Hiện tại: mọi cánh cửa đều mở

Chưa có firewall — mọi dịch vụ đều đáp lời bất kỳ ai gõ cửa.

bất kỳ ai
Internet — mọi ngườiuser + scanner + botnet
→qua internet công khai
VPS — 203.0.113.10 không firewall — mọi port đều mở
SSH:22
Web (Nginx):80 / :443
MySQL:3306
Postgres:5432
Redis:6379
mọi thứ khác:1024 …

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.
— khẩu hiệu của người vận hành
01
Phần 1

ufw thực ra là gì

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.

Công cụ

ufw trong một hơi thở

Lớp vỏ dễ dùng

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ô.

Mặc định an toàn

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.

Stateful (giữ trạng thái)

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.

Đã được cài sẵn

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ạ.

Thế trận mặc định

Từ chối vào, cho ra — một công tắc

Đi vào: TỪ CHỐI

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 đó.

Đi ra: CHO PHÉP

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á.

Chi tiết giúp bạn hiểu ngay

Vì sao 'từ chối mọi thứ đi vào' không làm hỏng lưu lượng của chính bạn

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.

đi ra
Browser của bạnbạn mở đầu yêu cầu
→yêu cầu ĐI RA — cho phép đi ra
ufwkết nối mới, mở đầu từ bên trong → CHO PHÉP
→
Website / API
vào (câu trả lời)
Website / APIgửi trang trở lại
←câu trả lời ĐI VÀO — thuộc về kết nối CỦA BẠN
ufwlưu lượng trả về, kết nối đang theo dõi → CHO PHÉP
←
Browser của bạn

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'.

Nói cho dễ hiểu

Stateful, không dùng thuật ngữ

Cuốn sổ

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.

Quy tắc chuông cửa

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.

Vì sao quan trọng với bạn

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ạ.

02
Phần 2

Các lệnh cốt lõi

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.

Công tắc và gương soi

Bật lên, rồi nhìn vào

sudo ufw enable

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ả.

ufw status

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.

ufw status verbose

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?'.

Trong terminal

Bật người gác cổng lên

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).

ops@vps — zsh
$ ufw status
Status: inactive
$ sudo ufw enable
Command may disrupt existing ssh connections.
Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
$ ufw status
Status: active
Bộ ba hằng ngày

allow, deny, delete — mở, đóng, hoàn tác

ufw allow <port>/tcp

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.

ufw deny <port>

Đó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.

ufw delete <rule>

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

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.

Một bản phác thảo nhỏ

Những lệnh bạn thực sự sẽ gõ

bash
# 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.

Ví dụ tiêu biểu

Bộ luật tiêu biểu cho VPS web

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.

ops@vps — zsh
# the whole web-VPS rule set, in two commands
$ sudo ufw allow OpenSSH
Rule added
$ sudo ufw allow 'Nginx Full'
Rules updated
$ ufw status
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
Công tắc toàn cục

Đặt mặc định cho mọi thứ còn lại

ufw default deny incoming

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.

ufw default allow outgoing

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.

Mặc định bao quát cái đuôi dài

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.

03
Phần 3

Tư duy nền tảng

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.

Bức tranh

Người gác cổng đứng trước

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ụ.

internet
Internet — user + scannermọi người, mọi lúc
→mọi packet
ufw — người gác cổng mặc định: từ chối vào · cho ra
22/tcpALLOW
80/tcpALLOW
443/tcpALLOW
3306/tcpDENY
5432/tcpDENY
phần còn lạiDENY
→chỉ lưu lượng được phép
Dịch vụ trên VPSNginx :80/:443 · SSH :22
MySQL :3306 — ẩn

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.

Quy tắc vàng

Đừng bao giờ khoá mình ra khỏi SSH

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.

SSH là chìa khoá duy nhất

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.

Luôn mở SSH trước

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.

Xác minh sau mỗi thay đổi

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.

Thứ tự an toàn

Siết chặt mà không bị khoá ngoài

Bốn nước đi, đúng thứ tự này, mỗi lần đều như vậy.

  1. 1

    Cho phép port SSH của bạn trước

    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.

  2. 2

    Bật firewall lên

    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.

  3. 3

    Mở terminal thứ hai, xác minh

    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ừ đó.

  4. 4

    Rồi siết chặt, và kiểm tra status

    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.

Dấu vết trên giấy

Logging — xem ai đang gõ cửa

ufw logging on

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.

Nó đổ ở đâu

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.

Mặc định đã bật, để chạy cũng rẻ

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ở.

ufw nằm ở đâu

ufw so với iptables/nftables — mỗi cái một dòng

iptables / nftables

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.

ufw

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.
— đó là toàn bộ bài

Mở đúng những cánh cửa bạn cầ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.