UFW (viết tắt của Uncomplicated Firewall) là một công cụ cấu hình firewall chạy trên nền iptables
. Nó được tích hợp sẵn trong các bản phân phối của Ubuntu và cung cấp một giao diện đã được đơn giản hóa để cấu hình các tác vụ firewall phổ biến thông qua dòng lệnh.
Bài viết này có dạng một tài liệu tham khảo nhanh về các câu lệnh và trường hợp sử dụng UFW thường gặp, bao gồm các ví dụ về cách cho phép và chặn dịch vụ theo port, network interface, và địa chỉ IP nguồn.
Các rule và lệnh UFW cơ bản
Xác minh trạng thái UFW
Để kiểm tra xem ufw
đã được kích hoạt hay chưa, hãy chạy lệnh:
sudo ufw status
Status: inactive
Output sẽ cho biết firewall của bạn có đang hoạt động hay không.
Kích hoạt UFW
Nếu bạn nhận được thông báo Status: inactive
khi chạy ufw status
, điều đó có nghĩa là firewall chưa được kích hoạt trên hệ thống. Bạn sẽ cần chạy một lệnh để kích hoạt nó.
Theo mặc định, khi được kích hoạt, UFW sẽ chặn mọi truy cập từ bên ngoài vào tất cả các port trên server. Trên thực tế, điều này có nghĩa là nếu bạn đang kết nối với server qua SSH và bạn kích hoạt UFW trước khi cho phép truy cập tới port SSH, kết nối SSH đó sẽ bị ngắt ngay lập tức. Vì vậy, hãy làm theo hướng dẫn trong phần cho phép truy cập SSH trước khi kích hoạt firewall.
Để kích hoạt UFW trên hệ thống của bạn, hãy chạy lệnh:
sudo ufw enable
Bạn sẽ thấy kết quả như sau:
Firewall is active and enabled on system startup
Để xem những gì hiện đang bị chặn hoặc được phép, bạn có thể sử dụng tham số verbose
khi chạy ufw status
như sau:
sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
Vô hiệu hóa UFW
Nếu vì lý do nào đó bạn cần vô hiệu hóa UFW, bạn có thể chạy lệnh sau:
sudo ufw disable
Lưu ý rằng lệnh này sẽ vô hiệu hóa hoàn toàn dịch vụ firewall trên hệ thống của bạn.
Chặn một địa chỉ IP
Dùng lệnh sau để chặn tất cả các kết nối mạng xuất phát từ một địa chỉ IP cụ thể (nhớ thay thế địa chỉ IP được tô sáng bằng địa chỉ IP bạn muốn chặn):
sudo ufw deny from 203.0.113.100
Rule added
Trong ví dụ này, from 203.0.113.100
chỉ định một địa chỉ IP nguồn là “203.0.113.100”.
Nếu bây giờ chạy sudo ufw status
, bạn sẽ thấy địa chỉ IP được chỉ định được liệt kê là bị từ chối (denied):
Status: active
To Action From
-- ------ ----
Anywhere DENY 203.0.113.100
Tất cả các kết nối, đến hoặc đi, đều bị chặn đối với địa chỉ IP được chỉ định.
Chặn một subnet
Nếu bạn cần chặn toàn bộ một subnet, bạn có thể sử dụng địa chỉ subnet làm tham số from
trong lệnh ufw deny
.
Lệnh này sẽ chặn tất cả các địa chỉ IP trong subnet ví dụ 203.0.113.0/24
:
sudo ufw deny from 203.0.113.0/24
Rule added
Chặn kết nối đến một network interface
Dùng lệnh sau để chặn các kết nối đến từ một địa chỉ IP cụ thể tới một network interface (giao diện mạng) cụ thể (thay thế địa chỉ IP được tô sáng bằng địa chỉ IP bạn muốn chặn):
sudo ufw deny in on eth0 from 203.0.113.100
Rule added
Tham số in
yêu cầu ufw
chỉ áp dụng rule cho các kết nối đến, và tham số on eth0
chỉ định rằng rule chỉ áp dụng cho interface eth0
. Điều này có thể có ích nếu bạn có một hệ thống với nhiều network interface (bao gồm cả các interface ảo) và bạn cần chặn truy cập bên ngoài vào một số interface này nhưng không phải tất cả.
Cho phép một địa chỉ IP
Chạy lệnh sau để cho phép tất cả các kết nối mạng xuất phát từ một địa chỉ IP cụ thể (thay thế địa chỉ IP được tô sáng bằng địa chỉ IP mà bạn muốn cho phép truy cập):
sudo ufw allow from 203.0.113.101
Rule added
Nếu bây giờ bạn chạy sudo ufw status
, bạn sẽ thấy output tương tự như sau. Nó hiển thị từ ALLOW
bên cạnh địa chỉ IP bạn vừa thêm.
Status: active
To Action From
-- ------ ----
...
Anywhere ALLOW 203.0.113.101
Bạn cũng có thể cho phép các kết nối từ cả một subnet bằng cách cung cấp subnet mask (dùng để phân chia subnet) tương ứng cho một host, chẳng hạn như 203.0.113.0/24
.
Cho phép kết nối đến một network interface
Chạy lệnh sau để cho phép các kết nối đến từ một địa chỉ IP cụ thể tới một network interface cụ thể (thay thế địa chỉ IP được tô sáng bằng địa chỉ IP bạn muốn cho phép):
sudo ufw allow in on eth0 from 203.0.113.102
Rule added
Tham số in
yêu cầu ufw
chỉ áp dụng rule cho các kết nối đến, và tham số on eth0
chỉ định rằng rule chỉ áp dụng cho interface eth0
.
Nếu bây giờ bạn chạy sudo ufw status
, bạn sẽ thấy output tương tự như sau:
Status: active
To Action From
-- ------ ----
...
Anywhere on eth0 ALLOW 203.0.113.102
Xóa một rule UFW
Để xóa một rule đã được thiết lập trong UFW, hãy dùng lệnh ufw delete
, theo sau là nội dung của rule đó (allow
hoặc deny
) cùng với các tham số tương ứng. Ví dụ sau sẽ xóa một rule đã được thiết lập trước đó để cho phép tất cả các kết nối từ địa chỉ IP 203.0.113.100
:
sudo ufw delete allow from 203.0.113.101
Rule deleted
Một cách khác để chỉ định rule bạn muốn xóa là cung cấp ID của rule đó. Thông tin này có thể được lấy bằng lệnh sau:
sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] Anywhere DENY IN 203.0.113.100
[ 2] Anywhere on eth0 ALLOW IN 203.0.113.102
Từ output này, bạn có thể thấy có hai rule đang hoạt động. Rule đầu tiên (với các giá trị được tô sáng) từ chối tất cả các kết nối đến từ địa chỉ IP 203.0.113.100
. Rule thứ hai cho phép các kết nối trên interface eth0
đến từ địa chỉ IP 203.0.113.101
.
Vì theo mặc định, UFW đã chặn tất cả truy cập bên ngoài trừ khi được cho phép một cách tường minh, nên rule đầu tiên là dư thừa và bạn có thể xóa nó. Để xóa một rule bằng ID của nó, hãy chạy lệnh:
sudo ufw delete 1
Bạn sẽ được yêu cầu xác nhận. Nhớ đảm bảo rằng ID bạn cung cấp trỏ đến đúng rule bạn muốn xóa.
Deleting:
deny from 203.0.113.100
Proceed with operation (y|n)? y
Rule deleted
Nếu sa đó bạn liệt kê lại các rule bằng sudo ufw status
, bạn sẽ thấy rule đó đã được xóa.
Liệt kê các profile ứng dụng có sẵn
Sau khi cài đặt, các ứng dụng dùng giao tiếp mạng thường sẽ thiết lập một profile UFW mà bạn có thể sử dụng để cho phép kết nối từ các địa chỉ bên ngoài. Điều này thường tương tự như việc chạy ufw allow <port>
. Nó có lợi thế là cung cấp một giải pháp đơn giản gộp các port cụ thể mà một dịch vụ sử dụng và cung cấp danh pháp để dễ dàng tham chiếu đến các dịch vụ.
Để liệt kê các profile hiện có, hãy chạy lệnh:
sudo ufw app list
Nếu bạn đã cài đặt một dịch vụ (như web server hoặc phần mềm phụ thuộc mạng khác) và profile không có sẵn trong UFW, trước tiên hãy đảm bảo dịch vụ đó đã được bật. Đối với các server từ xa, bạn thường sẽ có sẵn OpenSSH:
Available applications:
OpenSSH
Kích hoạt một profile ứng dụng
Để kích hoạt một profile ứng dụng UFW, hãy chạy ufw allow
theo sau là tên của profile ứng dụng bạn muốn kích hoạt (lấy bằng lệnh sudo ufw app list
).
Trong ví dụ sau, chúng ta đang kích hoạt profile của OpenSSH để cho phép tất cả các kết nối SSH đến trên port SSH mặc định.
sudo ufw allow "OpenSSH"
Rule added
Rule added (v6)
Hãy nhớ đặt tên profile trong dấu ngoặc kép nếu chúng bao gồm nhiều từ, chẳng hạn như “Nginx HTTPS”.
Vô hiệu hóa profile ứng dụng
Để vô hiệu hóa một profile ứng dụng mà bạn đã thiết lập trước đó trong UFW, bạn sẽ cần xóa rule tương ứng của nó. Ví dụ, hãy xem xét output từ sudo ufw status
:
sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)
Output này cho thấy profile ứng dụng Nginx Full
hiện đang được kích hoạt. Nó cho phép tất cả các kết nối đến web server cả qua HTTP và HTTPS. Nếu bạn chỉ muốn cho phép các yêu cầu HTTPS đến và đi từ web server của mình, bạn sẽ phải trước tiên kích hoạt rule hạn chế nhất (trong trường hợp này sẽ là Nginx HTTPS
) và sau đó vô hiệu hóa rule Nginx Full
đang hoạt động:
sudo ufw allow "Nginx HTTPS"
sudo ufw delete allow "Nginx Full"
Hãy nhớ rằng bạn có thể liệt kê tất cả các profile ứng dụng có sẵn bằng sudo ufw app list
.
Cho phép SSH
Khi làm việc với các server từ xa, phải đảm bảo rằng port SSH được mở cho các kết nối để bạn có thể đăng nhập vào server của mình từ xa.
Lệnh sau sẽ kích hoạt profile ứng dụng OpenSSH của UFW và cho phép tất cả các kết nối đến port SSH mặc định trên server:
sudo ufw allow OpenSSH
Rule added
Rule added (v6)
Mặc dù cú pháp thay thế sau ít thân thiện với người dùng hơn, nó trực tiếp chỉ định số port của dịch vụ SSH (thường được đặt là 22
theo mặc định):
sudo ufw allow 22
Rule added
Rule added (v6)
Cho phép SSH đến từ địa chỉ IP hoặc subnet cụ thể
Để cho phép các kết nối đến từ một địa chỉ IP hoặc subnet cụ thể, bạn cần thêm một chỉ thị from
để xác định nguồn của kết nối. Bạn cũng cần phải chỉ định địa chỉ đích bằng tham số to
.
Để giới hạn rule này chỉ cho SSH, bạn sẽ chỉ định proto
(protocol) thành tcp
và sau đó sử dụng tham số port
và đặt nó thành 22
, port mặc định của SSH.
Lệnh sau sẽ chỉ cho phép các kết nối SSH đến từ địa chỉ IP 203.0.113.103
:
sudo ufw allow from 203.0.113.103 proto tcp to any port 22
Rule added
Bạn cũng có thể sử dụng địa chỉ subnet làm tham số from
để cho phép các kết nối SSH từ toàn bộ một mạng:
sudo ufw allow from 203.0.113.0/24 proto tcp to any port 22
Rule added
Cho phép Rsync đến từ địa chỉ IP hoặc subnet cụ thể
Chương trình Rsync chạy trên port 873
và có thể được sử dụng để chuyển các tệp từ máy tính này sang máy tính khác.
Để cho phép các kết nối rsync
đến từ một địa chỉ IP hoặc subnet cụ thể, hãy sử dụng tham số from
để chỉ định địa chỉ IP nguồn và tham số port
để đặt port đích 873
.
Lệnh sau sẽ chỉ cho phép các kết nối Rsync đến từ địa chỉ IP 203.0.113.103
:
sudo ufw allow from 203.0.113.103 to any port 873
Rule added
Để cho phép toàn bộ subnet 203.0.113.0/24
có thể rsync
đến server của bạn, hãy chạy lệnh:
sudo ufw allow from 203.0.113.0/24 to any port 873
Rule added
Cho phép Nginx HTTP / HTTPS
Sau khi cài đặt, Nginx thiết lập một vài profile UFW khác nhau trong server. Khi bạn đã cài đặt Nginx và kích hoạt nó như một dịch vụ, hãy chạy lệnh sau để xác định các profile nào có sẵn trong hệ thống:
sudo ufw app list | grep Nginx
Nginx Full
Nginx HTTP
Nginx HTTPS
Để cho phép cả lưu lượng HTTP và HTTPS, hãy chọn Nginx Full
. Nếu không, hãy chọn Nginx HTTP
để chỉ cho phép HTTP hoặc Nginx HTTPS
để chỉ cho phép HTTPS.
Lệnh sau sẽ cho phép cả lưu lượng HTTP và HTTPS trên server (port 80
và 443
):
sudo ufw allow "Nginx Full"
Rule added
Rule added (v6)
Cho phép Apache HTTP / HTTPS
Sau khi cài đặt, Apache thiết lập một vài profile UFW khác nhau trong server. Khi bạn đã cài đặt Apache và kích hoạt nó như một dịch vụ, hãy chạy lệnh sau để xác định các profile nào có sẵn trong hệ thống:
sudo ufw app list | grep Apache
Apache
Apache Full
Apache Secure
Để cho phép cả lưu lượng HTTP và HTTPS, hãy chọn Apache Full
. Nếu không, hãy chọn Apache
cho HTTP hoặc Apache Secure
cho HTTPS.
Lệnh sau sẽ cho phép cả lưu lượng HTTP và HTTPS trên server (port 80
và 443
):
sudo ufw allow "Apache Full"
Rule added
Rule added (v6)
Cho phép tất cả kết nối HTTP đến (port 80)
Các web server như Apache và Nginx thường lắng nghe các yêu cầu HTTP trên port 80
. Nếu chính sách mạng của bạn mặc định drop (loại bỏ) hoặc deny (từ chối) lưu lượng đến, bạn sẽ cần tạo một rule UFW để cho phép truy cập từ bên ngoài trên port 80
. Bạn có thể sử dụng số port hoặc tên dịch vụ (http
) làm tham số cho lệnh này.
Để cho phép tất cả các kết nối HTTP (port 80
) đến, hãy chạy lệnh:
sudo ufw allow http
Rule added
Rule added (v6)
Một cú pháp thay thế khác là chỉ định số port của dịch vụ HTTP:
sudo ufw allow 80
Rule added
Rule added (v6)
Cho phép tất cả kết nối HTTPS đến (port 443)
HTTPS thường chạy trên port 443
. Nếu chính sách mạng của bạn mặc định drop hoặc deny lưu lượng đến, bạn sẽ cần tạo một rule UFW để cho phép truy cập từ bên ngoài trên port 443
. Bạn có thể sử dụng số port hoặc tên dịch vụ (https
) làm tham số cho lệnh này.
Để cho phép tất cả các kết nối HTTPS (port 443
) đến, hãy chạy lệnh:
sudo ufw allow https
Rule added
Rule added (v6)
Một cú pháp thay thế là chỉ định số port của dịch vụ HTTPS:
sudo ufw allow 443
Rule added
Rule added (v6)
Cho phép tất cả kết nối HTTP và HTTPS đến
Nếu bạn muốn cho phép cả lưu lượng HTTP và HTTPS, bạn có thể tạo một rule duy nhất cho phép cả hai port. Cách sử dụng này yêu cầu bạn cũng phải xác định protocol bằng tham số -p
. Trong trường hợp này nó nên được đặt thành tcp
.
Để cho phép tất cả các kết nối HTTP và HTTPS đến (port 80
và 443
), hãy chạy lệnh:
sudo ufw allow proto tcp from any to any port 80,443
Rule added
Rule added (v6)
Cho phép kết nối MySQL từ địa chỉ IP hoặc subnet cụ thể
MySQL lắng nghe các kết nối từ client trên port 3306
. Nếu server cơ sở dữ liệu MySQL của bạn đang được sử dụng bởi một client trên một server từ xa, bạn sẽ cần tạo một rule UFW để cho phép kết nối đó.
Để cho phép các kết nối MySQL đến từ một địa chỉ IP hoặc subnet cụ thể, hãy sử dụng tham số from
để chỉ định địa chỉ IP nguồn và tham số port
để đặt port đích 3306
.
Lệnh sau sẽ cho phép địa chỉ IP 203.0.113.103
kết nối đến port MySQL của server:
sudo ufw allow from 203.0.113.103 to any port 3306
Rule added
Để cho phép toàn bộ subnet 203.0.113.0/24
kết nối đến server MySQL của bạn, hãy chạy lệnh:
sudo ufw allow from 203.0.113.0/24 to any port 3306
Rule added
Cho phép kết nối PostgreSQL từ địa chỉ IP hoặc Subnet cụ thể
PostgreSQL lắng nghe các kết nối từ client trên port 5432
. Nếu server cơ sở dữ liệu PostgreSQL của bạn đang được sử dụng bởi một client trên một server từ xa, bạn cần cho phép kết nối đó.
Để cho phép các kết nối PostgreSQL đến từ một địa chỉ IP hoặc subnet cụ thể, hãy chỉ định nguồn bằng tham số from
và đặt port thành 5432
:
sudo ufw allow from 203.0.113.103 to any port 5432
Rule added
Để cho phép toàn bộ subnet 203.0.113.0/24
kết nối đến server PostgreSQL của bạn, hãy chạy lệnh:
sudo ufw allow from 203.0.113.0/24 to any port 5432
Rule added
Chặn mail SMTP đi
Các mail server như Sendmail và Postfix thường sử dụng port 25
cho lưu lượng SMTP. Nếu server của bạn được gửi mail đi, bạn có thể muốn chặn loại lưu lượng đó. Để chặn các kết nối SMTP đi, hãy chạy lệnh:
sudo ufw deny out 25
Rule added
Rule added (v6)
Lệnh này cấu hình firewall của bạn để drop tất cả lưu lượng đi trên port 25
. Nếu bạn cần từ chối các kết nối đi trên một số port khác, bạn có thể lặp lại lệnh này và thay thế 25
bằng số port bạn muốn chặn.
Tổng kết
UFW là một công cụ mạnh mẽ có thể cải thiện đáng kể tính bảo mật của các server của bạn khi được cấu hình đúng cách. Hầu hết các lệnh trong hướng dẫn này có thể được điều chỉnh linh hợp để áp dụng vào các trường hợp khác nhau bằng cách thay đổi các tham số như địa chỉ IP nguồn và/hoặc port đích. Để biết thêm thông tin chi tiết về ufw
, bạn có thể tham khảo tài liệu của Ubuntu hoặc dùng lệnh man ufw
.