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

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



port:端口



interface:接口,可以理解为网卡



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



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



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



forward-port:端口转发



rule:自定义规则


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"?>

Block

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

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

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

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

services:保存service配置文件

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

白名单配置操作
配置白名单
收集白名单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

使 trusted 区域设置生效,使用命令如下:
$ sudo firewall-cmd --reload

确认 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
把常用关键服务加入排除列表
$ sudo firewall-cmd --permanent --zone=drop --add-service=ssh

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

将默认区域设置为drop
$ sudo firewall-cmd --set-default-zone=drop

再将默认网卡(比如eth0)分配给 drop 区域,使用命令如下:
$ sudo firewall-cmd --permanent --zone=drop --change-interface=eth0

使白名单最终生效,使用命令如下:
$ 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"

标签: none