Giới thiệu về IPtable
Iptables do Netfilter Organiztion viết ra để tăng tính năng bảo mật trên hệ thống Linux.
Iptables cung cấp các tính năng sau:
- Tích hợp tốt với kernel của Linux.
- Có khả năng phân tích package hiệu quả.
- Lọc package dựa vào MAC và một số cờ hiệu trong TCP Header
- Cung cấp chi tiết các tùy chọn để ghi nhận sự kiện hệ thống
- Cung cấp kỹ thuật NAT
- Có khả năng ngăn chặn một số cơ chế tấn công theo kiểu DoS
Cài đặt IPtable
Iptables được cài đặt mặc định trong hệ thống Linux, package của iptables là iptablesversion.rpm hoặc iptables-version.tgz …, ta có thể dùng lệnh để cài đặt package hoặc sử dụng yum install để cài đặt. Ở đây mình sẽ sử dụng yum install để cài đặt
$ yum install iptables-services
- Khởi động iptables:
$ systemctl start iptables
- Tắt iptables
$ systemctl stop iptables
- Tái khởi động iptables:
$ systemctl restart iptables
- Xác định trạng thái iptables:
$ systemctl status iptables
Cơ chế xử lý package trong iptables
Iptables sẽ kiểm tra tất cả các package khi nó đi qua iptables host, quá trình kiểm tra này được thực hiện một cách tuần tự entry đầu tiên đến entry cuối cùng.
Có ba loại bảng trong iptables:
1. Mangle table: chịu trách nhiệm biến đổi quality of service bits trong TCP header. Thông thường loại table này được ứng dụng trong SOHO (Small Office/Home Office).
2. Filter queue: chịu trách nhiệm thiết lập bộ lọc packet (packet filtering), có ba loại builtin chains được mô tả để thực hiện các chính sách về firewall (firewall policy rules).
- Forward chain: Cho phép packet nguồn chuyển qua firewall.
- Input chain: Cho phép những gói tin đi vào từ firewall.
- Output chain: Cho phép những gói tin đi ra từ firewall.
3. NAT queue: thực thi chức năng NAT (Network Address Translation), cung cấp hai loại built-in chains sau đây:
- Pre-routing chain: NAT từ ngoài vào trong nội bộ. Quá trình NAT sẽ thực hiện trước khi khi thực thi cơ chế routing. Điều này thuận lợi cho việc đổi địa chỉ đích để địa chỉ tương thích với bảng định tuyến của firewall, khi cấu hình ta có thể dùng khóa DNAT để mô tả kỹ thuật này
- Post-routing chain: NAT từ trong ra ngoài. Quá trình NAT sẽ thực hiện sau khi thực hiện cơ chế định tuyến. Quá trình này nhằm thay đổi địa chỉ nguồn của gói tin. Kỹ thuật này được gọi là NAT one-to-one hoặc many-to-one, được gọi là Source NAT hay SNAT.
- OUPUT: Trong loại này firewall thực hiện quá trình NAT.
Target và Jumps
- Jump là cơ chế chuyển một packet đến một target nào đó để xử lý thêm một số thao tác khác.
- Target là cơ chế hoạt động trong iptables, dùng để nhận diện và kiểm tra packet. Các target được xây dựng sẵn trong iptables như:
- ACCEPT: iptables chấp nhận chuyển data đến đích.
- DROP: iptables khóa những packet.
- LOG: thông tin của packet sẽ gởi vào syslog daemon iptables tiếp tục xử lý luật tiếp theo trong bảng mô tả luật. Nếu luật cuối cùng không match thì sẽ drop packet. Với tùy chọn thông dụng là
--log-prefix=”string”
, tức iptables sẽ ghi nhận lại những message bắt đầu bằng chuỗi “string”. - REJECT: ngăn chặn packet và gởi thông báo cho sender. Với tùy chọn thông dụng là
--reject-with qualifier
, tức qualifier chỉ định loại reject message sẽ được gởi lại cho người gởi. Các loại qualifer sau:icmp-port-unreachable (default), icmp-net-unreachable, icmp-host-unreachable, icmp-proto-unreachable,
… - DNAT: thay đổi địa chỉ đích của packet. Tùy chọn là
--to-destination ipaddress
. - SNAT: thay đổi địa chỉ nguồn của packet. Tùy chọn là
--to-source <address>[- address][:<port>-<port>]
- MASQUERADING: được sử dụng để thực hiện kỹ thuật NAT (giả mạo địa chỉ nguồn với địa chỉ của interface của firewall). Tùy chọn là
[--to-ports <port>[-<port>]]
, chỉ định dãy port nguồn sẽ ánh xạ với dãy port ban đầu.
Thực hiện lệnh trong iptables
Sau đây là những lệnh cơ bản mà bạn cần nắm khi sử dụng iptables
- -t <table> : Chỉ định bảng cho iptables bao gồm: filter, nat, mangle tables
- -j <table> : Nhảy đến một target chain khi packet thoả rule hiện tại
- -A : Thêm rule vào cuối iptables chain.
- -F : Xóa tất cả các luật trong bảng lựa chọn
- -p <protocol-type> : Mô tả các giao thức bao gồm: icmp, tcp, udp và all
- -s <ip-address> : Chỉ định địa chỉ nguồn
- -d <ip-address> : Chỉ định địa chỉ đích
- -i <interface-name> : Chỉ định “input” interface nhận packet
- -o <interface-name> : Chỉ định “output” interface chuyển packet ra ngoài
Các ví dụ
- Ví dụ 1:
Firewall chấp nhận cho bất kỳ TCP packet đi vào interface eth0 đến địa chỉ 172.28.24.199
$ iptables -A INPUT -s 0/0 -i eth0 -d 172.28.24.199 -p tcp -j ACCEPT
- Ví dụ 2:
Firewall chấp nhận TCP packet được định tuyến khi nó đi vào interface eth0 và đi ra interface eth1 để đến đích 172.28.2.2 với port nguồn bắt đầu 1024/65535 và port đích 8080
$ iptables -A FORWARD -s 0/0 -i eth0 -o eth1 -d 172.28.2.2 -p tcp \ --sport 1024:65535 --dport 8080 -j ACCEPT
- Ví dụ 3:
Firewall cho phép gởi icmp echo-request và icmp echo-reply
$ iptables -A OUPUT -p icmp --icmp-type echo-request -j ACCEPT $ iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
- Ví dụ 4:
Chỉ định số lượng yêu cầu phù hợp cho một đơn vị thời gian theo dạng(/second, /minute, /hour. /day)
$ iptables -A INPUT -p icmp -icmp-type echo-request -m limit --limit 1/s \ -i eth0 -j ACCEPT
Ưu điểm của nó là giới hạn được số lượng kết nối, giúp cho ta chống được các cơ chế tấn công như DoS (Denial of Service attack). Một số tuỳ chọn bạn cần nắm như sau.
- -m multiport –sport<port,port> : Mô tả nhiều dãy sport, phải cách nhau bằng dấu “,” và dùng tùy chọn –m
- -m multiport –dport<port,port> : Mô tả nhiều dãy dport, phải cách nhau bằng dấu “,” và dùng tùy chọn –m
- -m multiport –ports<port,port> : Mô tả nhiều dãy port, phải cách nhau bằng dấu “,” và dùng tùy chọn –m
- -m –state<state> : Kiểm tra trạng thái:
- ESTABLISHED: đã thiết lập connection
- NEW: bắt đầu thiết lập connection
- RELATED: thiết lập connection thứ 2(FTP data transfer hoặc ICMP error)
- Ví dụ 5:
Firewall chấp nhận TCP packet từ bất kỳ địa chỉ nào đi vào interface eth0 đến địa chỉ 172.28.24.195 qua interface eth1, source port từ 102465535 và destionation port là 8080 và 443 (dòng lệnh thứ 1). Packet trả về cũng được chấp nhận từ 172.28.2.2 (dòng lệnh thứ 2).
$ iptables -A FORWARD -s 0/0 -i eth0 -d 172.28.24.195 -o eth1 -p tcp \ --sport 1024:65535 -m multiport --dport 8080,443 -j ACCEPT $ iptables -A FORWARD -d 0/0 -i eth0 -s 172.28.2.2 -o eth1 -p tcp \ -m state --state ESTABLISH D -j ACCEPT
Sử dụng chain tự định nghĩa
Thay vì sử dụng các chain đã được xây dựng trong iptables, ta có thể sử dụng User Defined chains để định nghĩa một chain name mô tả cho tất cả protocol-type cho packet. Ta có thể dùng User Defined chains thay thế chain dài dòng bằng cách sử dụng chain chính chỉ đến nhiều chain con
- Ví dụ 6:
$ iptables -A INPUT -i eth0 -d 172.28.24.198 -j fast-input-queue $ iptables -A OUTPUT -o eth0 -s 172.28.2.2 -j fast-output-queue $ iptables -A fast-input-queue -p icmp -j icmp-queue-in $ iptables -A fast-output-queue -p icmp -j icmp-queue-out $ iptables -A icmp-queue-out -p icmp --icmp-type echo-request \ -m state --state NEW -j ACCEPT $ iptables -A icmp-queue-in-p icmp --icmp-type echo-reply \ -m state --state NEW -j ACCEPT