Linux đi kèm với một tường lửa gọi là Netfilter. Theo trang web chính thức dự án: netfilter là một tập hợp các hook bên trong hạt nhân Linux, cho phép các mô-đun hạt nhân đăng ký chức năng callback với ngăn xếp (stack) mạng. Một đăng ký của chức năng callback sau đó được gọi trở lại cho mỗi gói mà đi qua các hook tương ứng trong ngăn xếp mạng. Linux bases firewall được điều khiển bởi chương trình được gọi là iptables để xử lý lọc cho IPv4, và ip6tables xử lý lọc cho IPv6. Ví dụ về các quy tắc iptables Hầu hết các lệnh được liệt kê trong bài viết này được viết với giả định rằng sẽ được thực hiện bởi user root chạy bash hoặc bất kỳ shell hiện đại khác. Đừng gõ lệnh trên hệ thống từ xa như nó sẽ ngắt kết nối truy cập của bạn. Đối với mục đích trình bày, tôi đã sử dụng RHEL 6.x, nhưng các lệnh sau đây sẽ làm việc với bất kỳ distro Linux hiện đại mà có sử dụng netfliter. # 1: Hiển thị trạng thái Firewall của bạn Gõ lệnh sau đây sử dụng user root: Mã: iptables -L -n -v Ví dụ kết quả đầu ra: Mã: Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Kết quả đầu ra ở trên chỉ ra rằng tường lửa không hoạt động. Ví dụ sau đây cho thấy một bức tường lửa đang hoạt động: Mã: iptables -L -n -v Ví dụ kết quả đầu ra: Mã: Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID 394 43586 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 93 17292 ACCEPT all -- br0 * 0.0.0.0/0 0.0.0.0/0 1 142 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- br0 br0 0.0.0.0/0 0.0.0.0/0 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID 0 0 TCPMSS tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x06/0x02 TCPMSS clamp to PMTU 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 wanin all -- vlan2 * 0.0.0.0/0 0.0.0.0/0 0 0 wanout all -- * vlan2 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- br0 * 0.0.0.0/0 0.0.0.0/0 Chain OUTPUT (policy ACCEPT 425 packets, 113K bytes) pkts bytes target prot opt in out source destination Chain wanin (1 references) pkts bytes target prot opt in out source destination Chain wanout (1 references) pkts bytes target prot opt in out source destination Giải thích: - L: Danh sách các quy tắc. - v: Hiển thị thông tin chi tiết. Tùy chọn này hiển thị tên interface, các tùy chọn quy tắc, và các TOS mask. Các gói dữ liệu và byte cũng được liệt kê, với hậu tố 'K', 'M' hoặc 'G' cho 1000, 1.000.000 và 1.000.000.000 tương ứng. - n: Hiển thị địa chỉ IP và cổng ở định dạng số. Không sử dụng DNS để phân giải tên. Điều này sẽ tăng tốc độ. # 1.1: Kiểm tra tường lửa với số dòng, hãy nhập: Mã: iptables -n -L -v --line-numbers Ví dụ kết quả đầu ra: Mã: Chain INPUT (policy DROP) num target prot opt source destination 1 DROP all -- 0.0.0.0/0 0.0.0.0/0 state INVALID 2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 4 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy DROP) num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 2 DROP all -- 0.0.0.0/0 0.0.0.0/0 state INVALID 3 TCPMSS tcp -- 0.0.0.0/0 0.0.0.0/0 tcp flags:0x06/0x02 TCPMSS clamp to PMTU 4 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 5 wanin all -- 0.0.0.0/0 0.0.0.0/0 6 wanout all -- 0.0.0.0/0 0.0.0.0/0 7 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 Chain OUTPUT (policy ACCEPT) num target prot opt source destination Chain wanin (1 references) num target prot opt source destination Chain wanout (1 references) num target prot opt source destination Bạn có thể sử dụng số dòng để xóa hoặc chèn quy tắc mới vào tường lửa. # 1.2: Để hiển thị chuỗi quy tắc INPUT hoặc OUTPUT, hãy nhập: Mã: iptables -L INPUT -n -v iptables -L OUTPUT -n -v --line-numbers # 2: Stop/Start/Restart Firewall Nếu bạn đang sử dụng CentOS/RHEL/ Fedora Linux, hãy nhập: Mã: service iptables stop service iptables start service iptables restart Bạn có thể sử dụng lệnh iptables riêng của mình để ngăn chặn tường lửa và xóa tất cả các quy tắc: Mã: iptables –F iptables -X iptables -t nat –F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT Giải thích: -F: Xóa (flushing) tất cả các quy tắc. -X: Xóa chuỗi. -t table_name: Chọn bảng (gọi là nat hay mangle) và xóa/flush các quy tắc. -P: Thiết lập chính sách mặc định (như DROP, REJECT, hoặc ACCEPT). # 3: Xóa các quy tắc tường lửa Để hiển thị số dòng cùng với các thông tin khác về qua tắc hiện hành, hãy nhập: Mã: iptables -L INPUT -n --line-numbers iptables -L OUTPUT -n --line-numbers iptables -L OUTPUT -n --line-numbers | less iptables -L OUTPUT -n --line-numbers | grep 202.54.1.1 Bạn sẽ nhận được danh sách các IP. Nhìn vào các số ở bên trái, sau đó sử dụng số để xóa nó. Ví dụ xóa dòng 4, hãy nhập: Mã: iptables -D INPUT 4 Hoặc tìm nguồn IP 202.54.1.1 và xóa khỏi quy tắc: Mã: iptables -D INPUT -s 202.54.1.1 -j DROP Giải thích: -D: Xóa một hoặc nhiều quy tắc từ chuỗi lựa chọn # 4: Chèn quy Firewall Để chèn một hoặc nhiều quy tắc trong chuỗi được chọn sử dụng cú pháp sau đây. Đầu tiên tìm ra số dòng, hãy nhập: Mã: iptables -L INPUT -n –line-numbers Ví dụ kết quả đầu ra: Mã: Chain INPUT (policy DROP) num target prot opt source destination 1 DROP all -- 202.54.1.1 0.0.0.0/0 2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state NEW,ESTABLISHED Để chèn quy tắc giữa 1 và 2, hãy nhập: Mã: iptables -I INPUT 2 -s 202.54.1.2 -j DROP Để xem quy tắc được cập nhật, hãy nhập: Mã: iptables -L INPUT -n --line-numbers Ví dụ kết quả đầu ra: Mã: Chain INPUT (policy DROP) num target prot opt source destination 1 DROP all -- 202.54.1.1 0.0.0.0/0 2 DROP all -- 202.54.1.2 0.0.0.0/0 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state NEW,ESTABLISHED # 5: Lưu các quy tắc tường lửa Để lưu quy tắc tường lửa trên CentOS/RHEL/Fedora Linux, hãy nhập: Mã: service iptables save Trong ví dụ này,drop một IP và lưu quy tắc tường lửa: Mã: iptables -A INPUT -s 202.5.4.1 -j DROP service iptables save Đối với tất cả các distro khác sử dụng lệnh iptables-save: Mã: iptables-save > /root/my.active.firewall.rules cat /root/my.active.firewall.rules # 6: Khôi phục quy tắc tường lửa Để khôi phục lại quy tắc tường lửa từ một tập tin gọi là /root/my.active.firewall.rules, hãy nhập: Mã: iptables-restore < /root/my.active.firewall.rules Để khôi phục lại quy tắc tường lửa trên CentOS/RHEL/Fedora Linux, hãy nhập: Mã: service iptables restart # 7: Thiết lập chính sách tường lửa mặc định Để drop tất cả lưu lượng: Mã: iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP iptables -L -v –n #### you will not able to connect anywhere as all traffic is dropped ### # 7.1: Chỉ Block lưu lượng đi vào Để drop tất cả các gói đi vào hoặc chuyển tiếp, nhưng vẫn cho phép lưu lượng gửi đi, hãy nhập: Mã: iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT iptables -L -v -n # 8: Drop Private Network Address trên public interface Các gói tin với địa chỉ nguồn không định tuyến sẽ bị từ chối bằng cách sử dụng cú pháp sau: Mã: iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP # 8.1: IPv4 Address Ranges đối với Private Networks (chắc chắn rằng bạn chặn chúng trên public interface) 10.0.0.0/8 -j (A) 172.16.0.0/12 (B) 192.168.0.0/16 (C) 224.0.0.0/4 (MULTICAST D) 240.0.0.0/5 (E) 127.0.0.0/8 (LOOPBACK) # 9: Block một địa chỉ IP (IP BLOCK) Để chặn một địa chỉ ip kẻ tấn công được gọi là 1.2.3.4, hãy nhập: Mã: iptables -A INPUT -s 1.2.3.4 -j DROP iptables -A INPUT -s 192.168.0.0/24 -j DROP # 10: Block yêu cầu cổng gửi đến (BLOCK PORT) Để chặn tất cả các yêu cầu dịch vụ trên cổng 80, hãy nhập: Mã: iptables -A INPUT -p tcp --dport 80 -j DROP iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP Để chặn cổng 80 chỉ dành cho một địa chỉ ip 1.2.3.4, hãy nhập: Mã: iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP # 11: Block IP địa chỉ gửi đi Để chặn giao thông gửi đi đến một host hoặc domain nào đó như aluhost.com, hãy nhập: Mã: host -t a aluhost.com Ví dụ kết quả đầu ra: Mã: aluhost.com has address 201.211.121.105 Lưu ý địa chỉ IP của nó và gõ lệnh sau đây để chặn tất cả lưu lượng gửi đi để 201.211.121.105: Mã: iptables -A OUTPUT -d 201.211.121.105 -j DROP Bạn có thể sử dụng một mạng con như sau: Mã: iptables -A OUTPUT -d 192.168.1.0/24 -j DROP iptables -A OUTPUT -o eth1 -d 192.168.1.0/24 -j DROP # 11.1: Ví dụ - Block domain Facebook.com Đầu tiên, tìm hiểu tất cả các địa chỉ IP của facebook.com, hãy nhập: Mã: host -t www.facebook.com Ví dụ kết quả đầu ra: Mã: www.facebook.com has address 69.171.228.40 Tìm CIDR cho 69.171.228.40, hãy nhập: Mã: whois 69.171.228.40 | grep CIDR Ví dụ kết quả đầu ra: Mã: CIDR: 69.171.224.0/19 Để ngăn chặn truy cập gửi đi đến www.facebook.com, hãy nhập: Mã: iptables -A OUTPUT -p tcp -d 69.171.224.0/19 -j DROP Bạn cũng có thể sử dụng tên miền, hãy nhập: Mã: iptables -A OUTPUT -p tcp -d www.facebook.com -j DROP iptables -A OUTPUT -p tcp -d facebook.com -j DROP # 12: Log and Drop Packets Nhập lệnh dưới đây để log và block IP giả mạo trên public interface gọi là eth1 Mã: iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: " iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP Theo mặc định tất cả mọi thứ được ghi vào tập tin /var/log/messages. Mã: tail -f /var/log/messages grep --color 'IP SPOOF' /var/log/messages # 13: Log và drop các gói với giới hạn số lượng các mục log Tùy chọn –m limit có thể giới hạn số lượng các mục bản log được tạo ra mỗi lần. Điều này được sử dụng để ngăn chặn flooding tập tin log của bạn. Để log và drop spoofing mỗi 5 phút, trong bursts của 7 mục mới nhất . Mã: iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: " iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP # 14: Drop hoặc Cho phép lưu lượng từ địa chỉ MAC Sử dụng cú pháp sau: Mã: iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP ## *only accept traffic for TCP port # 8080 from mac 00:0F:EA:91:04:07 * ## iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT # 15: Block hay Allow yêu cầu ICMP Ping Gõ lệnh sau để chặn các yêu cầu ICMP ping: Mã: iptables -A INPUT -p icmp --icmp-type echo-request -j DROP iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP Phản ứng Ping cũng có thể được giới hạn trong mạng hoặc máy chủ nhất định: Mã: iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT Một số câu lệnh sau đây chỉ chấp nhận từng loại về các yêu cầu ICMP: Mã: ### ** assumed that default INPUT policy set to DROP ** ############# iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT ## ** all our server to respond to pings ** ## iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # 16: Mở rộng phạm vi của các cổng Sử dụng cú pháp sau đây để mở một loạt các cổng: Mã: iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT # 17: Mở rộng phạm vi các địa chỉ IP Sử dụng cú pháp sau đây để mở một loạt các địa chỉ IP: Mã: ## only accept connection to tcp port 80 (Apache) if ip is between 192.168.1.100 and 192.168.1.200 ## iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT Mã: ## nat example ## iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.1.20-192.168.1.25 # 18: Thiết lập kết nối và Restaring Firewall Khi bạn khởi động lại iptables nó sẽ drop các kết nối thiết lập cũng như là nó unload các module từ các hệ thống như RHEL/Fedora/CentOS Linux. Chỉnh sửa /etc/sysconfig/iptables-config và thiết lập IPTABLES_MODULES_UNLOAD như sau: Mã: IPTABLES_MODULES_UNLOAD = no # 19: Help Iptables Flooding My Server Screen Sử dụng crit log level để gửi tin nhắn đến một tập tin log thay vì giao diện điều khiển: Mã: iptables -A INPUT -s 1.2.3.4 -p tcp --destination-port 80 -j LOG --log-level crit # 20: Chặn hoặc mở cổng chung Các cú pháp sau sẽ mở và đóng cổng chung TCP và UDP: Mã: Replace ACCEPT with DROP to block port: ## open port ssh tcp port 22 ## iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT ## open cups (printing service) udp/tcp port 631 for LAN users ## iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 631 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT ## allow time sync via NTP for lan users (open udp port 123) ## iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT ## open tcp port 25 (smtp) for all ## iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT # open dns server ports for all ## iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT ## open http/https (Apache) server port to all ## iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT ## open tcp port 110 (pop3) for all ## iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT ## open tcp port 143 (imap) for all ## iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT ## open access to Samba file server for lan users only ## iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT ## open access to proxy server for lan users only ## iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j ACCEPT ## open access to mysql server for lan users only ## iptables -I INPUT -p tcp --dport 3306 -j ACCEPT # 21: Hạn chế số lượng kết nối song song đến một Server Per Client IP Bạn có thể sử dụng mô-đun connlimit để đặt các hạn chế như vậy. Để cho phép 3 kết nối ssh trên máy chủ của khách hàng, hãy nhập: Mã: iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT Thiết lập HTTP requests đến 20: Mã: iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP Giải thích, --connlimit-above 3: Phù hợp nếu số lượng kết nối hiện có là trên 3. --connlimit-mask 24: Group hosts sử dụng chiều dài tiền tố. Đối với IPv4, đây phải là một số từ (bao gồm) 0 và 32. # 22: HOWTO: Sử dụng iptables như một chuyên gia Để biết thêm thông tin về iptables, xin vui lòng xem trang hướng dẫn bằng cách gõ man iptables từ dòng lệnh: Mã: man iptables Bạn có thể thấy sự giúp đỡ bằng cách sử dụng cú pháp sau: Mã: iptables -h Để xem các trợ giúp với các lệnh và các mục tiêu cụ thể, hãy nhập: Mã: iptables -j DROP -h # 22.1: Kiểm tra tường lửa của bạn Tìm hiểu xem cổng nào đang mở hay không, hãy nhập: Mã: netstat -tulpn Tìm hiểu xem tcp port 80 mở hay không, hãy nhập: Mã: netstat -tulpn | grep :80 Nếu cổng 80 không mở cửa, khởi động Apache, hãy nhập: Mã: service httpd start Hãy chắc chắn rằng iptables cho phép truy cập vào cổng 80: Mã: iptables -L INPUT -v -n | grep 80 Mở cổng 80 bằng cách sử dụng iptables cho tất cả người dùng: Mã: iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT service iptables save Sử dụng lệnh telnet để xem tường lửa có cho phép kết nối đến cổng 80: Mã: telnet www.aluhost.com 80 Ví dụ kết quả đầu ra: Mã: Trying 201.211.121.105... Connected to www.aluhost.com. Escape character is '^]'. ^] telnet> quit Connection closed. Bạn có thể sử dụng nmap để thăm dò máy chủ của riêng bạn bằng cách sử dụng cú pháp sau: Mã: nmap -sS -p 80 www.aluhost.com Ví dụ kết quả đầu ra: Mã: Starting Nmap 5.00 ( http://nmap.org ) at 2011-12-13 13:19 IST Interesting ports on www.aluhost.com (201.211.121.105): PORT STATE SERVICE 80/tcp open http Nmap done: 1 IP address (1 host up) scanned in 1.00 seconds Tôi cũng khuyên bạn nên cài đặt và sử dụng sniffer như tcpdupm và ngrep để kiểm tra cài đặt tường lửa của bạn.