iptables扩展功能需要配合模块实现; 隐式扩展:在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块,即 有的模块只需要指定协议名称,不需要指定模块名称,这样在定义协议时,间接的使用了模块,如TCP、UDP、icmp协议,因为协议名与模块名同名; 显示扩展:必须使用-m选项指明要调用的扩展模块的扩展机制(手动指定引用的模块名称),要手动加载扩展模块 rpm -ql iptables #查看iptables所支持的模块
iptables -A INPUT -s 192.168.39.6 -p tcp --dport 80 -j ACCEPT #filter表input链添加一条规则,允许192.168.39.6通过tcp协议访问本机的80端口;-p指定tcp协议时间接使用了tcp模块 iptables -A INPUT -s 192.168.39.6 -p tcp --dport 80:90 -j ACCEPT #允许192.168.39.6通过tcp协议访问本机的80-90之间的所有端口;连续的端口号只会占用一条规则 iptables -A INPUT -s 192.168.39.100 -p tcp --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT #filter表input链添加规则,指定192.168.39.100三次捂手的第一次握手直接拒绝;指定6个标记位,三次握手的第一次握手只有SYN标记位为1,其余都为0,所以最后的SYN表示为SYN为1;标记位只属于TCP协议,所以需要指定协议为TCP;第二次握手为SYN,ACK为1,其余为0;第三次握手为ACK为1,其余为0;并且标记位不存在6个都为1或者都为0的报文 iptables -A INPUT -s 192.168.39.100 -p tcp --syn -j REJECT #--syn也表示三次握手的第一次握手,即只检查6个标记位中的4个,并且syn位为1
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT #filter表input链添加规则,允许客户端ping的响应报文;icmp协议中,type为0的表示为响应报文,为8的表示为请求报文;间接引用了icmp模块
iptables -A INPUT -p tcp -m multiport --dports 80,3306 -j ACCEPT #filter表input链添加规则,允许客户端通过TCP协议访问3306和80端口;multiport模块的作用是指定多个不连续的端口,并且只会生成一条规则,不会生成多余的规则;离散端口最多能指定15个 iptables -A INPUT -p tcp -m multiport --ports 80,3306 -j ACCEPT #--ports包含了--sports及--dports
--src-range from[-to] 源IP地址范围 --dst-range from[-to] 目标IP地址范围 iptables -A INPUT -d 192.168.39.101 -p tcp --dport 80 -m iprange --src-range 192.168.39.5-192.168.39.10 -j REJECT #拒绝192.168.39.5至192.168.39.10通过TCP访问本机的192.168.39.101的80端口;通过iprange模块指定IP地址范围
此模块只支持源MAC,不支持目标MAC,因为目标MAC地址如果不是当前服务器的MAC地址,网卡会直接抛弃报文 iptables -A INPUT -m mac --mac-source 00:50:56:12:34:56 -j ACCEPT #filter表input链添加规则,允许客户端网卡的MAC地址为00:50:56:12:34:56的访问
iptables虽然不是应用层防火墙,但是也可以通过string模块分析数据报文中的特定关键字 --algo {bm|kmp} 字符串匹配检测算法 --from offset 指定数据帧的开始偏移位置 --to offset 指定数据帧的结束偏移位置 --string pattern 要检测的字符串模式 数据帧中数据链路层头部中有8个字节的前导信息、6个字节的目标MAC和6个字节的源MAC、2个字节的type类型;IP头固定20个字节;TCP头固定20个字节,即可以跳过数据报文中的前62个字节开始检查特定的字符串 iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --string "google" -j REJECT #filter表output链添加规则,拒绝客户端访问的站点页面内容中带有google关键字的页面;此规则需要设置在output链上,此规则只针对站点页面的内容,所以客户端在访问时,请求报文中是不带有站点页面内容的,只有回复报文中才包含页面内容,并且回复报文的源端口为本机的80端口
通过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,设置规则时需要+8小时;centos6不支持--kerneltz,centos6默认就是当地时间,不需要进行转换; iptables -A INPUT -m time --timestart 1:00 --timestop 10:00 --weekdays Sat,Sun -j DROP #filter表input链添加规则,拒绝所有客户端在周六、周日的早9点到晚6点访问本机的所有地址
根据每个客户端IP做并发连接数数量匹配限制,可防止Dos(Denial of Service,拒绝服务)攻击 --connlimit-upto 连接的数量小于等于多少时匹配 --connlimit-above 连接的数量大于多少时匹配 iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 100 -j REJECT
#filter表input链添加规则,当每个客户端IP访问tcp80端口,并发连接超过100时,拒绝访问
limit模块可以限制报文收发速率 --limit #[/second|/minute|/hour|/day] #限制收发报文速率 --limit-burst number #指定前多少个报文不限制 1、iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT #filter表input链添加规则,指定每分钟接收20个报文,并且前5个报文不进行限制 2、iptables -A INPUT -j REJECT
#需要配合此条规则一起使用,否则第一条规则不成立,默认会全部允许访问
通过state状态跟踪模块,判断新旧用户发起的请求,从而进行访问控制; 状态有如下几种: NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求,即new为一次连接的第一个请求;如断开连接后,重新建立连接,再次发送请求,此请求也为new; ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态,即一次连接第一次请求之后的请求都为ESTABLISHED; RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系; INVALID:无效的连接,如flag标记位不正确,如TCP6个标记位都为0或者都为1; UNTRACKED:未进行追踪的连接,如raw表中关闭追踪; 1、iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT #ESTABLISHED为已经建立连接的,RELATED为与已有连接相关的连接,这两个状态都代表老用户;允许老用户通过tcp协议访问22端口 2、iptables -A INPUT -j REJECT #配合第一条规则使用,拒绝新用户连接22端口 ###注意
连接跟踪功能是通过conntrack模块实现的,通过“lsmod | grep conntrack”查看内核中是否加载了该模块,此模块会因为iptables规则中调用了state模块,则内核会自动加载conntrack模块,否则不会加载此模块
/proc/net/nf_conntrack #此文件为跟踪库,记录了连接过本机的IP,但是记录在内存中,终究是有极限的
/proc/sys/net/nf_conntrack_max #此文件记录了最大跟踪连接的数量,超过此文件数量的连接将会被拒绝;连接跟踪会占用较多内存,加大系统负载
/proc/sys/net/netfilter/ #此目录下的文件记录了各个协议的连接超时时长
conntrack连接跟踪模块还有另外一个功能,ftp的被动模式开启的端口不固定,这样在防火墙策略中不方便开启端口,跟踪模块可以通过分析ftp协议的21端口,通过分析命令通道获取到被动模式所要开启的数据通道端口号,需要让内核加载一个能够分析ftp协议的conntrack跟踪模块,具体步骤如下:
1、modprobe nf_conntrack_ftp #使内核加载能够分析ftp协议的conntrack跟踪模块
2、iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已经建立连接或和已有连接相关的连接访问;连通21端口,后续连接都算ESTABLISHED或RELATED;
3、iptables -A INPUT -p tcp --dport 21 -j ACCEPT #允许客户端访问tcp的21端口
4、iptables -A INPUT -J REJECT #拒绝所有人访问;第二条规则在前面会比第三条规则在前面效率更高一些