本文仅对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