标题:iptables应用汇总 出处:沧海一粟 时间:Thu, 09 Feb 2012 00:34:35 +0000 作者:jed 地址:http://www.dzhope.com/post/867/ 内容: 本文仅对iptables的使用做一些总结,如果您对原理感兴趣,请参阅其它文档,谢谢! 1. 匹配方式 内建匹配方式: 1.1 匹配网络接口 -i/-o,如 -i eth0 -o eth1 1.2 匹配协议 -p,如 -p tcp、-p udp、-p icmp、-p all 1.3 匹配地址 -s/-d,如 -s 192.168.1.188 -d 202.96.134.133、-s 192.168.1.0/24、-d www.google.cn (名称实际上会域名解析出地址) 1.4 匹配端口 --sport/--dport,如 --sport 1024、--dport 21:25(最多匹配两个) 内建匹配方式的高级应用: -p tcp --dport 21 --syn --m state --state NEW -j ACCEPT -p tcp --dport 21 --tcp-flags ALL SYN,FIN -j DROP -p tcp --dport 21 --tcp-flags SYN,FIN SYN,FIN -j DROP -p imcp --icmp-type 8 -j ACCEPT 模块匹配方式: 1.5 匹配MAC地址 -m mac --mac-source/--mac-dest,如 -m mac --mac-source 00-21-5D-A5-87-8C 1.6 匹配IP地址范围 -m iprange --src-range/--dst-range,如 -m iprange --src-range 192.168.1.1-192.168.1.254 1.7 匹配多个端口 -m multiport --sports/--dports/--ports,如 -m multiport --sports 21,25,80,110(最多匹配15个) 1.8 匹配会话状态 -m state --state,如 -m state --state NEW/ESTABLISHED/RELATED/INVALID 1.9 匹配TTL -m ttl --ttl-eq/--ttl-lt/--ttl-gt, 如 -m ttl --ttl-eq 64 (WINDOWS) 1.10 匹配包类型 -m pkttype --pkt-type,如 -m pkttype --pkt-type unicast/multicast/boradcast 1.11 匹配包长度 -m length --length,如 -m length --length 60[:80] -p imcp --icmp-type 8 1.12 匹配字符串 -m string --algo bm --string "system32" 1.13 匹配发包速率 -m limit --limit 6/m --limit-burst 10 1.14 匹配最近记录 -m recent 参数比较多,举例中说明 recent模块默认只能记录100个IP来源,且为每个来源记录20笔记录,可以使用下面的语句修改 modprobe ipt_recent ip_list_tot=16384 modprobe ipt_recent ip_pkt_list_tot=50 或 modprobe ipt_recent ip_list_tot=16384 ip_pkt_list_tot=50 综合应用举例: 打开本机的SSH和WEB服务 IPT="/sbin/iptables -t filter" $IPT -F $IPT -X (只有先清除所有规则,才能清用户链) $IPT -Z (重置计数器) $IPT -P OUTPUT ACCEPT $IPT -P INPUT DROP $IPT -A INPUT -p all -m state --state INVALID DROP $IPT -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A INPUT -p tcp -m multiport --dports 22,80 [-m state --state NEW --syn] -j ACCEPT 仅允许长度为168的imcp ping包进来 $IPT -A INPUT -p icmp --icmp-type 8 -m length --length 140 -j ACCEPT (168-28=140) $IPT -A INPUT -p icmp -j DROP 控制本机接收imcp ping包的频率,如果超过每分钟10个,则以后每分钟仅允许6个, 如果发送端停止发包,则在10*6=60s后会完全解除这个限制 $IPT -A INPUT -p icmp --icmp-type 8 -m limit --limit 6/m --limit-burst 10 -j ACCEPT $IPT -A INPUT -p icmp -j DROP 接下来,使用recent模块完成上面的功能 $IPT -A INPUT -p icmp --icmp-type 8 -m recent --name icmp_db --rcheck --second 60 --hitcount 6 -j DROP $IPT -A INPUT -p icmp --icmp-type 8 -m recent --name icmp_db --set $IPT -A INPUT -p icmp --icmp-type 8 -j ACCEPT 这样将在 /proc/net/xt_recent/目录下建立 icmp_db数据库,可以使用cat icmp_db查看内容 如果只要来源不停止发包,就让他永远无法通法,可以使用--update 锁定PortScan攻击者IP,使其在10分钟之内不得再访问本机任何服务; modprobe ipt_recent ip_list_tot=1024 ip_pkt_list_tot=50 $IPT -A INPUT -p tcp --syn -m recent --name PortScan --update --second 600 --hitcount 10 -j DROP $IPT -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A INPUT -p tcp --syn -m state --state NEW -m multiport --dports 22,25,110 -j ACCEPT $IPT -A INPUT -p tcp --syn -m recent --name PortScan --set 也要以考虑改变规则的位置来影响防御效果; 注意:规则的排列顺序也是很重要的,请将匹配频率最高的移动前面,可以iptables -L -n -v查看; 2. 处理方法 2.1 RETURN 只能用于用户链中,用于返回父链,如: $IPT -N ICMP $IPT -A ICMP -p icmp -j DROP $IPT -A ICMP -p all -j RETURN $IPT -A INPUT -p icmp -j ICMP $IPT -A INPUT -p all -j ACCEPT 2.2 REJECT -j REJECT --reject-with icmp-net-unreachable/icmp-host-unreachable/icmp-port-unreachable 2.3 LOG -j LOG 默认会保存到 /var/log/message 在/etc/syslog.conf后加入一行 kern.=alert /var/log/netfilter 然后这样使用 -j LOG --log-level alert [--log-prefix "ICMP-PREFIX"] 2.4 REDIRECT 可以将包转给自己的特定端口,下面的例子用于代理服务器 iptables -t nat -A PREROUTING -d 10.1.1.201 -p tcp --dport 80 -j REDIREDT --to-port 3124 3. 路由功能 系统默认是不打开路由功能的,下面提供两种方法: 方法一:编辑/etc/sysctl.conf,修改 net.ipv4.ip_forward=1(默认是0) 方法二:echo "1" > /proc/sys/net/ipv4/ip_forward $IPT -P FORWARD DROP $IPT -A FORWARD -s 192.168.1.0/24 -j ACCEPT $IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT 4. NAT功能 IPT="iptables -t nat" $IPT -F 4.1 一对多NAT(IP共享) $IPT -A POSTROUTING -o eth1 -s 192.168.1.0/24 -j SNAT --to 10.0.0.201 4.2 多对多NAT $IPT -A POSTROUTING -o eth1 -s 192.168.1.0/24 -j SNAT --to 10.0.0.201-10.0.0.205 4.3 一对一NAT $IPT -A POSTROUTING -o eth1 -s 192.168.1.201 -j SNAT --to 10.0.0.201 $IPT -A PREROUTING -i eth1 -d 10.0.0.201 -j DNAT --to 192.168.1.201 4.4 NAPT $IPT -A PREROUTING -i eth1 -d 10.0.0.201 -p tcp --dport 80 -j DNAT --to 192.168.1.201:80 $IPT -A POSTROUTING -o eth1 -s 192.168.1.0/24 -j SNAT --to 10.0.0.201 4.5 负载均衡 $IPT -A PREROUTING -i eth1 -d 10.0.0.201 -j DNAT --to 192.168.1.201-192.168.1.205 5. “连接追踪” 当我们使用-m state模块功能的时候,iptables除了装载xt_state.ko模块外,还装载ip_conntrack.ko,接着它会建立 /proc/net/ip_conntrack数据库 保存各种超时的文件在 /proc/sys/net/ipv4/netfilter/* 如 ip_conntrack_tcp_timeout_syn_sent 120s ip_conntrack_tcp_timeout_syn_recv 60s ip_conntrack_tcp_timeout_syn_established 432000s ip_conntrack_udp_timeout 30s ip_conntrack_udp_timeout_stream 180s ip_conntrack_ICMP_timeout 30s 追踪的最大连接数 /proc/sys/net/ipv4/ip_conntrack_max 系统默认为 最大内存(K)/16K/(系统位数/32),若 512M内存,则默认的最大连接数为 32768 要修改这个限制,必须以手动方式加载 ip_contrack模块,命令为: modprobe ip_conntrack hashsize=16384 每个hashsize可容纳8条连接,那么修改后连接数为16384*8=131072 每条连接消耗内存为228B,可以查看/var/log/message ip_conntrack加载日志 131072*228/(1024*1024)=28.5M 可以使用raw table功能来取消某些连接的追踪功能,如下 iptables -t raw -A PREROUTING -i eth0 -o eth1 -p tcp --dport 25 -j NOTRACK iptables -t raw -A PREROUTING -i eth1 -o eth0 -p tcp --sport 25 -j NOTRACK 这样将使包跳过NAT和ip_contrack模块,造成不能NAT功能; 对于复杂的通讯协议,必须加载扩展模块,如ftp,必须加载 modprobe ip_conntrack_ftp modprobe ip_nat_ftp 6. DDOS攻击防御 调整系统核心参数 /etc/sysctl.conf 6.1 net.ipv4.tcp_synack_retries=3(默认为5) echo "3" > /proc/sys/net/ipv4/tcp_retries 6.2 net.ipv4.tcp_max_syn_backlog=2046(默认为1024) echo "2048" > /proc/sys/net/ipv4/tcp_max_tcp_backlog 6.3 net.ipv4.tcp_syncookies=1(默认为0) echo "1" > /proc/sys/net/ipv4/tcp_syncookies 一个有效的防御脚本: #!/bin/bash IPT="/sbin/iptables -t filter" modprobe ipt_recent ip_list_tot=16384 $IPT -F $IPT -X $IPT -Z $IPT -N SYN_FLOOD $IPT -A SYN_FLOOD -p tcp --syn --dport 80 -m recent --name synflood_db --update --second 120 --hitcount 1 -j ACCEPT $IPT -A SYN_FLOOD -p tcp --syn --dport 80 -m recent --name synflood_db --set $IPT -A SYN_FLOOD -p tcp --syn --dport 80 -j DROP $IPT -A INPUT -p tcp --syn --dport 80 -m limit --limit 1/m --limit-burst 300 -j ACCEPT $IPT -A INPUT -p tcp --syn --dport 80 -j SYN_FLOOD Generated by Bo-blog 2.1.1 Release