Centos7中默认将原来的防火墙iptables升级为了firewalld,firewalld跟iptables比起来至少有两大好处:

 

1、firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效;

 

2、firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链”或者对TCP/IP协议也不理解,也可以实现大部分功能。

 

原理

firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现。

 

l 区域(zone)是一组规则,它们决定了允许哪些流量通过。Firewalld默认内置了 9 个区域(zone),按从最不信任到最受信任的顺序为:

drop:最低信任级别。所有传入的连接都将被丢弃而不会回复,并且只能进行传出连接。

block:与上述类似,但不是简单地删除连接,而是使用icmp-host-prohibitedor和 icmp6-adm-prohibited 消息拒绝传入的请求。

public:表示不信任的公共网络。可能会视情况允许选择的传入连接。默认情况下,此区域为激活状态。

external:如果你使用防火墙作为网关,则为外部网络。将其配置为 NAT 转发,以便你的内部网络保持私有但可访问。

internal:external 区域的另一侧,用于网关的内部。这些计算机值得信赖,并且可以使用一些其他服务。

dmz:用于 DMZ (DeMilitarized Zone) 中的计算机(将无法访问网络其余部分的隔离计算机),仅允许某些传入连接。

work:用于工作机。信任网络中的大多数计算机。可能还允许其他一些服务。

home:家庭环境。通常,这意味着您信任其他大多数计算机,并且将接受其他一些服务。

trusted:信任网络中的所有计算机。可用选项中最开放的,应谨慎使用。

 

l Zone包含这些可配置项:

target:默认行为,有四个可选值:default、ACCEPT、%%REJECT%%、DROP。默认为default

ACCEPT 会接受所有流入的符合规则的数据包。

REJECT 除了被明确写好允许的规则,会拒绝所有流入的数据包, 并给发起连接的机器回复被拒绝的消息。

DROP 除了被明确写好允许的规则,会拒绝所有流入的数据包, 不会给发起连接的机器回复任何消息。

 

:表示一个服务。服务常常需要打开很多端口,甚至还有特定的一些源和目的 IP 甚至一些协议的访问,如果把这些同时都定义在 zone 中,会造成最后的 zone 配置文件很大,提取成 services 相当于是解耦的概念,有利于后期的维护。

 

:端口

 

:接口,可以理解为网卡

 

:源地址,可以是ip地址也可以是ip地址段

 

:icmp报文阻塞,可以按照icmp类型进行设置

 

:ip地址伪装,也就是按照源网卡地址进行NAT转发

 

:端口转发

 

:自定义规则

 

l 对于一个接受到的请求具体使用哪个zone,firewalld是通过三种方法来判断的:

 

1、source,也就是源地址

2、interface,接收请求的网卡

3、firewalld.conf中配置的默认zone

 

这三个的优先级按顺序依次降低,也就是说如果按照source可以找到就不会再按interface去查找,如果前两个都找不到才会使用第三个。

 

需要注意:同一个源地址只能对于一个zone。一个网络连接只能被一个 zone 处理,但一个 zone 可以用于多个网络连接。

安装

$ sudo yum install firewalld

$ sudo systemctl start firewalld

$ sudo systemctl enable firewalld

$ sudo firewall-cmd --state

 

配置解释

  • firewalld的配置文件以xml格式为主(主配置文件firewalld.conf例外),他们有两个存储位置

 

1、/etc/firewalld/

 

2、/usr/lib/firewalld/

 

使用时的规则是这样的:当需要一个文件时firewalld会首先到第一个目录中去查找,如果可以找到,那么就直接使用,否则会继续到第二个目录中查找。

 

  • firewalld的配置文件结构非常简单,主要有两个文件和三个目录:

 

文件:firewalld.conf、lockdown-whitelist.xml

 

目录:zones、services、icmptypes

 

另外,如果使用到direct,还会有一个direct.xml文件。

 

 

  • firewalld.conf:firewalld的主配置文件,是键值对的格式,只有五个配置项

 

DefaultZone:默认使用的zone,默认值为public;

 

MinimalMark: 标记的最小值,linux内核会对每个进入的数据包都进行标记;

 

CleanupOnExit:表示当退出firewalld后是否清除防火墙规则,默认值为yes;

 

Lockdown: 这个选项跟D-BUS接口操作firewalld有关,firewalld可以让别的程序通过D-BUS接口直接操作,当Lockdown设置为yes的时候就可以通过lockdown-whitelist.xml文件来限制都有哪些程序可以对其进行操作,而当设置为no的时候就没有限制了,默认值为 no;

 

IPv6_rpfilter:其功能类似于rp_filter,只不过是针对ipv6版的,其作用是判断所接受到的包是否是伪造的,检查方式主要是通过路由表中的路由条目实现的。默认值为yes。

 

  • lockdown-whitelist.xml:当Lockdown为yes的时候用来限制可以通过D-BUS接口操作firewalld的程序

 

  • direct.xml:通过这个文件可以直接使用防火墙的过滤规则,对从原来的iptables到firewalld的迁移提供了一条绿色通道

 

  • zones:保存zone配置文件

<?xml version="1.0" encoding="utf-8"?>

<zone target="%%REJECT%%">

  <short>Block</short>

  <description>Unsolicited incoming network packets are rejected. Incoming packets that are related to outgoing network connections are accepted. Outgoing network connections are allowed.</description>

  <service name="ssh"/>

  <service name="dhcpv6-client"/>

</zone>

target 表示当发来的数据包,没有匹配到任何的规则(比如端口号,服务等),采取的默认行为。

short 表示对 zone 的一个简短描述名字。

description 表示对 zone 的一段详细描述

 

  • services:保存service配置文件

 

  • icmptypes:保存和icmp类型相关的配置文件

 

 

白名单配置操作

配置白名单
  1. 收集白名单IP地址或网段。逐一加入 trusted 区域:

$ sudo firewall-cmd --permanent --zone=trusted --add-source=173.245.48.0/20

……

$ sudo firewall-cmd --permanent --zone=trusted --add-source=131.0.72.55

 

  1. 使 trusted 区域设置生效,使用命令如下:

$ sudo firewall-cmd --reload

 

  1. 确认 trusted 区域是否设置正确,使用命令如下:

$ sudo firewall-cmd --zone=trusted --list-all

返回:

trusted (active)

  target: ACCEPT

  icmp-block-inversion: no

  interfaces:

  sources: 173.245.48.0/20 …… 131.0.72.0/22

  services:

  ports:

  protocols:

  masquerade: no

  forward-ports:

  source-ports:

  icmp-blocks:

  rich rules:

 

切换默认区域从 public 到 drop
  1. 把常用关键服务加入排除列表

$ sudo firewall-cmd --permanent --zone=drop --add-service=ssh

$ sudo firewall-cmd --permanent --zone=drop --add-service=dhcpv6-client

 

  1. 将默认区域设置为drop

$ sudo firewall-cmd --set-default-zone=drop

 

  1. 再将默认网卡(比如eth0)分配给 drop 区域,使用命令如下:

$ sudo firewall-cmd --permanent --zone=drop --change-interface=eth0

  1. 使白名单最终生效,使用命令如下:

$ sudo firewall-cmd --reload

 

常见命令参考

$ sudo firewall-cmd --list-all

 

  • 配置zone

 

firewall-cmd --set-default-zone=zone 

配置默认zone。也可以通过firewalld.conf配置文件的DefaultZone配置项来配置。

firewall-cmd --get-default-zone

获取默认zone的值。

firewall-cmd --get-active-zones

查看当前所有起作用的zone

firewall-cmd --get-zone-of-interface=interface

firewall-cmd --get-zone-of-source=source[/mask]

根据source或者interface查询所对应的zone。可以检查设置是否正确。

 

  • 配置source

firewall-cmd [--permanent] [--zone=zone] --list-sources

用于列出指定zone的所有绑定的source地址

 

firewall-cmd [--permanent] [--zone=zone] --query-source=source[/mask]

用于查询指定zone是否跟指定source地址进行了绑定

 

firewall-cmd [--permanent] [--zone=zone] --add-source=source[/mask]

用于将一个source地址绑定到指定的zone(只可绑定一次,第二次绑定到不同的zone会报错)

 

firewall-cmd [--zone=zone] --change-source=source[/mask]

用于改变source地址所绑定的zone,如果原来没有绑定则进行绑定,这样就跟--add-source的作用一样了

 

firewall-cmd [--permanent] [--zone=zone] --remove-source=source[/mask]

用于删除source地址跟zone的绑定

 

--permanent表示是否存储到配置文件中(如果存储到配置文件中这不会立即生效)

--zone用于指定所要设置的zone,如果不指定则使用默认zone。

 

  • 配置interface

 

interface有两个可以配置的位置:1、zone所对应的xml配置文件2、网卡配置文件(也就是ifcfg-*文件)。

 

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除外)。

 

  • 配置target

firewall-cmd --permanent [--zone=zone] --get-target

firewall-cmd --permanent [--zone=zone] --set-target=target

 

  • 配置service

 

firewall-cmd [--permanent] [--zone=zone] --list-services

firewall-cmd [--permanent] [--zone=zone] --add-service=service [--timeout=seconds]

--timeout的含义是这样的:添加一个服务,但是不是一直生效而是生效一段时间,过期之后自动删除。这个选项非常有用,比如我们想暂时开放一个端口进行一些特殊的操作(比如远程调试),等处理完成后再关闭,不过有时候我们处理完之后就忘记关闭了,而现在的--timeout选项就可以帮我们很好地解决这个问题。

firewall-cmd [--permanent] [--zone=zone] --remove-service=service

firewall-cmd [--permanent] [--zone=zone] --query-service=service

 

  • Port命令

firewall-cmd [--permanent] [--zone=zone] --list-ports

firewall-cmd [--permanent] [--zone=zone] --add-port=portid[-portid]/protocol [--timeout=seconds]

--timeout的含义是这样的:添加一个服务,但是不是一直生效而是生效一段时间,过期之后自动删除。这个选项非常有用,比如我们想暂时开放一个端口进行一些特殊的操作(比如远程调试),等处理完成后再关闭,不过有时候我们处理完之后就忘记关闭了,而现在的--timeout选项就可以帮我们很好地解决这个问题。

firewall-cmd [--permanent] [--zone=zone] --remove-port=portid[-portid]/protocol

firewall-cmd [--permanent] [--zone=zone] --query-port=portid[-portid]/protocol

 

  • icmp-block命令

 

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命令

ip地址伪装,NAT转发中的一种。

 

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到85端口的所有请求都转发到8080端口

 

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]]

 

 

 

 

具体步骤:

    4  [2020.12.29 09:31:11]:firewall-cmd --state

    6  [2020.12.29 09:31:44]:systemctl start firewalld

    7  [2020.12.29 09:31:52]:firewall-cmd --state

    8  [2020.12.29 09:32:01]:firewall-cmd --list-all-zone

    9  [2020.12.29 09:32:31]:firewall-cmd --permanent --zone=trusted --add-source=10.29.141.188

   10  [2020.12.29 09:32:51]:firewall-cmd --permanent --zone=trusted --add-source=10.29.41.163

   11  [2020.12.29 09:33:03]:firewall-cmd --permanent --zone=trusted --add-source=10.7.27.5

 

   12  [2020.12.29 09:33:06]:firewall-cmd --permanent --zone=trusted --add-source=10.26.196.234

12  [2020.12.29 09:33:06]:firewall-cmd --permanent --zone=trusted --add-source=10.26.197.234

 

   13  [2020.12.29 09:33:26]:firewall-cmd --reload

   14  [2020.12.29 09:33:37]:firewall-cmd --zone=trusted --list-all

   15  [2020.12.29 09:33:49]:firewall-cmd --permanent --zone=drop --add-service=ssh

   16  [2020.12.29 09:34:00]:firewall-cmd --permanent --zone=drop --add-service=dhcpv6-client

   17  [2020.12.29 09:34:11]:firewall-cmd --set-default-zone=drop

   18  [2020.12.29 09:34:22]:firewall-cmd --permanent --zone=drop --change-interface=eth0

   19  [2020.12.29 09:34:32]:firewall-cmd --reload

   20  [2020.12.29 09:34:41]:firewall-cmd --list-all-zone

 

开放端口:

firewall-cmd --zone=trusted --add-port=3000/tcp --permanent

firewall-cmd --zone=drop --add-port=3000/tcp --permanent

firewall-cmd --reload

 

firewall-cmd --zone=drop --remove-port=3000/tcp --permanent

 

 

Sudo命令执行权限被锁住:(https://ywnz.com/linux/pamtally/)

pam_tally2 -r -u 用户名

 

新增白名单:

sudo firewall-cmd --permanent --zone=trusted --add-source=10.1.x.x

开端口

firewall-cmd --zone=public --add-port=8080/tcp --permanent

 

移除

sudo firewall-cmd --permanent --zone=trusted --remove-source=10.1.x.x

 

sudo systemctl stop firewalld

 

 

端口开放

sudo firewall-cmd --zone=public --add-port=18770-19090/tcp --permanent

查看开放的端口

sudo firewall-cmd --zone=public --list-ports


指定开放给哪个ip端口

sudo firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.1.x.x" port protocol="tcp" port="18769" accept"