扩展模块分为二种:
(1)隐式扩展:在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,会自动加载对应模块
(2)显式扩展:必须使用-m选项指明要调用的扩展模块的扩展机制,要手动加载扩展模块
使用帮助:
CentOS 6: man iptables
CentOS 7: man iptables-extensions
环境准备:
192.168.12.27、192.168.12.12
在192.168.12.27配置iptables规则并安装httpd和mariadb
iptables -F
iptables -A INPUT -s 192.168.12.1 -j ACCEPT #允许windows访问
iptables -A INPUT -i lo -j ACCEPT #允许本机访问
iptables -A INPUT -j REJECT #拒绝所有
隐式模块
1、添加端口
允许192.168.12.12访问本机的80和3306端口,一条规则只能例外一个端口,如果端口相连可以写在一条规则
中,
iptables -I INPUT 3 -s 192.168.12.12 -p tcp --dport 80 -j ACCEPT
iptables -I INPUT 3 -s 192.168.12.12 -p tcp --dport 81:83 -j ACCEPT #添加3个连续的端口
2、拒绝tcp的第一次握手
iptables -D INPUT 3 删除上一步的规则
iptables -I INPUT 3 -s 192.168.12.12 -j ACCEPT
iptables -I INPUT 3 -s 192.168.12.12 -p tcp --syn -j REJECT
curl测试就不通了,但是ping通,并且upd协议也可以使用
3、192.168.12.27可以ping通192.168.12.12,反过来不通
iptables -D INPUT 3
iptables -D INPUT 3
iptables -I INPUT 3 -p icmp --icmp-type 0 -j ACCEPT #允许响应报文通过,不然icmp报文可以出去无法回来。
显式模块
1、multiport扩展
使用multiport扩展添加,以离散方式定义多端口匹配,最多指定15个端口
iptables -I INPUT 3 -s 192.168.12.12 -p tcp -m multiport --dports 80,3306 -j ACCEPT
2、mac扩展
适用于:PREROUTING, FORWARD,INPUT chains
iptables -D INPUT 3 #删除第三条规则
iptables -I INPUT 3 -m mac --mac-source 00:0c:29:36:a7:c3 -j ACCEPT
4、string扩展
对报文中的应用层数据做字符串模式匹配检测 --algo {bm|kmp} 字符串匹配检测算法
--from offset 开始偏移 应用层数据库开始是从传输层后除去帧的(8+6+6+2)22字节,IP头固定20字节,tcp40个字节,跳过62个
--to offset 结束偏移
建立二个页面
echo www.google.com > /var/www/html/test.html
echo hello > /var/www/html/index.html
iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --string "google" -j REJECT
此处添加的是OUTPUT,因为客户端请求报文中没有google,是禁止本机带有google字符被访问,测试主页可以访问
5、time扩展
根据将报文到达的时间与指定的时间范围进行匹配
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss] 时间
--timestop hh:mm[:ss]
[!] --monthdays day[,day...] 每个月的几号
[!] --weekdays day[,day...] 星期几,1 – 7 分别表示星期一到星期日
--kerneltz:内核时区,不建议使用,CentOS7系统默认为UTC
注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)
示例9点到18点上班时间可以访问,默认是UTC
iptables -I INPUT 3 -m time --timestart 1:00 --timestop 10:00 -j ACCEPT
修改时间测试可以访问
6、connlimit扩展
根据每客户端IP做并发连接数数量匹配
可防止Dos(Denial of Service,拒绝服务)***
--connlimit-upto #:连接的数量小于等于#时匹配
--connlimit-above #:连接的数量大于#时匹配
通常分别与默认的拒绝或允许策略配合使用
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 100 -j REJECT #tcp80并发连接数达到100拒绝
如果tcp连接数达到100禁止访问,该命令能当作简单防护***,如果通过多个ip发起请求就无法禁止了(DDoS)
7、limit扩展
基于收发报文的速率做匹配
令牌桶过滤器
--limit #[/second|/minute|/hour|/day]
--limit-burst number
每分钟ping20次前10个不限制
iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 10 -j REJECT
8、state扩展
根据”连接追踪机制“去检查连接的状态,较耗资源,conntrack机制:追踪本机上的请求和响应之间的关系
状态有如下几种:
NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因
此,将其识别为第一次发出的请求
ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之
前期间内所进行的通信状态
RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连
接与命令连接之间的关系
INVALID:无效的连接,如flag标记不正确
UNTRACKED:未进行追踪的连接,如raw表中关闭追踪
已经追踪到的并记录下来的连接信息库
/proc/sys/net/nf_conntrack
调整连接追踪功能所能够容纳的最大连接数量
/proc/sys/net/nf_conntrack_max 默认65536,工作中如果设置连接追踪根据需要调大
vi /etc/sysctl.conf
net.nf_conntrack_max=88888
sysctl -p
不同的协议的连接追踪时长
/proc/sys/net/netfilter/
先用另一个主机远程到当前主机
iptables -I INPUT 3 -p tcp --dport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT
已经连接的可以保持连接,退出再次连接的用户拒绝
9、开放被动模式的ftp服务
ftp被动模式的端口号是不确定,
iptables -I INPUT 3 -p tcp --dport 21 -j ACCEPT #只添加21端口可以连接,不能查看目录内容
modprobe nf_conntrack_ftp #加载可以识别ftp协议的模块
iptables -I INPUT 3 -m state --state ESTABLISHED,RELATED -j ACCEPT #使用ftp的连接跟踪模块
10、iptables的日志功能
ptables -I INPUT 3 -s 192.168.12.12 -j LOG --log-prefix "from 12.12"
iptables的规则优化
任何不允许的访问,应该在请求到达时给予拒绝
规则在链接上的次序即为其检查时的生效次序
基于上述,规则优化
1 安全放行所有入站和出站的状态为ESTABLISHED状态连接
2 谨慎放行入站的新请求
3 有特殊目的限制访问功能,要在放行规则之前加以拒绝
4 同类规则(访问同一应用),匹配范围小的放在前面,用于特殊处理
5 不同类的规则(访问不同应用),匹配范围大的放在前面
6 应该将那些可由一条规则能够描述的多个规则合并为一条
7 设置默认策略,建议白名单(只放行特定连接)
1) iptables -P,不建议
2) 建议在规则的最后定义规则做为默认策略