防火墙工具iptables

222 阅读6分钟

一.介绍

   防火墙工具iptables--由软件包iptables提供的命令行工具,工作在用户空间,用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包
         三种报文流向
            流入本机:PREROUTING --> INPUT-->用户空间进程
            流出本机:用户空间进程 -->OUTPUT--> POSTROUTING
            转发:    PREROUTING --> FORWARD --> POSTROUTING
            
   iptable 五表table:filter、nat、mangle、raw、security  
           五链prerouting总入口,input流入本机,output流出本机,forward转发,postrouting总出口
     	
        filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包,默认表
     			功能:过滤,允许或拒绝流量
        		有三个链:INPUT链,FORWARD链,OUTPUT链
        nat表:network address translation 地址转换规则表
        mangle:修改数据标记位规则表
        raw:关闭启用的连接跟踪机制,加快封包穿越防火墙速度
        security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现
   
   
   优先级由高到低的顺序为:security -->raw-->mangle-->nat-->filter

二.实践

1.环境准备

#firewalld 和iptables 有冲突需要先关闭一方
#CentOS 7,8 :
    systemctl disable --now firewalld.service
#或者
    systemctl stop firewalld.service 
    systemctl disable firewalld. service
#CentOS 6 : 此处停用iptables 指的是不用系统默认规则。
    service iptables stop
    chkconfig iptables off

2. 增加

2.1 基本用法
-t  nat           #指定表raw, mangle, nat, [filter]默认
-A  INPUT         #参数为链,表示追加到INPUT表,大小写敏感。
-I  INPUT         #参数为链 默认插入第一条,可以指明插入的规则编号,如:-I  INPUT 2  表示插入第二条 
-s  10.0.0.100    #参数为IP 源地址
-d                #参数为IP,目标地址
-j  REJECT        #参数为动作,DROP丢弃 ,REJECT拒绝,ACCEPT 接受
-p icmp           #指定协议,可使用数字如0(all) tcp|udp|icmp|icmpv6|udplite|esp|ah|sctp|mh or“all“
-i 网卡名         #报文流入的接口;只应用于INPUT、FORWARD、PREROUTING链
-o 网卡名         #报文流出的接口;只应用于FORWARD、OUTPUT、POSTROUTING链

#例:1 给 -t filter表的 -A INPUT链追加 -s 10.0.0.100访问就 -j DROP 的规则
        iptables  -A INPUT -s 10.0.0.100 -j DROP   #追加
#例:2 给 -t filter表的 -I I NPUT链插入第3行 -s 10.0.0.100访问就 -j ACCEPT 的规则
        iptables -I INPUT 3 -s 10.0.0.100 -j ACCEPT   
#例:3 不让10.0.0.150 ping通,禁止icmp协议通过
        iptables -A INPUT -s 10.0.0.150 -p icmp -j REJECT
#例:4 从lo网卡进来的允许
        iptables -A INPUT -i lo -j ACCEPT
2.2 扩展用法
-m 模块名 #指定模块名 
#multiport 扩展模块,可以把不连续的端口写在一条规则里
#iprange   扩展模块,指明连续的(但一般不是整个网络)ip地址范围
#mac       扩展模块,mac 模块可以指明源MAC地址
#string    扩展模块, 对报文中的应用层数据做字符串模式匹配检测
#time 	   扩展模块,指定时间允许或拒绝 ,注意:CentOS 8 此模块有问题,CentOS 7 系统默认为 UTC
#connlimit 扩展模块,根据每客户端IP做并发连接数数量匹配,可防止Dos(Denial of Service,拒绝服务)攻击
#limit     扩展模块,限流,基于收发报文的速率做匹配,令牌桶过滤器
		   			
重点模块  #state     扩展模块,可以根据”连接追踪机制“去检查连接的状态
#状态类型:前三个
#  NEW:新发起的请求;不管用什么协议,第一次链接都是NEW
#  ESTABLISHED:NEW状态之后
#  RELATED:新发起的但与已有连接相关联的连接
		
tcp icmp  #不用指定模块名
        #例:1 ~~~~filter表INPUT链 10.0.0.100 -p tcp --dport 80 指定不能访问tcp 80端口
            iptables -A INPUT -s 10.0.0.100 -p tcp --dport 80  -j DEJECT
        #例:2 ~~~~第一次握手将被拒绝,可实现新用户不让连,老用户继续可以连接直到退出。
            iptables -A INPUT -p tcp --syn -j DEJECT
        #例:3 ~~~~实现我可以ping通10.0.0.100,10.0.0.100不能ping通我,-p icmp --icmp-type 8(8请求报文,0应答报文) -j REJECT 
            iptables -A INPUT -s 10.0.0.100 -p icmp --icmp-type 8 -j REJECT 
			
-m multiport #把多个连续或者非连续的端口号写在一行规则里,连续(21:25)不连续逗号隔开(80,443),也可以同时指定(21:25,80,443)
        #例:拒绝10.0.0.100 访问本机的tcp 80,443端口 用multiport模块写在一行规则里
            iptables -A INPUT -s 10.0.0.100 -p tcp -m multiport --dports 80,443 -j REJECT
        #例:修改-R INPUT -s 10.0.0.100 所在行规则,-p tcp -m multiport --dports 21:25,80,443改为范围端口和指定端口
            iptables -R INPUT -s 10.0.0.100 -p tcp -m multiport --dports 21:25,80,443 -j REJECT
			
-m iprange  #指明连续的(但一般不是整个网络)ip地址范围
            iptables -A INPUT -d 172.16.1.100 -p tcp --dport 80 -m iprange --src-range 172.16.1.5-172.16.1.10 -j DROP
 			
-m string  #对报文中的应用层数据做字符串模式匹配检测
        #例:1 从本机往出发,过tcp 80端口 从62个字节开始检查报文 有"google" 就拒绝
            iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --from 62 --string "google" -j REJECT					
            
-m time  #指定时间允许或拒绝 ,时间为UTC时间,可以用date -u 查看。注意:CentOS 8 此模块有问题  ,CentOS 7和ubuntu 系统默认为 UTC                 
            iptables -A INPUT  -m time --timestart 14:30 --timestop 18:30 -j REJECT                                                     
			
-m connlimit #控制连接数,可防止Dos(Denial of Service,拒绝服务)攻击
            iptables -A INPUT -m connlimit --connlimit-above 2 -j REJECT
				
-m limit  #限流,基于收发报文的速率做匹配,令牌桶过滤器
        #例:ping我,前五个包不限制,从第五个包开始每分钟只允许通过10个包,并且不满足规则全部拒绝
            iptables -A INPUT -p icmp  -m limit --limit 10/minute --limit-burst 10 -j ACCEPT
            iptables -A INPUT  -p icmp -j REJECT
		
	
-m state    #重点模块-NEW新连接--ESTABLISHED后续链接--------------------------
        #例:1 新用户不让连,老用户可以连
            iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
            iptables -A INPUT -m state --state NEW -j REJECT


#面试经常问:	
cat /proc/net/nf_conntrack  #连接记录
cat /proc/sys/net/netfilter/nf_conntrack_max #调整连接追踪功能可以容纳的最大连接数量
				
#连接数调为1 ,现在有第二条连接,就会报下面这种错
[root@centos8 ~]#echo 1 > /proc/sys/net/netfilter/nf_conntrack_max
[root@centos8 ~]#tail /var/log/messages 
Jul  9 21:06:32 centos8 kernel: nf_conntrack: nf_conntrack: table full, dropping packet

3. 查看

iptables -nvL --line-numbers   #查看表详细信息和显示编号 ,默认filter表

4. 删除

-D  INPUT 2 #删除 (1) 指明规则序号 (2) 指明规则本身
-F  INPUT   #清空指定的规则链,不写参数表示全删
		 
#例:删除filter表INPUT链 第2行的规则
    iptables -D INPUT 2  

5. 修改

-R INPUT 2 #替换指定链上的指定规则编号
		
#例:修改filter表INPUT链第3行规则 为 -j REJECT 
    iptables -R INPUT 3 -s 10.0.0.100 -j REJECT

注意:

	1.给链添加的规则按从上到下的顺序执行匹配,也就是编号1为最高级别。

规则优化最佳实践

-
1. 安全放行所有入站和出站的状态为ESTABLISHED状态连接,建议放在第一条,效率更高
2. 谨慎放行入站的新请求
3. 有特殊目的限制访问功能,要在放行规则之前加以拒绝
4. 同类规则(访问同一应用,比如:http ),匹配范围小的放在前面,用于特殊处理
5. 不同类的规则(访问不同应用,一个是http,另一个是mysql ),匹配范围大的放在前面,效率更高
6. 应该将那些可由一条规则能够描述的多个规则合并为一条
7. 设置默认策略,建议白名单(只放行特定连接)如:把拒绝所有的规则放到所有规则最后面。