firewall-cmd
在 centos7 里有几种防火墙共存,firewalld、iptables,默认是使用 firewalld 来管理 netfilter 子系统,不过底层调用的命令仍然是 iptables 等。
firewalld 自身并不具备防火墙的功能,而是和 iptables 一样需要通过内核的 netfilter 来实现,也就是说 firewalld 和 iptables 一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过 firewalld 和 iptables 的结构以及使用方法不一样罢了。firewalld是iptables的一个封装,可以让你更容易地管理iptables规则。它并不是iptables的替代品,虽然iptables命令仍可用于firewalld,但建议firewalld时仅使用firewalld命令。
firewalld 和 iptables service 之间一个极大的不同在于:
使用 iptables service 每一个单独更改都意味着清除所有旧有的规则和从/etc/sysconfig/iptables 里读取所有新的规则,换句话说,每次修改都要求防火墙完全重启。这就会影响到现有的连接。
然而使用 firewalld 却不会再创建任何新的规则,仅仅运行规则中的不同之处,因此firewalld 可以在运行时间内改变设置而不丢失现行连接。
这种不同的原因在于iptables service 在 /etc/sysconfig/iptables 这一个文件中储存,而 firewalld 将配置储存在 /usr/lib/firewalld/(系统配置文件,预定义配置文件)和 /etc/firewalld/(用户配置文件) 中的多个XML文件里。
firewalld 跟 iptables 的区别:
(1)firewalld可以动态修改单条规则,动态管理规则集,允许更新规则而不破坏现有会话和连接,而iptables,在修改了规则后必须得全部刷新才可以生效。
(2)firewalld使用区域和服务而不是链式规则。
(3)进站:firewalld默认是拒绝的(ping和ssh不拒绝),需要设置以后才能放行。而iptables默认是允许的,需要拒绝的才去限制。
出站:firewalld、iptables 不限制。
(5)firewalld 默认每个服务是拒绝,每个服务都需要去设置才能放行;iptables 默认是每个服务是允许,需要拒绝的才去限制。
firewalld的基本概念
在CentOS7之后,当你使用firewalld时,有两个基本概念
- 服务(service)
- 区域(zone)
什么叫service?
简单说,就是应用协议
例如,上网经常用到tcp协议的80端口和443端口,还有域名解析要用到udp协议的35端口,访问共享文件夹需要用到udp端口的137和138端口, ssh登录的22端口
这些常用的应用,firewalld都已经内置了。因此在防火墙的配置和管理会变得简单以及人性化。
什么是zone?
而理解区域就更简单了,就是对各种内置服务预分组的集合。
在目录/usr/lib/firewalld/zones下预定义了所有的zone

当然,也可以通过firewall命令进行查看
1 | [root@procketmq1 ~]# firewall-cmd --get-zones |
各个zone的含义如下。按信任等级排序
trusted–接受所有网络连接。我不建议将该区域用于连接到WAN的专用服务器或VM。
home –适用于您信任其他计算机的局域网内的家用计算机,例如笔记本电脑和台式机。仅允许选择的TCP / IP端口。
internal–当您主要信任LAN上的其他服务器或计算机时,用于内部网络。
work–在信任同事和其他服务器的工作场所中使用。以上都支持接受ssh
public–默认区域。不接受ssh。需要单独配置开通指定机器的ssh访问。
external-对于路由器连接类型很有用。您还需要LAN和WAN接口,以使伪装(NAT)正常工作。
dmz –仅接受SSH服务连接
block–拒绝所有传入的网络连接。仅从系统内部启动的网络连接是可能的。
drop –丢弃所有传入网络连接,没有任何回复。仅允许传出网络连接。
简单来说,区域就是firewalld预先准备了几套防火墙策略集合(策略模板),
用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。
查看默认zone
1 | [root@procketmq1 ~]# firewall-cmd --get-default-zone |
默认使用的zone是public
查看当前使用的zone
1 | [root@procketmq1 ~]# firewall-cmd --get-active-zones |
当前活跃的zone是public。并且分配的接口是eth0
确定使用的区域
默认区是public,但是不是说此时所有的连接就是使用public区域的配置
对于一个接收到的请求具体使用哪个 zone,firewalld 是通过下面三种方式来判断的:
source:来源地址。
Interface:接收请求的网卡。
firewalld:配置的默认区域(zone)。
这三个方式的优先级按顺序依次降低,也就是说如果按照 source 可以找到就不会再按 interface 去找,如果前两个都找不到才会使用第三个默认区域。
常用命令清单

补充说明
- 使用firewall-cmd配置的命令是立即生效的,但是不是永久的。重启会失效。如果想一直有效,需要使用永久(Permanent)模式,即在firewall-cmd的命令后加–permanent参数
- 但是永久模式的配置不是立即生效的,在系统重启后才会生效。要想立即生效,手动执行 firewall-cmd –reload 重载命令。
- remove 掉 ssh 服务或者 ssh 端口,当前远程登陆会话不会断开,退出后就无法远程连接了。
- 添加常用端口,默认会添加到默认的区域(如果没有修改默认区域,默认区域为 public)。
查看当前防火墙启用的规则
1 | [root@procketmq1 ~]# firewall-cmd --list-all |
因为默认的就是public区域
1 | firewall-cmd --list-all --zone=public |
所以 ,这俩个命令是一样的效果。
对结果的一些解释
public(active)说明目前该zone是active状态。你–zone=internal就会发现internal后面就没有active
target: default
target就是对数据包的处理动作。有以下几种选项
- default:不做任何事情
- ACCEPT:除了被明确写好的规则,会接受所有流入的数据包
- REJECT 除了被明确写好允许的规则,会拒绝所有流入的数据包, 会给发起连接的机器回复被拒绝的消息。
- DROP:除了被明确写好允许的规则,会拒绝所有流入的数据包, 不会给发起连接的机器回复任何消息。
要修改target,命令如下
1 | firewall-cmd --zone=public --set-target=DROP |
- icmp-block-inversion: no
ICMP协议类型黑白名单开关,默认是no。即黑名单模式:默认放行,允许处理所有的icmp type。只有添加到黑名单的icmp type被禁止响应。
interfaces: eth0
关联的网卡
sources
来源,可以是IP地址,也可以是mac地址
services
允许的服务。public域默认不允许ssh
ports:
允许的目标端口,即本地开放的端口,这里添加的是公开端口,所有的IP地址都能访问。
protocols:
允许通过的协议
masquerade: no
是否允许伪装(yes/no),可改写来源IP地址及mac地址
forward-ports:
允许转发的端口
source-ports:
允许的来源端口
icmp-blocks:
可添加ICMP类型,当icmp-block-inversion为no时(黑名单),这些ICMP类型被拒绝;当icmp-block-inversion为yes时(白名单), 这些ICMP类型被允许。
rich rules:
富规则,即更细致、更详细的防火墙规则策略,它的优先级在所有的防火墙策略中也是最高的。
查询、列出、添加、删除开放的端口:
应该是最常用的功能了
1 | firewall-cmd --zone=public --query-port=8080/tcp //返回该端口是否开放 |
端口既可以是一个独立端口数字,又或者端口范围,例如,5060-5070。
协议可以指定为 tcp 或 udp。
rich rules
rich rule里可以写的内容:
rule :规则。
family:’ipv4’:指定ipv4的地址。
source address=’10.0.10.1’:要拒绝或接受的IP,可以是IP或者是IP段。
service name=’ssh’:指定的是ssh服务。
port 指定端口
protocol:指定协议
target操作:drop:此条规则的执行方法是丢弃。reject:此条规则的执行方法是拒绝。accept:此条规则的执行方法是接受。
举例:
允许某个ip进行ssh登录
1 | firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='x.x.x.x' service name='ssh' accept" |
这是通过实行service的方式或者指定port 22端口
1 | firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='x.x.x.x' port protocol='tcp' port='22' accept" |