[Network] TÌM HIỂU VỀ IPTABLES
Bài đăng này đã không được cập nhật trong 3 năm
I. GIỚI THIỆU VỀ IPTABLES
Iptables là Firewall được cấu hình và hoạt động trên nền Console rất nhỏ và tiện dụng, 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.
II. SỬ DỤNG IPTABLES
1. Cài đặt
IPTABLES được cài mặc định trong hệ thống Linux. Package của iptables là iptables-version.rpm hoặc iptables-version.tgz
Lệnh cài đặt (trên ubuntu): $ apt-get install ufw
Lệnh cài đặt (trên Redhat/CentOS): $ yum install iptables
2. Khởi động iptables
-
Câu lệnh start, stop, và restart iptables.
[root@localhost tmp]# service iptables start
[root@localhost tmp]# service iptables stop
[root@localhost tmp]# service iptables restart
-
Để khởi động iptables mỗi khi khởi động máy.
[root@localhost tmp]# chkconfig iptables on
-
Để xem tình trạng của iptables
[root@localhost tmp]# service iptables status
3. Xử lý gói trong iptables
Tất cả mọi gói dữ liệu đều được kiểm tra bởi iptables bằng cách dùng các bảng tuần tự xây dựng sẵn. 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ụ trong TCP header như TOS (type of service), TTL (time to live), và MARK.
_ Filter: chịu trách nhiệm lọc gói dữ liệu. Nó gồm có 3 quy tắc nhỏ (chain) để giúp bạn thiết lập các nguyên tắc lọc gói:
- Forward chain : lọc gói khi đi đến đế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 ra khỏi server.
_ NAT: gồm có 2 loại:
- Pre-routing chain: thay đổi địa chỉ đến của gói dữ liệu khi cần thiết.
- Post-routing chain: thay đổi địa chỉ nguồn của gói dữ liệu khi cần thiết.
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 queues| Quy tắc xử lý gói (chain)| Chức năng của chain| | |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 khác của firewall| | | |INPUT| Lọc gói đi đến firewall| | | |OUTPUT| Lọc gói đi ra khỏi firewall| |NAT| Network Address Translation| PREROUTING| Việc thay đổi địa chỉ diễn ra trước khi định tuyến. Thay đổi địa chỉ đích sẽ giúp gói dữ liệu phù hợp với bảng định tuyến của firewall. Sử dụng DestinationNAT or DNAT| | | | POSTROUTING| Việc thay đổi địa chỉ diễn ra sau khi định tuyến. Sử dụng sourceNAT, or SNAT| | | | OUTPUT| NAT sử dụng cho các gói dữ liệu xuất phát từ firewall. Hiếm khi dùng trong môi trường SOHO(smalloffice- homeoffice).| |Mangle| Chỉnh sửa TCP header|PREROUTING - POSTROUTING - OUTPUT- INPUT- FORWARD| Điều chỉnh các bit quy định chất lượng dịch vụ trước khi định tuyến. Hiếm khi dùng trong môi trường SOHO(smalloffice-homeoffice)|
Ta tham khảo hình sau:
Đầu tiên, gói dữ liệu đế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 để kiể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 gói dữ liệu được chuyển đi.
Nếu gói dữ liệu đi vào một mạng được bảo vệ, thì 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 đi vào trong bên trong firewall, nó sẽ được kiểm tra bởi INPUT chain trong mangle table, 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ào đ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 and QoS sẽ được kiểm tra trong POSTROUTING chain.
4. Targets
Targets là hành động sẽ diễn ra khi một gói dữ liệu được kiểm tra và phù hợp với một yêu cầu nào đó. Khi một target đã được nhận dạng, gói dữ liệu cần nhảy (jump) để thực hiện các xử lý tiếp theo. Bảng sau liệt kê các targets mà iptables sử dụng.
** Bảng 2: Miêu tả các target mà iptables thường dùng nhất.**
|Targets| Ý nghĩa| Tùy chọn| | |ACCEPT| iptables ngừng xử lý gói dữ liệu và chuyển tiếp vào một ứng dụng cuối hoặc hệ điều hành để xử lý| |DROP| iptables ngừng xử lý gói dữ liệu và gói dữ liệu bị chặn, loại bỏ| |LOG| Thông tin của gói sẽ được đư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 báo lý do vì sao gói bị bỏ.| |REJECT| Tương tự như DROP, 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 đã 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| DNAT| Dùng để thực hiện Destination network address translation |--to-destination ipaddress: Iptables sẽ thay đổi địa chỉ IP vào địa chỉ đích của gói dữ liệu. SNAT| Dùng để thực hiện SourceNetwork address translation |--to-source <address>[-<address>][:
-<port>]Miêu tả IP và port sẽ được thay đổi bởi iptables.| 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>[-<port>]]Ghi rõ các port nguồn mà port gốc có thể ánh xạ được.|
5. Các tham số chuyển mạch quan trọng của Iptables
Các tham số sau sẽ 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 sử 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 | |**-t < table > |Nếu bạn không chỉ định rõ là tables nào, thì filter table sẽ được áp dụng. Có ba loại table là filter, nat, mangle.| |-j < target > **|Nhảy đến một chuỗi target nào đó khi gói dữ liệu phù hợp quy luật hiện tại.| -A |Nối thêm một quy luật nào đó vào cuối chuỗi(chain). -F |Xóa hết tất cả mọi quy luật trong bảng đã chọn. -p < protocol-type >| Phù hợp với giao thức(protocols), thông thường là icmp, tcp, udp và all -s < ip-address >| IP nguồn -d < ip-address >| IP đích -i < interface-name >| Phù hợp điều kiện INPUT khi gói dữ liệu đi vào firewall -o < interface-name>| Phù hợp điều kiện OUTPUT khi gói dữ liệu đi ra khỏi firewall. Để hiểu rõ hơn về các lệnh, ta cùng xem một ví dụ sau:
iptables -A INPUT -s 0/0 -i eth0 -d 192.168.1.1 -p TCP -j ACCEPT
Iptables được cấu hình cho phép “firewall” chấp nhận các gói dữ liệu TCP, đến từ card mạng eth0, có bất kỳ địa chỉ IP nguồn đi đến địa chỉ 192.168.1.1 - là địa chỉ IP của firewall. 0/0 nghĩa là bất kỳ địa chỉ IP nào.
Bảng 4: Các điều kiện TCP và UDP thông dụng.
|Lệnh switching| Miêu tả| | |-p tcp --sport < port>| Điều kiện TCP port nguồn(source port).Có thể là một giá trị hoặc một chuỗi có dạng: start-port-number:end-port-number -p tcp --dport < port>| Điều kiện TCP port đích (destination port) Có thể là một giá trị hoặc một chuỗi có dạng: starting-port:ending-port -p udp --sport < port>| Điều kiện UDP port nguồn(source port). Có thể là một giá trị hoặc một chuỗi có dạng: start-port-number:end-port-number -p udp --dport < port>| Điều kiện UDP port đích (destination port) Có thể là một giá trị hoặc một chuỗi có dạng: starting-port:ending-port Ta cùng xem ví dụ sau:
iptables -A FORWARD -s 0/0 -i eth0 -d 192.168.1.58 -o eth1 -p TCP --sport 1024:65535 --dport 80 -j ACCEPT
Iptables được cấu hình cho phép firewall chấp nhận các gói dữ liệu TCP, đến từ card mạng eth0, có bất kỳ địa chỉ IP nguồn nào, đi đến địa chỉ 192.168.1.58 qua card mạng eth1. Số port nguồn là từ 1024 đến 65535 và port đích là 80 (www/http).
Bảng 5: Điều kiện ICMP
|Lệnh| Miêu tả| | --icmp-type < type>| Thường dùng nhất là echo-reply và echo- request Ví dụ về ICMP.
iptables -A OUTPUT -p icmp --icmp -type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp -type echo-reply -j ACCEPT
Iptables được cấu hình cho phép firewall chấp nhận gởi ICMP echo-requests (pings) và gởi trả các ICMP echo-replies.
Một ví dụ khác:
iptables -A INPUT -p icmp --icmp -type echo-request -m limit –limit 1/s -i eth0 -j ACCEPT
Iptables cho phép giới hạn giá trị lớn nhất số lượng các gói phù hợp trong một giây. Bạn có chỉ định thời gian theo định dạng /second, /minute, /hour, hoặc /day. Hoặc sử dụng dạng viết tắt 3/s thay vì 3/second. Trong ví dụ này ICMP echo requests bị giới hạn không nhiều hơn một yêu cần 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.
Bảng 6: Các điều kiện mở rộng thông dụng
Lệnh|** Ý nghĩa**| | |-mmultiport --sport <port,port>| Nhiều port nguồn khác nhau của TCP/UDP được phân cách bởi dấu phẩy(,). Đây là liệt kê của các port chứ không phải là một chuỗi các port liên tiếp. -mmultiport --dport <port,port>| Nhiều port đích khác nhau của TCP/UDP được phân cách bởi dấu phẩy(,). -mmultiport --ports <port,port>| Nhiều port khác nhau của TCP/UDP được phân cách bởi dấu phẩy(,) Không phân biệt port đích hay port nguồn. ** -m --state <state>**| Các trạng thái thông dụng nhất được dùng là: ESTABLISHED: Gói dữ liệu là một phần của kết nối đã được thiết lập bởi cả 2 hướng. NEW:Gói dữ liệu là bắt đầu của một kết nối mới. RELATED: Gói dữ liệu bắt đầu một kết nối phụ. Thông thường đây là đặc điểm của các giao thức như FTP hoặc lỗi ICMP. INVALID: Gói dữ liệu không thể nhận dạng được. Điều này có thể do việc thiếu tài nguyên hệ thống hoặc lỗi ICMP không trùng với một luồng dữ liệu đã có sẵn. Đây là phần mở rộng tiếp theo của ví dụ trước:
iptables -A FORWARD -s 0/0 -i eth0 -d 192.168.1.58 -o eth1 -p TCP --sport 1024:65535 -m multiport --dport 80,443 -j ACCEPT
iptables -A FORWARD -d 0/0 -o eth0 -s 192.168.1.58 -i eth1 -p TCP -m state --state ESTABLISHED -j ACCEPT
Iptables được cấu hình cho phép firewall chấp nhận các gói dữ liệu TCP, đến từ card mạng eth0, có bất kỳ địa chỉ IP nguồn, đi đến địa chỉ 192.168.1.58 qua card mạng eth1. Số port nguồn là từ 1024 đến 65535 và port đích là 80 (www/http) và 443 (https). Đến khi các gói dữ liệu nhận trở lại từ 192.168.1.58, 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 --state ESTABLISHED.
6. Chỉnh sửa file iptables
Các rules iptables được lưu trữ trong file “/etc/sysconfig/iptables”. Ta có thể chình sửa và tạo lại thành những rule mới.
Ví dụ: xuất những lệnh trong iptables đã lưu trữ ra file văn bản với tên firewall-config:
[root@bigboy tmp]# iptables-save > firewall-config
[root@bigboy tmp]# cat firewall-config
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [144:12748]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp -m icmp--icmp -type 255 -j ACCEPT
-A RH-Firewall-1-INPUT -p esp -j ACCEPT
-A RH-Firewall-1-INPUT -p ah -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state--state NEW -m tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
[root@bigboy tmp]#
Sau khi chỉnh sửa file firewall-config, ta có thể tải nó lại trong rule firewall với lệnh:
[root@bigboy tmp]# iptables-restore < firewall-config
Ta có thể lưu tạm thời:
[root@bigboy tmp]# service iptables save
7. Những modun Kernel cần thiết
Modun Kernel cần thiết để hoạt động một vài chương trình của ứng dụng iptables
Một số modun:
-
iptables_nat module cần cho một số loại NAT.
-
ip_conntrack_ftp module cần cho việc thêm vào giao thức FTP.
-
ip_conntrack module giữ trạng thái liên kết với giao thức TCP.
-
ip_nat_ftp module cần được tải cho những máy chủ FTP sau một firewall NAT
CHÚ Ý: file /etc/sysconfig/iptables không cập nhật những môdun tải về, vì vậy chúng ta phải thêm những trạng thái đó vào file /etc/rc.local và chạy nó tại cuối mỗi lần boot lại.
Những mẫu trong phần này bao gồm những trạng thái được lưu trong file /etc/rc.local:
#File:/etc/rc.local
#Module to track the state of connections modprobe ip_conntrack
#Load the iptables active FTP module, requires ip_conntrack modprobe
#ip_conntrack_ftp
#Load iptables NAT module when required modprobe iptable_nat
`#Module required for active an FTP server using NAT modprobe ip_nat_ftp``
8. Những ví dụ iptables
8.1 Cho phép máy chủ DNS truy cập đến Firewall
Firewall không thể tạo yêu cầu DNS queries đến Internet bởi vì Internet được yêu cầu cho hàm cơ bản của firewall, nhưng bởi vì Fedora Linux’s yum RPM sẽ giúp giữ máy chủ cập nhật với trạng thái bảo vệ mới nhất. Những trạng thái theo sau sẽ cập nhật không chỉ cho firewall hoạt động như những DNS client mà còn cho những firewall làm việc trong một bộ đệm hoặc có vai trò như DNS server.
#-------------------------------------------------------------------------------------------------------
#AllowoutboundDNSqueriesfromtheFWandthereplies too#
#-Interfaceeth0istheinternetinterface#
#ZonetransfersuseTCPandnotUDP.Mosthomenetworks
#/websitesusingasingleDNSserverwon'trequireTCP
#statements
#-------------------------------------------------------------------------------------------------------
iptables -A OUTPUT -p udp -o eth0 --dport 53 –s port 1024:65535 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --sport 53 –d port 1024:65535 -j ACCEPT
8.2 Cho phép WWW và SSH truy cập vào firewall
Bước đầu tiên là thiết lập liên kết cho port 80 (WWW) và 22 (SSH). Những gói tin sẽ được trả lại khi đã tạo kết nối giữa firewall và máy đích. Ngược lại, những port trên (80 và 22) sẽ không được thiết lập chế độ bảo mật tại ngõ ra cho những gói tin chỉ được chuyển đi (OUTPUT).
#---------------------------------------------------------
-#Allow previously established connections
#-Interface eth0 is the internet interface
#---------------------------------------------------------
iptables -A OUTPUT -o eth0 -m state --state ESTABLISHED, RELATED -j ACCEPT
#---------------------------------------------------------
#Allow port 80 (www) and 22 (SSH) connections to the
#firewall
#---------------------------------------------------------
iptables -A INPUT -p tcp -i eth0 --dport 22 -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp -i eth0 --dport 80 -m state --state NEW -j ACCEPT
8.3 Cho phép Firewall truy cập internet
Đoạn mã iptables này có thể cho phép một user trên firewall sử dụng Web browser đến giao tiếp Internet. Đường truyền giao thức HTTP sử dụng TCP port 80, HTTPs (HTTP secure) port 443.
**iptables -A OUTPUT -j ACCEPT -m state –state NEW, ESTABLISHED, RELATED -o eth0 -p tcp -m multiport --dport 80,443 -m multiport --sport 1024:65535 **
iptables -A INPUT -j ACCEPT -m state --state ESTABLISHED, RELATED -i eth0 -p tcp
8.4 Mặt nạ (Masquerade_many to one NAT)
Địa chỉ IP mặt nạ (masquerade) luôn luôn mặc định đến địa chỉ IP chính của firewall. Ưu điểm của địa chỉ IP mặt nạ (masquerade) là ta không phải chỉ rõ địa chỉ IP NAT. Điều này tạo cho việc cấu hình bảng iptables NAT với giao thức DHCP.
Việc che đậy (Masquerading) phụ thuộc vào Hệ Điều Hành Linux được cấu hình để cập nhật định tuyến giữa internet và giao tiếp mạng riêng của firewall. Điều này được thực hịên bởi IP enabling bằng cách cho file /proc/sys/net/ipv4/ip_forward giá trị 1
Một masquerading được thiết lập sử dụng POSTROUTING chain của bảng nat table, ta sẽ phải định dạng iptables để cho phép nhiều gói đi qua giữa 2 bề mặt. Để làm được điều này, sử dụng FORWARD chain của filter table. Nhiều hơn, nhiều gói liên quan những liên kết NEW và ESTABLISHED sẽ được cho phép outbound đến Internet, nhưng chỉ những gói liên quan đến liên kết ESTABLISHES sẽ được phép inbound.
#---------------------------------------------------------
#Load the NAT module
#Note:It is best to use the/etc/rc.local example in
#this chapter. This value will not be retained in the
# /etc/sysconfig/iptables file. Included only as a
#reminder.
#---------------------------------------------------------
modprobe iptable_nat
#---------------------------------------------------------
#Enable routing by modifying the ip_forward/proc
# file system
#Note: It is best to use the/etc/sysctl.conf example in
#this chapter. This value will not be retained in the
#/etc/sysconfig/iptables file. Included only as a reminder.
#---------------------------------------------------------
echo 1 >/proc/sys/net/ipv4/ip_forward
#---------------------------------------------------------
#Allowmasquerading
#-Interfaceeth0istheinternetinterface
#-Interfaceeth1istheprivatenetworkinterface
#---------------------------------------------------------
iptables -A POSTROUTING -t nat -o eth0 -s 192.168.1.0/24 -d 0/0 -j MASQUERADE
#---------------------------------------------------------
#Priortomasquerading,thepacketsareroutedviathefilter
#table'sFORWARDchain.
#Allowedoutbound: New,established and related connections
#Allowedinbound:Establishedandrelatedconnections
#---------------------------------------------------------
iptables -A FORWARD -t filter -o eth0 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT
iptables -A FORWARD -t filter -i eth0 -m state --state ESTABLISHED, RELATED -j ACCEPT
8.5 Sửa lỗi bảng iptables
Một số công cụ cho phép sửa lỗi firewall iptables. Một trong những phương pháp tốt nhất là loại bỏ tất cả những gói bị drop.
*Kiểm tra the firewall log:
Ta theo dõi những gói đi qua firewall có trong danh sách bảng iptables của những rule sử dụng LOG target.
LOG target sẽ:
-
Tạm dừng tất cả đường truyền để chỉnh sửa rule trong iptables trong nơi nó được chứa.
-
Tự động viết vào file /var/log/messages và sau đó thực thi rule kế tiếp.
Để dừng gói tin không mong muốn, ta phải thêm vào rule phù hợp với một DROP target sau LOG rule. Tạm dừng một nhóm gói bị lỗi vào file /var/log/messages.
#------------------------------------------------------
#Loganddropallotherpacketstofile/var/log/messages
# Withoutthiswecouldbecrawlingaroundinthedark
#------------------------------------------------------
Iptables –A INPUT –j LOG
Iptables –A OUTPUT –j LOG
Iptables –A FORWARD –j LOG
Iptables –A INPUT –j DROP
Iptables –A OUTPUT –j DROP
Iptables –A FORWARD –j DROP
All rights reserved