Hướng dẫn cài đặt Iptables Firewall trên Ubuntu 20.04

Chào bạn, tôi là Đức, người đứng sau blog buimanhduc.com. Trong thế giới số hiện nay, việc bảo vệ máy chủ khỏi các mối đe dọa trên internet là cực kỳ quan trọng. Bạn có bao giờ lo lắng về việc ai đó có thể truy cập trái phép vào server của mình không? Một trong những tuyến phòng thủ đầu tiên và hiệu quả nhất chính là tường lửa. Tường lửa hoạt động như một người bảo vệ, kiểm soát mọi lưu lượng mạng ra vào máy chủ của bạn, chỉ cho phép những kết nối hợp lệ và chặn đứng những truy cập đáng ngờ. Đối với hệ điều hành Ubuntu 20.04, iptables là một công cụ tường lửa cực kỳ mạnh mẽ và linh hoạt. Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu từ A-Z cách cài đặt, cấu hình và quản lý iptables để xây dựng một hàng rào bảo mật vững chắc cho máy chủ của bạn.

Giới thiệu về tường lửa và vai trò bảo mật mạng

Tường lửa (firewall là gì) là một hệ thống bảo mật mạng, hoạt động như một rào chắn giữa mạng nội bộ an toàn và mạng bên ngoài không đáng tin cậy, chẳng hạn như Internet. Nhiệm vụ chính của nó là giám sát và kiểm soát lưu lượng mạng đến và đi dựa trên các quy tắc bảo mật đã được xác định trước. Hãy tưởng tượng tường lửa giống như một nhân viên an ninh tại cổng một tòa nhà: anh ta sẽ kiểm tra danh tính và mục đích của mọi người trước khi cho phép họ vào hoặc ra. Tương tự, tường lửa quyết định cho phép hoặc từ chối các gói tin mạng dựa trên nguồn, đích, cổng và các tiêu chí khác.

Khi một máy chủ không có biện pháp bảo vệ, nó sẽ trở thành một mục tiêu dễ bị tấn công. Các vấn đề phổ biến bao gồm việc hacker dò quét các cổng đang mở để tìm lỗ hổng bảo mật, thực hiện các cuộc tấn công từ chối dịch vụ (DDoS là gì) làm quá tải hệ thống, hoặc cài cắm mã độc để đánh cắp dữ liệu nhạy cảm. Thiếu tường lửa chẳng khác nào bạn để cửa nhà mở toang, mời gọi những vị khách không mời. Hậu quả có thể rất nghiêm trọng, từ mất mát dữ liệu, gián đoạn dịch vụ đến ảnh hưởng uy tín thương hiệu.

Trên môi trường Linux, đặc biệt là Ubuntu 20.04, iptables là một công cụ tường lửa dòng lệnh vô cùng mạnh mẽ, cho phép quản trị viên hệ thống kiểm soát chi tiết lưu lượng mạng ở cấp độ kernel. Dù có vẻ phức tạp ban đầu, nhưng một khi đã nắm vững, iptables cung cấp khả năng tùy biến gần như vô hạn để bạn xây dựng một hệ thống phòng thủ vững chắc. Trong bài viết này, chúng ta sẽ cùng nhau khám phá cách cài đặt, cấu hình các quy tắc cơ bản, quản lý kết nối, giám sát và xử lý các sự cố thường gặp với iptables một cách chi tiết và dễ hiểu nhất.

Hình minh họa

Cài đặt và cấu hình iptables trên Ubuntu 20.04

Trước khi đi sâu vào việc tạo ra các quy tắc phức tạp, chúng ta cần đảm bảo rằng iptables đã được cài đặt và sẵn sàng hoạt động trên hệ thống Ubuntu 20.04 của bạn. Hầu hết các bản phân phối Linux, bao gồm cả Ubuntu, đều cài đặt sẵn iptables. Tuy nhiên, việc kiểm tra lại luôn là một bước cần thiết để đảm bảo mọi thứ đều ổn định.

Cài đặt iptables trên hệ thống

Đầu tiên, hãy kiểm tra xem iptables đã có trên hệ thống của bạn hay chưa. Bạn có thể làm điều này bằng cách mở terminal và chạy lệnh kiểm tra phiên bản:

sudo iptables --version

Nếu lệnh này trả về một phiên bản (ví dụ: `iptables v1.8.4`), điều đó có nghĩa là iptables đã được cài đặt. Trong trường hợp bạn nhận được thông báo lỗi “command not found”, bạn cần phải cài đặt nó. Quá trình cài đặt rất đơn giản với trình quản lý gói `apt` của Ubuntu. Hãy chạy các lệnh sau:

sudo apt update
sudo apt install iptables

Lệnh đầu tiên dùng để cập nhật danh sách các gói phần mềm, và lệnh thứ hai sẽ tiến hành cài đặt iptables. Chỉ sau vài giây, công cụ tường lửa mạnh mẽ này sẽ sẵn sàng để bạn sử dụng.

Cấu hình iptables cơ bản

Sau khi cài đặt xong, bước tiếp theo là thiết lập các chính sách mặc định (default policies). Chính sách mặc định quyết định hành động sẽ được thực hiện đối với các gói tin không khớp với bất kỳ quy tắc nào bạn đã tạo. Đây là một khái niệm cực kỳ quan trọng trong an ninh mạng. Một thực hành tốt là “chặn tất cả, cho phép một vài”, nghĩa là chúng ta sẽ chặn toàn bộ lưu lượng theo mặc định và chỉ mở những cổng thực sự cần thiết.

iptables hoạt động dựa trên các “chain” (chuỗi). Ba chain cơ bản và quan trọng nhất bạn cần nắm là:

  • INPUT: Quản lý các gói tin đi vào máy chủ.
  • OUTPUT: Quản lý các gói tin đi ra từ máy chủ.
  • FORWARD: Quản lý các gói tin được chuyển tiếp qua máy chủ (thường dùng khi server hoạt động như một router).

Để bắt đầu, chúng ta sẽ thiết lập chính sách mặc định cho chain `INPUT` là `DROP` (hủy bỏ gói tin). Điều này có nghĩa là mọi kết nối đến sẽ bị chặn trừ khi có một quy tắc cho phép cụ thể. Hãy cẩn thận khi thực hiện bước này, đặc biệt là khi bạn đang kết nối qua SSH, vì bạn có thể tự khóa mình ra khỏi máy chủ. Chúng ta sẽ tìm hiểu cách cho phép SSH ở phần sau. Để thiết lập chính sách, chạy lệnh:

sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

Ở đây, chúng ta chặn tất cả lưu lượng đến (`INPUT`) và chuyển tiếp (`FORWARD`), nhưng cho phép tất cả lưu lượng đi ra (`OUTPUT`). Điều này đảm bảo rằng các dịch vụ trên máy chủ của bạn vẫn có thể kết nối ra ngoài Internet để cập nhật hoặc truy vấn thông tin.

Hình minh họa

Các quy tắc tường lửa cơ bản: mở và đóng cổng

Khi bạn đã thiết lập chính sách mặc định là chặn mọi kết nối đến, máy chủ của bạn đang ở trạng thái rất an toàn nhưng cũng gần như vô dụng, vì không ai có thể truy cập vào các dịch vụ bạn cung cấp. Bước tiếp theo là tạo ra các quy tắc “ngoại lệ” để cho phép những lưu lượng hợp lệ đi qua. Điều này được thực hiện bằng cách mở các cổng (port) tương ứng với các dịch vụ mà bạn muốn công khai.

Mở cổng cho các dịch vụ phổ biến

Mỗi dịch vụ mạng chạy trên một cổng cụ thể. Ví dụ, kết nối SSH dùng cổng 22, máy chủ web HTTP dùng cổng 80, và HTTPS dùng cổng 443. Để cho phép người dùng truy cập vào các dịch vụ này, bạn cần tạo quy tắc `ACCEPT` trong chain `INPUT` cho từng cổng.

Điều cực kỳ quan trọng là phải luôn mở cổng SSH (22) trước tiên, nếu không bạn sẽ bị mất kết nối và không thể quản trị máy chủ được nữa. Lệnh để mở cổng SSH là:

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Hãy phân tích lệnh này:

  • -A INPUT: Thêm (Append) một quy tắc mới vào cuối chain `INPUT`.
  • -p tcp: Chỉ định giao thức là TCP.
  • --dport 22: Chỉ định cổng đích (destination port) là 22.
  • -j ACCEPT: Hành động (Jump) là `ACCEPT` (chấp nhận gói tin).

Tương tự, để mở cổng cho máy chủ web HTTP và HTTPS, bạn chạy các lệnh sau:

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Bên cạnh đó, bạn cũng nên cho phép lưu lượng trên giao diện loopback (localhost), vì nhiều ứng dụng nội bộ cần giao tiếp với nhau qua địa chỉ `127.0.0.1`. Quy tắc này rất quan trọng để hệ thống hoạt động ổn định:

sudo iptables -A INPUT -i lo -j ACCEPT

Đóng các cổng không cần thiết

Nguyên tắc bảo mật cơ bản là “giảm thiểu bề mặt tấn công” (minimize attack surface), nghĩa là bạn chỉ nên mở những gì thực sự cần thiết. Nếu chính sách mặc định của bạn đã là `DROP`, thì mọi cổng không được cho phép tường minh đều đã bị chặn. Bạn không cần phải thêm quy tắc `DROP` cho từng cổng không sử dụng.

Tuy nhiên, trong trường hợp bạn lỡ đặt chính sách mặc định là `ACCEPT` (không được khuyến khích), bạn sẽ phải tự tay đóng từng cổng không cần thiết. Ví dụ, nếu bạn không muốn ai kết nối đến cổng cơ sở dữ liệu MySQL (3306) từ bên ngoài, bạn có thể thêm quy tắc sau:

sudo iptables -A INPUT -p tcp --dport 3306 -j DROP

Hành động `DROP` sẽ âm thầm hủy bỏ gói tin, khiến cho kẻ tấn công không biết được cổng đó có tồn tại hay không. Một lựa chọn khác là `REJECT`, nó sẽ từ chối và gửi lại một thông báo lỗi. `DROP` thường được ưu tiên hơn vì nó gây khó khăn cho việc dò quét cổng.

Hình minh họa

Quản lý kết nối và lưu lượng mạng bằng iptables

Một trong những tính năng mạnh mẽ nhất của iptables là khả năng hoạt động như một tường lửa trạng thái (stateful firewall). Điều này có nghĩa là nó không chỉ kiểm tra từng gói tin một cách độc lập mà còn có khả năng theo dõi trạng thái của các kết nối mạng. Việc này giúp tăng cường bảo mật và hiệu suất một cách đáng kể, đồng thời làm cho việc viết quy tắc trở nên đơn giản hơn rất nhiều.

Quản lý kết nối trạng thái (stateful firewall)

iptables có thể nhận biết một gói tin thuộc về một kết nối mới hay là một phần của kết nối đã được thiết lập. Có bốn trạng thái kết nối chính, nhưng chúng ta sẽ tập trung vào ba trạng thái quan trọng nhất:

  • NEW: Gói tin bắt đầu một kết nối mới. Ví dụ, khi bạn truy cập một trang web lần đầu, yêu cầu HTTP đầu tiên sẽ có trạng thái `NEW`.
  • ESTABLISHED: Gói tin là một phần của một kết nối đã tồn tại. Sau khi kết nối HTTP được thiết lập, tất cả các gói tin dữ liệu trao đổi qua lại sẽ có trạng thái `ESTABLISHED`.
  • RELATED: Gói tin bắt đầu một kết nối mới nhưng có liên quan đến một kết nối đã tồn tại. Ví dụ phổ biến là trong giao thức FTP, kênh dữ liệu được mở sau khi kênh điều khiển đã được thiết lập.

Lợi ích của việc này là gì? Thay vì phải viết quy tắc cho cả lưu lượng đi vào và đi ra cho một dịch vụ, bạn chỉ cần cho phép các kết nối `NEW` đến các cổng dịch vụ của mình. Sau đó, bạn có thể tạo một quy tắc duy nhất để cho phép tất cả lưu lượng `ESTABLISHED` và `RELATED`. Đây là quy tắc quan trọng nhất bạn cần thêm vào cấu hình của mình:

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Quy tắc này nói rằng: “Nếu một gói tin thuộc về một kết nối đã được thiết lập hoặc có liên quan, hãy chấp nhận nó”. Điều này tự động cho phép lưu lượng trả về từ các kết nối do máy chủ của bạn khởi tạo, cũng như lưu lượng tiếp theo trong các kết nối hợp lệ đến máy chủ. Với quy tắc này, bạn không cần phải mở các cổng ngẫu nhiên cho lưu lượng trả về.

Hình minh họa

Giới hạn lưu lượng và ngăn chặn tấn công

iptables còn cung cấp các module mở rộng để thực hiện các chức năng nâng cao, chẳng hạn như giới hạn tốc độ kết nối để ngăn chặn các cuộc tấn công từ chối dịch vụ (DDoS là gì) đơn giản hoặc các cuộc tấn công dò mật khẩu (brute-force).

Ví dụ, để bảo vệ cổng SSH khỏi các cuộc tấn công brute-force, bạn có thể giới hạn số lượng kết nối mới mà một địa chỉ IP có thể thực hiện trong một khoảng thời gian nhất định. Lệnh sau đây sẽ giới hạn các kết nối SSH mới ở mức 5 kết nối mỗi phút:

sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m limit --limit 5/min --limit-burst 5 -j ACCEPT

Hãy phân tích các tham số mới:

  • -m limit: Sử dụng module `limit`.
  • --limit 5/min: Đặt tốc độ giới hạn là 5 kết nối mỗi phút.
  • --limit-burst 5: Cho phép tối đa 5 kết nối “bùng nổ” ban đầu trước khi áp dụng giới hạn.

Sau khi một IP đạt đến giới hạn này, các kết nối mới tiếp theo từ IP đó sẽ bị bỏ qua cho đến khi bộ đếm được reset. Đây là một cách hiệu quả để làm chậm các cuộc tấn công tự động mà không ảnh hưởng nhiều đến người dùng hợp lệ. Bạn có thể áp dụng kỹ thuật tương tự cho các dịch vụ khác như web server hoặc mail server để tăng cường khả năng phòng thủ của hệ thống.

Kiểm tra và giám sát trạng thái tường lửa

Sau khi đã thiết lập các quy tắc, làm thế nào để bạn biết chúng đang hoạt động đúng như mong đợi? Việc kiểm tra, giám sát và ghi lại nhật ký (logging) là những bước không thể thiếu trong quy trình quản lý tường lửa. Nó không chỉ giúp bạn xác nhận cấu hình mà còn là công cụ quan trọng để phát hiện sớm các hoạt động đáng ngờ trên hệ thống.

Kiểm tra các quy tắc iptables đang hoạt động

Để xem danh sách tất cả các quy tắc hiện có trong iptables, bạn có thể sử dụng lệnh `iptables -L`. Tuy nhiên, lệnh này sẽ hiển thị địa chỉ IP dưới dạng tên miền (nếu có thể phân giải) và tên dịch vụ thay vì số cổng. Để có cái nhìn chi tiết và rõ ràng hơn, bạn nên sử dụng các tùy chọn `-v` (verbose – chi tiết) và `-n` (numeric – hiển thị dạng số):

sudo iptables -L -v -n

Kết quả trả về sẽ là một bảng chi tiết cho từng chain (`INPUT`, `FORWARD`, `OUTPUT`), bao gồm các thông tin sau:

  • pkts: Số lượng gói tin đã khớp với quy tắc.
  • bytes: Tổng dung lượng (tính bằng byte) của các gói tin đã khớp.
  • target: Hành động được thực hiện (ACCEPT, DROP, REJECT, LOG…).
  • prot: Giao thức (tcp, udp, icmp…).
  • source: Địa chỉ IP nguồn.
  • destination: Địa chỉ IP đích.
  • Thông tin khác: Chi tiết về cổng nguồn, cổng đích, trạng thái kết nối…

Việc phân tích bảng này giúp bạn hiểu rõ lưu lượng nào đang được cho phép, lưu lượng nào đang bị chặn, và quy tắc nào được sử dụng nhiều nhất. Đây là bước đầu tiên và quan trọng nhất để gỡ lỗi khi một dịch vụ không hoạt động như mong đợi.

Hình minh họa

Giám sát lưu lượng và log tường lửa

Việc xem các bộ đếm gói tin là hữu ích, nhưng để điều tra sâu hơn, bạn cần ghi lại nhật ký chi tiết về các gói tin bị chặn. iptables cho phép bạn tạo một quy tắc đặc biệt để ghi log các gói tin trước khi chúng bị hủy bỏ. Điều này cực kỳ hữu ích để phát hiện các nỗ lực quét cổng hoặc tấn công.

Cách tốt nhất là tạo một chain tùy chỉnh cho việc ghi log. Đầu tiên, tạo một chain mới tên là `LOG_AND_DROP`:

sudo iptables -N LOG_AND_DROP

Tiếp theo, thêm hai quy tắc vào chain này. Quy tắc đầu tiên ghi lại thông tin gói tin, và quy tắc thứ hai hủy bỏ nó:

sudo iptables -A LOG_AND_DROP -j LOG --log-prefix "IPTABLES-DROPPED: " --log-level 4
sudo iptables -A LOG_AND_DROP -j DROP

Cuối cùng, thay vì `DROP` trực tiếp trong chain `INPUT`, bạn hãy chuyển các gói tin không mong muốn đến chain `LOG_AND_DROP`. Ví dụ, bạn có thể đặt quy tắc này ở cuối chain `INPUT` để bắt tất cả các gói tin không khớp với quy tắc `ACCEPT` nào ở trên:

sudo iptables -A INPUT -j LOG_AND_DROP

Bây giờ, mọi gói tin bị tường lửa chặn sẽ được ghi lại trong nhật ký hệ thống. Bạn có thể xem các log này bằng lệnh:

sudo dmesg | grep "IPTABLES-DROPPED"

Hoặc kiểm tra trong file `/var/log/syslog` hoặc `/var/log/kern.log`. Việc phân tích các log này sẽ cho bạn cái nhìn sâu sắc về các mối đe dọa đang nhắm vào máy chủ của mình, từ đó có thể điều chỉnh quy tắc tường lửa để đối phó hiệu quả hơn.

Một số lưu ý khi sử dụng iptables để bảo vệ máy chủ

iptables là một công cụ cực kỳ linh hoạt, nhưng “quyền lực lớn đi kèm với trách nhiệm lớn”. Một sai lầm nhỏ trong cấu hình có thể dẫn đến việc khóa chính bạn ra khỏi máy chủ hoặc vô tình tạo ra một lỗ hổng bảo mật. Dưới đây là một số lưu ý quan trọng bạn cần ghi nhớ để sử dụng iptables một cách an toàn và hiệu quả.

Lưu ý về thứ tự và ưu tiên quy tắc

Đây là một trong những khái niệm quan trọng nhất khi làm việc với iptables. Các quy tắc trong một chain được xử lý theo thứ tự từ trên xuống dưới. Khi một gói tin đi vào, iptables sẽ kiểm tra nó với quy tắc đầu tiên. Nếu gói tin khớp với quy tắc, hành động tương ứng (ví dụ: `ACCEPT` hoặc `DROP`) sẽ được thực hiện ngay lập tức và iptables sẽ ngừng xử lý gói tin đó. Nếu không khớp, nó sẽ chuyển sang quy tắc tiếp theo, và cứ thế tiếp tục.

Tại sao điều này lại quan trọng? Hãy xem xét ví dụ sau. Giả sử bạn có hai quy tắc:

  1. Quy tắc 1: `DROP` tất cả lưu lượng từ một địa chỉ IP độc hại.
  2. Quy tắc 2: `ACCEPT` tất cả lưu lượng đến cổng 443 (HTTPS).

Nếu bạn đặt quy tắc 2 trước quy tắc 1, địa chỉ IP độc hại kia vẫn có thể truy cập vào dịch vụ HTTPS của bạn. Nhưng nếu bạn đặt quy tắc 1 lên trước, mọi kết nối từ IP đó sẽ bị chặn ngay lập tức, bất kể nó cố gắng truy cập cổng nào. Do đó, nguyên tắc chung là: đặt các quy tắc `DROP` hoặc `REJECT` cụ thể (chặn IP, chặn cổng) lên trên cùng, tiếp theo là các quy tắc `ACCEPT` cụ thể, và cuối cùng là chính sách `DROP` mặc định hoặc một quy tắc `DROP` toàn bộ.

Hình minh họa

Backup cấu hình và tự động áp dụng sau khởi động

Một cú “sốc” mà nhiều người mới sử dụng iptables gặp phải là tất cả các quy tắc họ cẩn thận thiết lập đều biến mất sau khi máy chủ khởi động lại. Điều này là do các quy tắc iptables được lưu trong bộ nhớ và sẽ bị xóa khi reboot.

Để tránh việc phải cấu hình lại từ đầu mỗi lần, bạn cần một cơ chế để lưu và tự động nạp lại các quy tắc. Trên Ubuntu, cách phổ biến và đơn giản nhất là sử dụng gói iptables-persistent. Hãy cài đặt nó:

sudo apt install iptables-persistent

Trong quá trình cài đặt, nó sẽ hỏi bạn có muốn lưu các quy tắc IPv4 và IPv6 hiện tại không. Hãy chọn “Yes”. Sau này, mỗi khi bạn thay đổi cấu hình và đã chắc chắn rằng nó hoạt động đúng, hãy chạy lệnh sau để lưu lại bộ quy tắc mới:

sudo netfilter-persistent save

Lệnh này sẽ ghi các quy tắc hiện tại vào các file cấu hình trong `/etc/iptables`. Dịch vụ `netfilter-persistent` sẽ tự động chạy khi khởi động và nạp lại các quy tắc đã lưu, đảm bảo tường lửa của bạn luôn được kích hoạt với cấu hình chính xác. Trước khi thực hiện bất kỳ thay đổi lớn nào, bạn cũng nên tạo một bản sao lưu thủ công:

sudo iptables-save > ~/iptables-rules-backup.txt

Nếu có sự cố, bạn có thể khôi phục lại từ file này bằng lệnh `sudo iptables-restore < ~/iptables-rules-backup.txt`.

Các vấn đề thường gặp và cách khắc phục

Ngay cả với sự chuẩn bị kỹ lưỡng nhất, đôi khi mọi thứ vẫn không diễn ra như kế hoạch. Việc cấu hình sai iptables có thể gây ra các sự cố khó chịu như mất kết nối hoặc dịch vụ không thể truy cập. Dưới đây là hai vấn đề phổ biến nhất và cách để bạn nhanh chóng chẩn đoán và khắc phục chúng.

Không thể truy cập dịch vụ sau khi cấu hình iptables

Đây là sự cố kinh điển: bạn vừa áp dụng một bộ quy tắc tường lửa mới và đột nhiên không thể SSH vào máy chủ hoặc trang web của bạn không tải được nữa. Đừng hoảng sợ! Nguyên nhân hầu như luôn nằm ở một trong những điều sau:

  1. Thiếu quy tắc cho phép (ACCEPT): Bạn đã đặt chính sách `INPUT` mặc định là `DROP` nhưng lại quên thêm quy tắc `ACCEPT` cho cổng của dịch vụ đó (ví dụ: cổng 22 cho SSH, cổng 80/443 cho web).
  2. Thiếu quy tắc cho kết nối đã thiết lập: Đây là lỗi rất phổ biến. Bạn đã cho phép kết nối `NEW` đến, nhưng lại quên quy tắc quan trọng cho phép lưu lượng `ESTABLISHED` và `RELATED`. Nếu không có quy tắc sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT, máy chủ sẽ không thể gửi dữ liệu trả về cho client.
  3. Sai thứ tự quy tắc: Một quy tắc `DROP` quá rộng được đặt trước quy tắc `ACCEPT` cụ thể của bạn, khiến cho lưu lượng hợp lệ bị chặn trước khi nó đến được quy tắc cho phép.

Cách xử lý nhanh: Nếu bạn vẫn còn một phiên terminal đang mở, hãy nhanh chóng kiểm tra lại các quy tắc bằng sudo iptables -L -v -n. Thêm các quy tắc `ACCEPT` còn thiếu. Nếu bạn đã bị khóa hoàn toàn, bạn sẽ cần truy cập vào máy chủ thông qua bảng điều khiển của nhà cung cấp dịch vụ cloud (console access) hoặc yêu cầu hỗ trợ để tạm thời xóa tất cả các quy tắc bằng lệnh sudo iptables -F. Sau đó, hãy rà soát lại cấu hình một cách cẩn thận trước khi áp dụng lại.

Hình minh họa

iptables không lưu cấu hình sau khi reboot

Bạn dành hàng giờ để tạo ra một bộ quy tắc hoàn hảo, kiểm tra kỹ lưỡng, và rồi tất cả công sức của bạn biến mất sau lần khởi động lại máy chủ đầu tiên. Vấn đề này xảy ra vì, như đã đề cập, các quy tắc iptables chỉ tồn tại trong bộ nhớ.

Nguyên nhân phổ biến: Bạn đã không sử dụng một cơ chế để lưu trữ các quy tắc một cách bền vững. Bạn có thể đã quên cài đặt gói iptables-persistent hoặc đã cài đặt nhưng quên chạy lệnh lưu sau khi thực hiện các thay đổi.

Hướng dẫn khắc phục:

  1. Cài đặt iptables-persistent: Nếu chưa có, hãy cài đặt nó ngay: sudo apt update && sudo apt install iptables-persistent.
  2. Lưu cấu hình hiện tại: Sau khi đã cấu hình xong và chắc chắn mọi thứ hoạt động, hãy chạy lệnh: sudo netfilter-persistent save. Thao tác này sẽ ghi đè các file cấu hình cũ bằng bộ quy tắc hiện tại của bạn.
  3. Kiểm tra dịch vụ: Đảm bảo rằng dịch vụ `netfilter-persistent` được kích hoạt để chạy khi khởi động: sudo systemctl enable netfilter-persistent.service.

Bằng cách tuân thủ quy trình này, bạn có thể yên tâm rằng hàng rào bảo vệ của mình sẽ luôn tự động được dựng lên mỗi khi máy chủ của bạn bắt đầu hoạt động.

Hình minh họa

Các best practices khi sử dụng iptables trên Ubuntu 20.04

Để tối ưu hóa việc sử dụng iptables và đảm bảo hệ thống của bạn được bảo vệ một cách tốt nhất, hãy tuân thủ một số nguyên tắc và thực hành tốt đã được cộng đồng công nhận. Việc áp dụng những thói quen này sẽ giúp bạn tránh được các lỗi phổ biến, tăng cường an ninh và dễ dàng hơn trong việc quản lý hệ thống lâu dài.

  • Luôn sao lưu cấu hình trước khi thay đổi: Đây là quy tắc vàng. Trước khi thêm, sửa hoặc xóa bất kỳ quy tắc nào, hãy tạo một bản sao lưu của cấu hình hiện tại bằng lệnh sudo iptables-save > iptables-rules-$(date +%F).txt. Nếu có sự cố, bạn có thể nhanh chóng khôi phục lại trạng thái ổn định.

  • Chỉ mở cổng cần thiết, đóng tất cả các cổng không dùng: Áp dụng nguyên tắc “đặc quyền tối thiểu”. Bắt đầu bằng cách đặt chính sách mặc định của chain `INPUT` thành `DROP`. Sau đó, chỉ mở từng cổng một cho các dịch vụ bạn thực sự cần cung cấp. Điều này giảm thiểu đáng kể “bề mặt tấn công” của máy chủ.

  • Sử dụng logs để giám sát và điều chỉnh kịp thời: Đừng chỉ thiết lập tường lửa rồi quên nó đi. Hãy cấu hình ghi log cho các gói tin bị từ chối. Thường xuyên kiểm tra các file log để phát hiện các hoạt động bất thường, chẳng hạn như quét cổng hoặc các nỗ lực tấn công lặp đi lặp lại. Dựa vào đó, bạn có thể điều chỉnh quy tắc, ví dụ như chặn các địa chỉ IP đáng ngờ.

  • Không áp dụng quy tắc ngay trên máy chủ sản xuất mà thử nghiệm trước: Nếu có thể, hãy thử nghiệm các thay đổi quy tắc phức tạp trên một môi trường staging hoặc máy chủ thử nghiệm. Điều này giúp bạn phát hiện các vấn đề tiềm ẩn mà không làm gián đoạn dịch vụ chính đang chạy.

  • Luôn cho phép kết nối loopback và established/related: Hai quy tắc này gần như là bắt buộc trong mọi cấu hình tường lửa. Cho phép lưu lượng trên giao diện loopback (`-i lo`) và cho phép các kết nối đã thiết lập (`-m conntrack –ctstate ESTABLISHED,RELATED`) là nền tảng để hệ thống và các dịch vụ hoạt động ổn định.

  • Theo dõi và cập nhật iptables cùng hệ điều hành định kỳ: Giống như mọi phần mềm khác, iptables và kernel Linux có thể có các lỗ hổng bảo mật. Hãy đảm bảo bạn thường xuyên chạy sudo apt update && sudo apt upgrade để cập nhật hệ thống của mình lên phiên bản mới nhất, vá các lỗ hổng đã biết.

Hình minh họa

Kết luận

Qua bài viết này, chúng ta đã cùng nhau đi qua một hành trình chi tiết từ việc cài đặt cơ bản đến cấu hình nâng cao với iptables trên Ubuntu 20.04. Bạn đã thấy được rằng, dù là một công cụ dòng lệnh, iptables lại sở hữu một sức mạnh và sự linh hoạt đáng kinh ngạc, cho phép chúng ta xây dựng một hàng rào bảo mật vững chắc, tùy chỉnh theo từng nhu cầu cụ thể của máy chủ. Việc làm chủ iptables không chỉ là một kỹ năng kỹ thuật, mà còn là một bước đi thiết yếu trong việc bảo vệ tài sản số của bạn trước vô vàn mối đe dọa trên không gian mạng.

Bảo mật là một quá trình liên tục, không phải là một hành động chỉ làm một lần. Tôi khuyến khích bạn hãy bắt tay vào thực hành ngay những kiến thức đã học. Hãy bắt đầu với một máy chủ thử nghiệm, làm quen với các lệnh, thử nghiệm các loại quy tắc khác nhau và quan sát cách chúng ảnh hưởng đến lưu lượng mạng. Đừng ngại mắc lỗi, vì đó là cách học nhanh nhất. Khi đã tự tin, bạn có thể áp dụng cho các máy chủ sản xuất của mình, góp phần tạo ra một môi trường Internet an toàn hơn.

Hành trình của bạn với tường lửa Linux không dừng lại ở đây. Sau khi đã nắm vững iptables, bạn có thể tìm hiểu các công cụ nâng cao hơn như `ipset` để quản lý hiệu quả các danh sách IP lớn, hoặc khám phá các giải pháp thay thế thân thiện hơn như `ufw` (Uncomplicated Firewall) – một giao diện đơn giản hóa của iptables, hoặc `firewalld` thường thấy trên các hệ thống RHEL/CentOS. Chúc bạn thành công trên con đường trở thành một chuyên gia quản trị hệ thống vững vàng!

Đánh giá
Tác giả

Mạnh Đức

Có cao nhân từng nói rằng: "Kiến thức trên thế giới này đầy rẫy trên internet. Tôi chỉ là người lao công cần mẫn đem nó tới cho người cần mà thôi !"

Chia sẻ
Bài viết liên quan