22A Hue Street, Hanoi, Vietnam 0904092014 info@binhminhitc.com

Giới thiệu

UFW (Uncomplicated Firewall) là giao diện cho iptables, được thiết kế để đơn giản hóa việc cấu hình tường lửa. Dù iptables là công cụ mạnh mẽ và linh hoạt, người mới bắt đầu có thể thấy khó học cách dùng nó để cấu hình tường lửa đúng cách. Nếu bạn đang muốn bắt đầu bảo mật mạng và chưa biết dùng công cụ nào, UFW có thể là lựa chọn phù hợp.

Hướng dẫn này sẽ chỉ bạn cách thiết lập tường lửa bằng UFW trên Ubuntu 18.04.

Yêu cầu

Để làm theo hướng dẫn, bạn cần:

  • Một máy chủ Ubuntu 18.04 có người dùng không phải root với quyền sudo; bạn có thể thiết lập theo Bước 1–3 trong hướng dẫn Initial Server Setup with Ubuntu 18.04.

UFW được cài sẵn trên Ubuntu. Nếu vì lý do nào đó nó đã bị gỡ, bạn có thể cài lại bằng sudo apt install ufw.

Bước 1 — Dùng IPv6 với UFW (tùy chọn)

Hướng dẫn này viết cho IPv4, nhưng cũng áp dụng được cho IPv6 nếu bạn bật nó. Nếu máy chủ Ubuntu đã bật IPv6, hãy bảo đảm UFW được cấu hình hỗ trợ IPv6 để quản lý quy tắc tường lửa cho cả IPv6 lẫn IPv4. Để làm vậy, mở tệp cấu hình UFW bằng nano hoặc trình soạn thảo bạn thích.

sudo nano /etc/default/ufw

Sau đó bảo đảm giá trị của IPV6 là yes. Nội dung sẽ trông như sau: Trích đoạn /etc/default/ufw

IPV6=yes

Lưu và đóng tệp. Giờ khi UFW được bật, nó sẽ ghi quy tắc tường lửa cho cả IPv4 và IPv6. Tuy nhiên, trước khi bật UFW, cần bảo đảm tường lửa cho phép bạn kết nối qua SSH. Hãy bắt đầu bằng việc thiết lập chính sách mặc định.

Bước 2 — Thiết lập chính sách mặc định

Khi mới bắt đầu với tường lửa, các quy tắc đầu tiên cần định nghĩa là chính sách mặc định. Các quy tắc này quyết định cách xử lý lưu lượng không khớp rõ ràng với quy tắc nào khác. Mặc định, UFW chặn mọi kết nối đến và cho phép mọi kết nối đi. Nghĩa là không ai từ bên ngoài kết nối được đến máy chủ, còn mọi ứng dụng trên máy chủ đều kết nối được ra ngoài.

Hãy đặt lại các quy tắc UFW về mặc định để chắc chắn bạn có thể làm theo hướng dẫn này. Để đặt giá trị mặc định cho UFW, dùng các lệnh sau:

sudo ufw default deny incoming
sudo ufw default allow outgoing

Các lệnh này đặt mặc định là chặn kết nối đến và cho phép kết nối đi. Riêng các thiết lập mặc định này có thể đủ cho máy tính cá nhân, nhưng máy chủ thường cần phản hồi yêu cầu từ người dùng bên ngoài. Chúng ta sẽ xem phần này tiếp theo.

Bước 3 — Cho phép kết nối SSH

Nếu bật tường lửa UFW ngay bây giờ, nó sẽ chặn mọi kết nối đến. Vì vậy, ta cần tạo các quy tắc cho phép rõ ràng những kết nối đến hợp lệ — chẳng hạn SSH hoặc HTTP — nếu muốn máy chủ phản hồi các yêu cầu đó. Nếu dùng máy chủ đám mây, có lẽ bạn sẽ muốn cho phép kết nối SSH đến để có thể kết nối và quản lý máy chủ.

Để cấu hình máy chủ cho phép kết nối SSH đến, dùng lệnh sau:

sudo ufw allow ssh

Lệnh này tạo quy tắc tường lửa cho phép mọi kết nối trên cổng 22, là cổng mà SSH daemon lắng nghe theo mặc định. UFW biết cổng allow ssh nghĩa là gì vì nó được liệt kê như một dịch vụ trong tệp /etc/services.

Tuy nhiên, ta cũng có thể viết quy tắc tương đương bằng cách chỉ định cổng thay vì tên dịch vụ. Ví dụ, lệnh này hoạt động giống lệnh ở trên:

sudo ufw allow 22

Nếu bạn đã cấu hình SSH daemon dùng cổng khác, cần chỉ định đúng cổng đó. Ví dụ, nếu máy chủ SSH lắng nghe trên cổng 2222, dùng lệnh sau để cho phép kết nối trên cổng này:

sudo ufw allow 2222

Giờ tường lửa đã được cấu hình cho phép kết nối SSH đến, ta có thể bật nó.

Bước 4 — Bật UFW

Để bật UFW, dùng lệnh sau:

sudo ufw enable

Bạn sẽ nhận cảnh báo rằng lệnh có thể làm gián đoạn các kết nối SSH hiện có. Ta đã thiết lập quy tắc cho phép kết nối SSH nên có thể tiếp tục. Trả lời lời nhắc bằng y và nhấn ENTER.

Tường lửa đã hoạt động. Chạy lệnh sudo ufw status verbose để xem các quy tắc đã đặt. Phần còn lại của hướng dẫn trình bày chi tiết hơn cách dùng UFW, như cho phép hoặc chặn các loại kết nối khác nhau.

Bước 5 — Cho phép các kết nối khác

Lúc này, bạn nên cho phép mọi kết nối khác mà máy chủ cần phản hồi. Các kết nối cần cho phép tùy thuộc nhu cầu cụ thể của bạn. May mắn là bạn đã biết cách viết quy tắc cho phép kết nối theo tên dịch vụ hoặc cổng; ta đã làm vậy với SSH trên cổng 22. Bạn cũng có thể làm tương tự cho:

  • HTTP trên cổng 80, cổng mà máy chủ web không mã hóa sử dụng, bằng sudo ufw allow http hoặc sudo ufw allow 80
  • HTTPS trên cổng 443, cổng mà máy chủ web mã hóa sử dụng, bằng sudo ufw allow https hoặc sudo ufw allow 443

Ngoài chỉ định cổng hoặc dịch vụ đã biết, còn vài cách khác để cho phép kết nối.

Dải cổng cụ thể

Bạn có thể chỉ định dải cổng với UFW. Một số ứng dụng dùng nhiều cổng thay vì một cổng.

Ví dụ, để cho phép kết nối X11, vốn dùng các cổng 6000-6007, dùng các lệnh sau:

sudo ufw allow 6000:6007/tcp
sudo ufw allow 6000:6007/udp

Khi chỉ định dải cổng với UFW, bạn phải chỉ định giao thức (tcp hoặc udp) mà quy tắc áp dụng. Trước đây ta chưa nhắc điều này vì nếu không chỉ định giao thức thì cả hai giao thức đều được cho phép, điều này ổn trong đa số trường hợp.

Địa chỉ IP cụ thể

Khi làm việc với UFW, bạn cũng có thể chỉ định địa chỉ IP. Ví dụ, nếu muốn cho phép kết nối từ một địa chỉ IP cụ thể, như IP ở cơ quan hoặc ở nhà là 203.0.113.4, bạn cần chỉ định from, rồi đến địa chỉ IP:

sudo ufw allow from 203.0.113.4

Bạn cũng có thể chỉ định cổng mà địa chỉ IP được phép kết nối bằng cách thêm to any port kèm số cổng. Ví dụ, nếu muốn cho phép 203.0.113.4 kết nối đến cổng 22 (SSH), dùng lệnh sau:

sudo ufw allow from 203.0.113.4 to any port 22

Subnet

Nếu muốn cho phép một subnet địa chỉ IP, bạn có thể dùng ký hiệu CIDR để chỉ định netmask. Ví dụ, để cho phép mọi địa chỉ IP từ 203.0.113.1 đến 203.0.113.254, dùng lệnh sau:

sudo ufw allow from 203.0.113.0/24

Tương tự, bạn có thể chỉ định cổng đích mà subnet 203.0.113.0/24 được phép kết nối. Ta lại lấy cổng 22 (SSH) làm ví dụ:

sudo ufw allow from 203.0.113.0/24 to any port 22

Kết nối đến một card mạng cụ thể

Nếu muốn tạo quy tắc tường lửa chỉ áp dụng cho một card mạng (network interface) cụ thể, bạn có thể chỉ định "allow in on" kèm tên card mạng.

Bạn nên tra cứu các card mạng trước khi tiếp tục. Để làm vậy, dùng lệnh sau:

ip addr
Output Excerpt2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state
. . .
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default
. . .

Phần được tô sáng trong kết quả là tên các card mạng. Chúng thường có tên như eth0 hoặc enp3s2.

Vì vậy, nếu máy chủ có card mạng công khai tên eth0, bạn có thể cho phép lưu lượng HTTP (cổng 80) đến card này bằng lệnh sau:

sudo ufw allow in on eth0 to any port 80

Như vậy máy chủ sẽ nhận được yêu cầu HTTP từ Internet công cộng.

Hoặc, nếu muốn máy chủ cơ sở dữ liệu MySQL (cổng 3306) lắng nghe kết nối trên card mạng riêng eth1, bạn có thể dùng lệnh sau:

sudo ufw allow in on eth1 to any port 3306

Điều này cho phép các máy chủ khác trong mạng riêng kết nối đến cơ sở dữ liệu MySQL của bạn.

Bước 6 — Chặn kết nối

Nếu chưa thay đổi chính sách mặc định cho kết nối đến, UFW sẽ chặn mọi kết nối đến. Nhìn chung, điều này giúp việc xây dựng chính sách tường lửa an toàn đơn giản hơn, vì bạn phải tạo quy tắc cho phép rõ ràng từng cổng và địa chỉ IP cụ thể.

Tuy nhiên, đôi khi bạn sẽ muốn chặn các kết nối cụ thể theo địa chỉ IP hoặc subnet nguồn, có thể vì biết máy chủ đang bị tấn công từ đó. Ngoài ra, nếu muốn đổi chính sách mặc định cho kết nối đến thành allow (không khuyến nghị), bạn cần tạo quy tắc deny cho mọi dịch vụ hoặc địa chỉ IP mà bạn không muốn cho phép kết nối.

Để viết quy tắc deny, bạn dùng các lệnh đã mô tả ở trên, thay allow bằng deny.

Ví dụ, để chặn kết nối HTTP, dùng lệnh sau:

sudo ufw deny http

Hoặc nếu muốn chặn mọi kết nối từ 203.0.113.4, dùng lệnh sau:

sudo ufw deny from 203.0.113.4

Giờ hãy xem cách xóa quy tắc.

Bước 7 — Xóa quy tắc

Biết cách xóa quy tắc tường lửa cũng quan trọng như biết cách tạo. Có hai cách chỉ định quy tắc cần xóa: theo số thứ tự quy tắc hoặc theo chính quy tắc đó (tương tự cách chỉ định khi tạo). Ta sẽ bắt đầu với cách xóa theo số thứ tự vì dễ hơn.

Theo số thứ tự quy tắc

Nếu xóa quy tắc tường lửa theo số thứ tự, việc đầu tiên là lấy danh sách quy tắc. Lệnh status của UFW có tùy chọn hiển thị số thứ tự cạnh mỗi quy tắc, như sau:

sudo ufw status numbered
Numbered Output:Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22                         ALLOW IN    15.15.15.0/24
[ 2] 80                         ALLOW IN    Anywhere

Nếu muốn xóa quy tắc 2, quy tắc cho phép kết nối cổng 80 (HTTP), ta chỉ định nó trong lệnh delete của UFW như sau:

sudo ufw delete 2

Lệnh sẽ hiện lời nhắc xác nhận rồi xóa quy tắc 2, quy tắc cho phép kết nối HTTP. Lưu ý nếu đã bật IPv6, bạn cũng nên xóa quy tắc IPv6 tương ứng.

Theo chính quy tắc

Thay vì số thứ tự, bạn có thể chỉ định chính quy tắc cần xóa. Ví dụ, nếu muốn gỡ quy tắc allow http, bạn có thể viết như sau:

sudo ufw delete allow http

Bạn cũng có thể chỉ định quy tắc theo allow 80 thay vì tên dịch vụ:

sudo ufw delete allow 80

Cách này sẽ xóa cả quy tắc IPv4 và IPv6, nếu có.

Bước 8 — Kiểm tra trạng thái và quy tắc UFW

Bạn có thể kiểm tra trạng thái UFW bất cứ lúc nào bằng lệnh sau:

sudo ufw status verbose

Nếu UFW đang tắt (mặc định), bạn sẽ thấy kết quả tương tự như sau:

OutputStatus: inactive

Nếu UFW đang hoạt động (nếu bạn đã làm theo Bước 3), kết quả sẽ báo đang hoạt động và liệt kê các quy tắc đã đặt. Ví dụ, nếu tường lửa được đặt cho phép kết nối SSH (cổng 22) từ mọi nơi, kết quả có thể như sau:

OutputStatus: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere

Dùng lệnh status nếu muốn xem UFW đã cấu hình tường lửa như thế nào.

Bước 9 — Tắt hoặc đặt lại UFW (tùy chọn)

Nếu không muốn dùng UFW nữa, bạn có thể tắt nó bằng lệnh sau:

sudo ufw disable

Mọi quy tắc đã tạo bằng UFW sẽ không còn hiệu lực. Bạn luôn có thể chạy sudo ufw enable nếu cần bật lại sau này.

Nếu đã cấu hình quy tắc UFW nhưng muốn làm lại từ đầu, bạn có thể dùng lệnh reset:

sudo ufw reset

Lệnh này sẽ tắt UFW và xóa mọi quy tắc đã định nghĩa trước đó. Lưu ý rằng chính sách mặc định sẽ không trở về thiết lập ban đầu nếu bạn từng thay đổi chúng. Như vậy bạn có thể bắt đầu lại từ đầu với UFW.

Kết luận

Tường lửa của bạn giờ đã được cấu hình cho phép (ít nhất) kết nối SSH. Hãy nhớ cho phép mọi kết nối đến khác mà máy chủ cần, đồng thời hạn chế các kết nối không cần thiết, để máy chủ vừa hoạt động tốt vừa an toàn.