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类型相关的配置文件
白名单配置操作
配置白名单
- 收集白名单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"