Iptables chuyên sâu Image Iptables chuyên sâu

Firewall là công cụ khá quan trọng dùng để cấu hình để bảo vệ máy chủ và cơ sở hạ tầng. Trong Linux, iptables là một công cụ firewall được sử dụng rộng rãi để tương tác với netfilter - một packet filtering framework trong Linux Kernel. Trong bài viết này, chúng ta sẽ cùng tìm hiểu cách thức hoạt động của iptables lẫn netfilter ở hướng chuyên sâu nghiêng về lý thuyết, để giúp các bạn có thể hiểu các rule trên iptables hoạt động chi tiết bên trong Linux Kernel như thế nào.

1. Iptables là gì?

Iptables chỉ là giao diện dòng lệnh để tương tác với tính năng packet filtering của netfilter framework. Tuy nhiên để đơn giản thì trong bài viết này chúng ta sẽ gọi chung là iptables.

Cơ chế packet filtering của iptables hoạt động bao gồm 3 thành phần sau: tables, chainstargets.

2. Các table trong iptables

2.1. Table filter

Table filter là một trong những table được dùng nhiều nhất trong iptables. Filter table được sử dụng để đưa ra quyết định về việc có nên để gói tin(network packet) tiếp tục đến đích dự định hay từ chối yêu cầu của nó hay không.

2.2. Table NAT

Table NAT để sử dụng các rule về NAT(Network Address Translation), table này có nhiệm vụ chỉnh sửa source hoặc destination của gói tin để thực hiện cơ chế NAT.

2.3. Table mangle

Table mangle cho phép chỉnh sửa phần header của gói tin, ví dụ như giá trị TTL.

2.4. Table raw

Iptables là một stateful firewall, điều đó có nghĩa là các gói được kiểm tra liên quan đến trạng thái(state) của nó (Ví dụ: gói có thể là một phần của kết nối mới hoặc có thể là một phần của kết nối hiện có.). Table raw cho phép bạn làm việc với các gói trước khi kernel bắt đầu theo dõi trạng thái của nó, nó cũng giúp loại trừ một số gói tin ra khỏi việc tracking vì ví đề hiệu năng hệ thống.

2.5. Table security

Ngoài ra, một số kernel còn hỗ trợ Table security. Nó được dùng bởi SELinux để thiết lập các chính sách bảo mật.

3. Các chain trong iptables

Mỗi table có một số chain nhất định, giúp bạn filter các gói tin.

  • Chain PREROUTING: Rule trong chain này được thực thi ngay khi gói tin vừa vào đến giao diện mạng(Network Interface). Chain này tồn tại ở các table: nat, mangle và raw.
  • Chain INPUT: Rule trong chain này được thực thi ngay trước khi gói tin gặp tiến trình(process). Chain này chỉ tồn tại ở table mangle và nat.
  • Chain OUTPUT: Rule trong chain này được thực thi ngay sau khi gói tin được tiến trình tạo ra. Chain này tồn tại ở các table: raw, mangle, nat và filter.
  • Chain FORWARD: Rule này thực thi cho các gói tin được định tuyến qua host hiện tại. Chain này chỉ tồn tại ở table mangle và filter.
  • Chain POSTROUTING: Rule này thực thi ngay khi gói tin rời giao diện mạng. Chain này chỉ tồn tại ở table mangle và nat.

4. Matching trong iptables

Để một rule trong iptables được xem là matched thì gói tin đi qua phải đáp ứng các tiêu chí của rule đó để hành động tiếp theo hoặc target được thực thi.

Hệ thống matching của iptables rất linh hoạt và có thể được mở rộng đáng kể với các tiện ích mở rộng(extension) của iptables có sẵn trên hệ thống. Rule có thể xây dựng các tiêu chí để match bao gồm loại protocol, dest hoặc source address, dest hoặc source port, dest hoặc source network, input hoặc output interface, header, các trạng thái state của kết nối. Chúng có thể được kết hợp để tạo ra các bộ quy tắc khá phức tạp để phân biệt giữa các gói tin khác nhau.

5. Target trong iptables

A target là một hành động sẽ được trigger ngay khi các tiêu chí của rule khớp(matched) hoàn toàn. Target được chia ra làm 2 nhóm sau:

  • Terminating target: Là loại target thực thi hành động mà nó sẽ chấm dứt việc kiểm(evaluation) tra gói tin. Tùy thuộc vào rule thiết lập, nó có thể DROP, ACCEPT hoặc REJECT gói tin.
  • Non-terminating targets: Là loại target mà nó thực thi hành động và vẫn tiếp tục việc kiểm tra gói tin dựa theo các rule khác. Ví dụ target LOG, nó ghi log vào file và packet đó vẫn chịu sự kiểm tra của các rule còn lại.

6. Connection tracking trong iptables

Connection tracking cho phép iptables đưa ra quyết định cho mỗi gói tin mà nó nhìn thấy dựa vào ngữ cảnh(context) của kết nối đang diễn ra. Quá trình Connection tracking diễn ra khá sớm trong vòng đời(lifecycle) của một gói tin. Hệ thống sẽ kiểm tra gói tin với tập hợp các kết nối đang có trên hệ thống, cập nhật trạng thái(state) nếu cần hoặc thêm kết nối mới. Các gói tin được đánh dấu bằng target "NOTRACK" từ table raw sẽ được bypass quá trình tracking này.

6.1. Các trạng thái(state)

Các kết nối được theo dõi bởi hệ thống Connection tracking sẽ ở một trong các trạng thái sau:

  • NEW: Kết nói chỉ có 1 gói tin đầu tiên của một kết nối được đánh trạng thái này, áp dụng cho cả TCP lẫn UDP.
  • ESTABLISHED: Trạng thái chuyển NEW to ESTABLISHED khi nhận được phản hồi hợp lệ từ phía đối diện của kết nối. Với kết nối TCP, nó chính là SYN/ACK và với UDP/ICMP, là phản hồi mà ở đó địa chỉ nguồn và địa chỉ đích được hoán đổi.
  • RELATED: Các gói tin không phải là một phần của kết nối hiện có, nhưng được liên kết với một kết nối đã có trong hệ thống được gắn nhãn RELATED.
  • INVALID: Các gói có thể được đánh dấu là INVALID nếu chúng không được liên kết với một kết nối hiện có và không phù hợp để mở một kết nối mới.
  • UNTRACKED: Gói tin được đánh dấu UNTRACKED nếu nó được gắn cờ để bypass quá trình tracking từ table raw.
  • SNAT: Đó là trạng thái sẽ được đánh dấu khi gói tin được chỉnh sửa phần source address bởi quá trình NAT. Nó được dùng bởi hệ thống Connection tracking để thay đổi lại source address ở gói tin phản hồi lại.
  • DNAT: Đó là trạng thái sẽ được đánh dấu khi gói tin được chỉnh sửa phần destination address bởi quá trình NAT. Nó được dùng bởi hệ thống Connection tracking để thay đổi lại destination address ở gói tin phản hồi lại.

7. Tóm tắt

Firewall là một công cụ bảo mật quan trọng cho các sysadmin. Như chúng ta đã thấy, iptables cung cấp một tường lửa rất mạnh mà bạn có thể sử dụng để bảo mật hệ thống của mình. Chúng ta đã đề cập đến một số nguyên lý hoạt động và khái niệm liên quan ở mức chuyên sâu để thiết kế các rule iptables cho các hệ thống bạn quản lý. Bạn có thể tìm hiểu thêm về iptables tại man page của lệnh này, hoặc trang chủ của dự án netfilter tại đây.