Việc bảo vệ hệ thống máy chủ trước các mối đe dọa từ mạng internet là yếu tố quan trọng giúp đảm bảo an toàn dữ liệu và duy trì hoạt động ổn định. Một trong những công cụ Firewall phổ biến và dễ sử dụng nhất là UFW (Uncomplicated Firewall). Được thiết kế đặc biệt dành cho hệ điều hành Linux, UFW không chỉ đơn giản hóa quá trình quản lý tường lửa mà còn mang lại hiệu quả cao trong việc kiểm soát lưu lượng mạng.
Nếu bạn đang tìm kiếm một giải pháp để bảo vệ máy chủ của mình, việc cài đặt và cấu hình UFW là bước đầu tiên cần thiết. Trong bài viết này, chúng tôi sẽ hướng dẫn chi tiết từng bước để bạn có thể thiết lập Firewall bằng UFW một cách nhanh chóng, chính xác và tối ưu nhất. Cùng tìm hiểu ngay để nâng cao khả năng bảo mật cho hệ thống của bạn!

Cài đặt UFW
Trên các bản phân phối dựa trên Debian, như Ubuntu, UFW thường được cài sẵn.
Bạn có thể kiểm tra và cài đặt nó bằng lệnh sau:
sudo apt install ufw
Nhiều nhà cung cấp máy chủ cấu hình tường lửa UFW khi triển khai máy chủ để chỉ cho phép kết nối SSH, giúp bạn kết nối với máy chủ.
Nếu bạn có một máy chủ từ Vultr, UFW có thể đã được kích hoạt mặc định. Trong trường hợp của tôi với Hetzner, UFW chưa được kích hoạt.
Bạn có thể kiểm tra trạng thái của UFW và tập hợp quy tắc hiện tại của bạn bằng lệnh sau:
sudo ufw status
Kết quả của lệnh sẽ cho biết rằng UFW không hoạt động hoặc đang hoạt động với tập hợp quy tắc hiện tại của bạn.
Nếu UFW đang không hoạt động, điều đó không sao, vì chúng ta sẽ tiến hành cấu hình nó một cách đúng đắn và kích hoạt nó.
Tuy nhiên, nếu UFW đã hoạt động, hãy vô hiệu hóa và đặt lại nó bằng các lệnh sau:
sudo ufw disable
sudo ufw reset
Bạn có thể kích hoạt lại khi đã thêm tất cả các quy tắc và hoàn tất cấu hình.
Chính sách mặc định của UFW
Theo mặc định, UFW áp dụng cách tiếp cận an toàn bằng cách chặn tất cả lưu lượng truy cập đến trong khi cho phép lưu lượng đi từ máy chủ của chúng ta. Điều này có nghĩa là máy chủ của chúng ta có thể giao tiếp với bên ngoài, nhưng vẫn không thể truy cập từ bên ngoài.
Vì máy chủ của chúng ta không gặp vấn đề gì khi kết nối với thế giới bên ngoài, nên không cần thay đổi điều này.
Tuy nhiên, để cho phép lưu lượng truy cập đến, cần mở chọn lọc chỉ các cổng cần thiết và cho phép lưu lượng truy cập qua chúng.
Bạn có thể tìm thấy chính sách mặc định được định nghĩa trong tệp /etc/default/ufw:
DEFAULT_INPUT_POLICY="DROP"
DEFAULT_OUTPUT_POLICY="ACCEPT"
Như bạn thấy, chính sách mặc định cho lưu lượng truy cập đến được đặt là DROP, trong khi chính sách mặc định cho lưu lượng truy cập đi được đặt là ACCEPT.
Nếu UFW được kích hoạt, bạn cũng có thể xem lại chính sách mặc định bằng lệnh sau:
sudo ufw status verbose
Bạn có thể thay đổi hành vi mặc định này của UFW bằng cách chỉnh sửa trực tiếp tệp hoặc bằng cách sử dụng hai lệnh sau:
sudo ufw default <policy> incoming
sudo ufw default <policy> outgoing
Thay thế <policy> bằng deny, allow hoặc reject.
deny tương ứng với DROP, allow tương ứng với ACCEPT, và reject tương ứng với REJECT.
Cả chính sách DROP và REJECT đều ngăn chặn lưu lượng truy cập đi qua tường lửa, nhưng chúng khác nhau ở thông điệp phản hồi.
Với DROP, lưu lượng truy cập bị loại bỏ một cách im lặng mà không gửi bất kỳ xác nhận nào đến nguồn. Nó không chuyển tiếp gói tin cũng như không phản hồi lại.
Ngược lại, REJECT gửi một thông điệp lỗi trở lại nguồn, báo hiệu rằng kết nối đã thất bại.
Tệp cấu hình của UFW
Có ba tệp mà tôi muốn bạn xem xét.
Mặc dù bạn có thể không cần phải sửa đổi chúng khi cấu hình UFW và thêm quy tắc của mình, nhưng việc hiểu rõ về chúng là hữu ích.
Bạn có thể đã mở tệp /etc/default/ufw và xem xét chính sách mặc định của UFW, nhưng còn có những cài đặt khác mà bạn có thể cần biết đến.
Ví dụ, bạn có thể vô hiệu hóa hoàn toàn IPv6 bằng cách thay đổi biến IPV6 từ yes thành no.
Ngoài ra, bạn cũng có tùy chọn để sửa đổi chính sách chuyển tiếp mặc định và chính sách ứng dụng mặc định.
Bạn cũng có thể cho phép UFW quản lý các chuỗi tích hợp bằng cách thiết lập biến MANAGE_BUILTINS thành yes. Các chuỗi tích hợp là các chuỗi mặc định do Iptables cung cấp, chẳng hạn như INPUT, OUTPUT, và FORWARD.
UFW tạo ra các chuỗi riêng của mình để quản lý các quy tắc của nó, chẳng hạn như ufw-user-input và ufw-user-output. Các chuỗi UFW này được liên kết với các chuỗi tích hợp để áp dụng các quy tắc tường lửa của UFW.
Khi MANAGE_BUILTINS được đặt thành yes, khi dừng hoặc tải lại UFW, nó sẽ xóa hoàn toàn các chuỗi tích hợp, loại bỏ tất cả quy tắc (cả quy tắc do UFW quản lý và quy tắc không do UFW quản lý) khỏi INPUT, OUTPUT, và FORWARD.
Bất kỳ quy tắc không phải UFW nào trong các chuỗi tích hợp sẽ bị mất. UFW sẽ kiểm soát hoàn toàn tường lửa, điều này có thể xung đột với các công cụ khác quản lý các chuỗi này.
Vì lý do này, tôi không khuyên bạn nên kích hoạt nó trừ khi bạn hoàn toàn hiểu rõ về các tác động của nó.
Sự thay đổi duy nhất tôi thực hiện trong tệp này là biến IPT_SYSCTL. Có một tệp khác mà tôi sẽ thảo luận tiếp theo, đó là /etc/ufw/sysctl.conf. UFW sử dụng tệp này để điều chỉnh một số tham số kernel nhất định.
Tuy nhiên, tệp gốc để thay đổi các tham số kernel là /etc/sysctl.conf.
Trong khi UFW sử dụng phiên bản riêng của nó cho mục đích này, tôi không thích làm vậy. Khi tôi củng cố kernel Linux, tôi thực hiện các thay đổi của mình trực tiếp trong tệp /etc/sysctl.conf.
Nếu UFW sửa đổi cùng một tham số trong tệp riêng của nó, các thay đổi của tôi sẽ không có hiệu lực vì UFW sẽ ghi đè lên bất kỳ tham số tương ứng nào trong tệp gốc sysctl.conf.
Đó là lý do tại sao tôi cấu hình UFW sử dụng tệp gốc sysctl.conf như sau:
IPT_SYSCTL=/etc/sysctl.conf
Bằng cách này, tôi tránh phải xử lý hai tệp và có thể duy trì cái nhìn rõ ràng hơn về các thay đổi trong một tệp duy nhất.
Nếu bạn mở tệp /etc/ufw/sysctl.conf, bạn sẽ thấy rằng UFW đã điều chỉnh một số tham số kernel. Khi UFW được kích hoạt, các giá trị mới cho những tham số này sẽ có hiệu lực.
Theo mặc định, UFW vô hiệu hóa việc chấp nhận ICMP redirects, điều này giúp ngăn chặn các cuộc tấn công man-in-the-middle. Nó cũng bỏ qua các lỗi ICMP không hợp lệ và vô hiệu hóa việc ghi nhật ký các gói Martian.
Vì tôi không thích quản lý các tham số kernel ở hai nơi, tôi cấu hình UFW sử dụng tệp /etc/sysctl.conf.
Để bổ sung các thay đổi mặc định mà UFW thực hiện, tôi chỉ cần thêm những dòng sau vào cuối tệp /etc/sysctl.conf:
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.icmp_echo_ignore_all = 0
net.ipv4.conf.all.log_martians = 0
net.ipv4.conf.default.log_martians = 0
Bây giờ, chỉ cần khởi động lại máy chủ để thay đổi có hiệu lực. Không cần phải kích hoạt UFW để áp dụng các thay đổi vì chúng ta đang sử dụng tệp gốc sysctl.conf.
Tệp cuối cùng mà tôi muốn bạn xem xét là tệp /etc/ufw/ufw.conf, chứa chỉ hai biến:
ENABLED=no
LOGLEVEL=low
Biến đầu tiên kiểm soát xem UFW được kích hoạt hay không. Không cần phải thay đổi nó thủ công vì việc kích hoạt hoặc vô hiệu hóa UFW từ dòng lệnh sẽ tự động cập nhật giá trị này.
Biến thứ hai kiểm soát mức độ ghi nhật ký của UFW. Nó có thể được đặt thành off, low, medium, high, hoặc full, tùy thuộc vào mức độ chi tiết ghi nhật ký mà bạn muốn.
Bạn cũng có thể thay đổi mức độ ghi nhật ký trực tiếp từ dòng lệnh bằng lệnh sau:
sudo ufw logging <logging_level>
Điều này sẽ tự động cập nhật giá trị của biến LOGLEVEL.
Tệp quy tắc của UFW
Trong thư mục /etc/ufw/, bạn sẽ tìm thấy các tệp có phần mở rộng .rules:
after6.rules after.rules before6.rules before.rules user6.rules user.rules
Các tệp này điều khiển cách UFW quản lý lưu lượng truy cập đến, đi và chuyển tiếp. Các tệp có số 6 xử lý lưu lượng IPv6, trong khi các tệp không có số này xử lý lưu lượng IPv4.
Điều quan trọng là bạn không nên sửa đổi trực tiếp các tệp user.rules hoặc user6.rules, vì bất kỳ thay đổi nào cũng có thể bị UFW ghi đè. Các quy tắc do người dùng thêm từ dòng lệnh được lưu vào những tệp này, vì vậy chúng được gọi là tệp user.rules.
Bạn có thể tự do thêm quy tắc tùy chỉnh chỉ vào các tệp before.rules hoặc after.rules.
Thứ tự mà UFW xử lý các quy tắc tường lửa là: before.rules trước tiên, tiếp theo là user.rules, và cuối cùng là after.rules.
Ví dụ, nếu bạn đặt một quy tắc để chặn lưu lượng HTTP trong before.rules, nó sẽ được xử lý trước bất kỳ quy tắc nào trong tệp user.rules, điều này có thể cho phép lưu lượng HTTP.
Các quy tắc trong tệp before.rules ưu tiên hơn, nghĩa là chúng được thực thi trước, cho phép bạn thực thi các biện pháp bảo mật nghiêm trọng hơn, chẳng hạn như quy tắc để chặn cuộc tấn công SYN flood.
Có những trường hợp hiếm hoi mà tôi phải thêm quy tắc tùy chỉnh vào tệp after.rules. Mặc dù tôi không nghĩ bạn sẽ cần làm điều này, nhưng tốt nhất là ít nhất bạn nên biết rằng nó tồn tại – phòng trường hợp!
Và điều quan trọng cần đề cập là tất cả các tệp quy tắc của UFW chủ yếu sử dụng cú pháp Iptables.
Hiểu thứ tự mà UFW xử lý những tệp này và vai trò tương ứng của chúng là rất quan trọng để quản lý hiệu quả tường lửa của bạn.
Quy rắc cơ bản người dùng định nghĩa
Trong phần sau đây, tôi sẽ đề cập đến những quy tắc cơ bản cho tường lửa mà bạn có thể thêm từ dòng lệnh.
UFW cung cấp một tập hợp các lệnh để quản lý quy tắc tường lửa trực tiếp, cho phép bạn nhanh chóng chỉ định dịch vụ hoặc cổng nào được phép hoặc bị từ chối.
Mặc dù những quy tắc này được thiết kế cho việc kiểm soát truy cập mạng cơ bản và không dành cho những trường hợp sử dụng nâng cao, nhưng chúng rất phù hợp để thiết lập nhanh chóng và hiệu quả một tường lửa.
Để xem lại các quy tắc mà bạn đã thêm khi tường lửa bị vô hiệu hóa, hãy sử dụng lệnh sudo ufw show added, vì sudo ufw status sẽ không hiển thị quy tắc trong trường hợp đó.
Hãy nhớ rằng mỗi quy tắc bạn thêm từ dòng lệnh đều được lưu vào tệp user.rules, vì vậy hãy thoải mái kiểm tra nó khi bạn thêm quy tắc để hiểu cách UFW chuyển đổi các lệnh thành nội dung trong tệp.
Cho phép và từ chối lưu lượng
Chức năng cốt lõi của UFW là cho phép hoặc từ chối lưu lượng mạng.
Để cho phép hoặc từ chối lưu lượng cho các cổng cụ thể, bạn sử dụng quy tắc allow hoặc deny, tương ứng.
Để cho phép lưu lượng đến trên cổng 22 (SSH):
sudo ufw allow 22
Bạn cũng có thể chỉ định một giao thức (TCP hoặc UDP):
sudo ufw allow 22/tcp
Để từ chối lưu lượng trên cổng 80 (HTTP):
sudo ufw deny 80
Nếu cần một khoảng cổng như 5000-6000, hãy sử dụng lệnh sau:
sudo ufw deny 5000:6000/tcp
Tương tự, để từ chối lưu lượng cho cùng khoảng đó:
sudo ufw deny 5000:6000/tcp
Bạn cũng có thể cho phép hoặc từ chối lưu lượng dựa trên tên dịch vụ thay vì chỉ định số cổng. Ví dụ, để cho phép lưu lượng SSH bằng cách sử dụng tên dịch vụ, bạn có thể sử dụng:
sudo ufw allow ssh
UFW sẽ tự động xác định cổng đúng (cổng 22 cho SSH) và giao thức liên quan (TCP) để áp dụng quy tắc. Cách tiếp cận này giúp đơn giản hóa việc quản lý quy tắc, đặc biệt khi làm việc với các dịch vụ nổi tiếng.
Hồ sơ ứng dụng
Các ứng dụng (phần mềm hoặc dịch vụ đã cài đặt) có thể đăng ký hồ sơ của mình với UFW khi cài đặt, cho phép UFW quản lý chúng theo tên.
Để xem danh sách hồ sơ có sẵn, bạn có thể sử dụng lệnh sau:
sudo ufw app list
Nếu máy chủ của bạn mới được thiết lập, bạn có khả năng chỉ thấy hồ sơ OpenSSH, đó là dịch vụ đứng sau SSH.
Khi sử dụng hồ sơ ứng dụng, không cần nhớ các cổng cụ thể. Thay vào đó, bạn chỉ cần sử dụng tên hồ sơ.
Ví dụ: để cho phép lưu lượng trên cổng 443 (HTTPS), bạn có thể sử dụng các lệnh sau:
sudo ufw allow "NGINX HTTPS"
sudo ufw allow "Apache Secure"
Nếu bạn tò mò về nguồn gốc của những hồ sơ này, hãy kiểm tra thư mục /etc/ufw/applications.d/.
Quy tắc limit
Quy tắc limit trong UFW giúp bảo vệ chống lại các cuộc tấn công brute-force bằng cách giới hạn số lần kết nối mà một IP có thể thực hiện trong khoảng thời gian ngắn.
Ví dụ: khi bảo mật SSH, quy tắc này cho phép người dùng hợp pháp kết nối nhưng chặn tạm thời bất kỳ IP nào thực hiện quá nhiều lần thử không thành công.
Theo mặc định, quy tắc này chỉ cho phép 6 kết nối từ cùng một IP trong vòng 30 giây. Nếu vượt quá giới hạn này, IP sẽ bị chặn trong thời gian ngắn, giảm thiểu nguy cơ bị brute-force attacks.
Để áp dụng quy tắc này cho lưu lượng SSH:
sudo ufw limit 22
Lệnh này bật quyền truy cập SSH trong khi bảo vệ máy chủ khỏi các nỗ lực kết nối quá mức.
Kiểm soát truy cập theo IP hoặc Subnet
UFW cho phép bạn kiểm soát quyền truy cập dựa trên địa chỉ IP hoặc subnet, điều này hữu ích để giới hạn quyền truy cập cho các khách hàng cụ thể hoặc từ chối quyền truy cập từ nguồn cụ thể.
Để cho phép tất cả lưu lượng từ một IP cụ thể đến bất kỳ cổng nào:
sudo ufw allow from 192.168.1.100
Để chỉ cho phép lưu lượng SSH từ một IP cụ thể:
sudo ufw allow from 192.168.1.100 to any port 22
Để cho phép lưu lượng từ một subnet:
sudo ufw allow from 192.168.1.0/24
Để từ chối lưu lượng từ một địa chỉ IP cụ thể:
sudo ufw deny from 203.0.113.50
Trong một số trường hợp, bạn có thể muốn chỉ định không chỉ IP hoặc subnet mà còn cả giao thức (TCP hoặc UDP).
Ví dụ: để chỉ cho phép lưu lượng TCP từ một địa chỉ IP đến cổng 80, bạn có thể chỉ định giao thức như sau:
sudo ufw allow from 192.168.1.100 to any port 80 proto tcp
Bằng cách chỉ định giao thức trong các quy tắc kiểm soát truy cập của bạn, bạn sẽ kiểm soát tốt hơn về luồng lưu lượng, đảm bảo rằng chỉ lưu lượng mong muốn (TCP hoặc UDP) được phép từ nguồn hoặc mạng cụ thể.
Kích hoạt và kiểm tra trạng thái
Trước khi kích hoạt tường lửa của chúng ta, điều quan trọng là xem xét các quy tắc mà chúng ta đã thêm cho đến nay để tránh bất kỳ hành vi bất ngờ nào.
Như tôi đã đề cập trước đó, nếu tường lửa bị vô hiệu hóa, chúng ta không thể sử dụng lệnh sudo ufw status để xem xét quy tắc của mình.
Thay vào đó, chúng ta sử dụng lệnh sudo ufw show added. Lệnh này sẽ liệt kê tất cả các quy tắc mà chúng ta đã thêm.
Hãy luôn thêm quy tắc, xem xét lại chúng và sau đó tiến hành kích hoạt tường lửa.
Để kích hoạt UFW và áp dụng các quy tắc mà bạn đã cấu hình, hãy sử dụng lệnh sau:
sudo ufw enable
Bây giờ, bạn có thể kiểm tra trạng thái của UFW và tập hợp quy tắc hiện tại của mình bằng lệnh sudo ufw status.
Đối với cái nhìn chi tiết hơn:
sudo ufw status verbose
Nếu gặp bất kỳ vấn đề gì, hãy vô hiệu hóa UFW bằng cách sử dụng sudo ufw disable và xem xét lại các quy tắc của bạn.
Nếu bạn cần đặt lại UFW về trạng thái mặc định (loại bỏ tất cả quy tắc), bạn có thể sử dụng lệnh sudo ufw reset.
Xóa quy tắc
Nếu vì lý do nào đó bạn muốn xóa một quy tắc mà bạn đã thêm vào, bạn có thể sử dụng lệnh sudo ufw delete theo sau bởi quy tắc đó như sau:
sudo ufw delete deny from 111.111.111.111 to any port 80 proto tcp
sudo ufw delete allow 80
Có một cách dễ dàng hơn để xóa quy tắc nhưng yêu cầu phải bật tường lửa. Phương pháp này liên quan đến việc sử dụng số thứ tự của quy tắc.
Khi firewall đã được kích hoạt, bạn có thể sử dụng lệnh sudo ufw status numbered để lấy danh sách các quy tắc và số tương ứng của chúng như sau:
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 22/tcp (v6) ALLOW IN Anywhere (v6)
Bây giờ, để xóa một quy tắc, bạn chỉ cần sử dụng số thứ tự của quy tắc đó:
sudo ufw delete 1
Đây là phương pháp đơn giản hơn nhiều.
Các thực hành tốt nhất
Tôi muốn chia sẻ một vài thực hành tốt nhất với bạn từ kinh nghiệm của mình.
Bước đầu tiên trước khi kích hoạt một firewall là cho phép lưu lượng SSH để đảm bảo quyền truy cập vào máy chủ. Nếu bạn kích hoạt firewall trước khi thêm quy tắc này, bạn sẽ gặp rủi ro mất quyền truy cập vào máy chủ của mình.
Tôi đã hướng dẫn bạn cách sử dụng các quy tắc allow hoặc limit. Việc sử dụng những quy tắc này sẽ cho phép bất kỳ địa chỉ IP nào truy cập vào cổng 22, điều này nghĩa là cổng SSH của chúng ta mở đối với mọi người. Đây là điều tôi tránh trên một máy chủ sản xuất.
Nếu tôi có một địa chỉ IP cố định mà tôi có thể truy cập máy chủ từ đó, tôi sẽ giới hạn cổng SSH chỉ dành cho địa chỉ IP đó. Điều này cung cấp thêm một lớp bảo mật và giảm thiểu rủi ro bị truy cập trái phép.
Ngay cả khi bạn đã tạo ra một cặp khóa SSH , triển khai xác thực khóa và tạo ra một người dùng không phải root , hacker vẫn có thể cố gắng xâm nhập vào máy chủ của bạn.
Chỉ giới hạn cổng SSH đối với địa chỉ IP của bạn nếu nó cố định – chẳng hạn như khi sử dụng dịch vụ VPN hoặc nếu ISP của bạn đã cấp cho bạn một địa chỉ IP cố định.
Nếu bạn có địa chỉ IP cố định , hãy sử dụng lệnh sau:
sudo ufw allow from <YOUR_IP> proto tcp to any port 22
Bây giờ, địa chỉ IP được chỉ định trong lệnh là địa chỉ duy nhất có thể truy cập vào máy chủ.
Khi bạn giới hạn quyền truy cập SSH chỉ đối với một IP duy nhất , Fail2ban trở nên không cần thiết vì không còn IP nào để chặn. Tuy nhiên, tôi vẫn khuyên nên giữ Fail2ban được cài đặt và kích hoạt.
Một tính năng hữu ích khác để triển khai là tường lửa đám mây. Hầu hết nhà cung cấp máy chủ đều cung cấp một bức tranh đám mây firewall , cho phép bạn thiết lập một firewall cơ bản ở mức đám mây và áp dụng nó vào máy chủ của mình.
Với điều này , bạn có thể giới hạn cổng SSH đối với địa chỉ IP của mình bằng cách sử dụng bức tranh đám mây firewall trong khi vẫn mở cửa cho mọi người ở UFW . Nếu địa chỉ IP của bạn thay đổi , bạn dễ dàng truy cập bảng điều khiển nhà cung cấp của mình để cập nhật nó .
Bây giờ , hãy nói về lưu lượng HTTP và HTTPS .
Nếu bạn đang hé lộ một trang web , bạn cần phải cho phép lưu lượng trên cổng 80 và 443 để khách truy cập vào trang web . Không nên có bất kỳ hạn chế nào ở đây , vì chúng ta muốn mọi người đều tiếp cận trang web .
Tuy nhiên , vẫn còn vài điều cần cân nhắc . Nếu bạn đang sử dụng chứng nhận SSL (mà bạn nên làm ) và chuyển hướng lưu lượng từ HTTP sang HTTPS , thì không cần phải cho phép lưu lượng trên cổng 80 . Trong khi việc cho phép lưu lượng trên cả hai cổng thường là tốt , tôi vẫn muốn đề cập đến điều này .
Ngoài ra , nếu bạn đang sử dụng dịch vụ proxy như Cloudflare , thì lưu lượng sẽ chỉ đến từ địa chỉ IP của họ . Để tăng cường bảo mật , hãy hạn chế lưu lượng HTTP và HTTPS chỉ đối với địa chỉ IP của Cloudflare .
Ví dụ : hãy sử dụng những lệnh sau :
sudo ufw allow from <CF_IP> to any port 80 proto tcp
sudo ufw allow from <CF_IP> to any port 443 proto tcp
Lặp lại những lệnh này cho tất cả địa chỉ IP Cloudflare , hoặc tự động hóa nó bằng một bash script .
Quy tắc tường lửa nâng cao
Cho đến bây giờ , chúng ta đã tập trung vào những quy tắc cơ bản do người dùng định nghĩa mà bạn dễ dàng quản lý từ dòng lệnh .
Bây giờ , tôi sẽ giới thiệu ý tưởng về những quy tắc nâng cao , giúp kiểm soát lưu lượng ở mức sâu hơn bằng cách cấu hình các tập tin /etc/ufw/before.rules.
Những quy tắc nâng cao này cho phép lọc lưu lượng trước khi nó đến dịch vụ trên máy chủ của bạn và trước khi firewall áp dụng những quy luật tiêu chuẩn của mình .
Những quy trình nâng cao rất mạnh mẽ và có thể được tùy chỉnh theo từng trường hợp cụ thể , cung cấp khả năng kiểm soát tốt hơn về an ninh mạng và hiệu suất mạng .
Như tôi đã đề cập trước đó , tất cả các tập tin quy trình của UFW chủ yếu sử dụng cú pháp iptables .
Cấu trúc tập tin before.rules
Tập tin before.rules bắt đầu bằng việc khai báo bảng *filter và xác định nhiều chuỗi tùy chỉnh :
- Ví dụ :
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
:ufw-before-input: Xử lý gói tin đến.:ufw-before-output: Xử lý gói tin đi.:ufw-before-forward: Xử lý gói tin chuyển tiếp qua máy chủ.:ufw-not-local: Xử lý gói tin không được gửi đến hoặc gửi đi từ hệ thống địa phương .
Nó bao gồm nhiều quy trình mặc định nhằm xử lý các thao tác mạng cơ bản và cải thiện an ninh . Những quy trình này bao gồm nhiều tình huống khác nhau như cho phép tất cả lưu lượng trên interfaces vòng lặp hoặc loại bỏ gói tin không hợp lệ . Chúng sẽ được áp dụng mặc định khi bạn bật firewall .
Tập tin kết thúc bằng dòng COMMIT, báo hiệu sự hoàn tất của các quy trình .
Cấu trúc trong before6.rules đối với IPv6 gần giống như cấu trúc trong before.rules đối với IPv4 .
Điểm khác biệt chính là tên trong before6.rules đều thêm số 6, như sau :
- Ví dụ :
*filter
:ufw6-before-input - [0:0]
:ufw6-before-output - [0:0]
:ufw6-before-forward - [0:0]
Tuy nhiên , khác với before.rules, before6.rules không bao gồm chuỗi ufw6-not-local.
Nó bao gồm một số quy trình mặc định mà before.rules đã tuyên bố , nhưng cũng chứa thêm một số quy trình áp dụng riêng biệt đối với lưu lượng IPv6 .
Tập tin cũng kết thúc bằng dòng COMMIT, báo hiệu sự hoàn tất của các quy trình .
Trường hợp sử dụng
Như đã đề cập trước đó , những tập tin này ưu tiên hơn , nghĩa là chúng được thực thi trước .
Điều này cho phép chúng ta xác định những quy trình sẽ diễn ra trước khi lưu lượng đến bất cứ thứ gì đang chạy trên máy chủ và trước khi nó di chuyển qua firewall .
Bạn có thể triển khai giải pháp để chặn cuộc tấn công SYN flood bằng cách giới hạn số lượng gói SYN được phép thông qua cổng 80 và 443 , đồng thời chặn những IP vượt quá giới hạn này . Đây là điều mà không thể thực hiện bằng việc sử dụng những quy trình cơ bản do người dùng xác định từ dòng lệnh .
Mặc dù bạn có thể sử dụng quy trình limit cho cổng 80 và 443 , nhưng điều này không phù hợp với máy chủ web vì những giới hạn đó không phù hợp với kiểu mẫu lưu lượng thông thường mà máy chủ web thường gặp phải .
Việc sử dụng những quy trình nâng cao trong before.rules giúp tinh chỉnh firewall dành riêng cho những trường hợp như thế này .
Ví dụ về các quy tắc nâng cao
Nếu bạn xem xét nội dung của tập tin before.rules, bạn sẽ thấy hai quy trình sau đây :
- Ví dụ :
-A ufw-before-input -m conntrack --ctstate INVALID -j ufw-logging-deny
-A ufw-before-input -m conntrack --ctstate INVALID -j DROP
Hai quy trình này nhằm ghi lại và chặn bất kỳ gói tin không hợp lệ nào , và chúng được thêm vào chuỗi ufw-before-input, chuỗi lọc lưu lượng đến trước khi tới máy chủ , đảm bảo rằng chỉ kết nối hợp lệ mới được phép .
UFW sử dụng mô-đun conntrack (viết tắt của theo dõi kết nối) để theo dõi kết nối và xác định những kết nối ở trạng thái INVALID. Mặc dù những quy trình này hiệu quả nhưng chúng ta vẫn có thể làm tốt hơn nữa .
Để tăng cường bảo mật cho máy chủ , chúng ta có thể thêm hai quy trình bổ sung nhằm ghi lại và chặn bất kỳ kết nối mới nào mà không chỉ riêng lá cờ SYN .
Thêm hai quy trình sau dưới những gì đã được thêm mặc định bởi UFW :
- Ví dụ :
-A ufw-before-input -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ufw-logging-deny
-A ufw-before-input -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j DROP
Đừng quên thêm chúng vào tập tin before6.rules nữa :
- Ví dụ :
-A ufw6-before-input -p tcp -m tcp ! --tcp-flags FIN,SYN,RST ACK SYN -m conntrack --ctstate NEW -j ufw6-logging-deny
-A ufw6-before-input -p tcp -m tcp ! --tcp-flags FIN,SYN,RST ACK SYN -m conntrack --ctstate NEW -j DROP
- Quy trình đầu tiên chặn bất kỳ gói tin nào bị coi là
INVALIDbởi mô-đun conntrack. - Quy trình thứ hai chặn gói TCP đánh dấu là NEW (cho thấy cố gắng kết nối mới) nhưng không đặt lá cờ SYN riêng biệt .
Bây giờ hãy tải lại UFW nếu nó đã được bật :
sudo ufw reload
Những quy trình bổ sung này tăng cường khả năng lọc ra những gói tin tiềm năng độc hại và bảo vệ máy chủ khỏi những nỗ lực kết nối không mong muốn .
Kết luận
Việc cấu hình và quản lý tường lửa UFW là một bước quan trọng trong việc bảo mật máy chủ Linux. UFW cung cấp một cách tiếp cận đơn giản nhưng hiệu quả để kiểm soát lưu lượng mạng, cho phép bạn dễ dàng thiết lập các quy tắc cho các dịch vụ và cổng cần thiết. Để đảm bảo an toàn, việc giới hạn quyền truy cập SSH chỉ cho địa chỉ IP cố định và sử dụng các quy tắc nâng cao để lọc lưu lượng trước khi đến máy chủ là điều cần thiết.
Hơn nữa, việc sử dụng tường lửa đám mây giúp tăng cường bảo mật cho máy chủ của bạn bằng cách hạn chế lưu lượng truy cập từ các nguồn không mong muốn. Hãy thường xuyên kiểm tra và cập nhật các quy tắc UFW để đảm bảo rằng máy chủ của bạn luôn được bảo vệ trước các mối đe dọa tiềm ẩn.
Cuối cùng, việc kết hợp UFW với các công cụ bảo mật khác như Fail2ban sẽ tạo ra một môi trường an toàn hơn cho hệ thống của bạn. Hãy bắt đầu tối ưu hóa bảo mật cho máy chủ Linux của bạn ngay hôm nay!









