Iptables trên linux

Mục Lục CHƯƠNG I: GIỚI THIỆU VỀ IPTABLES. 6 1. Iptables là gì?. 6 2. Tải về và cài đặt trọn gói Iptables. 6 3. Làm thế nào để bắt đầu iptables ?. 7 4. Xác định Các trạng thái của iptables. 7 5. Cơ chế xử lý package trong iptables. 7 6. Target và Jumps. 12 7. Tùy chọn --limit, --limit-burst15 8. Redirect cổng. 17 9. Cách đổi địa chỉ IP động (dynamic NAT)17 10. Cách đóng giả địa chỉ IP (masquerade)18 11. Quá trình chuyển gói dữ liệu qua Netfilter19 12. Các tham số dòng lệnh thường gặp của Iptables. 20 12.1. Gọi trợ giúp. 20 12.2. Các tùy chọn để thao tác với chain. 20 12.3. Các tùy chọn để thao tác với luật21 12.4. Các tùy chọn để chỉ định thông số. 21 12.5 Sử dụng user defined chains:26 12.6 Lưu lại những đoạn mã iptables:27 12.7 Thiết lập những Rule cho Fedora’s iptable:28 12.8. Tìm lại Đoạn mã bị mất:28 12.9 Những modun Kernel cần thiết :29 12.10 Sửa lỗi bảng iptables:30 13.Những đoạn mã iptables mẫu:31 13.1 Cơ bản về hoạt động của hệ thống bảo vệ:31 13.2. Ưu điểm của sự khởi tạo iptables:33 13.3. Sự cho phép máy chủ DNS truy cập đến Firewall:35 13.4 Cho phép WWW và SSH truy cập vào firewall:35 13.5_. Firewall cho phép bạn để truy cập Internet36 13.6. Cho phép mạng Trang chủ của bạn để truy cập Các Firewall37 13.7. Mặt nạ (Masquerade_many to one NAT):38 13.8 Giả mạo (Nhiều NAT)40 13.9 NAT Port Forwarding (DHCP DSL)43 13.10 SNAT & MASQUERADE45 13.11. DNAT. 51 CHƯƠNG II: VÍ DỤ VỀ CẤU HÌNH IPTABLES CHO MÁY CHỦ PHỤC VỤ WEB52 1. Thiết lập các tham số cho nhân. 52 2. Nạp các môđun cần thiết cho Iptables. 53 3. Nguyên tắc đặt luật là "drop trước, accept sau". 53 4. Lọc ICMP vào và chặn ngập lụt PING54 5. Reject quét cổng TCP và UDP. 55 6. Phát hiện quét cổng bằng Nmap. 56 7. Chặn ngập lụt SYN57 8: Giới hạn truy cập SSH cho admin. 57 9. Giới hạn FTP cho web-master58 10. Lọc TCP vào. 59 11. Lọc UDP vào và chặn ngập lụt UDP. 59 CHƯƠNG III : KẾT LUẬN61 TÀI LIỆU THAM KHẢO62

doc62 trang | Chia sẻ: lvcdongnoi | Lượt xem: 6293 | Lượt tải: 5download
Bạn đang xem trước 20 trang tài liệu Iptables trên linux, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
. Ví dụ như SQUID đang listen trên cổng 3128/tcp. Để redirect cổng 80 đến cổng 3128 này bạn làm như sau: # iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128 Lưu ý: tùy chọn -j REDIRECT cho có trong chain PREROUTING 9. Cách đổi địa chỉ IP động (dynamic NAT) Giới thiệu về công nghệ đổi địa chỉ NAT động và đóng giả IP Masquerade. NAT động là một trong những kĩ thuật chuyển đổi địa chỉ IP NAT (Network Address Translation). Các địa chỉ IP nội bộ được chuyển sang IP NAT như sau: Hình 3. Cách đôỉ địa chỉ Ip đông NAT Router đảm nhận việc chuyển dãy IP nội bộ 169.168.0.x sang dãy IP mới 203.162.2.x. Khi có gói liệu với IP nguồn là 192.168.0.200 đến router, router sẽ đổi IP nguồn thành 203.162.2.200 sau đó mới gởi ra ngoài. Quá trình này gọi là SNAT (Source-NAT, NAT nguồn). Router lưu dữ liệu trong một bảng gọi là bảng NAT động. Ngược lại, khi có một gói từ liệu từ gởi từ ngoài vào với IP đích là 203.162.2.200, router sẽ căn cứ vào bảng NAT động hiện tại để đổi địa chỉ đích 203.162.2.200 thành địa chỉ đích mới là 192.168.0.200. Quá trình này gọi là DNAT (Destination-NAT, NAT đích). Liên lạc giữa 192.168.0.200 và 203.162.2.200 là hoàn toàn trong suốt (transparent) qua NAT router. NAT router tiến hành chuyển tiếp (forward) gói dữ liệu từ 192.168.0.200 đến 203.162.2.200 và ngược lại. 10. Cách đóng giả địa chỉ IP (masquerade) Đây là một kĩ thuật khác trong NAT. Hình 4. Cách đóng giả địa chỉ IP. NAT Router chuyển dãy IP nội bộ 192.168.0.x sang một IP duy nhất là 203.162.2.4 bằng cách dùng các số hiệu cổng (port-number) khác nhau. Chẳng hạn khi có gói dữ liệu IP với nguồn 192.168.0.168:1204, đích 211.200.51.15:80 đến router, router sẽ đổi nguồn thành 203.162.2.4:26314 và lưu dữ liệu này vào một bảng gọi là bảng masquerade động. Khi có một gói dữ liệu từ ngoài vào với nguồn là 221.200.51.15:80, đích 203.162.2.4:26314 đến router, router sẽ căn cứ vào bảng masquerade động hiện tại để đổi đích từ 203.162.2.4:26314 thành 192.168.0.164:1204. Liên lạc giữa các máy trong mạng LAN với máy khác bên ngoài hoàn toàn trong suốt qua router. 11. Quá trình chuyển gói dữ liệu qua Netfilter Gói dữ liệu (packet) chạy trên chạy trên cáp, sau đó đi vào card mạng (chẳng hạn như eth0). Đầu tiên packet sẽ qua chain PREROUTING (trước khi định tuyến). Tại đây, packet có thể bị thay đổi thông số (mangle) hoặc bị đổi địa chỉ IP đích (DNAT). Đối với packet đi vào máy, nó sẽ qua chain INPUT. Tại chain INPUT, packet có thể được chấp nhận hoặc bị hủy bỏ. Tiếp theo packet sẽ được chuyển lên cho các ứng dụng (client/server) xử lí và tiếp theo là được chuyển ra chain OUTPUT. Tại chain OUTPUT, packet có thể bị thay đổi các thông số và bị lọc chấp nhận ra hay bị hủy bỏ. Đối với packet forward qua máy, packet sau khi rời chain PREROUTING sẽ qua chain FORWARD. Tại chain FORWARD, nó cũng bị lọc ACCEPT hoặc DENY. Packet sau khi qua chain FORWARD hoặc chain OUTPUT sẽ đến chain POSTROUTING (sau khi định tuyến). Tại chain POSTROUTING, packet có thể được đổi địa chỉ IP nguồn (SNAT) hoặc MASQUERADE. Packet sau khi ra card mạng sẽ được chuyển lên cáp để đi đến máy tính khác trên mạng. 12. Các tham số dòng lệnh thường gặp của Iptables 12.1. Gọi trợ giúp Để gọi trợ giúp về Iptables, bạn gõ lệnh $ man iptables $ iptables --help Chẳng hạn nếu bạn cần biết về các tùy chọn của  match limit, bạn gõ lệnh $ iptables -m limit --help. 12.2. Các tùy chọn để thao tác với chain - Tạo chain mới: iptables -N - Xóa hết các luật đã tạo trong chain: iptables -X - đặt chính sách cho các chain `built-in` (INPUT, OUTPUT & FORWARD): iptables -P , ví dụ: iptables -P INPUT ACCEPT để chấp nhận các packet vào chain INPUT - liệt kê các luật có trong chain: iptables -L - xóa các luật có trong chain (flush chain): iptables -F - reset bộ đếm packet về 0: iptables -Z 12.3. Các tùy chọn để thao tác với luật - thêm luật: -A (append) - xóa luật: -D (delete) - thay thế luật: -R (replace) - chèn thêm luật: -I (insert) 12.4. Các tùy chọn để chỉ định thông số 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 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 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 Phù hợp với giao thức ( protocols ) , thong thường là icmp, tcp, udp, và all . -s Phù hợp IP nguồn -d Phù hợp IP đích -i Phù hợp điều kiện INPUT khi gói dữ liệu đi vào firewall. -o Phù hợp điều kiện OUTPUT khi gói dữ liệu đi ra khỏi firewall . Trong lệnh này ví dụ thiết bị chuyển mạch 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 có giao tiếp (protocols) là TCP , đến từ giao tiếp card mạng eth0 , có bất kỳ địa chỉ IP nguồn là bất kỳ đ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ện Lệnh switching chin Miêu tả -p tcp --sport Đ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 Đ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 tcp –syn Dùng để nhận dạng một yêu cầu kết nối TCP mới . ! --syn , nghĩa là không có yêu cần kết nối mới . -p udp --sport Đ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 Đ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 Ta cùng xem ví dụ sau : iptables-A FORWARD-s 0 / 0-i eth0-d 192.168.1.58-o eth1-p TCP \ - Thể thao 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 có giao tiếp (protocols) là TCP , đến từ card mạng eth0 , có bất kỳ địa chỉ IP nguồn là bất kỳ , đ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 Thường dùng nhất là echo-reply và echo- Request. Ta cùng xem mộ ví dụ sau 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. Bảng 6 : Các điều kiện mở rộng thông dụng Lệnh Ý nghĩa -m multiport --sport 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. -m multiport --dport Nhiều port đích 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. -m multiport --ports Nhiều port 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. Không phân biệt port đích hay port nguồn . -m --state Các trạng thái thông dụng nhất được dung 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à đặt đ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 có giao tiếp (protocols) là TCP , đến từ card mạng eth0 , có bất kỳ địa chỉ IP nguồn là bất kỳ , đ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 và --state ESTABLISHED. 12.5 Sử dụng user defined chains: Chuỗi User Defined Chains nằm trong bảng iptables. Nó giúp cho quá trình sử lý gói tốt hơn. Ví dụ: Thay vì sử dụng gói đơn được xây dựng trong chain cho tất cả giao thức, ta có thể sử dụng chain này để quyết định loại giao thức cho gói và sau đó kiểm soát việc xử lý user-defined, protocol-specific chain trong bảng filter table. Mặt khác, ta có thể thay thế một chuỗi “long chain” với chuỗi chính “stubby main chain” bởi nhiều chuỗi “stubby chain”, bằng cách chia ngắn đó tổng chiều dài của tất cả chain gói phải thông qua. Sáu lệnh sau giúp việc cải tiến tốc độ xử lý: iptables -A INPUT -i eth0 -d 206.229.110.2 -j \ fast-input-queue iptables -A OUTPUT -o eth0 -s 206.229.110.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\ -j ACCEPT DANH SÁCH CÁC LỆNH (QUEUE) Chain Description INPUT Được xây dựng trong INPUT chain trong bảng iptables. OUTPUT Được xây dựng trong ONPUT chain 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-out lệnh output tách riêng cho giao thức ICMP. icmp-queue-in Lệnh input tách riêng cho giao thức ICMP. 12.6 Lưu lại những đoạn mã iptables: Đoạn mã iptables được lưu tạm thời ở file “/etc/sysconfig/iptables” Định dạng mẫu trong file iptables cho phép giao thức ICMP, IPSec (những gói ESP và AH), thiết lập liên kết, và quay lại SSH. [root@bigboy tmp]# cat /etc/sysconfig/iptables # Generated by iptables-save v1.2.9 on Mon Nov 8 11:00:07 2004 *filter :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 # Completed on Mon Nov 8 11:00:07 2004 [root@bigboy tmp]# 12.7 Thiết lập những Rule cho Fedora’s iptable: Trong Fedora có chương trình gọi lokkit, chưong trình này có thể thiết lập một rule firewall đơn giản, giúp tăng cường bảo mật. Chương trình lokkit lưu những rule firewall trong file mới “/etc/sysconfig/iptables”. 12.8. Tìm lại Đoạn mã bị mất: Đoạn mã iptables được lưu trữ trong file “/etc/sysconfig/iptables”. Ta có thể chình sửa những đoạn mã và tạo lại những 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 # Generated by iptables-save v1.2.9 on Mon Nov 8 11:00:07 2004 *filter :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 # Completed on Mon Nov 8 11:00:07 2004 [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 12.9 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, ip_conntrack_ftp module, + 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 vào 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 đoạn mã 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 12.10 Sửa lỗi bảng iptables: Một số công cụ cho phép sửa lỗi đoạn mã 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ị khoá. * 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 Để tạm dừng đường truyền 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. #------------------------------------------------------ # Log and drop all other packets to file /var/log/messages # Without this we could be crawling around in the dark #------------------------------------------------------ iptables -A OUTPUT -j LOG iptables -A INPUT -j LOG iptables -A FORWARD -j LOG iptables -A OUTPUT -j DROP iptables -A INPUT -j DROP iptables -A FORWARD -j DROP 13.Những đoạn mã iptables mẫu: 13.1 Cơ bản về hoạt động của hệ thống bảo vệ: Hệ Điều Hành Linux có cơ chế bảo vệ là các thông số kernel hệ thống trong file hệ thống /proc qua file /etc/sysctl.conf. Dùng file /etc/systl.conf cho các thông số kernel hỗ trợ. Đây là một cấu hình mẫu: # File: /etc/sysctl.conf #-------------------------------------------------------- # Disable routing triangulation. Respond to queries out # the same interface, not another. Helps to maintain state # Also protects against IP spoofing #-------------------------------------------------------- net/ipv4/conf/all/rp_filter = 1 #--------------------------------------------------------- - # Enable logging of packets with malformed IP addresses #--------------------------------------------------------- - net/ipv4/conf/all/log_martians = 1 # Disable redirects #--------------------------------------------------------- - net/ipv4/conf/all/send_redirects = 0 #--------------------------------------------------------- - # Disable source routed packets #--------------------------------------------------------- - net/ipv4/conf/all/accept_source_route = 0 #--------------------------------------------------------- - # Disable acceptance of ICMP redirects #--------------------------------------------------------- - net/ipv4/conf/all/accept_redirects = 0 #--------------------------------------------------------- - # Turn on protection from Denial of Service (DOS) attacks #--------------------------------------------------------- - net/ipv4/tcp_syncookies = 1 #--------------------------------------------------------- - # Disable responding to ping broadcasts #--------------------------------------------------------- - net/ipv4/icmp_echo_ignore_broadcasts = 1 #--------------------------------------------------------- - # Enable IP routing. Required if your firewall is # protecting # network, NAT included #--------------------------------------------------------- - net/ipv4/ip_forward = 1 13.2. Ưu điểm của sự khởi tạo iptables: Ta có thể thêm vào nhiểu cái ứng dụng khởi tạo cho đoạn mã, bao gồm việc kiểm tra đường truyền internet từ những địa chỉ riêng RFC1918. Nhiều hơn nhứng khởi tạo phức tạpbao gồm kiểm tra lỗi bởi sự tấn công sử dụng cờ TCP không có giá trị. Đoạn mã cũng sử dụng nhiều “user-defined chain” để tạo đoạn mã ngắn hơn và nhanh hơn như những chain có thể bị truy cập lặp lại. Điều này loại bỏ việc cần thiết lặp lại những trạng thái tương tự. Đoạn mã firewall hoàn tất : #=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=# # # Define networks: NOTE!! You may want to put these # "EXTERNAL" # definitions at the top of your script. # #=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=# EXTERNAL_INT="eth0" # External Internet interface EXTERNAL_IP="97.158.253.25" # Internet Interface IP address #--------------------------------------------------------- - # Initialize our user-defined chains #--------------------------------------------------------- - iptables -N valid-src iptables -N valid-dst #--------------------------------------------------------- - # Verify valid source and destination addresses for all packets #--------------------------------------------------------- - iptables -A INPUT -i $EXTERNAL_INT -j valid-src iptables -A FORWARD -i $EXTERNAL_INT -j valid-src iptables -A OUTPUT -o $EXTERNAL_INT -j valid-dst iptables -A FORWARD -o $EXTERNAL_INT -j valid-dst #=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=# # # Source and Destination Address Sanity Checks # Drop packets from networks covered in RFC 1918 # (private nets) # Drop packets from external interface IP # #=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=# iptables -A valid-src -s $10.0.0.0/8 -j DROP iptables -A valid-src -s $172.16.0.0/12 -j DROP iptables -A valid-src -s $192.168.0.0/16 -j DROP iptables -A valid-src -s $224.0.0.0/4 -j DROP iptables -A valid-src -s $240.0.0.0/5 -j DROP iptables -A valid-src -s $127.0.0.0/8 -j DROP iptables -A valid-src -s 0.0.0.0/8 -j DROP iptables -A valid-src -d 255.255.255.255 -j DROP iptables -A valid-src -s 169.254.0.0/16 -j DROP iptables -A valid-src -s $EXTERNAL_IP -j DROP iptables -A valid-dst -d $224.0.0.0/4 -j DROP 13.3. Sự 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 nhưng cũng cho những firewall làm việc trong một bộ đệm hoặc có vai trò như DNS server. #------------------------------------------------------------------------------------------------------- - # Allow outbound DNS queries from the FW and the replies too # # - Interface eth0 is the internet interface # # Zone transfers use TCP and not UDP. Most home networks # / websites using a single DNS server won't require TCP # statements #------------------------------------------------------------------------------------------------------- - iptables -A OUTPUT -p udp -o eth0 --dport 53 –sport \ 1024:65535 -j ACCEPT iptables -A INPUT -p udp -i eth0 --sport 53 –dport \ 1024:65535 -j ACCEPT 13.4 Cho phép WWW và SSH truy cập vào firewall: Đoạn mã ngắn này là cho một firewall và gấp đôi như một web server được quản lý bởi người quản trị hệ thống web server “web server system adminitrator” qua những lớp vỏ bảo mật (SSH_secure shell). Những gói quay lại đã được dự định trước cho port 80 (WWW) và 22 (SSH) được phép. Vì vậy tạo những bước đầu tiên để thiết lập liên kết.. 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 chỉ được chuyển đi không quay về cho tất cả liên kết thiết lập được phép. #--------------------------------------------------------- -# 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 –sport \ 1024:65535 -m state --state NEW -j ACCEPT iptables -A INPUT -p tcp -i eth0 --dport 80 --sport \ 1024:65535 -m state --state NEW -j ACCEPT 13.5_. Firewall cho phép bạn để truy cập Internet Iptables mã này cho phép một người dùng trên các bức tường lửa sử dụng một trình duyệt web để lướt Internet. HTTP giao thông sử dụng TCP cổng 80, và HTTPS sử dụng cổng 443. Lưu ý: HTTPS (secure HTTP) được sử dụng cho các giao dịch thẻ tín dụng thường xuyên, cũng như của RedHat Linux máy chủ chạy up2date. FTP và HTTP được sử dụng thường xuyên với yum. #------------------------------------------------- -------------- # Cho phép cổng 80 (www) và 443 (https) kết nối từ các bức tường lửa #------------------------------------------------- -------------- iptables-A OUTPUT ACCEPT-m-j nhà nước \ - State NEW, ESTABLISHED, LIÊN QUAN-o eth0-p tcp \ -M multiport - dports 80.443 - thể thao 1024:65535 #------------------------------------------------- -------------- # Cho phép các kết nối được xác lập trước # - Giao diện eth0 là giao diện internet #------------------------------------------------- -------------- iptables-A INPUT ACCEPT-m-j nhà nước - nhà nước ESTABLISHED, LIÊN QUAN \ -I eth0-p tcp Nếu bạn muốn tất cả lưu lượng TCP có nguồn gốc từ các bức tường lửa được chấp nhận, sau đó tháo đường: -M multiport - dports 80.443 - thể thao 1024:65535 13.6. Cho phép mạng Trang chủ của bạn để truy cập Các Firewall Trong ví dụ này, eth1 là trực tiếp kết nối với một mạng gia đình bằng cách sử dụng địa chỉ IP từ mạng 192.168.1.0. Tất cả lưu lượng giữa mạng này và tường lửa đơn thuần chỉ là giả định là đáng tin cậy và được cho phép. quy định thêm sẽ được cần thiết cho các giao diện kết nối với Internet để cho phép các cổng chỉ cụ thể, các loại hình kết nối và máy chủ từ xa thậm chí có thể được tiếp cận với tường lửa của bạn và mạng gia đình. #------------------------------------------------- -------------- # Cho phép tất cả lưu lượng hai chiều từ tường lửa của mình vào # Bảo vệ mạng # - Interface eth1 là giao diện mạng riêng #------------------------------------------------- -------------- iptables-A INPUT-j ACCEPT-p các s-192.168.1.0/24-i eth1 iptables-A OUTPUT-j ACCEPT-p tất cả các-d 192.168.1.0/24-o eth1 13.7. Mặt nạ (Masquerade_many to one NAT): Đường truyền từ tất cả thiết bị trên một hoặc nhiều mạng được bảo vệ sẽ xuất hiện như là nó bắt đầu từ địa chỉ IP đơn trên vị trí Internet của firewall. Địa chỉ IP mặt nạ (masquerade) luôn luôn mặc định đến địa chỉ IP của giao tiếp 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. Ta có thể cấu hình nhiều đến một NAT cho một tên IP bằng cách sử dụng POSTROUTING và không dùng trạng thái MASQUERADE. 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 như là đối với giá trị mặc định 0 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. Điều này sẽ giúp bảo vệ mạng ở nhà từ bất cứ một người nào cố gắng kết nối với mạng nhà từ Internet. #--------------------------------------------------------- - # 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 # filesystem # file # # 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 #--------------------------------------------------------- - # Allow masquerading # - Interface eth0 is the internet interface # - Interface eth1 is the private network interface #--------------------------------------------------------- - iptables -A POSTROUTING -t nat -o eth0 -s 192.168.1.0/24 \ -d 0/0 -j MASQUERADE #--------------------------------------------------------- - # Prior to masquerading, the packets are routed via the # filter # table's FORWARD chain. # Allowed outbound: New, established and related # connections # Allowed inbound : Established and related connections #--------------------------------------------------------- - 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 13.8 Giả mạo (Nhiều NAT) Bạn có thể cấu hình nhiều cho một NAT cho một IP, sử dụng POSTROUTING và không báo cáo Masquerade. Một ví dụ về điều này có thể được nhìn thấy trong phần NAT tĩnh sau. Hãy nhớ rằng iptables yêu cầu các module iptables_nat được nạp với lệnh modprobe cho tính năng mạo để làm việc. Giả mạo cũng phụ thuộc vào hệ điều hành Linux đang được cấu hình để hỗ trợ định tuyến giữa internet và các giao diện mạng riêng của tường lửa. Điều này được thực hiện bằng cách cho phép chuyển tiếp IP hoặc định tuyến bằng cách cho tập tin / proc/sys/net/ipv4/ip_forward giá trị 1 như trái ngược với các giá trị mặc định vô hiệu hóa bằng 0. Sau khi giả mạo đã đạt được bằng cách sử dụng chuỗi POSTROUTING của bảng nat, bạn sẽ phải cấu hình iptables để cho phép các gói tin đến dòng chảy giữa hai giao diện. Để làm điều này, hãy sử dụng chuỗi FORWARD của bảng lọc. Cụ thể hơn, các gói liên quan đến kết nối NEW và ESTABLISHED sẽ được phép đi vào Internet, nhưng chỉ gói tin liên quan đến các kết nối ESTABLISHED sẽ được phép vào. Điều này giúp bảo vệ mạng gia đình từ bất cứ ai cố gắng để bắt đầu kết nối từ Internet: #------------------------------------------------- -------------- # Tải các module NAT # # Lưu ý: Cách tốt nhất là sử dụng / etc / rc.local trong ví dụ này # Chương. Giá trị này sẽ không được giữ lại trong # / Etc / sysconfig / iptables file. Bao gồm chỉ như là một lời nhắc nhở. #------------------------------------------------- -------------- modprobe iptable_nat #------------------------------------------------- -------------- # Kích hoạt tính năng định tuyến bằng cách sửa đổi file / hệ thống tập tin proc ip_forward # # Lưu ý: Cách tốt nhất là sử dụng / etc / sysctl.conf trong ví dụ này # Chương. Giá trị này sẽ không được giữ lại trong # / Etc / sysconfig / iptables file. Bao gồm chỉ như là một lời nhắc nhở. #------------------------------------------------- -------------- echo 1> / proc/sys/net/ipv4/ip_forward #------------------------------------------------- -------------- # Cho phép giả mạo # - Giao diện eth0 là giao diện internet # - Interface eth1 là giao diện mạng riêng #------------------------------------------------- -------------- iptables-A POSTROUTING-t nat-o eth0-s 192.168.1.0/24-d 0 / 0 \ -J Masquerade #------------------------------------------------- -------------- # Trước khi giả mạo, các gói dữ liệu được chuyển qua bộ lọc # Chuỗi FORWARD của bảng. # Cho phép đi ra: mới, các kết nối được thành lập và có liên quan # Cho phép gửi đến: kết nối thành lập và có liên quan #------------------------------------------------- -------------- iptables-A FORWARD lọc-o eth0-t-m nhà nước \ - State NEW, ESTABLISHED, LIÊN QUAN-j ACCEPT iptables-A FORWARD lọc-t-i eth0-m nhà nước \ - THÀNH LẬP nhà nước, liên quan-j ACCEPT Lưu ý: Nếu bạn cấu hình tường lửa của bạn để làm giả mạo, sau đó nếu cần phải được sử dụng như là các gateway mặc định cho tất cả các máy chủ của bạn trên mạng. 13.9 NAT Port Forwarding (DHCP DSL) Trong nhiều trường hợp người dùng gia đình có thể có được một DHCP địa chỉ IP công cộng duy nhất từ ISP của họ. Nếu một bức tường lửa Linux cũng là giao diện của bạn với mạng Internet và bạn muốn lưu trữ một trang web vào một trong các máy chủ nhà bảo vệ NAT, sau đó bạn sẽ phải sử dụng cổng chuyển tiếp.Ở đây, sự kết hợp của địa chỉ IP duy nhất của tường lửa, địa chỉ IP của máy chủ từ xa, và nguồn / đích đến cảng giao thông có thể được sử dụng để nhận diện ra một luồng giao thông. Tất cả các giao thông phù hợp với một sự kết hợp đặc biệt của những yếu tố này sau đó có thể được chuyển tiếp đến một máy chủ duy nhất trên mạng riêng. Port forwarding được xử lý bởi các chuỗi PREROUTING của bảng nat. Như trong giả mạo, các module iptables_nat đã được nạp và định tuyến đã được kích hoạt cho cổng chuyển tiếp để làm việc. Định tuyến cũng phải được cho phép trong iptables với chuỗi FORWARD, điều này bao gồm tất cả các kết nối gửi đến NEW từ Internet phù hợp với các cổng cảng chuyển tiếp cộng với tất cả các gói trong tương lai liên quan đến việc kết nối ESTABLISHED theo cả hai hướng: #------------------------------------------------- -------------- # Tải các module NAT # # Lưu ý: Cách tốt nhất là sử dụng / etc / rc.local trong ví dụ này # Chương. Giá trị này sẽ không được giữ lại trong # / Etc / sysconfig / iptables file. Bao gồm chỉ như là một lời nhắc nhở. #------------------------------------------------- -------------- modprobe iptable_nat #------------------------------------------------- -------------- # Nhận địa chỉ IP của giao diện eth0 Internet (linux chỉ) # # Bạn sẽ phải sử dụng một biểu thức khác nhau để có được địa chỉ IP # Cho các hệ thống điều hành khác đã có một đầu ra ifconfig khác nhau # Hoặc nhập địa chỉ IP bằng tay trong báo cáo kết PREROUTING # # Đây là tường lửa của bạn tốt nhất khi được địa chỉ IP sử dụng DHCP. # Các địa chỉ IP bên ngoài chỉ có thể được cứng được mã hóa ("gõ vào # Bình thường ") #------------------------------------------------- -------------- external_int = "eth0" external_ip = "` ifconfig $ external_int | grep "inet addr" | \ awk '{print $ 2}' | sed-e 's /.*://'`" #------------------------------------------------- -------------- # Kích hoạt tính năng định tuyến bằng cách sửa đổi file / hệ thống tập tin proc ip_forward # # Lưu ý: Cách tốt nhất là sử dụng / etc / sysctl.conf trong ví dụ này # Chương. Giá trị này sẽ không được giữ lại trong # / Etc / sysconfig / iptables file. Bao gồm chỉ như là một lời nhắc nhở. #------------------------------------------------- -------------- echo 1> / proc/sys/net/ipv4/ip_forward #------------------------------------------------- -------------- # Cho phép chuyển tiếp cổng để lưu lượng truy cập đích đến cổng 80 của # địa chỉ IP của tường lửa sẽ được chuyển tiếp đến cổng 8080 trên máy chủ # 192.168.1.200 # # - Giao diện eth0 là giao diện internet # - Interface eth1 là giao diện mạng riêng #------------------------------------------------- -------------- iptables-t nat-A PREROUTING-p tcp-i eth0-d $ external_ip \ - Dport 80 - thể dục thể thao 1024:65535-j DNAT - to 192.168.1.200:8080 #------------------------------------------------- -------------- # Sau khi DNAT, các gói dữ liệu được chuyển qua bộ lọc của bảng # FORWARD chuỗi. # Kết nối vào cổng 80 tới máy tính mục tiêu vào các tư nhân # Mạng phải được cho phép. #------------------------------------------------- -------------- iptables-A FORWARD-p tcp-i eth0-o eth1-d 192.168.1.200 \ - Dport 8080 - thể thao nhà nước 1024:65535-m - state NEW-j ACCEPT iptables-A FORWARD lọc-o eth0-t-m nhà nước \ - State NEW, ESTABLISHED, LIÊN QUAN-j ACCEPT iptables-A FORWARD lọc-t-i eth0-m nhà nước \ - THÀNH LẬP nhà nước, liên quan-j ACCEPT 13.10 SNAT & MASQUERADE Để tạo kết nối `transparent` giữa mạng LAN 192.168.0.1 với Internet bạn lập cấu hình cho tường lửa Iptables như sau: # echo 1 > /proc/sys/net/ipv4/ip_forward cho phép forward các packet qua máy chủ đặt Iptables # iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 210.40.2.71 đổi IP nguồn cho các packet ra card mạng eth0 là 210.40.2.71. Khi nhận được packet vào từ Internet, Iptables sẽ tự động đổi IP đích 210.40.2.71 thành IP đích tương ứng của máy tính trong mạng LAN 192.168.0/24. Hoặc bạn có thể dùng MASQUERADE thay cho SNAT như sau: # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE  (MASQUERADE thường được dùng khi kết nối đến Internet là pp0 và dùng địa chỉ IP động) Ví dụ  Trong ví dụ này, tất cả lưu lượng truy cập đến một địa chỉ IP cụ thể nào, không chỉ tới một cổng đặc biệt, được phiên dịch sang một máy chủ trên mạng con được bảo vệ. Bởi vì các bức tường lửa có hơn một địa chỉ IP, tôi không thể khuyên bạn nên Masquerade, nó sẽ buộc giả mạo địa chỉ IP của giao diện chính và không phải là một trong các bí danh địa chỉ IP tường lửa có thể có. Thay vào đó, sử dụng SNAT để chỉ định bí danh địa chỉ IP được sử dụng cho các kết nối được khởi xướng bởi tất cả các máy chủ khác trong mạng lưới bảo vệ. Lưu ý: Mặc dù các bảng NAT nat tất cả lưu lượng truy cập đến các máy chủ mục tiêu (192.168.1.100 đến 102), chỉ kết nối vào cổng 80443 và 22 được phép thông qua các chuỗi FORWARD. Ngoài ra thông báo như thế nào bạn phải chỉ định một lựa chọn đa cổng riêng biệt-m bất cứ khi nào bạn cần phải kết hợp nhiều cổng không liên tục cho cả hai nguồn và đích. Trong ví dụ này tường lửa: Sử dụng 1-1 NAT để làm cho server 192.168.1.100 trên mạng gia đình của bạn xuất hiện trên Internet như là địa chỉ IP 97.158.253.26. Tạo ra một nhiều đến một NAT cho mạng nhà 192.168.1.0 trong đó tất cả các máy chủ xuất hiện trên Internet như địa chỉ IP 97.158.253.29. Điều này khác với giả mạo Bạn sẽ phải tạo bí danh địa chỉ IP cho mỗi người trong các khu công nghiệp Internet cho 1-1 NAT để làm việc. #------------------------------------------------- -------------- # Tải các module NAT # # Lưu ý: Cách tốt nhất là sử dụng / etc / rc.local trong ví dụ này # Chương. Giá trị này sẽ không được giữ lại trong # / Etc / sysconfig / iptables file. Bao gồm chỉ như là một lời nhắc nhở. #------------------------------------------------- -------------- modprobe iptable_nat #------------------------------------------------- -------------- # Kích hoạt tính năng định tuyến bằng cách sửa đổi file / hệ thống tập tin proc ip_forward # # Lưu ý: Cách tốt nhất là sử dụng / etc / sysctl.conf trong ví dụ này # Chương. Giá trị này sẽ không được giữ lại trong # / Etc / sysconfig / iptables file. Bao gồm chỉ như là một lời nhắc nhở. #------------------------------------------------- -------------- echo 1> / proc/sys/net/ipv4/ip_forward #------------------------------------------------- -------------- # NAT tất cả lưu lượng truy cập: ########### # Hãy nhớ để tạo bí danh cho internet tất cả các địa chỉ IP dưới đây ########### # # TO: TỪ: BẢN ĐỒ SERVER: # 97.158.253.26 Anywhere 192.168.1.100 (1:1 NAT - Tour trong nước) # Bất cứ nơi nào 192.168.1.100 97.158.253.26 (1:1 NAT - Outbound) # Bất cứ nơi nào 192.168.1.0/24 97.158.253.29 (FW IP) # # SNAT được sử dụng để NAT tất cả các kết nối ra ngoài khác khởi xướng # Từ mạng lưới bảo vệ để xuất hiện từ # Địa chỉ IP 97.158.253.29 # # POSTROUTING: # NAT nguồn địa chỉ IP. Thường được sử dụng để kết nối NAT từ # Mạng của bạn về nhà với Internet # # PREROUTING: # NAT địa chỉ IP đích. Thường được dùng để NAT # Kết nối từ Internet đến mạng của bạn # # - Giao diện eth0 là giao diện internet # - Interface eth1 là giao diện mạng riêng #------------------------------------------------- -------------- # PREROUTING báo cáo cho NAT 01:01 # (Kết nối có nguồn gốc từ Internet) iptables-t nat-A PREROUTING-d 97.158.253.26-i eth0 \ -J DNAT - to-đích 192.168.1.100 # POSTROUTING báo cáo cho NAT 01:01 # (Kết nối có nguồn gốc từ các máy chủ mạng gia đình) iptables-t nat-A POSTROUTING-s 192.168.1.100-o eth0 \ -J SNAT - to-nguồn 97.158.253.26 # Báo cáo POSTROUTING cho nhiều: 1 NAT # (Kết nối có nguồn gốc từ các mạng gia đình toàn bộ) iptables-t nat-A POSTROUTING-s 192.168.1.0/24 \ -J SNAT-o eth0 - to-nguồn 97.158.253.29 # Cho phép chuyển tiếp cho mỗi máy chủ cấu hình cho NAT 01:01 # (Đối với các kết nối có nguồn gốc từ Internet. Chú ý cách bạn # Sử dụng địa chỉ IP thực sự ở đây) iptables-A FORWARD-p tcp-i eth0-o eth1-d 192.168.1.100 \ -M multiport - dports 80,443,22 \ -M nhà nước - state NEW-j ACCEPT # Cho phép chuyển tiếp cho tất cả các mới và thành lập các kết nối SNAT # Có nguồn gốc trên mạng gia đình và đã được thành lập # Kết nối DNAT iptables-A FORWARD lọc-o eth0-t-m nhà nước \ - State NEW, ESTABLISHED, LIÊN QUAN-j ACCEPT # Cho phép chuyển tiếp cho tất cả các kết nối bắt nguồn từ NAT 01:01 # Của Internet mà đã chuyển qua chuyển tiếp mới # Thông báo ở trên iptables-A FORWARD lọc-t-i eth0-m nhà nước \ - THÀNH LẬP nhà nước, liên quan-j ACCEPT 13.11. DNAT Giả sử bạn đặt các máy chủ Proxy, Mail và DNS trong mạng DMZ. Để tạo kết nối trong suốt từ Internet vào các máy chủ này bạn là như sau: # echo 1 > /proc/sys/net/ipv4/ip_forward # iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2 # iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j DNAT --to-destination 192.168.1.3 # iptables -t nat -A PREROUTING -i eth0 -p udp --dport 53 -j DNAT --to-destination 192.168.1.4 CHƯƠNG II: VÍ DỤ VỀ CẤU HÌNH IPTABLES CHO MÁY CHỦ PHỤC VỤ WEB Phần này trình bày qua ví dụ cụ thể và chỉ hướng dẫn lọc packet vào. Các packet `forward` và 'output' không được đề cập ở đây. Giả sử như máy chủ phục vụ Web kết nối mạng trực tiếp vào Internet qua card mạng eth0, địa chỉ IP là 1.2.3.4. Ta cần lập cấu hình tường lửa cho Iptables đáp ứng các yêu cầu sau: - cổng TCP 80 (chạy apache) mở cho mọi người truy cập web - cổng 21 (chạy proftpd) chỉ mở cho webmaster (dùng để upload file lên public_html) - cổng 22 (chạy openssh) chỉ mở cho admin (cung cấp shell `root` cho admin để nâng cấp & patch lỗi cho server khi cần) - cổng UDP 53 (chạy tinydns) để phục vụ tên miền (đây chỉ là ví dụ) - chỉ chấp nhận ICMP PING tới với code=0x08, các loại packet còn lại đều bị từ chối. 1. Thiết lập các tham số cho nhân echo 1 > /proc/sys/net/ipv4/tcp_syncookies echo 10 > /proc/sys/net/ipv4/tcp_fin_timeout echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time echo 0 > /proc/sys/net/ipv4/tcp_window_scaling echo 0 > /proc/sys/net/ipv4/tcp_sack echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts echo 0 > /proc/sys/net/ipv4/conf/eth0/accept_source_route tcp_syncookies=1 bật chức năng chống DoS SYN qua syncookie của Linux tcp_fin_timeout=10 đặt thời gian timeout cho quá trình đóng kết nối TCP là 10 giây tcp_keepalive_time=1800 đặt thời gian giữ kết nối TCP là 1800 giây ... Các tham số khác bạn có thể xem chi tiết trong tài liệu đi kèm của nhân Linux. 2. Nạp các môđun cần thiết cho Iptables Để sử dụng Iptables, bạn cần phải nạp trước các môđun cần thiết. Ví dụ nếu bạn muốn dùng chức năng LOG trong Iptables, bạn phải nạp môđun ipt_LOG vào trước bằng lệnh # modprobe ipt_LOG. MODULES="ip_tables iptable_filter ipt_LOG ipt_limit ipt_REJECT ipt_state for i in $MODULES; do     /sbin/modprobe $MODULES done 3. Nguyên tắc đặt luật là "drop trước, accept sau" Đây là nguyên tắc mà bạn nên tuân theo. Đầu tiên hãy đóng hết các cổng, sau đó mở dần cách cổng cần thiết. Cách này tránh cho bạn gặp sai sót trong khi đặt luật cho Iptables. iptables -P INPUT DROP thả packet trước iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT giữ các kết nối hiện tại và chấp nhận các kết nối có liên quan iptables -A INPUT -i lo -s 127.0.0.1 -j ACCEPT chấp nhận các gói vào looback từ IP 127.0.0.1 iptables -A INPUT -i lo -s 1.2.3.4 -j ACCEPT  và 1.2.3.4 BANNED_IP="10.0.0.0/8 192.168.0.0/16 172.16.0.0/12 224.0.0.0/4 240.0.0.0/5" for i in $BANNED_IP; do     iptables -A INPUT -i eth0 -s $i -j DROP thả các gói dữ liệu đến từ các IP nằm trong danh sách cấm BANNER_IP done 4. Lọc ICMP vào và chặn ngập lụt PING LOG của Iptables sẽ được ghi vào file /var/log/firewall.log. Bạn phải sửa lại cấu hình cho SYSLOG như sau: # vi /etc/syslog.conf kern.=debug /var/log/firewall.log # /etc/rc.d/init.d/syslogd restart Đối với các gói ICMP đến, chúng ta sẽ đẩy qua chain CHECK_PINGFLOOD để kiểm tra xem hiện tại đamg bị ngập lụt PING hay không, sau đó mới cho phép gói vào. Nếu đang bị ngập lụt PING, môđun LOG sẽ tiến hành ghi nhật kí ở mức giới hạn --limit $LOG_LIMIT và --limit-burst $LOG_LIMIT_BURST, các gói PING ngập lụt sẽ bị thả hết. LOG_LEVEL="debug" LOG_LIMIT=3/m LOG_LIMIT_BURST=1 PING_LIMIT=500/s PING_LIMIT_BURST=100 iptables -A CHECK_PINGFLOOD -m limit --limit $PING_LIMIT --limit-burst $PING_LIMIT_BURST -j RETURN iptables -A CHECK_PINGFLOOD -m limit --limit $LOG_LIMIT --limit-burst $LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix "fp=PINGFLOOD:warning a=DROP " iptables -A CHECK_PINGFLOOD -j DROP iptables -A INPUT -i eth0 -p icmp --icmp-type echo-request -j CHECK_PINGFLOOD iptables -A INPUT -i eth0 -p icmp --icmp-type echo-request -j ACCEPT 5. Reject quét cổng TCP và UDP Ở đây bạn tạo sẵn chain reject quét cổng, chúng ta sẽ đẩy vào chain INPUT sau. Đối với gói TCP, chúng ta  reject bằng gói TCP với cờ SYN=1 còn đối với gói UDP, chúng ta sẽ reject bằng gói ICMP `port-unreachable` iptables-N REJECT_PORTSCAN iptables-A REJECT_PORTSCAN -p tcp -m limit --limit $LOG_LIMIT --limit-burst $LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix "fp=PORTSCAN:tcp a=REJECT " iptables-A REJECT_PORTSCAN -p udp -m limit --limit $LOG_LIMIT --limit-burst $LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix "fp=PORTSCAN:udp a=REJECT " iptables-A REJECT_PORTSCAN -p tcp -j REJECT --reject-with tcp-reset iptables-A REJECT_PORTSCAN -p udp -j REJECT --reject-with icmp-port-unreachable 6. Phát hiện quét cổng bằng Nmap iptables-N DETECT_NMAP iptables-A DETECT_NMAP -p tcp --tcp-flags ALL FIN,URG,PSH -m limit --limit $LOG_LIMIT --limit-burst $LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix "fp=NMAP:XMAS a=DROP " iptables-A DETECT_NMAP -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -m limit --limit $LOG_LIMIT --limit-burst $LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix "fp=NMAP:XMAS-PSH a=DROP " iptables-A DETECT_NMAP -p tcp --tcp-flags ALL ALL -m limit --limit $LOG_LIMIT --limit-burst $LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix "fp=NMAP:XMAS-ALL a=DROP " iptables-A DETECT_NMAP -p tcp --tcp-flags ALL FIN -m limit --limit $LOG_LIMIT --limit-burst $LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix "fp=NMAP:FIN a=DROP " iptables-A DETECT_NMAP -p tcp --tcp-flags SYN,RST SYN,RST -m limit --limit $LOG_LIMIT --limit-burst $LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix "fp=NMAP:SYN-RST a=DROP " iptables-A DETECT_NMAP -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit $LOG_LIMIT --limit-burst $LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix "fp=NMAP:SYN-FIN a=DROP " iptables-A DETECT_NMAP -p tcp --tcp-flags ALL NONE -m limit --limit $LOG_LIMIT --limit-burst $LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix "fp=NMAP:NULL a=DROP " iptables-A DETECT_NMAP -j DROP iptables-A INPUT -i eth0 -p tcp ! --syn -m state --state NEW -j DETECT_NMAP Đối với các gói TCP đến eth0 mở kết nối nhưng không đặt SYN=1 chúng ta sẽ chuyển sang chain DETECT_NMAP. Đây là những gói không hợp lệ và hầu như là quét cổng bằng nmap hoặc kênh ngầm. Chain DETECT_NMAP sẽ phát hiện ra hầu hết các kiểu quét của Nmap và tiến hành ghi nhật kí ở mức --limit $LOG_LIMIT và --limit-burst $LOG_LIMIT_BURST. Ví dụ để kiểm tra quét XMAS, bạn dùng tùy chọn --tcp-flags ALL FIN,URG,PSH nghĩa là 3 cờ FIN, URG và PSH được bật, các cờ khác đều bị tắt. Các gói qua chain DETECT_NMAP sau đó sẽ bị DROP hết. 7. Chặn ngập lụt SYN Gói mở TCP với cờ SYN được set 1 là hợp lệ nhưng không ngoại trừ khả năng là các gói SYN dùng để ngập lụt. Vì vậy, ở dây bạn đẩy các gói SYN còn lại qua chain CHECK_SYNFLOOD để kiểm tra ngập lụt SYN như sau: iptables-N CHECK_SYNFLOOD iptables-A CHECK_SYNFLOOD -m limit --limit $SYN_LIMIT --limit-burst $SYN_LIMIT_BURST -j RETURN iptables-A CHECK_SYNFLOOD -m limit --limit $LOG_LIMIT --limit-burst $LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix "fp=SYNFLOOD:warning a=DROP " iptables-A CHECK_SYNFLOOD -j DROP iptables-A INPUT -i eth0 -p tcp --syn -j CHECK_SYNFLOOD 8: Giới hạn truy cập SSH cho admin SSH_IP="1.1.1.1" iptables -N SSH_ACCEPT iptables -A SSH_ACCEPT -m state --state NEW -j LOG --log-level $LOG_LEVEL --log-prefix "fp=SSH:admin a=ACCEPT " iptables -A SSH_ACCEPT -j ACCEPT iptables -N SSH_DENIED iptables -A SSH_DENIED -m limit --limit $LOG_LIMIT --limit-burst $LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix "fp=SSH:attempt a=REJECT " iptables -A SSH_DENIED -p tcp -j REJECT --reject-with tcp-reset for i in $SSH_IP; do iptables -A INPUT -i eth0 -p tcp -s $i --dport 22 -j SSH_ACCEPT done iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -j SSH_DENIED 9. Giới hạn FTP cho web-master FTP_IP="2.2.2.2" iptables -N FTP_ACCEPT iptables -A FTP_ACCEPT -m state --state NEW -j LOG --log-level $LOG_LEVEL --log-prefix "fp=FTP:webmaster a=ACCEPT " iptables -A FTP_ACCEPT -j ACCEPT iptables -N FTP_DENIED iptables -A FTP_DENIED -m limit --limit $LOG_LIMIT --limit-burst $LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix "fp=FTP:attempt a=REJECT " iptables -A FTP_DENIED -p tcp -j REJECT --reject-with tcp-reset for i in $FTP_IP; do iptables -A INPUT -i eth0 -p tcp -s $i --dport 21 -j FTP_ACCEPT done iptables -A INPUT -i eth0 -p tcp --dport 21 -m state --state NEW -j FTP_DENIED 10. Lọc TCP vào iptables -N TCP_INCOMING iptables -A TCP_INCOMING -p tcp --dport 80 -j ACCEPT iptables -A TCP_INCOMING -p tcp -j REJECT_PORTSCAN iptables -A INPUT -i eth0 -p tcp -j TCP_INCOMING 11. Lọc UDP vào và chặn ngập lụt UDP iptables -N CHECK_UDPFLOOD iptables -A CHECK_UDPFLOOD -m limit --limit $UDP_LIMIT --limit-burst $UDP_LIMIT_BURST -j RETURN iptables -A CHECK_UDPFLOOD -m limit --limit $LOG_LIMIT --limit-burst $LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix "fp=UDPFLOOD:warning a=DROP " iptables -A CHECK_UDPFLOOD -j DROP iptables -A INPUT -i eth0 -p udp -j CHECK_UDPFLOOD iptables -N UDP_INCOMING iptables -A UDP_INCOMING -p udp --dport 53 -j ACCEPT iptables -A UDP_INCOMING -p udp -j REJECT_PORTSCAN iptables -A INPUT -i eth0 -p udp -j UDP_INCOMING Để hạn chế khả năng bị DoS và tăng cường tốc độ cho máy chủ phục vụ web, bạn có thể dùng cách tải cân bằng (load-balacing) như sau: Cách 1: chạy nhiều máy chủ phục vụ web trên các địa chỉ IP Internet khác nhau. Ví dụ, ngoài máy chủ phục vụ web hiện tại 1.2.3.4, bạn có thể đầu tư thêm các máy chủ phục vụ web mới 1.2.3.2, 1.2.3.3, 1.2.3.4, 1.2.3.5. Điểm yếu của cách này là tốn nhiều địa chỉ IP Internet. Cách 2: đặt các máy chủ phục vụ web trong một mạng DMZ. Cách này tiết kiệm được nhiều địa chỉ IP nhưng bù lại bạn gateway Iptables 1.2.3.4 - 192.168.0.254 có thể load nặng hơn trước và yêu cầu bạn đầu tư tiền cho đường truyền mạng từ gateway ra Internet. Bạn dùng DNAT trên gateway 1.2.3.4 để chuyển tiếp các gói dữ liệu từ client đến một trong các máy chủ phục vụ web trong mạng DMZ hoặc mạng LAN như sau: # iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.1-192.168.0.4 KẾT LUẬN Đồ án hoàn thành giúp cho người đọc có được cái nhìn khái quát nhất về chức năng, phương thức hoạt động của IPTABLEs trên LINUX. Bao gồm cách cài đặt iptables, cơ chế xử lý package trong iptables, Target và Jumps, các tham số dòng lệnh của Iptables... và ứng dụng IPTABLES cho máy chủ phục vụ Web. Ưu điểm của IPTABLES IPTABLES ra đời được cải tiến hơn so với IPCHAINS như: tích hợp tốt với hạt nhân LiNUX, kiểm tra trạng thái gói, lọc packet dựa trên địa chỉ MAC... Là một bức tường lửa ứng dụng lọc gói rất mạnh và được tích hợp sẵn trên LINUX. TÀI LIỆU THAM KHẢO [1] Nguyễn Thị Điệp và Tiêu Đông Nhơn, Giáo trình Dịch vụ mạng Linux, Đại học Quốc Gia Thành phố Hồ Chí Minh 12/2005. [2] How To Set Up A Debian Linux Proxy Server by Debian's Web. [3] Nguyễn Hồng Thái, Cài đặt và Cấu hình iptables, Đại học Công nghệ Thành phố Hồ Chí Minh. [4] Các website - - ttp://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch14 _:_Linux_Firewalls_Using_iptables

Các file đính kèm theo tài liệu này:

  • docIPTABLES trên LINUX.doc