Linux 学习笔记之(十二)Linux 防火墙
一、名词解释
专有名词 | 解释 |
target | 目标,这个前面学生也已经给大家介绍过了,可以理解为默认行为,有四个可选值:default、ACCEPT、%%REJECT%%、DROP,如果不设置默认为default |
service | 表示一个服务 |
port | 端口,使用port可以不通过service而直接对端口进行设置 |
interface | 接口,可以理解为网卡 |
source | 源地址,可以是ip地址也可以是ip地址段 |
icmp-block | icmp报文阻塞,可以按照icmp类型进行设置 |
masquerade | ip地址伪装,也就是按照源网卡地址进行NAT转发 |
forward-port | 端口转发 |
rule | 自定义规则 |
区域 | 默认规则 |
trusted | 允许所有的数据包 |
home | 拒绝流入的流量,除非与流出的流量相关,而如果流量与ssh,mdns,ipp-client,amba_client与dhcpv6-client服务相关,则允许流量 |
internal | 等同于home区域 |
work | 拒绝流入的流量,除非与流出的流量数相关,而如果流量与ssh,mdns,ipp-client与dhcpv6-client服务相关,则允许流量 |
public | 拒绝流入的流量,除非与流出的流量相关,而如果流量与ssh,dhcpv6-client服务相关,则允许流量 |
external | 拒绝流入的流量,除非与流出的流量相关,而如果流量与ssh服务相关,则允许流量 |
dmz | 拒绝流入的流量,除非与流出的流量相关,而如果流量与ssh服务相关,则允许流量 |
block | 拒绝流入的流量,除非与流出的流量相关 |
drop | 拒绝流入的流量,除非与流出的流量相关 |
二、命令
命令 | 解释 |
firewall-cmd [--permanent] [--zone=zone] --list-sources | 用于列出指定zone的所有绑定的source地址,不指定 zone ,则使用默认 zone |
firewall-cmd [--permanent] [--zone=zone] --query- source = source [ /mask ] |
用于查询指定zone是否跟指定source地址进行了绑定,不指定 zone ,则使用默认 zone |
firewall-cmd [--permanent] [--zone=zone] --add- source = source [ /mask ] |
用于将一个source地址绑定到指定的zone(只可绑定一次,第二次绑定到不同的zone会报错),不指定 zone ,则使用默认 zone |
firewall-cmd [--zone=zone] --change- source = source [ /mask ] |
用于改变source地址所绑定的zone,如果原来没有绑定则进行绑定,这样就跟--add-source的作用一样了,不指定 zone ,则使用默认 zone |
firewall-cmd [--permanent] [--zone=zone] --remove- source = source [ /mask ] |
用于删除source地址跟zone的绑定,不指定 zone ,则使用默认 zone |
firewall-cmd [--permanent] [--zone=zone] --list-interfaces | 用于列出指定zone的所有绑定的 interface 网卡,不指定 zone ,则使用默认 zone |
firewall-cmd [--permanent] [--zone=zone] --add-interface=interface | 用于将一个interface网卡绑定到指定的zone(只可绑定一次,第二次绑定到不同的zone会报错),不指定 zone ,则使用默认 zone |
firewall-cmd [--zone=zone] --change-interface=interface | 用于改变interface网卡所绑定的zone,如果原来没有绑定则进行绑定,这样就跟--add-interface的作用一样了,不指定 zone ,则使用默认 zone |
firewall-cmd [--permanent] [--zone=zone] --query-interface=interface | 用于查询指定zone是否跟指定interface网卡进行了绑定,不指定 zone ,则使用默认 zone |
firewall-cmd [--permanent] [--zone=zone] --remove-interface=interface | 用于删除interface网卡跟zone的绑定,不指定 zone ,则使用默认 zone |
firewall-cmd --set-default-zone=zone | 设置区域为默认区域 |
firewall-cmd –get-default-zone | 查询默认区域 |
firewall-cmd --list-all-zones | 列出所有区域(其中区域标记为 active ,表示该区域绑定了 source 或 interface) |
firewall-cmd –list-all | 显示当前区域的网卡配置参数,资源,端口以及服务等信息 |
firewall-cmd –get-zones | 显示可用的区域 |
firewall-cmd --get-active-zones | 获取当前正在使用的区域 (即 标记为 active 的区域,也就是列出绑定了 source 和 interface 的区域) |
firewall-cmd --get-zone-of-interface=interface | 根据指定网卡查询其绑定的 zone |
firewall-cmd --get-zone-of- source = source [ /mask ] |
根据指定 source (IP) 查询其绑定的 zone |
firewall-cmd --permanent [--zone=zone] --get-target | 用于查询指定 zone 的 target,不指定 zone ,则使用默认 zone |
firewall-cmd --permanent [--zone=zone] -- set -target=target |
用于设定指定 zone 的 target,不指定 zone ,则使用默认 zone |
firewall-cmd [--permanent] [--zone=zone] --list-services | 用于查询指定 zone 的 绑定的 service,接不接受 service 中的端口流量 根据 zone 的 target 规则确认。不指定 zone ,则使用默认 zone |
firewall-cmd –get-services | 显示预先定义的服务 |
firewall-cmd [--permanent] [--zone=zone] --add-service=service [--timeout=seconds] | 在指定的 zone 中添加 service , timeout 选项与 permanent 不能并行使用,表示这个service绑定在这个zone 上的失效时间,不指定 zone ,则使用默认 zone |
firewall-cmd [--permanent] [--zone=zone] --remove-service=service | 在指定的 zone 中删除指定的 service,不指定 zone ,则使用默认 zone |
firewall-cmd [--permanent] [--zone=zone] --query-service=service | 在指定的 zone 上查询是否有绑定指定的 service |
firewall-cmd [--permanent] [--zone=zone] --list-ports | 用于查询指定 zone 的 绑定的 port,接不接受 port 流量 根据 zone 的 target 规则确认。不指定 zone ,则使用默认 zone |
firewall-cmd [--permanent] [--zone=zone] --add-port=portid[-portid] /protocol [--timeout=seconds] |
在指定的zone 上绑定指定的 port,timeout 选项与 permanent 不能并行使用,表示这个port 绑定在这个zone 上的失效时间,不指定 zone ,则使用默认 zone |
firewall-cmd [--permanent] [--zone=zone] --remove-port=portid[-portid] /protocol |
在指定的 zone 中删除指定的 port,不指定 zone ,则使用默认 zone |
firewall-cmd [--permanent] [--zone=zone] --query-port=portid[-portid] /protocol |
在指定的 zone 上查询是否有绑定指定的 port |
firewall-cmd [--permanent] [--zone=zone] --list-icmp-blocks | |
firewall-cmd [--permanent] [--zone=zone] --add-icmp-block=icmptype [--timeout=seconds] | |
firewall-cmd [--permanent] [--zone=zone] --remove-icmp-block=icmptype | |
firewall-cmd [--permanent] [--zone=zone] --query-icmp-block=icmptype | |
firewall-cmd [--permanent] [--zone=zone] --add-masquerade [--timeout=seconds] | |
firewall-cmd [--permanent] [--zone=zone] --remove-masquerade | |
firewall-cmd [--permanent] [--zone=zone] --query-masquerade | |
firewall-cmd [--permanent] [--zone=zone] --list-forward-ports | |
firewall-cmd [--permanent] [--zone=zone] --add-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[ /mask ]][--timeout=seconds] |
|
firewall-cmd [--permanent] [--zone=zone] --remove-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[ /mask ]] |
|
firewall-cmd [--permanent] [--zone=zone] --query-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[ /mask ]] |
|
firewall-cmd [--permanent] [--zone=zone] --list-rich-rules | |
firewall-cmd [--permanent] [--zone=zone] --add-rich-rule= 'rule' [--timeout=seconds] |
|
|
|
|
|
|
重新加载防火墙配置 |
|
开启应急状态模式 |
|
关闭应急状态模式 |
三、知识点
1、防火墙中的 zone
哪个zone在起作用
我们知道每个zone就是一套规则集,但是有那么多zone,对于一个具体的请求来说应该使用哪个zone(哪套规则)来处理呢?这个问题至关重要,如果这点不弄明白其他的都是空中楼阁,即使规则设置的再好,不知道怎样用、在哪里用也不行。
对于一个接受到的请求具体使用哪个zone,firewalld是通过三种方法来判断的:
1、source,也就是源地址
2、interface,接收请求的网卡
3、firewalld.conf中配置的默认zone
这三个的优先级按顺序依次降低,也就是说如果按照source可以找到就不会再按interface去查找,如果前两个都找不到才会使用第三个,也就是学生在前面给大家讲过的在firewalld.conf中配置的默认zone。
好了,我们现在知道其原理了,下面学生就给大家介绍每一种方式所对应的配置方法。
配置source
source是在zone的xml文件中配置的,其格式为
< zone > < source address = "address[/mask]" /> </ zone > |
只要我们将source节点放入相应的zone配置文件中就可以了,节点的address属性就是源地址,不过我们要注意相同的source节点只 可以在一个zone中进行配置,也就是说同一个源地址只能对于一个zone,另外,直接编辑xml文件之后还需要reload才可以起作用,这些学生前面已经给大家讲过,这里就不再重述了。
另外,我们当然也可以使用firewall-cmd命令进行配置,这里主要有五个相关命令(参数)
firewall-cmd [--permanent] [--zone=zone] --list-sources firewall-cmd [--permanent] [--zone=zone] --query- source = source [ /mask ] firewall-cmd [--permanent] [--zone=zone] --add- source = source [ /mask ] firewall-cmd [--zone=zone] --change- source = source [ /mask ] firewall-cmd [--permanent] [--zone=zone] --remove- source = source [ /mask ] |
我们分别来介绍一下
-
--list-sources:用于列出指定zone的所有绑定的source地址
-
--query-source:用于查询指定zone是否跟指定source地址进行了绑定
-
--add-source:用于将一个source地址绑定到指定的zone(只可绑定一次,第二次绑定到不同的zone会报错)
-
--change-source:用于改变source地址所绑定的zone,如果原来没有绑定则进行绑定,这样就跟--add-source的作用一样了
-
--remove-source:用于删除source地址跟zone的绑定
另外,大家可以看到上面的命令中有两个可选参数:--permanent和--zone,--permanent学生在前面已经给大家介绍过了,表 示是否存储到配置文件中(如果存储到配置文件中这不会立即生效),--zone用于指定所要设置的zone,如果不指定则使用默认zone。
我们来看个例子
[root@excelib.com ~] # firewall-cmd --zone=drop --change-source=1.2.3.4 |
这样就可以将1.2.3.4绑定到drop这个zone中了,如果没有修改过drop规则的话所有来自1.2.3.4这个ip的连接将会被drop。
至于什么时候使用add什么时候使用change,如果我们就是想将某源地址绑定到指定的zone那么最好使用change,而如果想在源地址没绑定的时候进行绑定,如果已经绑定过则不绑定那么就使用add。
配置interface
interface有两个可以配置的位置:1、zone所对应的xml配置文件2、网卡配置文件(也就是ifcfg-*文件)。
第一种配置跟source大同小异,学生这里就不再细述了,interface在zone配置文件中的节点为
< zone > < interface name = "string" /> </ zone > |
相关的firewall-cmd命令为
firewall-cmd [--permanent] [--zone=zone] --list-interfaces firewall-cmd [--permanent] [--zone=zone] --add-interface=interface firewall-cmd [--zone=zone] --change-interface=interface firewall-cmd [--permanent] [--zone=zone] --query-interface=interface firewall-cmd [--permanent] [--zone=zone] --remove-interface=interface |
另外,我们还可以在网卡配置文件中进行配置,比如可以在
ifcfg-em1
文件中添加下面的配置
ZONE=public |
这行配置就相当于下面的命令
[root@excelib.com ~] # firewall-cmd --zone=public --change-interface=em1 |
这样配置之后来自em1的连接就会使用public这个zone进行管理(如果source匹配了其他的zone除外)。
配置默认zone
默认zone的配置学生前面已经给大家介绍过了,他是通过firewalld.conf配置文件的DefaultZone配置项来配置的,当然也可以使用firewall-cmd命令来配置
firewall-cmd -- set -default-zone=zone |
另外还可以通过--get-default-zone来获取默认zone的值。
查看当前起作用的zone
我们可以使用下面的命令来查看当前所有起作用的zone
firewall-cmd --get-active-zones |
这个命令会返回所有绑定了source、interface以及默认的zone,并会说明在什么情况下使用。
反向查询
firewalld还给我们提供了反向查询的命令,也就是根据source或者interface查询所对应的zone,其命令如下
firewall-cmd --get-zone-of-interface=interface firewall-cmd --get-zone-of- source = source [ /mask ] |
有了这两个命令我们就可以检查我们的设置是否正确了。
好了,现在大家就明白了一个接收到的请求具体使用哪个zone了,那么zone具体的规则怎么配置呢?下面学生就来给大家详细介绍。
zone规则配置
target
zone规则中首先最重要的是target的设置,他默认可以取四个值:default、ACCEPT、%%REJECT%%、DROP,其含义很容易理解,这里学生就不介绍了,下面来说怎么配置。
在xml文件中target是zone节点的一个属性,比如drop.xml中为
< zone target = "DROP" > |
block.xml中为
< zone target = "%%REJECT%%" > |
如果使用firewall-cmd命令来操作,命令如下
firewall-cmd --permanent [--zone=zone] --get-target firewall-cmd --permanent [--zone=zone] -- set -target=target |
我们要特别注意,这里的--permanent不是可选的,也就是说使用firewall-cmd命令也不可以让他直接生效,也需要reload才可以。
service
service学生在前面也已经给大家介绍过了,他的配置和我们上面所介绍的source基本相同,只不过同一个service可以配置到多个不同的zone中,当然也就不需要--change命令了,他在zone配置文件中的节点为
< zone > < service name = "string" /> </ zone > |
相应的配置命令为
firewall-cmd [--permanent] [--zone=zone] --list-services firewall-cmd [--permanent] [--zone=zone] --add-service=service [--timeout=seconds] firewall-cmd [--permanent] [--zone=zone] --remove-service=service firewall-cmd [--permanent] [--zone=zone] --query-service=service |
具体每个命令的含义大家对照上面的source很容易就理解了,不过这里的--add命令中多了一个--timeout选项,学生这里给大家介绍一下。
--add-service中的--timeout的含义是这样的:添加一个服务,但是不是一直生效而是生效一段时间,过期之后自动删除。
这个选项非常有用,比如我们想暂时开放一个端口进行一些特殊的操作(比如远程调试),等处理完成后再关闭,不过有时候我们处理完之后就忘记关闭了, 而现在的--timeout选项就可以帮我们很好地解决这个问题,我们在打开的时候就可以直接设置一个时间,到时间之后他自动就可以关闭了。另外,这个参 数还有更有用的用法,学生会在下面给大家讲到。当然--timeout和--permanent是不可以一起使用的。
另外,这里我们主要讲的是怎么在zone中使用service,而service自己的配置学生下节再给大家详细介绍。
port
port是直接对端口的操作,他和service非常相似,所以这里也不详细介绍了,port在zone中的配置节点为
< zone > < port port = "portid[-portid]" protocol = "tcp|udp" /> </ zone > |
相应命令为
firewall-cmd [--permanent] [--zone=zone] --list-ports firewall-cmd [--permanent] [--zone=zone] --add-port=portid[-portid] /protocol [--timeout=seconds] firewall-cmd [--permanent] [--zone=zone] --remove-port=portid[-portid] /protocol firewall-cmd [--permanent] [--zone=zone] --query-port=portid[-portid] /protocol |
icmp-block
icmp-block是按照icmp的类型进行设置阻塞,比如我们不想接受ping报文就可以使用下面的命令来设置
[root@excelib.com ~] # firewall-cmd --add-icmp-block=echo-request |
当然,如果需要长久保存就需要加--permanent选项,不过那样就需要reload才能生效。
icmp-block在zone配置文件中的节点为
< zone > < icmp-block name = "string" /> </ zone > |
相应操作命令为
firewall-cmd [--permanent] [--zone=zone] --list-icmp-blocks firewall-cmd [--permanent] [--zone=zone] --add-icmp-block=icmptype [--timeout=seconds] firewall-cmd [--permanent] [--zone=zone] --remove-icmp-block=icmptype firewall-cmd [--permanent] [--zone=zone] --query-icmp-block=icmptype |
masquerade
masquerade大家应该都比较熟悉,其作用就是ip地址伪装,也就是NAT转发中的一种,具体处理方式是将接收到的请求的源地址设置为转发请 求网卡的地址,这在路由器等相关设备中非常重要,比如大家很多都使用的是路由器连接的局域网,而想上互联网就得将我们的ip地址给修改一下,要不大家都是 192.168.1.XXX的内网地址,那请求怎么能正确返回呢?所以在路由器中将请求实际发送到互联网的时候就会将请求的源地址设置为路由器的外网地 址,这样请求就能正确地返回给路由器了,然后路由器再根据记录返回给我们发送请求的主机了,这就是masquerade。
其设置非常简单,在zone中是一个没有参数(属性)的节点
< zone > < masquerade /> </ zone > |
操作命令为
firewall-cmd [--permanent] [--zone=zone] --add-masquerade [--timeout=seconds] firewall-cmd [--permanent] [--zone=zone] --remove-masquerade firewall-cmd [--permanent] [--zone=zone] --query-masquerade |
forward-port
这项也非常容易理解,他是进行端口转发的,比如我们要将在80端口接收到tcp请求转发到8080端口可以使用下面的命令
[root@excelib.com ~] # firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 |
forward-port还支持范围转发,比如我们还可以将80到85端口的所有请求都转发到8080端口,这时只需要将上面命令中的port修改为80-85即可。
在zone配置文件中节点如下
< zone > < forward-port port = "portid[-portid]" protocol = "tcp|udp" [ to-port = "portid[-portid]" ] [ to-addr = "ipv4address" ]/> </ zone > |
相关操作命令如下
firewall-cmd [--permanent] [--zone=zone] --list-forward-ports firewall-cmd [--permanent] [--zone=zone] --add-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[ /mask ]][--timeout=seconds] firewall-cmd [--permanent] [--zone=zone] --remove-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[ /mask ]] firewall-cmd [--permanent] [--zone=zone] --query-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[ /mask ]] |
rule
rule可以用来定义一条复杂的规则,其在zone配置文件中的节点定义如下
< zone > < rule [ family = "ipv4|ipv6" ]> [ < source address = "address[/mask]" [ invert = "bool" ]/> ] [ < destination address = "address[/mask]" [ invert = "bool" ]/> ] [ < service name = "string" /> | < port port = "portid[-portid]" protocol = "tcp|udp" /> | < protocol value = "protocol" /> | < icmp-block name = "icmptype" /> | < masquerade /> | < forward-port port = "portid[-portid]" protocol = "tcp|udp" [ to-port = "portid[-portid]" ] [ to-addr = "address" ]/> ] [ < log [ prefix = "prefixtext" ] [ level = "emerg|alert|crit|err|warn|notice|info|debug" ]/> [< limit value = "rate/duration" />] </ log > ] [ < audit > [< limit value = "rate/duration" />] </ audit > ] [ < accept /> | < reject [ type = "rejecttype" ]/> | < drop /> ] </ rule > </ zone > |
可以看到这里一条rule的配置的配置项非常多,比zone本身还多出了destination、log、audit等配置项。其实这里的rule就相当于使用iptables时的一条规则。rule的操作命令如下
firewall-cmd [--permanent] [--zone=zone] --list-rich-rules firewall-cmd [--permanent] [--zone=zone] --add-rich-rule= 'rule' [--timeout=seconds] firewall-cmd [--permanent] [--zone=zone] --remove-rich-rule= 'rule' firewall-cmd [--permanent] [--zone=zone] --query-rich-rule= 'rule' |
这里的参数'rule'代表一条规则语句,语句结构就是直接按照上面学生给大家的节点结构去掉尖括号来书写就可以了,比如要设置地址为 1.2.3.4的source就可以写成source address="1.2.3.4",也就是直接写标签名,然后跟着写属性就可以了,我们来看个例子
[root@excelib.com ~] # firewall-cmd --add-rich-rule='rule family="ipv4" source address="1.2.3.4" drop' |
这条规则就会将1.2.3.4这个源地址的连接全部给 drop 掉。
使用rule结合--timeout我们可以实现一些非常好玩和有用的功能,比如我们可以写个自动化脚本,当发现有异常的连接时就可以添加一条rule将其相应的地址drop掉,而且还可以使用--timeout给设置个时间段,过了之后再自动开放!
四、用法总结
1、通过不同的zone中设置规则来进行流量限制
部署图如下:
要求: 服务器B 信任来源为 10.19.158.112 的数据包
分析:
服务器 B 上的 /etc/firewalld 下文件目录结构如下:
zones 目录下存在 2个 zone 文件,分别为 public.xml \ trusted.xml
public.xml 内容如下:
services 目录下声明信任的服务文件:
ipsets 目录下声明的信任IP文件:
zones/trusted.xml 文件:
在 trusted 区域中使用 source 标签声明信任 114 和 110 两个 IP
在以上的配置中 trusted.xml 中的内容不可更改。
通过以上服务器防火墙配置文件可以看出:
trusted 区域中配置 信任 10.19.158.114、10.19.158.110
public 区域中配置 信任 10.19.158.108、10.19.158.113
结合第三章节中的第一小节点的知识点,可以分析出 服务器B接收数据包之后的处理方式如下:
有 sources\ interface 配置项的 区域才是活跃状态,服务器B中 活跃的 区域为 trusted.
默认区域为 public zone
所以根据规则服务器B收到包之后被处理的规则如下:
(1) 由于 所有 zones 中只有 trusted 配置了 sources ,所以 先查看 数据包是否符合 trusted zone 中的规则,会发现不符合,trusted zone 仅接收 src 为 114 和 110 的数据包;
(2) 接着会查看是否有 zones 中配置了 interface ,但是未发现存在这样的 zone (若是存在,则会进行规则比对,看 接收数据包的网卡在 这样的 zone 中的处理规则);
(3) (1)\(2) 都没有找到规则处理该数据包的情况下,会使用默认的 zone 进行处理,本示例中默认的zone 为public ,该 public 配置的信任 IP 也不包括该数据包的 src ip,为了解决该问题,只能在 public zone 中的 ipset 的 IP 信任列表中增加该数据包的 src (112 ) 即可;
2、把原本访问本机 888 端口的流量转发到 22 端口,当前和长期均有效
流量转发命令的格式为:firewall-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标IP地址>
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.157.133 |
然后在客户端使用 ssh 命令访问 192.168.157.133 的 888 端口,如下
来源于:
https://www.cnblogs.com/excelib/p/5155951.html
https://blog.csdn.net/aaaaaab_/article/details/80586874