简述iptables防火墙

429 阅读15分钟

一、Linux防火墙概述

1.1 防火墙的分类

  • 硬件防火墙(性能强、功能多、操作简单、不会占用业务服务器资源)

  • 软件防火墙(作为防火墙的最后一层防护)

    • iptables(centos5,6默认使用的防火墙)
    • firewalld(centos7,8默认使用的防火墙)
    • 第三方防火墙(非系统原生防火墙)

1.2 防火墙组件

Linux系统的防火墙:IP信息包过滤系统,他实际上由两个组件netfilter和Iiptables组成;Linux系统防火墙主要工作在网络层,针对IP数据包。体现在对包内的IP地址、端口、协议等信息的处理上。

通信四元素,五元素的概念

  • 通信四元素:源地址;源MAC地址;目的地址;目的MAC地址
  • 通信五元素:源地址;源MAC地址;目的地址;目的MAC地址;协议(比如tcp,udp,sctp)

netfilter与iptables的关系

  • netfilter:属于“内核态”(Kernel Space,又称为内核空间)的防火墙功能体系。

是内核的一部分,由一些数据包过滤表组成,这些表包含内核用来控制数据包过滤处理的规则集。

  • iptables:属于“用户态”(User Space,也称为用户空间)的防火墙管理体系。

是一种用来管理Linux防火墙的命令程序,它使插入、修改和删除数据包过滤表中的规则变得容易,通常位于/sbin/iptables文件下。

1.3 iptable概述

iptables是基于内核的防火墙,其中内置了raw、mangle、nat和filter一共四个规则表。表中所有规则配置后,立即生效,不需要重启服务。

iptables默认的表、链结构示意图如下: image-20220914094910182.png

iptables由四表五链组成

规则表的作用:容纳各种规则链

规则链的作用:容纳各种防火墙规则

总结:表中含有链,链中含有规则

iptable的四类规则表

规则表作用
raw表确定是否对该数据包进行状态跟踪。包含两个规则链:OUTPUT、PREROUTING。
mangle表修改数据包内容,用来做流量整形的,给数据包设置标记。包含五个规则链:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING。
nat表负责网络地址转换,用来修改数据包中的源、目标IP地址或端口。包含三个规则链:OUTPUT、PREROUTING、POSTROUTING。
filter表负责过滤数据包,确定是否放行该数据包(过滤)。包含三个规则链,INPUT、FORWARD、POSTROUTING。

数据包到达防火墙时,规则表之间的优先顺序:

raw>mangle>nat>filter

在iptables的四个规则表中,mangle表和raw表的应用相对较少

iptable的五类规则链

规则链作用
INPUT处理入站数据包,匹配目标IP为本机的数据包。
OUTPUT处理出站数据包,一般不在此链上做配置
FORWARD处理转发数据包,匹配流经本机的数据包
PREROUTING在进行路由转发数据前处理数据包,用来修改目的地址,用来做DNAT。相当于把内外服务器的IP和端口映射到路由器的外网IP和端口上。
POSTROUTING在进行路由转发数据后处理数据包,用来修改源地址,用来做SNAT。相当于内网通过路由器NAT转换功能实现内网主机通过一共公网IP地址上网。

1.4 规则链之间的匹配顺序

主机型防火墙:

  • 入站数据(来自外界的数据包,并且,目标地址是防火墙本机):PREROUTING -->INPUT-->OUTROUTING

  • 出站数据(从防火墙本机向外部地址发送的数据包):PREROUTING-->FORWARD-->POSTROUTING

网络下防火墙:

  • 转发数据(需要警告防火墙转发的数据包)

image.png

如上图所示,入站数据包如果目的地为本机IP(即本机收到数据包进行回包):

  • 数据包按照规则表顺序,匹配每个拥有PREROUTING规则链的规则表,查看是否有相关规则可以放行数据包,存在则直接放行,没有则按照顺序查询下一个规则表(即在路由选择前处理数据包,查看是否需要修改数据包的目的IP进行转发)
  • 若数据包的目的IP为本机IP数据包则会按照默认规则表filter转发到INPUT规则链,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后返回给发送方。

如果入站数据的目的地非本机IP(即路由接收数据包后进行转发数据):

  • 入站数据包在通过PREROUTING链后,发现入站数据包的目的IP属于非本机的数据包,经过路由选择会转发到FORWARD链,在规则中查找是否有转发该数据的规则链,如果没有则丢弃,如果存在相关规则,则将数据包交给PSTROUTING链,进行数据包的源地址修改为本机的IP发送,最后将数据包发送给目的IP地址。

总结

  • PREROUTING链中主要是设置修改数据包目的地IP的策略规则
  • INPUT链、FORWARD链、OUTPUT链都是设置判断数据包是否放行的策略规则
  • POSTROUTING链是设置修改数据包源地址IP的策略规则

规则链的匹配顺序:

  • 自上向下按顺序依次进行检查,找到相关匹配的规则后停止后续匹配(LOG策略除外,LOG表示记录相关日志)
  • 若在该链中找不到相匹配的规则,则按照盖帘的默认策略进行处理(未修改的情况下,默认策略为允许放行)

二、iptables的配置

2.1 iptables的安装

Centos 7默认使用的是firewalld防火墙,没有安装iptables,我们如果想要使用iptables防火墙功能。必须要先关闭firewalld防火墙,再安装iptables。

image.png

image.png

image.png

2.2 iptables配置方法

iptables配置方法有以下两种:

  1. 使用iptables命令行(主要使用的配置方式)
  2. system-config-firewall(图形化界面的管理命令,该命令Centos 7中未安装无法执行,Centos 6系统中可以直接使用)

2.3 iptables命令行配置方法

命令格式:

iptables -t [规则表名] 管理选项 [规则链名] [匹配条件] -j [控制类型]

注意事项:

  • 不指定表名时,默认指定filter表
  • 不指定链名时,默认指定表内的所有链
  • 除非需要配置的是设置链的默认策略,否则必须指定匹配条件
  • 控制类型使用大写字母,其余均为小写

2.4 iptables常用的控制类型及作用

常用控制类型:

类型含义
ACCEPT允许数据包通过
DROP直接丢弃数据包,不给出任何回应信息
REJECT拒绝数据包通过,会给数据发送端一个响应信息
SNAT修改数据包的源地址
DNAT修改数据包的目的地址
MASQUERADE伪装成一共非固定公网IP地址
LOG在/var/log/messsage文件中记录日志信息,然后将数据包传递给下一条规则。LOG只是一种辅助动作,并没有真正处理数据包

2.4 iptables常用的管理选项及作用

常用的管理选项

选项含义
-A在指定链的末尾追加(--append)一条新的规则
-I在指定链的开头插入(--insert)一条新的规则
-R修改、替换(--replace)指定链中的某一条规则,可指定规则序号或具体内容
-P设置指定链的默认策略(--policy)
-D删除(--delete)指定链中的某一条规则,可指定规则序号或具体内容
-F清空(--flush)指定链中的所有规则,若未指定链名,代表清空表中的所有链
-L列出(--list)指定链中所有的规则,若未指定链名,则列出表中的所有链
-n使用数字形式(--numeric)显示输出结果,如显示IP地址而不是主机名
-v显示详细信息,包括每条规则的匹配包数量的匹配字节数
--line-numbers查看规则时,显示规则的序号

-nL的选项使用有固定格式和先后顺序

2.5 配置iptables案例(管理规则的增删改查操作)

1. 查看规则

查看指定表中所有规则:

iptables -t 规则表名 -nL #-t指定表   -n不显示主机名使用数字显示即显示IP地址 L后不指定链名,即显示所有链的所有规则 nL为固定格式,使用有先后顺序

image.png

2. 添加规则

我们首先将filter表中所有规则清除如下所示:

image.png

指定链尾部添加规则(即指定链下方添加)

iptables -t filter -A INPUT -p icmp -j REJECT
            #指定表  #尾部添加 #指定协议 #指定控制类型 

image.png

image.png

指定链首部添加规则(即指定链上方添加)

iptables -t filter -I INPUT -p icmp -j DROP
            #指定表  #首部添加 #指定协议 #指定控制类型 

image.png

image.png

添加指定位置命令

iptables -t filter -I INPUT 2 -p tcp --dport 22 -j ACCEPT
# -t指定表  
#-I INPUT 2 指定在规则序号2上方插入一条规则 
#--dport 22 指定22端口

image.png

image.png

3.修改规则

修改指定链规则

iptables -t filter -R INPUT 1 -p icmp -j ACCEPT
#-R INPUT 1 指定INPUT规则链的序号为1的规则 -R为修改选项
#-j ACCEPT  重新指定控制类型为ACCEPT

image.png

修改默认规则策略

iptables -P OUTPUT DROP
# -P OUTPUT 相当于设定OUTPUT链的默认规则
# DROP 将指定链的默认规则修改为DROP,即拒绝全部

image.png

image.png

我们通过修改默认规则导致ssh远程连接断开后我们回到虚拟机查看规则状态:

image.png 我们需要重新使用我们的ssh远程连接功能,则需要在虚拟机上做出以下操作:

image.png

image.png

由上可知,我们修改iptables中的规则时,都是临时规则并且是及时生效的,在我们设置规则前一定要确定修改规则是否会影响,我们正在启动的服务或者其他功能,如果设定出错,我们只能通过重启服务器来恢复之前的默认的规则。

如果像上图操作,我们设立OUTPUT链的默认规则为DROP时,我们还需要使用ssh功能,我们可以先设立该规则的放行,再进行修改默认规则来避免我们日常使用中功能的中断:

image.png

image.png

总结:我们在修改默认规则时,可以先根据我们现运行的服务以及一些正在使用的功能的端口号,进行规则上的设立,以保证我们在更改默认规则后,我们的现有功能与服务仍可以正常使用。(默认策略需要在我们设置完所有规则策略后,最后再考虑修改)

4.删除规则

清空规则

ptables -t 规则表名 -F #-F 清空指定表/链中规则

image.png

清空规则注意事项

  1. -F 选项仅仅是清空规则链中的规则,不直接影响-P设置的默认规则,默认规则需要手动进行修改
  2. -P 选项设置DROP后,要注意是否一定需要使用-F清空所有表中的所有规则链中规则,是否可以指定相关的规则链去清空,防止默认设置中的DROP影响后续远程连接ssh等功能的使用
  3. 如果不写表格和链名,默认清空filter所有链中所有规则

删除指定规则

  1. 若规则列表中有多条相同的规则时,按内容匹配只删除的序号最小的一条
  2. 按号码匹配删除时,确保规则号码小于等于已有规则数,否则报错
  3. 按内容匹配删除时,确保规则存在,否则报错

方法一:指定规则序号删除

iptables -D OUTPUT 1
# -D OUTPUT 1 指定删除OUTPUT链中序号为1的规则

image.png

方法二:指定规则内容删除(如果有2条相同内容,会删除序号小)

iptables -D OUTPUT -p tcp -j ACCEPT
# 指定OUTPUT链中,协议为tcp,控制类型为ACCEPT的规则进行删除

image.png

三、iptables规则的匹配条件

3.1 通用匹配

通用匹配是可以直接使用,不依赖于其他条件或扩展,包括网络协议、IP地址、 网络接口等条件。

通用匹配的类型及格式:

协议匹配: -p 协议名

地址匹配:-g源地址、-d目的地址(地址格式可以是IP、网段、域名、空即任意地址)

接口匹配: -i入站网卡、-o出站网卡

举例:

iptables -A FORWARD ! -p icmp -j ACCEPT
# -A FORWARD 指定FORWARD链添加
# ! -p icmp   指除了icmp协议
# -j ACCEPT   指定控制类型为ACCEPT
# 整段含义:在FORWARD中除了icmp协议以外都进行放行策略
(此规则为单个规则,只解释了除了icmp协议都放行,没说明icmp协议不允许放行,
需要配合默认规则为DROP才能使其含义有效)

iptables -A INPUT -s 192.168.142.100 -j DROP
# 指定接收到源地址的IP地址为192.168.142.100的数据包后,丢弃数据包,拒绝放行(DROP)

iptables -I INPUT -i ens33 -s 192.168.142.0/24 -j DROP
# 指定入站网卡ens33收到源地址为192.168.142.0网段的地址,拒绝放行(DROP)

3.2 隐含匹配

隐含匹配是要求以特定的协议匹配作为前提,包括端口、TCP标记、ICMP类型等条件

1.端口匹配

--sport 源端口 --dport 目的端口 (可以是个别端口、端口范围)

PS:--sport 与 --dport 必须配合 -p 指定协议类型使用

举例:

--sport 1000        #匹配源端口是1000的数据包
--sport 1000:2000   #匹配源端口是1000-2000的数据包
--sport :2000       #匹配源端口是2000以下的数据包
--sport 1000:       #匹配源端口是1000以上的数据包

iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
#添加指定放行tcp协议的20和21端口的规则(即开放ftp协议的数据)  
#tcp20端口(传输ftp控制命令) tcp21端口(传输文件数据)

iptables -I FORWARD -d 192.168.80.0/24 -p tcp --dport 24500:24600 - j DROP
#添加指定拒绝转发目的端口为tcp协议的24500-24600端口并且是目的IP为192.168.80.0网段的数据包
#目的IP为192.168.80.0网段,但是目的端口不在此范围的数据包可以正常被转发

2.TCP标志位匹配

--tcp-flags <TCP标志位>

iptables -I INPUT -p tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
iptables -I OUTPUT -p tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT
# tcp三次握手时的第一次握手放行SYN为1数据报文,拒绝其他包:第二次握手放行SYN,ACK为1数据报文,拒绝其他包 两条规则尾部的SYN -j REJECT ; SYN,ACK -j REJECT  分别代表除了SYN=1的报文全部拒绝;除了SYN=1与ACK=1的报文全部拒绝

image.png

3.icmp类型匹配

--icmp-type <ICMP类型> (可以是字符串或数字代码)

  • "Echo-Request" (代码为8)表示请求

  • "Echo-Reply" (代码为0)表示回显

  • "Destination-Unreachable" (代码为3). 表示目标不可达

  • 关于其它可用的ICMP 协议类型,可以执行"iptables -p icmp -h”命令,查看帮助信息

      iptables -A INPUT -p icmp --icmp-type 8 -j DROP   #禁止其它主机ping本机
      iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT #允许本机ping其它主机
      iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT #当本机ping不通其它主机时提示目标不可达(此时其它主机需要配置关于icmp协议的控制类型为REJECT)
    

3.3 显示匹配

显示匹配是要求以"-m <扩展模块>”的形式明确指出类型,包括多端口、MAC地址、IP范围、数据包状态等条件。

1.多端口匹配

  • -m multiport --sport <源端口列表>

  • -m multiport --dport <目的端口列表>

      iptables -A INPUT -p tcp -m multiport --dport 20:22,53,80,111 -j ACCEPT
      #接收并放行tcp的多个端口:20,21,22,53,80,111的数据包
      #20:2220,21,22
    

2.IP范围匹配

  • -m iprange --src-range <源IP范围>

  • -m iprange --dst-range <目的IP范围>

    iptables -A FORWARD -p udp -m iprange --src-range 192.168.72.100-192.168.72.200 -j DROP  # 禁止转发源地址在192.168.72.100-192.168.72.200之间的udp数据包
    

3.MAC地址匹配

  • -m mac --mac-source <MAC地址>

      iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
      #禁止来自某个MAC地址的数据包通过本机转发
    

4.状态匹配

  • -m state --state <连接状态>

常见的连接状态:

状态含义
NEW主机连接目标主机,在目标主机上看到的第一个想要连接的数据包
ESTABLISHED主机已与目标主机进行通信,判断标准只要目标主机回应了第一个包,就进入该状态
RELATED主机已与目标主机进行通信,目标主机发起新的连接方式,一般与ESTABLISHED配合使用
INVALID无效的封包,比如数据破损的封包状态

举例:

iptables -I INPUT -M state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
#在接收到的第一个数据包的目的端口为tcp协议的22端口则放行通过

iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
#接收到状态为ESTABLISHED,RELATED(即双方主机建立连接的状态)的包则放行通过