Iptables

**iptables** là một chương trình chạy ở không gian người dùng, cho phép người quản trị hệ thống có thể cấu hình các bảng của tường lửa trong nhân Linux (được cài đặt trong các mô đun Netfilter khác nhau) và lưu trữ các chuỗi, luật. Các mô đun nhân và chương trình khác nhau được áp dụng cho từng giao thức; *iptables* cho IPv4, *ip6tables* cho  IPv6, *arptables* cho ARP, và *ebtables* cho  Ethernet frames.

Iptables yêu cầu quyền cao cấp trong hệ thống để hoạt động và phải được người dùng root thực thi, nếu không một số chức năng của chương trình sẽ không hoạt động. Trong hầu hết các hệ thống Linux, iptables được cài đặt tại /usr/sbin/iptables và hướng dẫn sử dụng trong trang chỉ dẫn của chương trình,. Người dùng có thể mở trang chỉ dẫn bằng lệnh `man iptables` sau khi cài đặt.

*iptables* is also commonly used to inclusively refer to the kernel-level components. *x_tables* is the name of the kernel module carrying the shared code portion used by all four modules that also provides the API used for extensions; subsequently, *Xtables* is more or less used to refer to the entire firewall (v4,v6,arp,eb) architecture.

## Lịch sử

Trước iptables, các gói chương trình dùng để quản lý tường lửa trên Linux là ipchains trên Linux 2.2; ipfwadm trên Linux 2.0, dựa trên chương trình ipfw trên BSD.

iptables giữ lại những ý tưởng chính trong ipfwadmi: các danh sách luật, trong đó mỗi luật chỉ ra những dấu hiệu cần tìm trong một gói tin, và các hành động sẽ thực hiện với một gói tin thỏa mãn các dấu hiệu. ipchains thêm khái niệm *chuỗi* luật, và iptables mở rộng ra *bảng*: một bảng được tra cứu khi cần quyết định phải NAT một gói tin, và một bảng khác chỉ ra phải lọc gói tin như thế nào. Thêm vào đó, ba điểm lọc trên hành trình của một gói tin được biến đổi sao cho mỗi gói tin thông qua một điểm lọc.

Cách phân chia này cho phép iptables sử dụng thông tin mà lớp giám sát kết nối thu được từ gói tin, những thông tin thường gặp trong NAT. Điều này làm cho iptables cao cấp hơn ipchains vì nó có khả năng giám sát trạng thái của kết nối và chuyển hướng, thay đổi hay dừng các gói tin dựa trên trạng thái của kết nối, không chỉ dựa vào nguồn, đích hay nội dung gói tin. (Điều này được thực hiện bằng tùy chọn `-m conntrack`, chi tiết xem trong trang chỉ dẫn.) Một tường lửa sử dụng iptables theo cách này còn được gọi là tường lửa có trạng thái, trong khi ipchains chỉ có thể  cài đặt tường lửa không trạng thái (trừ một số trường hợp đặc biệt). Ta có thể nói rằng iptables có thể nhận thức được ngữ cảnh của gói tin đang di chuyển, từ đó ra một quyết định đúng đắn hơn cho số phận của các gói tin và kết nối.

Người bảo quản Patrick McHardy của Netfilter đã đề xuất một chương trình thay thế cho iptables trong tương lai là nftables. Dự án hiện đang được phát triển trong bước alpha. Bên cạnh đó, vài chương trình như Xtables2  được phát triển để cải tiến các đoạn mã đã có trong nhân Linux.

## Hoạt động

Xtables cho phép người quản trị hệ thống định nghĩa các *bảng* (table) chứa các *chuỗi* (chains) *luật* (rules) áp dụng cho gói tin. Mỗi bảng tương ứng với một loại của quy trình gói tin. Các gói tin được xử lý nối tiếp qua từng luật trong chuỗi. Một luật trong một chuỗi có thể đổi hướng hay nhảy đến một chuỗi khác, và quá trình này tiếp diễn đến khi vòng lặp kết thúc. Mọi gói tin được xử lý đều phải thông qua ít nhất mỗi chuỗi luật.

Nguồn gốc của gói tin quyết định gói sẽ thông qua chuỗi nào đầu tiên. Có năm *chuỗi định nghĩa trước* (ánh xạ tới năm móc nối trong Netfilter), dẫu cho một bảng không nhất thiết phải có tất cả các chuỗi. Các chuỗi định nghĩa trước đều có *chính sách*, ví như DROP (hủy), chính sách này sẽ được thực hiện cho gói nếu gói đi đến cuối chuỗi. Người quản trị hệ thống có thể tạo thêm nhiều chuỗi luật, các chuỗi này không có chính sách; nếu một gói tin đi hết chuỗi này, nó được trả về chuỗi đã gọi. Chuỗi cũng có thể rỗng.

* "PREROUTING": Gói tin sẽ được đưa vào chuỗi trước khi một quyết định định tuyến được đưa ra.
* "INPUT": Gói tin được chuyển đến nội bộ. (Chuyển gói tin nội bộ được điều khiển bởi bảng định tuyến "local-delivery": ``ip route show table local``.)
* "FORWARD": Tất cả các gói cần định tuyến và không gửi đến nội bộ đều phải thông qua chuỗi này.
* "OUTPUT": Gói tin gửi từ chính máy tính đang làm việc sẽ thông qua chuỗi này.
* "POSTROUTING": Quyết định định tuyến đã được đưa ra. Gói tin đi vào chuỗi này trước khi đưa ra phần cứng.

Mỗi luật trong chuỗi chứa chi tiết về các dấu hiệu cần tìm trong gói tin. Nó cũng chứa *mục tiêu* hay *quyết định* với gói tin. Gói tin đi qua từng luật trong chuỗi. Nếu một luật không khớp với gói tin, gói tin sẽ đi qua luật kế tiếp. Nếu khớp luật, thực thi hành động được định nghĩa trong luật, sau đó gói tin có thể tiếp tục thông qua chuỗi hoặc không. So khớp bao gồm một lượng lớn tập luật, trong đó là các điều kiện để kiểm tra gói in. Việc này có thể xảy ra trong nhiều tầng của mô hình OSI, ví như đối số *<kbd>--mac-source</kbd>* và *<kbd>-p tcp --dport</kbd>*, hay các so khớp độc lập với giao thức như *<kbd>-m time</kbd>*.

Gói tin sẽ tiếp tục đi qua chuỗi trừ khi:

# gói tin khớp với một luật đưa ra quyết định xử lý gói tin, ví như  ACCEPT hay DROP, hay một mô đun trả về một kết quả cuối cùng; hoặc
# một luật gọi quyết định RETURN, trong trường hợp này tiến trình trả về chuỗi đã gọi chuỗi hiện hành; hoặc
# đã tới cuối chuỗi; gói tin hoặc tiếp tục thông qua chuỗi cha (nếu RETURN), hay nếu chuỗi hiện hành là chuỗi cơ bản, kết quả cuối cùng được sử dụng.

Quyết định trả về thường là ACCEPT (thường gặp ở mô đun NAT) hay DROP (ví dụ mô đun "REJECT"), có khi là CONTINUE (ví dụ trong mô đun "LOG"; CONTINUE là một tên nội bộ) để tiếp tục đi mô đun tiếp theo nếu không có mục tiêu/kết quả nào được chỉ định cho gói tin.

## Các phần mềm hỗ trợ

Có một số phần mềm bên thứ ba hỗ trợ đơn giản hóa quá trình thiết lập lệnh với iptables. Giao diện sử dụng có dạng văn bản hay đồ họa, cho phép người dùng nhấp chuột để tạo ra các tập luật đơn giản; các kịch bản với iptables thường được viết bằng văn lệnh Unix, gọi tới iptables hay `iptables-restore` với một tập lệnh đã định nghĩa, hay các lệnh mở rộng từ một bản mẫu với sự hướng dẫn trong một tập tin cấu hình đơn giản.

Một số gói giao diện, tập lệnh, và bộ sinh luật thường hạn chế bởi các bản mẫu được cài đặt sẵn. Do đó tập luật tạo ra thường không tối ưu, tường lửa hoạt động không hoàn hảo như mong muốn. Những người dùng muốn có tập luật tối ưu phải hiểu rõ iptables và thiết kế tập luật riêng.

## Các công cụ khác

*NuFW, một phần mở rộng của Netfilter, có chức năng tường lửa chứng thực.
*GUFW, một tiện ích cấu hình đơn giản trên Ubuntu
*FWSnort, Chuyển đổi một tập luật IDS của Snort sang chuẩn IPTables.
*psad, Tự động phân tích bản ghi vết của iptables để phát hiện các hành động đáng ngờ (như quét cổng, thăm dò cổng sau), bị động in dấu ấn các ngăn xếp TCP từ xa.
*Lập trình các mô đun Netfilter/iptables trên "Rope" 
*LibIPTables C API for iptables 

### Hướng dẫn
*Netfilter HOWTOs
*Sử dụng iptables trên Ubuntu như thế nào?
*Tài liệu hướng dẫn tường lửa và định tuyến nâng cao trên Linux 
* "Detecting and deceiving network scans" — countermeasures against nmap

## Liên kết ngoài
* Trang chủ dự án netfilter/iptables
* 
* Tài liệu hướng dẫn netfilter/iptables (outdated)

## Tham khảo