Cơ chế xử lý packet trong iptables: Tất cả mọi dữ liệu đều được kiểm tra khi đi qua iptables, quá trình kiểm tra này được thực hiện một cách tuần tự từ entry đâu đến entry cuối bằng cách
Trang 1I GIỚI THIỆU VỀ IPTABLES
Iptables là một chương trình chạy ở không gian người dùng Iptables là một firewall được tích hợp sẵn trong hệ điều hành Linux, do Netfilter Organiztion viết ra nhằm tăng tính bảo mật trên
hệ thống Linux
Iptables cung cấp các tính năng sau:
Sử dụng firewall cho mail server, web server, DNS server
Đảm bảo tính năng của Router như NAT, chuyển tiếp cổng (port forwarding)
để vừa bảo vệ hệ thống mạng, vừa cho phép một web server công khai địa chỉ
IP firewall
Tích hợp tốt với Linux kernel, cải thiện sự tin cậy và tốc độ chạy iptables
Có khả năng phân tích các packet một cách hiệu quả, cho phép firewall theo dõi các kết nối thông qua nó
Tính năng lọc gói (packet filtering) dựa trên địa chỉ MAC và các cờ trong TCP Header Từ đó, giúp hệ thống ngăn chặn việc tấn công từ bên ngoài và bảo mật
hệ thống nội bộ
Cung cấp chi tiết các tùy chọn để ghi nhận sự kiện hệ thống, ghi chép hệ thống (System logging) cho phép việc quản lí truy cập hệ thống
Hỗ trợ việc tích hợp các chương trình Web Proxy chẳng hạn như Squid
Ngăn chặn các kiểu tấn công từ chối dịch vụ
1 Cơ chế xử lý packet trong iptables:
Tất cả mọi dữ liệu đều được kiểm tra khi đi qua iptables, quá trình kiểm tra này được thực hiện một cách tuần tự từ entry đâu đến entry cuối bằng cách sử dụng các bảng tuần tự xây dựng sẵn (queues) Có 3 loại bảng này gồm:
Mangle: chịu trách nhiệm thay đổi các bits chất lượng dịch vụ ( quality of service bits) trong TCP header như TOS (type of service), TTL (time to live)
và Mark
Hình 1: Quá trình xử lí gói tin trong bảng Mangle
Filter: chịu trách nhiệm lọc gói dữ liệu Gồm 3 quy tắc nhỏ (Chain) để giúp thiết lập các nguyên tắc lọc gói, gồm:
Trang 2 Forward chain: lọc gói khi đi đến các server khác.
Input chain: lọc gói khi đi vào trong server
Output chain: lọc gói khi đi ra khỏi server
Hình 2: Quá trình xử lý gói tin trong bảng Filter
NAT (Network Address Translation): thực thi các chức năng chuyển đổi địa chỉ IP, gồm 2 loại:
Pre-routing chain: NAT tử ngoài vào trong nội bộ Quá trình NAT sẽ thay đổi địa chỉ đích của gói dữ liệu khi cần thiết trước khi thực hiện cơ chế routing
Post-routing chain: NAT từ trong ra ngoài Quá trình NAT sẽ thay đổi địa chỉ nguồn của gói dữ liệu khi cần thiết sau khi thực hiện cơ chế routing
Hình 3: Quá trình xử lý gói tin trong bảng NAT
Bảng 1: Các loại queues và chain cùng chức năng của nó
Loại
queues
Chức năng của queuse
Quy tắc xử lý gói
Filter Lọc gói
FORWARD
Lọc gói dữ liệu đi đến các server khác kết nối trên các NIC (Network Interface Controller) của firewall
INPUT Lọc gói khi đi đến firewall
OUTPUT Lọc gói khi đi ra khỏi firewall
Trang 3Network Address
Translation (biên
dịch địa chỉ
mạng)
PREROUTING Thay đổi địa chỉ đích của gói tin trước khi thực hiện cơ chế routing Sử dụng
Destination NAT (DNAT)
POSTROUTING
Thay đổi địa chỉ nguồn của gói tin sau khi thực hiện cơ chế routing Sử dụng Source NAT (SNAT)
OUTPUT
NAT sử dụng cho các gói tin xuất phát
từ firewall Rất ít khi sử dụng trong môi trường SOHO (Small Office – Home Office)
Mangle Chỉnh sửa TCP
header
PREROUTING POSTROUTING OUTPUT
INPUT FORWARD
Điều chỉnh các bit qui định chất lượng dịch vụ trước khi dẫn đường Rất ít khi
sử dụng trong môi trường SOHO (Small Office – Home Office)
Mô hình mô tả đường đi của một gói dữ liệu:
Trang 4Hình 4: đường đi của một gói dữ liệu khi qua Firewall
Đầu tiên, gói dữ liệu đi đến mạng A, tiếp đó nó được kiểm tra bởi Mangle Table PREROUTING Chain (nếu cần) Tiếp theo là kiểm tra gói dữ liệu bởi Nat Table ‘s PREROUTING Chain để
Trang 5kiểm tra xem gói dữ liệu có cần DNAT hay không ? DNAT sẽ thay đổi địa chỉ đích của gói dữ liệu, rồi chuyển gói dữ liệu đi
Nếu gói dữ liệu đi vào một mạng được bảo vệ, nó sẽ được lọc bởi FORWARD Chain của Filter Table, và nếu cần gói dữ liệu sẽ được SNAT trong POSTROUTING Chain để thay đổi IP nguồn trước khi vào mạng B
Nếu gói dữ liệu được định hướng vào bên trong Firewall, nó sẽ được kiểm tra bởi INPUT Chain trong Mangle Talbe, và nếu gói dữ liệu qua được các kiểm tra của INPUT Chain trong Filter Table, nó sẽ vào trong các chương trình của Server bên trong Firewall
Khi Firewall cần gói dữ liệu ra ngoài Gói dữ liệu sẽ được dẫn và đi qua sự kiểm tra của
OUTPUT Chain trong Mangle Table (nếu cần), tiếp đó là kiểm tra trong OUTPUT Chain của NAT Table để xem DNAT (DNAT sẽ thay đổi địa chỉ đến) có cần hay không và OUTPUT Chain của Filter Table sẽ kiểm tra gói dữ liệu nhằm phát hiện các gói dữ liệu không được phép gửi đi Cuối cùng trước khi gói dữ liệu được đưa ra lại Internet, SNAT và QoS sẽ được kiểm tra trong POSTROUTING Chain
2 Một số khái niệm trong Iptables:
Chain: là một chuỗi bao gồm nhiều Rule, mặc định các bảng có sẵn các chain như: INPUT, OUTPUT, FORWARD
Rule: là các luật đưa ra các điều kiện so sánh, tập hợp nhiều rule tạo thành chain
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
Target: là quá trình xử lý khi các gói tin đủ điều kiện Các target được xây dựng sẵn trong iptables như trong bảng sau:
Bảng 2: Miêu tả các target thường dùng trong iptables
dữ liệu đó và chuyển tiếp
nó vào một ứng dụng cuối hoặc hệ điều hành để xử
lý tiếp tục
dữ liệu đó và gói dữ liệu
bị chặn lại, loại bỏ
sẽ đưa vào syslog để kiểm tra Iptables tiếp tục xử lý gói với quy luật kế tiếp
log-prefix “string”
Iptables sẽ thêm vào log message một chuỗi do người dùng định sẵn Thông thường là để thông
Trang 6báo lý do loại bỏ gói tin.
nhưng nó sẽ gởi trả lại cho phía người gởi một thông báo lổi rằng gói tin đã bị chặn và loại bỏ
reject-with qualifier Tham số qualifier sẽ cho biết loại thông báo gởi trả lại phía gửi Qualifier gồm các loại sau:
Icmp-port-unreachable (default)
Icmp-net-unreachable Icmp-host-unreachable Icmp-proto-unreachable Icmp-net-prohibited Icmp-host-prohibited Tcp-reset
Echo-reply
Destination Network Address Translation, địa chỉ đích của gói dữ liệu sẽ được viết lại
to-destination
<ipaddress>
Iptables sẽ được viết lại địa chỉ IP vào địa chỉ đích của gói dữ liệu
Network Address Translation, địa chỉ nguồn của gói dữ liệu sẽ được viết lại
to-source <ipaddress>
Iptables sẽ được viết lại địa chỉ IP vào địa chỉ nguồn của gói dữ liệu MASQUERADE Dùng để thực hiện Source
Network Address Translation, mặc định thì địa chỉ IP nguồn sẽ giống như IP nguồn của firewall
to-ports <port>
Ghi rõ tầm các port nguồn
mà port gốc có thể ánh xạ được
II CẤU HÌNH IPTABLES:
1 Cài đặt iptables:
Iptables được cài đặt mặc định trong hệ thống Linux, packet của iptable là iptables-version.rpm hoặc iptables-version.tgz , ta có thể dùng lệnh sau để cài đặt packet này:
Đối với Red Hat:
# rpm –ivh iptables-version.rpm Đối với Debain
# apt-get install iptables
Trang 7 Lệnh khởi động iptables:
# service iptables start
Lệnh tắt iptables:
# service iptables stop
Lệnh khởi động lại iptables:
# service iptables restart
Lệnh xem tình trạng của iptables:
# service iptables status
Lệnh save cấu hình iptables:
# service iptables save
Để khởi động iptables mỗi khi khởi động Linux:
# chkconfig iptables on
2 Xử lý khi iptables không khởi động:
Khi cài đặt và khởi động iptables thì ta dùng lệnh /etc/init.d/iptables start Lúc này, iptables gọi script trong file /etc/sysconfig/iptables Do đó, nếu file này không tồn tại hoặc bị lỗi thì iptables sẽ không khởi động được
Khi thay đổi cấu hình trên iptables, ta phải dùng lệnh service iptables save để lưu lại các thông tin cấu hình Sau đó mới tiến hành restart lại iptables
Khởi động iptables:
# service iptables start
Tạo file iptables trống:
# touch /etc/sysconfig/iptables
Thiết lập quyền cho file này:
# chmod 600 /etc/sysconfig/iptables
# service iptables start
3 Các tham số chuyển mạch (switching) quan trọng của iptables:
Các tham số sau cho phép iptables thực hiện các hành động sao cho phù hợp với biểu đồ xử lí gói do người dùng hoạch định sẵn
Bảng 3: Các tham số chuyển mạch (switching) quan trọng của iptables
Lệnh switching quan trọng ý nghĩa
-A ( append) Nồi thêm một quy luật nào đó vào cuối
chuỗi (chain)
-E ( rename-chain) Đổi tên chain
-F ( flush) chainname Xóa hết tất cả mọi quy luật trong bảng đã
Trang 8-I ( insert) Chèn thêm rule vào vị trí được xác định
-P ( policy) Thay đổi rule mặc định cho chain
-R ( replace) Thay thế một rule bằng một rule khác tại
vị trí đã xác định
-X ( delete-chain) chainname Xóa chain
-t <table> Chỉ định bảng cho iptables bao gồm:
filter, nat, mangle Nếu không chỉ định rõ ràng thì filter table sẽ được áp dụng -j <target> Nhảy đến một target nào đó khi gói dữ
liệu phù hợp quy luật hiện tại
-p <protocol-type> Chỉ định 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 interface cho các gói tin đi vào -o <interface-name> Chỉ định interface cho các gói tin đi ra sport <port> Chỉ định port nguồn của gói tin
dport <port> Chỉ định port đích của gói tin
syn (chỉ sử dụng cho –p tcp) Yêu cầu một kết nối mới
-m <multiport> Chỉ định nhiều dãy cổng
ESTABLISHED: đã thiết lập connection
NEW: bắt đầu thiết lập connection
RELATED: thiết lập connection thứ 2
INVALID: gói dữ liệu không thể nhận dạng được do thiếu tài nguyên
icmp-type <type> Sử dụng với các tùy chọn thông dụng
như: echo-reply và echo-request
Để hiểu rõ hơn về các lệnh, ta cùng xem một số ví dụ sau:
Ví dụ 1: Tạo một chain NEWCHAIN trong bảng iptables
# iptables -N NEWCHAIN
Ví dụ 2: Xóa chain NEWCHAIN trong bảng iptables
# iptables -X NEWCHAIN
Trang 9Ví dụ 3: Xóa các rule có trong chain INPUT.
# iptables -F INPUT
Ví dụ 4: Xóa dòng rule thứ 2 trong chain INPUT
# iptables -D INPUT 2
Ví dụ 5: Thay đổi rule mặc định cho chain INPUT là ACCEPT
# iptables –P INPUT ACCEPT
Ví dụ 6: Firewall chấp nhận cho bất kì gói tin nào có giao thức TCP đi vào
interface eth0 đến địa chỉ 192.168.1.1
# iptables -A INPUT -s 0/0 -i eth0 -d 192.168.1.1 -p tcp -j ACCEPT
Ví dụ 7: Firewall chấp nhận gói tin nào có giao thức TCP đượ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 từ 1024 đến 65535 và port đích là 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ụ 8: Firewall cho phép gửi gói tin icmp echo-request và icmp echo-reply
# iptables -A OUTPUT -p icmp icmp-type echo-request -j ACCEPT
# iptables -A INPUT -p icmp icmp-type echo-reply -j ACCEPT
Ví dụ 9: Firewall chấp nhận gói tin có giao thức TCP 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ừ 1024 đến 65535 và destination port là 8080 và 433
Khi gói dữ liệu được nhận trở lại từ 172.28.2.2, thay vì mở các port nguồn
và đích, bạn chỉ việc cho phép dùng kết nối cũ đã thiết lập bằng cách dùng tham
số -m state và state ESTABLISHED
# iptables -A FORWARD -s 0/0 -i eth0 -d 172.28.24.195 -o eth1 -p tcp sport 1024:65535 -m multiport dport 8080,433 -j ACCEPT
# iptables -A FORWARD -d 0/0 -i eth0 -s 172.28.2.2 -o eth1 -p tcp -m state state ESTABLISHED -j ACCEPT
4 Sử dụng chain tự định nghĩa (user defined chains):
Chuỗi User Defind Chains nằm trong bảng iptables Nó giúp cho quá trình
xử lý gói tốt hơn
Thay vì sử dụng các “single chain” đã được xây dựng trong iptables để xử
lý cho từng giao thức, ta có thể sử dụng User Defind Chains để định nghĩa một chain gồm nhiều chuỗi chain mô tả cho tất cả kiểu giao thức (protocol style) cho gói tin
Trang 10Mặc khác, ta có thể dùng User Defined Chains để thay thế cho những chuỗi “long chain” bằng cách sử dụng chain chính chỉ đến các chain con
Ví dụ 10: Sáu lệnh sau giúp việc cải tiến tốc độ xử lý:
# iptables -A INPUT -i eth0 -d 192.168.10.2 -j fast-input-queue
# iptables -A OUTPUT -o eth0 -s 192.168.1.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-in -p icmp icmp-type echo-reply -j ACCEPT
# iptables -A icmp-queue-out -p icmp icmp-type echo-request -m state state NEW -j ACCEPT
Bảng 4: Danh sách các lệnh (Queue)
trong bảng iptables
trong bảng iptables
Fast-input-queue INPUT chain tách riêng biệt để hỗ trợ
cho những giao thức đặc biệt và chuyển các gói đến những protocol specific chains
Fast-output-queue OUTPUT chain tách riêng biệt để hỗ
trợ cho những giao thức đặc biệt và chuyển các gói đến những protocol specific chains
Icmp-queue-in Lệnh input tách riêng cho giao thức
ICMP
Icmp-queue-out Lệnh output tách riêng cho giao thức
ICMP
5 Cơ chế NAT trong iptables:
Source NAT (SNAT) và Destination NAT (DNAT) thường được dùng để chia sẽ kết nối internet giữa các máy tính trong mạng nội bộ Máy tính kết nối internet được coi là một gateway SNAT sẽ thay đổi địa chỉ nguồn của các gói tin đi ra internet bằng địa chỉ IP tĩnh internet của gateway Khi gateway nhận được các gói tin trả về internet, DNAT sẽ thay đổi địa chỉ đích của các gói tin rồi chuyển đến các máy tính trong mạng nội bộ
Trang 11Trong iptables POSTROUTING chain của bảng NAT sẽ đảm nhận công việc SNAT SNAT có hai phần mở rộng đó là SNAT và MASQUERADE SNAT dùng cho các máy tính gateway có địa chỉ IP tĩnh Còn MASQUERADE dùng cho các máy tính gateway có địa chỉ IP động
Chúng ta có thể thiết lập SNAT trên giao diện eth1 bằng lệnh :
# iptables -t nat -A POSTROUTING -o eth1 -j SNAT to-source 192.168.10.1
Và với MASQUERADE :
# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
Tương tự như vậy PREROUTING chain của bảng NAT sẽ đảm nhận công việc Destination NAT (DNAT) :
# iptables -t nat -A PREROUTING -i eth1 -p tcp dport 80 -j DNAT
to-destination 192.168.1.3:8080
Câu lệnh trên cho phép những gói tin đi vào từ interface eth1 với giao thức tcp cổng được chuyển đến địa chỉ IP 192.168.1.3 cổng 8080
6 Transparent proxying:
Transparent proxy là một cách để kiểm soát việc truy cập internet của các máy trong mạng nội bộ Transparent proxy được thiết lập để ngăn chặn những kết nối
ra ngoài và chuyển hướng chúng vào một máy tính thay thế vị trí của các máy tính ban đầu Kỹ thuật này cho phép chúng ta thiết lập proxy cho các dịch vụ mà không cần phải cấu hình trên mỗi máy tính trong mạng nội bộ
Ví dụ 11: Có một proxy HTTP được cấu hình lắng nghe trên cổng 8888, tất cả gói tin đi ra ngoài bằng giao thức HTTP qua port 80 sẽ bị chuyển hướng đến port 8888
# iptables -t nat -A PREROUTING -i eth0 -p tcp dport 80 -j REDIRECT to-port 8888
III Phòng chống tấn công và một số ví dụ về iptables:
1 Phòng chống tấn công từ chối dịch vụ (DOS):
Iptables cho phép giới hạn số lượng các gói tin phù hợp trong một giây Ta có thể chỉ định số lượng gói tin trong một thời gian theo định dạng /second, /minute, /hour, hoặc /day Hoặc sử dụng kiểu viết tắt /s thay vì /second
Trong ví dụ sau đây, gói ICMP echo requests bị giới hạn tốc độ truyền không nhiều hơn một yêu cầu trong một giây Đặc điểm này của iptables giúp ta lọc bớt các lưu lượng lớn, đây chính là đặc tính của tấn công từ chối dịch vụ (DOS) và sâu internet
# iptables A INPUT i eth0 p icmp icmptype echorequest m limit limit 1/s
-j ACCEPT