Hướng dẫn Thực tế Cấu hình Tường lửa Linux: So sánh iptables và nftables

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

Bạn Vừa Triển Khai một Máy chủ Linux Mới. Giờ thì Sao?

Vậy là bạn vừa khởi tạo một máy chủ Linux mới trên cloud. Nó có một địa chỉ IP công cộng, bạn có thể SSH vào, và bạn đã sẵn sàng để triển khai ứng dụng của mình. Nhưng khoan đã. Trước khi làm bất cứ điều gì khác, chúng ta cần nói về bảo mật. Ngay bây giờ, máy chủ đó là một tờ giấy trắng. Không có tường lửa, nó về cơ bản là một mục tiêu dễ bị tấn công. Các bot và trình quét tự động liên tục dò tìm trên internet những máy chủ dễ bị tổn thương giống như thế này.

Để một máy chủ phơi bày ra ngoài là một rủi ro cực lớn. Mọi dịch vụ đang chạy với một cổng mở đều là một cánh cửa tiềm tàng cho kẻ xâm nhập. Đã đến lúc khóa những cánh cửa đó lại.

Gốc rễ Vấn đề: Các Cổng Mạng không được Lọc

Bất kỳ dịch vụ mạng nào, như máy chủ web trên cổng 80/443 hoặc SSH trên cổng 22, đều phải mở một cổng để chấp nhận kết nối. Trên một bản cài đặt Linux mặc định, thường không có gì ngăn cản bất kỳ ai trên internet gõ cửa những cổng đó. Một máy chủ mới triển khai có thể chứng kiến hàng ngàn lượt quét cổng và nỗ lực đăng nhập tự động chỉ trong giờ đầu tiên trực tuyến.

Các kịch bản tự động này quét các dải IP 24/7. Chúng sẽ cố gắng tấn công brute-force mật khẩu SSH của bạn, khai thác một lỗ hổng đã biết, hoặc tìm bất kỳ cách nào khác để đột nhập. Giải pháp là kiểm soát chính xác lưu lượng nào được phép đến máy chủ của bạn ngay từ đầu. Đó là công việc của một tường lửa.

Trong Linux, framework lọc gói của kernel được gọi là Netfilter. Trong nhiều năm, chúng ta đã quản lý Netfilter bằng một công cụ gọi là iptables. Tuy nhiên, ngày nay, người kế nhiệm hiện đại và hiệu quả hơn của nó, nftables, đã trở thành trung tâm.

Công cụ Chuyên dụng: iptables vs. nftables

Khi bạn nghiên cứu về tường lửa Linux, hai cái tên ngay lập tức xuất hiện: iptablesnftables. Hiểu được sự khác biệt là chìa khóa để xây dựng một máy chủ hiện đại, an toàn.

Công cụ Cổ điển: iptables

iptables đã là tiêu chuẩn trong một thời gian rất dài. Nếu bạn đã làm việc với Linux hơn một vài năm, bạn chắc chắn đã sử dụng nó. Logic của nó được xây dựng trên các bảng riêng biệt (như filter, nat) và các chuỗi quy tắc (như INPUT, OUTPUT).

Một bộ quy tắc iptables điển hình có thể trông như thế này:

# Cho phép các kết nối SSH đến
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Cho phép các kết nối đã thiết lập (quan trọng cho lưu lượng trả về)
sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# Mặc định loại bỏ tất cả lưu lượng đến khác
sudo iptables -P INPUT DROP

Mặc dù hiệu quả, iptables có những nhược điểm của nó:

  • Phức tạp: Cú pháp dài dòng và có thể gây nhầm lẫn. Rất dễ mắc lỗi.
  • Tách biệt IPv4/IPv6: Bạn cần một công cụ hoàn toàn riêng biệt (ip6tables) và một bộ quy tắc trùng lặp cho IPv6. Đây là một vấn đề thực sự nhức đầu trong các mạng hiện đại.
  • Hiệu suất: Khi bộ quy tắc phát triển, iptables có thể chậm lại. Mỗi gói tin phải được kiểm tra lần lượt qua một chuỗi dài các quy tắc, điều này có thể gây ra độ trễ.

Người Kế nhiệm Hiện đại: nftables

nftables được thiết kế từ đầu để khắc phục những thiếu sót của iptables. Nó cung cấp một công cụ dòng lệnh mới, hợp nhất và cú pháp sạch sẽ hơn nhiều. Hầu hết các bản phân phối Linux hiện đại, bao gồm Debian, Ubuntu và Fedora, hiện đã sử dụng nftables làm mặc định.

Dưới đây là những ưu điểm chính của nó:

  • Framework Hợp nhất: Một lệnh nft duy nhất quản lý các quy tắc cho IPv4, IPv6 và ARP. Không còn phải xoay xở với iptables, ip6tables, và arptables.
  • Cập nhật Nguyên tử: Bạn có thể thay thế toàn bộ bộ quy tắc của mình trong một thao tác duy nhất, nguyên tử. Điều này ngăn chặn các khoảng trống tường lửa tạm thời hoặc lỗi cú pháp làm mất kết nối của bạn trong quá trình cập nhật.
  • Hiệu suất Vượt trội: Nó sử dụng các cấu trúc dữ liệu hiệu quả hơn, như bảng băm và tập hợp. Điều này cho phép xử lý gói tin nhanh hơn nhiều, đặc biệt với hàng ngàn quy tắc.

Đối với bất kỳ việc triển khai máy chủ mới nào, tôi thực sự khuyên bạn nên bắt đầu với nftables. Đó là sự lựa chọn cho tương lai.

Cấu hình Tường lửa Yêu thích của Tôi với nftables

Đây là hướng dẫn từng bước để thiết lập một tường lửa cơ bản vững chắc, an toàn. Đây chính là cấu hình chính xác mà tôi sử dụng cho các máy chủ web production mới.

Đầu tiên, hãy chắc chắn rằng nftables đã được cài đặt. Trên Debian/Ubuntu, chạy sudo apt update && sudo apt install nftables. Trên RHEL/CentOS/Fedora, đó là sudo dnf install nftables.

1. Tạo Tệp Cấu hình

Thay vì chạy các lệnh từng cái một, cách đáng tin cậy nhất để quản lý tường lửa là sử dụng một tệp cấu hình. Điều này làm cho bộ quy tắc của bạn dễ đọc, kiểm soát phiên bản và khôi phục. Tạo và chỉnh sửa /etc/nftables.conf:

sudo nano /etc/nftables.conf

2. Xây dựng Bộ quy tắc

Dán cấu hình sau vào tệp. Chúng ta sẽ phân tích từng phần dưới đây.

#!/usr/sbin/nft -f

# Bắt đầu với một trạng thái sạch
flush ruleset

# Tạo bảng chính cho cả IPv4 và IPv6
table inet filter {
    # Chuỗi input: cho lưu lượng đi vào máy chủ
    chain input {
        # Chính sách mặc định là loại bỏ mọi thứ. Đây là lập trường an toàn nhất.
        type filter hook input priority 0; policy drop;

        # --- CÁC QUY TẮC ACCEPT (theo thứ tự quan trọng) ---

        # 1. Cho phép lưu lượng từ giao diện loopback (cho các dịch vụ cục bộ)
        iifname "lo" accept

        # 2. Cho phép các kết nối đã thiết lập và liên quan (quy tắc thần kỳ)
        ct state established,related accept

        # 3. Cho phép ICMP (ping) - hữu ích cho việc chẩn đoán mạng
        ip protocol icmp accept
        ip6 nexthdr icmpv6 accept

        # 4. Cho phép SSH (cổng 22) - cực kỳ cần thiết!
        tcp dport 22 accept

        # 5. Cho phép HTTP và HTTPS (cổng 80, 443) cho máy chủ web
        tcp dport { 80, 443 } accept
    }

    # Chuỗi forward: cho lưu lượng đi ngang qua máy chủ (ví dụ: một router)
    # Chúng ta là máy chủ, không phải router, nên ta loại bỏ chuỗi này.
    chain forward {
        type filter hook forward priority 0; policy drop;
    }

    # Chuỗi output: cho lưu lượng đi ra từ máy chủ
    chain output {
        # Chúng ta mặc định tin tưởng lưu lượng đi ra của chính mình.
        type filter hook output priority 0; policy accept;
    }
}

Phân tích Cấu hình:

  • flush ruleset: Xóa sạch tất cả các quy tắc hiện có. Điều này đảm bảo cấu hình mới của bạn được áp dụng trên một trạng thái sạch.
  • table inet filter: Tạo một bảng duy nhất tên là `filter` cho họ `inet`, giúp xử lý cả IPv4 và IPv6 một cách tinh tế. Đây là một chiến thắng lớn về sự đơn giản.
  • chain input { policy drop; }: Đây là trái tim của chính sách bảo mật của chúng ta. Chúng ta định nghĩa chuỗi cho lưu lượng đến (`input`) và đặt chính sách mặc định của nó là drop. Bất kỳ gói tin nào không khớp với một quy tắc `accept` rõ ràng đều bị loại bỏ một cách âm thầm.
  • iifname "lo" accept: Cho phép tất cả lưu lượng trên giao diện loopback cục bộ. Nhiều ứng dụng cần điều này để giao tiếp với chính chúng.
  • ct state established,related accept: Đây là quy tắc thần kỳ. Nó sử dụng trình theo dõi kết nối (`ct`) để tự động cho phép lưu lượng trả về cho các kết nối mà máy chủ của bạn khởi tạo. Nếu không có nó, bạn có thể thực hiện các yêu cầu đi ra, nhưng bạn sẽ không bao giờ nhận được phản hồi trở lại.
  • tcp dport 22 accept: Cho phép rõ ràng các kết nối TCP đến cổng 22 (SSH). Nếu bạn quên quy tắc này, bạn sẽ tự khóa mình khỏi máy chủ của chính mình.
  • tcp dport { 80, 443 } accept: Cho thấy bạn có thể dễ dàng cho phép lưu lượng đến một tập hợp các cổng—trong trường hợp này, cho một máy chủ web tiêu chuẩn.
  • chain output { policy accept; }: Để đơn giản, chúng tôi cho phép tất cả lưu lượng đi ra. Mặc dù các môi trường bảo mật cao có thể hạn chế điều này hơn nữa, đây là một điểm khởi đầu thực tế và an toàn cho hầu hết các ứng dụng.

Cấu hình nftables này là cơ sở yêu thích của tôi cho bất kỳ máy chủ mới nào. Nó đã được chứng minh là cực kỳ ổn định trong môi trường production, cung cấp bảo mật mạnh mẽ mà không quá phức tạp.

3. Kích hoạt và Lưu trữ Quy tắc

Bây giờ, hãy tải bộ quy tắc mới của bạn và kích hoạt dịch vụ nftables để nó tự động khởi động mỗi khi boot máy.

# Áp dụng các quy tắc từ tệp một cách nguyên tử
sudo nft -f /etc/nftables.conf

# Kích hoạt dịch vụ nftables để khởi động cùng hệ thống
sudo systemctl enable nftables.service

# Khởi động dịch vụ ngay bây giờ
sudo systemctl start nftables.service

4. Kiểm tra Bộ quy tắc của bạn

Để xem các quy tắc đang hoạt động của bạn ở định dạng sạch sẽ, dễ đọc, hãy chạy lệnh này:

sudo nft list ruleset

Đầu ra phải hoàn toàn khớp với tệp /etc/nftables.conf của bạn. Điều này xác nhận tường lửa của bạn đang hoạt động và được cấu hình chính xác như bạn dự định.

Và cứ như vậy, máy chủ của bạn không còn là một mục tiêu dễ bị tấn công. Bạn đã xây dựng một tường lửa hiện đại, vững chắc, đóng lại cánh cửa với lưu lượng không mong muốn đồng thời cung cấp cho bạn một cấu hình rõ ràng, dễ bảo trì cho tương lai.

Share: