Nhóm các điều kiện chung có thể đ−ợc sử dụng trong tất cả các luật. Nhóm điều kiện chung luôn luôn có hiệu lực, không xét đến giao thức gói tin, không xét đến các điều kiện mở rộng. Không có tham số đặc biệt nào cần phải có khi sử dụng những điều kiện này.
Đồ án tốt nghiệp
-p protocol
Điều kiện này đ−ợc sử dụng để kiểm tra giao thức (protocol) của gói tin. Giao thức có thể đ−ợc chỉ ra bằng tên hoặc bằng giá trị số của giao thức (các giá trị số hợp lệ là các giá trị đ−ợc khai báo trong tập tin /etc/protocols), thí dụ nh− 1 có nghĩa là giao thức ICMP. Các giá trị của điều kiện -p cũng có thể là một danh sách các giao thức, đ−ợc phân cách nhau bởi dấu ','. Giá trị ALL đại diện cho mọi giao thức.
Thí dụ: iptables -A INPUT -p tcp,udp -s source_addr
Điều kiện này đ−ợc sử dụng để kiểm tra địa chỉ nguồn (source_addr) của các gói tin. Giá trị của điều kiện này, source_addr, là một địa chỉ IP với netmask có thể đ−ợc ghi ở dạng CIRD.
Thí dụ: iptables -A INPUT -s 192.168.1.1/27 -d dest_addr
Điều kiện này đ−ợc sử dụng để kiểm tra địa chỉ đích (dest_addr) của các gói tin. Giá trị của điều kiện này, dest_addr, là một địa chỉ IP với netmask có thể đ−ợc ghi ở dạng CIRD.
Thí dụ: iptables -A INPUT -d 192.168.1.1/24 -i in_interface
Điều kiện -i đ−ợc sử dụng để chỉ thực hiện kiểm tra những gói tin có đi đến giao tiếp mạng in_interface. Điều kiện này chỉ đ−ợc phép khai báo trong các chuỗi luật INPUT, FORWARD và PREROUTING. Giá trị của điều kiện này, in_interface, là tên của giao tiếp mạng. Có thể sử dụng ký tự thay thế + trong tên của giao tiếp mạng. Nếu + đứng một mình thì sẽ đại diện cho tất cả các giao tiếp mạng. Nếu + đ−ợc viết liền sau một phần tên của giao tiếp mạng, nó thay thế cho tất cả các giao
Đồ án tốt nghiệp
tiếp mạng có phần tên đó. Thí dụ, điều kiện -i eth+ sẽ áp dụng luật cho bất kỳ giao tiếp Ethernet nào trên hệ thống ngoại trừ các giao tiếp khác, nh− là ppp0.
Thí dụ: iptables -A INPUT -i eth0 -o out_interface
Điều kiện -o đ−ợc sử dụng để chỉ thực hiện kiểm tra những gói tin xuất phát từ giao tiếp mạng out_interface. Điều kiện này chỉ đ−ợc phép khai báo trong các chuỗi luật OUTPUT, FORWARD và POSTROUTING, ng−ợc với điều kiện -i. Cú pháp của điều kiện này t−ơng tự nh− cú pháp của điều kiện -i.
Thí dụ: iptables -A FORWARD -o eth0 6.2.5.3.2 Nhóm các điều kiện ẩn
Các điều kiện ẩn đ−ợc thực hiện, công nhận, tự động và đ−ợc nạp một cách hoàn toàn. Hiện có ba kiểu điều kiện ẩn áp dụng cho ba giao thức: điều kiện kiểm tra gói TCP, kiểm tra gói UDP, và kiểm tra gói ICMP.
Các điều kiện ẩn: --sport source_port
Điều kiện này chỉ hợp lệ khi trong luật có chỉ ra điều kiện -p tcp hoặc - p udp.
Điều kiện --source-port đ−ợc sử dụng để kiểm tra các gói tin dựa trên cổng nguồn (source_port) của chúng. Nếu không chỉ ra điều kiện này, iptables sẽ không kiểm tra cổng nguồn của gói tin. Giá trị của điều kiện này, source_port, có thể là cổng hoặc tên dịch vụ (tên dịch vụ hợp lệ là các tên dịch vụ đ−ợc khai báo trong tập tin /etc/services). source_port cũng có thể là một dãy các cổng, đ−ợc phân cách nhau bởi dấu ':'.
Đồ án tốt nghiệp
Thí dụ: iptables -A INPUT -p tcp --sport 22:80 --dport destination_port
Điều kiện này chỉ hợp lệ khi trong luật có chỉ ra điều kiện -p tcp hoặc - p udp.
Điều kiện --dport đ−ợc sử dụng để kiểm tra các gói tin dựa trên cổng đích (destination_port) của chúng. Cú pháp của điều kiện này giống nh− cú pháp của điều kiện --source-port.
Thí dụ: iptables -A INPUT -p tcp --dport 22 --icmp-type type
Điều kiện này chỉ hợp lệ khi trong luật có chỉ ra điều kiện -p icmp. Điều kiện --icmp-type đ−ợc sử dụng để kiểm tra các gói tin dựa trên kiểu giao thức ICMP của gói tin. Các kiểu, type, của giao thức ICMP có thể đ−ợc chỉ ra ở định dạng số hoặc định dạng tên.
Thí dụ: iptables -A INPUT -p icmp --icmp-type 8 --syn
Điều kiện --syn đ−ợc duy trì từ ipchains để đảm bảo tính t−ơng thích và để tạo sự chuyển tiếp một cách dễ dàng hơn. Nó đ−ợc dùng để kiểm tra các gói tin nếu chúng có cờ SYN đ−ợc bật và các cờ ACK và RST bị tắt. Những gói tin này chủ yếu đ−ợc dùng để yêu cầu một kết nối mới từ máy chủ. Nếu ta thực hiện loại bỏ những gói tin này, tất cả các gói tin
6.2.5.3.3 Nhóm các điều hiện hiện
Những điều kiện hiện là những điều kiện phải đ−ợc nạp một cách đặc biệt với lựa chọn -m. Sự khác nhau giữa các điều kiện hiện và điều kiện ẩn là ở chỗ các điều kiện đ−ợc nạp ẩn sẽ tự động đ−ợc nạp khi kiểm tra thuộc tính của các
Đồ án tốt nghiệp
gói tin, trong khi các điều kiện đ−ợc nạp hiện sẽ không bao giờ đ−ợc nạp một cách tự động – nó để cho ng−ời quản trị tự phát hiện và kích hoạt các điều kiện hiện.
Các điều kiện hiện: --source-port list
Điều kiện này chỉ hợp lệ khi trong luật có chỉ ra điều kiện -p tcp hoặc - p udp và điều kiện -m multiport. Điều kiện --source-port và điều kiện -- sport không sử dụng cùng nhau trong một luật.
Điều kiện --source-port t−ơng tự nh− điều kiện --sport, nh−ng giá trị của điều kiện là một danh sách, list (tối đa 15 phần tử), các cổng đ−ợc phân cách nhau bởi dấu ','.
Thí dụ: iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
--destination-port list
Điều kiện --destination-port t−ơng tự nh− điều kiện --dport, nh−ng giá trị của nó là một danh sách các cổng.
Cú pháp và điều kiện sử dụng điều kiện này t−ơng tự nh− điều kiện -- source-port.
Thí dụ: iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
--port list
Điều kiện này đ−ợc sử dụng để kiểm tra gói tin dựa vào cả địa chỉ nguồn lẫn địa chỉ đích của gói tin. Cú pháp và điều kiện giống nh− -- source-port.
Thí dụ: iptables -A INPUT -p tcp -m multiport --port 22,53,80,110 --mac-source mac_addr
Đồ án tốt nghiệp
Điều kiện này đ−ợc dùng để kiểm tra các gói tin dựa trên địa chỉ MAC nguồn của chúng. Địa chỉ MAC, mac_addr, phải đ−ợc ghi ở định dạng XX:XX:XX:XX:XX:XX. Điều kiện --mac-source chỉ hợp lệ trong các chuỗi PREROUTING, FORWARD và INPUT, đồng thời trong luật phải chỉ ra điều kiện -m mac.
Thí dụ: iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01
Các giá trị của điều kiện có thể đ−ợc lấy “nghịch đảo” bằng cách sử dụng ký tự ! đứng sau điều kiện. Thí dụ, nếu ta khai báo điều kiện sau -p ! icmp , iptables sẽ kiểm tra các gói tin không làm việc theo giao thức ICMP.
6.2.5.4 Các hành động trong luật
Sau khi đã chỉ ra các điều kiện kiểm tra gói tin, b−ớc cuối cùng của công việc thiết lập luật trong iptables là chỉ ra các hành động xử lý gói tin khi thông tin của gói tin đáp ứng đ−ợc các điều kiện chỉ ra trong luật. Tên của hành động xử lý gói tin phải đ−ợc đặt sau tham số -j trong luật. D−ới đây là một số hành động xử lý gói tin cơ bản:
6.2.5.4.1 user-defined-chain <user-defined-chain>
Hành động này sẽ thực hiện chuyển gói tin tới chuỗi luật ng−ời dùng định nghĩa, đã đ−ợc tạo tr−ớc đó với tên user-defined-chain, để đ−ợc kiểm tra và chịu xử lý theo các luật đ−ợc khai báo trong chuỗi luật ng−ời dùng định nghĩa này.
Thí dụ: iptables -A INPUT -p tcp -j tcp_packets ACCEPT
Ngay sau khi gói tin đáp ứng đ−ợc các điều kiện trong một luật và hành động xử lý gói này là ACCEPT, gói tin đ−ợc chấp nhận và không phải bị kiểm tra thêm qua các luật khác trong chuỗi luật hiện hành hay bị kiểm tra bởi các chuỗi luật khác trong cùng bảng. Tuy nhiên, một gói tin đ−ợc chấp nhận trong một chuỗi
Đồ án tốt nghiệp
luật vẫn có thể phải đi qua các chuỗi luật khác trong các bảng khác và có thể bị loại bỏ ở những bảng đó. Để sử dụng hành động này, cần chỉ ra –j ACCEPT trong luật.
6.2.5.4.2 DROP
Hành động DROP sẽ loại bỏ các gói tin ngay lập tức. Chú ý rằng hành động có thể gây ra một số tác động ngoài ý muốn, do nó có thể bỏ lại những socket không dùng trên máy. Do vậy, giải pháp tốt hơn là sử dụng hành động REJECT, đặc biệt là khi muốn ngăn chặn việc quét cổng.
6.2.5.4.3 REJECT
Hành động REJECT hoạt động t−ơng tự nh− hành động DROP, nh−ng nó gửi thông báo lỗi cho máy gửi gói tin bị loại bỏ. Hành động này chỉ đ−ợc phép khai báo trong các chuỗi luật INPUT, FORWARD và OUTPUT.
6.2.5.4.4 RETURN
Khi một gói tin “gặp” hành động RETURN, iptables sẽ ngừng kiểm tra gói tin trong chuỗi luật hiện hành. Nếu chuỗi luật hiện hành là con của chuỗi luật khác, gói tin sẽ tiếp tục đ−ợc kiểm tra bởi các luật trong chuỗi luật cha nếu không có hành động nào khác đ−ợc thực hiện. Nếu chuỗi luật là chuỗi luật chính, thí dụ INPUT, gói sẽ chịu tác động của hành động mặc định của chuỗi luật đó.
6.2.5.4.5 SNAT
Hành động SNAT đ−ợc sử dụng để thực hiện chuyển đổi địa chỉ mạng nguồn (Source Network Address Translation), có nghĩa là thay đổi địa chỉ IP nguồn trong header của gói tin. Hành động này th−ờng đ−ợc áp dụng khi có nhiều máy tính sử dụng chung một kết nối Internet.
Hành động SNAT chỉ hợp lệ khi đ−ợc đặt trong chuỗi luật POSTROUTING của bảng nat. Chỉ có gói đầu tiên trong một kết nối là đ−ợc thay đổi bởi hành động SNAT, và sau đó tất cả các gói kế tiếp sử dụng cùng kết nối sẽ cũng đ−ợc
Đồ án tốt nghiệp
đổi địa chỉ nguồn. Thêm nữa, các luật khởi nạp trong chuỗi luật POSTROUTING sẽ đ−ợc áp dụng tới tất cả các gói tin trong cùng dòng dữ liệu.
Hành động SNAT đ−ợc sử dụng cùng với lựa chọn --to-source. Lựa chọn này đ−ợc dùng để xác định địa chỉ IP và cổng mà gói tin sẽ sử dụng. Lựa chọn này sẽ thực hiện thay thế địa chỉ IP nguồn trong header của gói tin bằng một trong những địa chỉ IP đ−ợc chỉ ra. Nếu muốn cân bằng giữa các địa chỉ IP, ta có thể sử dụng một dãy địa chỉ IP, sử dụng ký tự '-' để phân cách. Các dòng dữ liệu sẽ sử dụng các địa chỉ trong dải này một cách ngẫu nhiên; các gói tin của cùng một dòng dữ liệu sẽ sử dụng cùng một địa chỉ IP. Trong SNAT, ta cũng có thể chỉ ra một dãy các cổng đ−ợc sử để thay đổi cổng nguồn của gói tin. Các cổng nguồn chỉ hợp lệ khi điều kiện -p tcp hay -p udp đ−ợc chỉ ra trong luật.
Thí dụ: iptables -t nat -A POSTROUTING –p tcp -o eth0 -j SNAT --to- source 194.236.50.155-194.236.50.160:1024-32000
6.2.5.4.6 MASQUERADE
Hành động MASQUERADE đ−ợc sử dụng cơ bản nh− hành động SNAT, nh−ng nó không đòi hỏi phải sử dụng lựa chọn --to-source. Hành động MASQUERADE đ−ợc sử dụng để làm việc với các kết nối sử dụng địa chỉ IP động nh− các kết nối quay số (dial-up) hay DHCP. Điều này có nghĩa là chỉ sử dụng hành động MASQUERADE với các kết nối IP đ−ợc gán địa chỉ động. Nếu ta có kết nối IP tĩnh, nên sử dụng hành động SNAT.
Khi thực hiện masquerade một kết nối, có nghĩa là sử dụng địa chỉ IP của một giao tiếp mạng thay địa chỉ IP nguồn trong header của gói tin. Hành động MASQUERADE cũng tác động tới các kết nối bị ‘bỏ quên’ khi một giao tiếp mạng tắt. (nếu sử dụng SNAT thì sẽ bị mất dữ liệu trong tr−ờng hợp này).
Đồ án tốt nghiệp
Hành động MASQUERADE vẫn có thể đ−ợc sử dụng thay thế cho SNAT ngay cả khi sử dụng địa chỉ IP tĩnh, tuy nhiên việc sử dụng nh− thế không có lợi do nó phải thực hiện thêm nhiều xử lý và có thể có mâu thuẫn trong t−ơng lai.
Chú ý là hành động MASQUERADE chỉ hợp lệ khi đ−ợc đặt trong chuỗi luật POSTROUTING của bảng nat.
Hành động MASQUERADE có thể sử dụng cùng với lựa chọn --to-ports. Lựa chọn này đ−ợc sử dụng để gán lại cổng nguồn cho các gói tin đi ra. Ta có thể chỉ ra một cổng hay một dãy các cổng, đ−ợc phân cách nhau bởi ký tự '-'. Lựa chọn này chỉ hợp lệ nếu trong luật có chỉ ra điều kiện -p tcp hay -p udp.
Thí dụ: iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000
6.2.5.4.7 DNAT
Hành động DNAT đ−ợc sử dụng để thực hiện chuyển đổi địa chỉ mạng đích (Destination Network Address Translation) có nghĩa là nó đ−ợc sử dụng để ghi lại địa chỉ IP Destination trong header của một gói tin. Nếu một gói tin thoả điều kiện của luật, và chịu tác động của hành động DNAT, gói tin và tất cả các gói tin theo sau trong cùng dòng dữ liệu sẽ đ−ợc chuyển đổi địa chỉ IP đích trong header của chúng và sau đó đ−ợc dẫn đ−ờng tới giao tiếp mạng, máy hay mạng đ−ợc yêu cầu. Hành động này có thể rất hữu dụng, thí dụ nh− trong tr−ờng hợp ta có một máy chủ web nằm trong LAN không có địa chỉ thật. Ta có thể thông báo cho firewall chuyển tiếp tất cả các gói tin đi vào cổng HTTP của bản thân nó (có địa chỉ thật) tới máy chủ web trong LAN.
Hành động DNAT chỉ có thể đ−ợc sử dụng trong các chuỗi luật PREROUTING và OUTPUT trong bảng nat.
Lựa chọn --to-destination đ−ợc sử dụng cùng với DNAT để thông báo cho DNAT biết địa chỉ IP sẽ đ−ợc sử dụng thay thế cho địa chỉ đích đến trong header
Đồ án tốt nghiệp
của gói tin. Ta có thể chỉ ra một dãy các địa chỉ đích, phân cách nhau bởi ký tự '- ', mỗi dòng dữ liệu sẽ sử dụng ngẫu nhiên một địa chỉ trong dãy địa chỉ đ−ợc chỉ ra. Tất cả các gói tin trong cùng một dòng dữ liệu sẽ sử dụng cùng một địa chỉ IP. Ta cũng có thể bổ sung thêm một cổng hay dãy các cổng muốn chuyển h−ớng gói tin tới những cổng đó. Để thêm cổng, khai báo thêm :port vào địa chỉ mà ta muốn DNAT các gói tin; lựa chọn này chỉ hợp lệ nếu trong luật có chỉ ra điều kiện -p tcp hay -p udp.
Thí dụ: iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80j DNAT --to-destination 192.168.1.1-192.168.1.10
Khi sử dụng DNAT, các máy trong mạng cục bộ có thể không truy nhập đ−ợc máy dịch vụ do vấn đề dẫn đ−ờng. Do vậy, giải pháp đơn giản cho vấn đề này là sử dụng hành động SNAT cho tất cả các gói đi vào firewall.
Thí dụ: iptables -t nat -A POSTROUTING -p tcp --dst $HTTP_IP --dport 80 -j SNAT --to-source $LAN_IP
Ngoài những điều kiện, hành động nêu trên, iptables còn có rất nhiều điều kiện và hành động khác nữa; để biết chi tiết về chúng, ta có thể tham khảo qua lệnh man.
6.2.5.5 Các ví dụ
D−ới đây là một số thí dụ minh hoạ về việc sử dụng các điều kiện và hành động đặc biệt hữu ích trong công việc xây dựng một firewall. Giả sử rằng mạng cục bộ có địa chỉ là $LOCAL_IP, firewall sử dụng hai card mạng: một card mạng, $EXT_ETH, nối ra Internet và một card mạng, $INT_ETH, nối với mạng