运维管理 ·

Centos 7 Firewall-CMD 防火墙命令参数详解

在CentOS7开始,默认是没有iptables的,而是使用了firewall防火墙.
与时俱进,简单的整理了一下firewall的使用方法.
关于详细的介绍参考官网,就不搬字了.这个网站有中文选项.可以直接看中文.关于CentOS7 非常多是资料这里面都能找到.
官方文档地址:

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html#sec-Introduction_to_firewalld

正文开始
FirewallD 提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。

什么是动态防火墙?

我们首先需要弄明白的第一个问题是到底什么是动态防火墙。为了解答这个问题,我们先来回忆一下 iptables service 管理防火墙规则的模式:用户将新的防火墙规则添加进 /etc/sysconfig/iptables 配置文件当中,再执行命令 service iptables reload 使变更的规则生效。在这整个过程的背后,iptables service 首先对旧的防火墙规则进行了清空,然后重新完整地加载所有新的防火墙规则,而如果配置了需要 reload 内核模块的话,过程背后还会包含卸载和重新加载内核模块的动作,而不幸的是,这个动作很可能对运行中的系统产生额外的不良影响,特别是在网络非常繁忙的系统中。

如果我们把这种哪怕只修改一条规则也要进行所有规则的重新载入的模式称为静态防火墙的话,那么 firewalld 所提供的模式就可以叫做动态防火墙,它的出现就是为了解决这一问题,任何规则的变更都不需要对整个防火墙规则列表进行重新加载,只需要将变更部分保存并更新到运行中的 iptables 即可。

这里有必要说明一下 firewalld 和 iptables 之间的关系, firewalld 提供了一个 daemon 和 service,还有命令行和图形界面配置工具,它仅仅是替代了 iptables service 部分,其底层还是使用 iptables 作为防火墙规则管理入口。firewalld 使用 python 语言开发,在新版本中已经计划使用 c++ 重写 daemon 部分。

什么是区域(zone)?

firewalld将网卡对应到不同的区域(zone),zone 默认共有9个,block dmz drop external home internal public trusted work.
不同的区域之间的差异是其对待数据包的默认行为不同,根据区域名字我们可以很直观的知道该区域的特征,在CentOS7系统中,默认区域被设置为public.
在最新版本的fedora(fedora21)当中随着 server 版和 workstation 版的分化则添加了两个不同的自定义 zone FedoraServer 和 FedoraWorkstation 分别对应两个版本。

使用下面的命令分别列出所有支持的 zone 和查看当前的默认 zone:


区域(zone)说明如下:

iptables service 在 /etc/sysconfig/iptables 中储存配置
firewalld 将配置储存在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件里

在/etc/firewalld/的区域设定是一系列可以被快速执行到网络接口的预设定。列表并简要说明如下:

drop(丢弃)
任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。
block(限制)
任何接收的网络连接都被 IPv4 的 icmp-host-prohibited 信息和 IPv6 的 icmp6-adm-prohibited 信息所拒绝。
public(公共)
在公共区域内使用,不能相信网络内的其他计算机不会对您的计算机造成危害,只能接收经过选取的连接。
external(外部)
特别是为路由器启用了伪装功能的外部网。您不能信任来自网络的其他计算,不能相信它们不会对您的计算机造成危害,只能接收经过选择的连接。
dmz(非军事区)
用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接。
work(工作)
用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接。
home(家庭)
用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接。
internal(内部)
用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接。
trusted(信任)
可接受所有的网络连接。
指定其中一个区域为默认区域是可行的。当接口连接加入了 NetworkManager,它们就被分配为默认区域。安装时,firewalld 里的默认区域被设定为公共区域。

什么是服务?

在 /usr/lib/firewalld/services/ 目录中,还保存了另外一类配置文件,每个文件对应一项具体的网络服务,如 ssh 服务等.
与之对应的配置文件中记录了各项服务所使用的 tcp/udp 端口,在最新版本的 firewalld 中默认已经定义了 70+ 种服务供我们使用.
当默认提供的服务不够用或者需要自定义某项服务的端口时,我们需要将 service 配置文件放置在 /etc/firewalld/services/ 目录中.
service 配置的好处显而易见:
第一,通过服务名字来管理规则更加人性化,
第二,通过服务来组织端口分组的模式更加高效,如果一个服务使用了若干个网络端口,则服务的配置文件就相当于提供了到这些端口的规则管理的批量操作快捷方式。

每加载一项 service 配置就意味着开放了对应的端口访问,使用下面的命令分别列出所有支持的 service 和查看当前 zone 种加载的 service:

动态添加一条防火墙规则如下:
假设自定义的 ssh 端口号为 5630,使用下面的命令来添加新端口的防火墙规则:


如果需要使规则保存到 zone 配置文件,则需要加参数 –permanent

举例如下:

# 注意:防火墙配置文件也可以手动修改,修改后记得重载,重载方法请看下文.

#####firewalld命令#####

# 查看firewalld状态 两种方法2选1即可

# 重读防火墙
# 以 root 身份输入以下命令,重新加载防火墙,并不中断用户连接,即不丢失状态信息:

# 以 root 身份输入以下信息,重新加载防火墙并中断用户连接,即丢弃状态信息:

# 注意:通常在防火墙出现严重问题时,这个命令才会被使用。比如,防火墙规则是正确的,但却出现状态信息问题和无法建立连接。

# 获取支持的区域(zone)列表


# 获取所有支持的服务


# 获取所有支持的ICMP类型


# 列出全部启用的区域的特性

[root@work111 zones]# firewall-cmd --list-all-zones
# 输出格式是:
<zone>
interfaces: <interface1> ..
services: <service1> ..
ports: <port1> ..
forward-ports: <forward port1> ..
icmp-blocks: <icmp type1> ..

# 输出区域 <zone> 全部启用的特性。如果省略区域,将显示默认区域的信息。
firewall-cmd [–zone=<zone>] –list-all



# 获取默认区域的网络设置

# 设置默认区域

# 注意:流入默认区域中配置的接口的新访问请求将被置入新的默认区域。当前活动的连接将不受影响。

# 获取活动的区域

# 根据接口获取区域
firewall-cmd –get-zone-of-interface=<interface>

## 以下关于区域和接口的操作,就不一一举例了,可以根据实际情况修改.

# 将接口增加到区域

firewall-cmd [--zone=<zone>] --add-interface=<interface>

# 如果接口不属于区域,接口将被增加到区域。如果区域被省略了,将使用默认区域。接口在重新加载后将重新应用。

# 修改接口所属区域

firewall-cmd [--zone=<zone>] --change-interface=<interface>

# 这个选项与 –add-interface 选项相似,但是当接口已经存在于另一个区域的时候,该接口将被添加到新的区域。

# 从区域中删除一个接口

firewall-cmd [--zone=<zone>] --remove-interface=<interface>

# 查询区域中是否包含某接口

firewall-cmd [--zone=<zone>] --query-interface=<interface>

# 注意:返回接口是否存在于该区域。没有输出。

# 列举区域中启用的服务

firewall-cmd [ --zone=<zone> ] --list-services

# 这两条简单点说,就是断网和连网.
# 启用应急模式阻断所有网络连接,以防出现紧急状况

firewall-cmd --panic-on

# 禁用应急模式

firewall-cmd --panic-off

# 查询应急模式

firewall-cmd --query-panic

# 启用区域中的一种服务

firewall-cmd [--zone=<zone>] --add-service=<service> [--timeout=<seconds>]

# 此举启用区域中的一种服务。如果未指定区域,将使用默认区域。如果设定了超时时间,服务将只启用特定秒数。如果服务已经活跃,将不会有任何警告信息。
# 例: 使区域中的 ipp-client 服务生效60秒:

firewall-cmd --zone=home --add-service=ipp-client --timeout=60

# 例: 启用默认区域中的http服务:

# 禁用区域中的某种服务

firewall-cmd [--zone=<zone>] --remove-service=<service>

# 此举禁用区域中的某种服务。如果未指定区域,将使用默认区域。
# 例: 禁止 home 区域中的 http 服务:

# 区域种的服务将被禁用。如果服务没有启用,将不会有任何警告信息。

# 查询区域中是否启用了特定服务

firewall-cmd [--zone=<zone>] --query-service=<service>

# 如果服务启用,将返回1,否则返回0。没有输出信息。

# 启用区域端口和协议组合

firewall-cmd [--zone=<zone>] --add-port=<port>[-<port>]/<protocol> [--timeout=<seconds>]

# 此举将启用端口和协议的组合。端口可以是一个单独的端口 <port> 或者是一个端口范围 <port>-<port> 。协议可以是 tcp 或 udp。

# 禁用端口和协议组合

firewall-cmd [--zone=<zone>] --remove-port=<port>[-<port>]/<protocol>

# 查询区域中是否启用了端口和协议组合

firewall-cmd [--zone=<zone>] --query-port=<port>[-<port>]/<protocol>

# 如果启用,此命令将有返回值。没有输出信息。

# 启用区域中的 IP 伪装功能

firewall-cmd [--zone=<zone>] --add-masquerade

# 此举启用区域的伪装功能。私有网络的地址将被隐藏并映射到一个公有IP。这是地址转换的一种形式,常用于路由。由于内核的限制,伪装功能仅可用于IPv4。

# 禁用区域中的 IP 伪装

firewall-cmd [--zone=<zone>] --remove-masquerade

# 查询区域的伪装状态

firewall-cmd [--zone=<zone>] --query-masquerade

# 如果启用,此命令将有返回值。没有输出信息

# 启用区域的 ICMP 阻塞功能

firewall-cmd [--zone=<zone>] --add-icmp-block=<icmptype>

# 此举将启用选中的 Internet 控制报文协议 (ICMP) 报文进行阻塞。 ICMP 报文可以是请求信息或者创建的应答报文,以及错误应答。

# 禁止区域的 ICMP 阻塞功能

firewall-cmd [--zone=<zone>] --remove-icmp-block=<icmptype>

# 查询区域的 ICMP 阻塞功能

firewall-cmd [--zone=<zone>] --query-icmp-block=<icmptype>

# 如果启用,此命令将有返回值。没有输出信息。
     # 例: 阻塞区域的响应应答报文:

firewall-cmd --zone=public --add-icmp-block=echo-reply

# 在区域中启用端口转发或映射

firewall-cmd [--zone=<zone>] --add-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }

# 端口可以映射到另一台主机的同一端口,也可以是同一主机或另一主机的不同端口。端口号可以是一个单独的端口 <port> 或者是端口范围 <port>-<port> 。协议可以为 tcp 或udp 。目标端口可以是端口号 <port> 或者是端口范围 <port>-<port> 。目标地址可以是 IPv4 地址。受内核限制,端口转发功能仅可用于IPv4。

# 禁止区域的端口转发或者端口映射

firewall-cmd [--zone=<zone>] --remove-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }

# 查询区域的端口转发或者端口映射

firewall-cmd [--zone=<zone>] --query-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }

# 如果启用,此命令将有返回值。没有输出信息。
# 例: 将区域 home 的 ssh 转发到 127.0.0.2

firewall-cmd --zone=home --add-forward-port=port=22:proto=tcp:toaddr=127.0.0.2

# 处理永久区域
# 永久选项不直接影响运行时的状态。这些选项仅在重载或者重启服务时可用。为了使用运行时和永久设置,需要分别设置两者。 选项 –permanent 需要是永久设置的第一个参数。

# 获取永久选项所支持的服务

# 获取永久选项所支持的ICMP类型列表

# 获取支持的永久区域


# 启用区域中的服务

firewall-cmd --permanent [--zone=<zone>] --add-service=<service>

# 此举将永久启用区域中的服务。如果未指定区域,将使用默认区域。

# 禁用区域中的一种服务

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

# 查询区域中的服务是否启用

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

# 如果服务启用,此命令将有返回值。此命令没有输出信息
# 例: 永久启用 home 区域中的 ipp-client 服务


# 永久启用区域中的一个端口-协议组合

firewall-cmd --permanent [--zone=<zone>] --add-port=<port>[-<port>]/<protocol>

# 永久禁用区域中的一个端口-协议组合

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

# 查询区域中的端口-协议组合是否永久启用

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

# 如果服务启用,此命令将有返回值。此命令没有输出信息。

# 例: 永久启用 home 区域中的 https (tcp 443) 端口


# 永久启用区域中的伪装

firewall-cmd --permanent [--zone=<zone>] --add-masquerade

# 此举启用区域的伪装功能。私有网络的地址将被隐藏并映射到一个公有IP。这是地址转换的一种形式,常用于路由。由于内核的限制,伪装功能仅可用于IPv4。

# 永久禁用区域中的伪装

firewall-cmd --permanent [--zone=<zone>] --remove-masquerade

# 查询区域中的伪装的永久状态

firewall-cmd --permanent [--zone=<zone>] --query-masquerade

# 如果服务启用,此命令将有返回值。此命令没有输出信息。

# 永久启用区域中的ICMP阻塞

firewall-cmd --permanent [--zone=<zone>] --add-icmp-block=<icmptype>

# 此举将启用选中的 Internet 控制报文协议 (ICMP) 报文进行阻塞。 ICMP 报文可以是请求信息或者创建的应答报文或错误应答报文。

# 永久禁用区域中的ICMP阻塞

firewall-cmd --permanent [--zone=<zone>] --remove-icmp-block=<icmptype>

# 查询区域中的ICMP永久状态

firewall-cmd --permanent [--zone=<zone>] --query-icmp-block=<icmptype>

# 如果服务启用,此命令将有返回值。此命令没有输出信息。
# 例: 阻塞公共区域中的响应应答报文:

firewall-cmd --permanent --zone=public --add-icmp-block=echo-reply

# 在区域中永久启用端口转发或映射

firewall-cmd --permanent [--zone=<zone>] --add-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }

# 端口可以映射到另一台主机的同一端口,也可以是同一主机或另一主机的不同端口。端口号可以是一个单独的端口 <port> 或者是端口范围 <port>-<port> 。协议可以为 tcp 或udp 。目标端口可以是端口号 <port> 或者是端口范围 <port>-<port> 。目标地址可以是 IPv4 地址。受内核限制,端口转发功能仅可用于IPv4。

# 永久禁止区域的端口转发或者端口映射

firewall-cmd --permanent [--zone=<zone>] --remove-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }

# 查询区域的端口转发或者端口映射状态

firewall-cmd --permanent [--zone=<zone>] --query-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }

# 如果服务启用,此命令将有返回值。此命令没有输出信息。
# 例: 将 home 区域的 ssh 服务转发到 127.0.0.2

firewall-cmd --permanent --zone=home --add-forward-port=port=22:proto=tcp:toaddr=127.0.0.2

## 直接选项
# 直接选项主要用于使服务和应用程序能够增加规则。 规则不会被保存,在重新加载或者重启之后必须再次提交。传递的参数 <args> 与 iptables, ip6tables 以及 ebtables 一致。
# 选项 –direct 需要是直接选项的第一个参数。
# 将命令传递给防火墙。参数 <args> 可以是 iptables, ip6tables 以及 ebtables 命令行参数。

firewall-cmd --direct --passthrough { ipv4 | ipv6 | eb } <args>

# 为表 <table> 增加一个新链 <chain> 。

firewall-cmd --direct --add-chain { ipv4 | ipv6 | eb } <table> <chain>

# 从表 <table> 中删除链 <chain> 。

firewall-cmd --direct --remove-chain { ipv4 | ipv6 | eb } <table> <chain>

# 查询 <chain> 链是否存在与表 <table>. 如果是,返回0,否则返回1.

firewall-cmd --direct --query-chain { ipv4 | ipv6 | eb } <table> <chain>

# 如果启用,此命令将有返回值。此命令没有输出信息。

# 获取用空格分隔的表 <table> 中链的列表。

firewall-cmd --direct --get-chains { ipv4 | ipv6 | eb } <table>

# 为表 <table> 增加一条参数为 <args> 的链 <chain> ,优先级设定为 <priority>。

firewall-cmd --direct --add-rule { ipv4 | ipv6 | eb } <table> <chain> <priority> <args>

# 从表 <table> 中删除带参数 <args> 的链 <chain>。

firewall-cmd --direct --remove-rule { ipv4 | ipv6 | eb } <table> <chain> <args>

# 查询 带参数 <args> 的链 <chain> 是否存在表 <table> 中. 如果是,返回0,否则返回1.

firewall-cmd --direct --query-rule { ipv4 | ipv6 | eb } <table> <chain> <args>

# 如果启用,此命令将有返回值。此命令没有输出信息。

# 获取表 <table> 中所有增加到链 <chain> 的规则,并用换行分隔

firewall-cmd --direct --get-rules { ipv4 | ipv6 | eb } <table> <chain>

##########

#####通过配置文件来使用Firewalld的方法#####
系统本身已经内置了一些常用服务的防火墙规则,存放在/usr/lib/firewalld/services/
注意!
请勿编辑/usr/lib/firewalld/services/ ,只有 /etc/firewalld/services 的文件可以被编辑。

以下例子均以系统自带的public zone 为例子.

1. 如果想开放80端口供外网访问http服务,例子如下

1.1 将 http.xml复制到/etc/firewalld/services/下面,以服务形式管理防火墙,
# 这个cp命令其实是可以省略的,系统会优先去读取 /etc/firewalld 里面的文件,读取完毕后,会去/usr/lib/firewalld/services/ 再次读取.为了方便修改和管理,建议复制到/etc/firewalld

1.2 修改public.xml,加入http服务

1.3 重新载入 两条命令都可以的

以 root 身份输入以下命令,重新加载防火墙,并不中断用户连接,即不丢失状态信息:

以 root 身份输入以下信息,重新加载防火墙并中断用户连接,即丢弃状态信息:

注意:通常在防火墙出现严重问题时,这个命令才会被使用。比如,防火墙规则是正确的,但却出现状态信息问题和无法建立连接。

2. 修改防火墙ssh的端口方法
2.1 复制ssh.xml文件到/etc/firewalld/services/

2.2 修改ssh.xml文件 5630为ssh端口

2.3 重新载入 两条命令都可以的

以 root 身份输入以下命令,重新加载防火墙,并不中断用户连接,即不丢失状态信息:

以 root 身份输入以下信息,重新加载防火墙并中断用户连接,即丢弃状态信息:

注意:通常在防火墙出现严重问题时,这个命令才会被使用。比如,防火墙规则是正确的,但却出现状态信息问题和无法建立连接。

3. 指定ip访问ssh端口
3.1 修改/etc/firewalld/zones/

# rule字段内为要限制的ip和使用的服务

 3.3 重新载入 两条命令都可以的

以 root 身份输入以下命令,重新加载防火墙,并不中断用户连接,即不丢失状态信息:

以 root 身份输入以下信息,重新加载防火墙并中断用户连接,即丢弃状态信息:

注意:通常在防火墙出现严重问题时,这个命令才会被使用。比如,防火墙规则是正确的,但却出现状态信息问题和无法建立连接。

4. 添加自定义服务 举例,添加8080端口为新的Service
4.1 添加新文件 8080.xml

<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>ELK</short>
<description>ELK By fooher.com</description>
<port protocol="tcp" port="9100"/>
</zone>

4.2 编辑public.xml 文件,加入相应的Server

<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public.</description>
<service name="dhcpv6-client"/>
<service name="ssh"/>
<port protocol="tcp" port="5630"/>
<port protocol="tcp" port="22"/>
<port protocol="tcp" port="9100"/> 这行是后加的,要匹配 /etc/firewalld/services/8080.xml 文件名
</zone>

4.3 重新载入 两条命令都可以的

以 root 身份输入以下命令,重新加载防火墙,并不中断用户连接,即不丢失状态信息:

以 root 身份输入以下信息,重新加载防火墙并中断用户连接,即丢弃状态信息:

注意:通常在防火墙出现严重问题时,这个命令才会被使用。比如,防火墙规则是正确的,但却出现状态信息问题和无法建立连接。

 

关注运维天涯微信、新浪微博

评论已关闭