# 1. 简介 [scode type="share"]firewall-cmd 是 firewalld的字符界面管理工具,firewalld是centos7的一大特性,和Ubuntu的[ufw][1]一样基于Python编写。它最大的好处有两个:第一是支持动态更新,不用重启服务;第二是加入了防火墙的“zone”概念。[/scode] **firewalld跟iptables比起来至少有两大好处:** - firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效。 - firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能。 [scode type="blue"]firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和 iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结 构以及使用方法不一样罢了。[/scode] **配置文件** firewalld的配置文件有两个存储位置 1、`/etc/firewalld/` 2、`/usr/lib/firewalld/` 当需要读取配置文件时,firewalld会首先到第一个目录中去查找,如果可以找到,那么就直接使用,否则会继续到第二个目录中查找。 第二个目录中存放的是firewalld提供的通用配置文件,如果我们想修改配置,可以copy一份到第一个目录中,然后再进行修改。这么做利于区分自定义的配置文件与通用配置文件。 - 更多关于firewalld的介绍可参考[https://www.cnblogs.com/excelib/p/5150647.html][2] - 更多关于zone的介绍可参考[https://www.cnblogs.com/excelib/p/5155951.html][3] # 2. 命令格式 ```bash firewall-cmd [选项 ... ] ``` **选项** 通用选项 ```bash -h, --help # 显示帮助信息; -V, --version # 显示版本信息. (这个选项不能与其他选项组合); -q, --quiet # 不打印状态消息; ``` 状态选项 ```bash --state # 显示firewalld的状态; --reload # 不中断服务的重新加载; --complete-reload # 中断所有连接的重新加载; --permanent # 将当前命令的规则永久保存; --runtime-to-permanent # 将当前防火墙的规则永久保存; --check-config # 检查配置正确性; ``` [scode type="yellow"]添加`--permanent`参数后,会将配置将写入配置文件中,但不会立即生效,需要进行reload[/scode] [scode type="yellow"]`--reload`与`--complete-reload`的区别就是第一个无需断开连接,就是firewalld特性之一动态添加规则,第二个需要断开连接,类似重启服务[/scode] 日志选项 ```bash --get-log-denied # 获取记录被拒绝的日志; --set-log-denied= # 设置记录被拒绝的日志,只能为 'all','unicast','broadcast','multicast','off' 其中的一个; ``` # 3. 服务管理 **安装firewalld** [scode type="yellow"]firewalld已经默认安装在CentOS7系统中,如果提示`firewall-cmd`命令不存在,则需手动安装[/scode] ```bash yum install firewalld firewall-config ``` **服务管理** ```bash systemctl start firewalld # 启动 systemctl stop firewalld # 停止 systemctl enable firewalld # 启用自动启动 systemctl disable firewalld # 禁用自动启动 systemctl status firewalld # 或者 firewall-cmd --state 查看状态 ``` # 4. 区域管理 ## 4.1 网络区域简介 通过将网络划分成不同的区域,制定出不同区域之间的访问控制策略来控制不同程序区域间传送的数据流。例如,互联网是不可信任的区域,而内部网络是高度信任的区域。网络安全模型可以在安装,初次启动和首次建立网络连接时选择初始化。该模型描述了主机所连接的整个网络环境的可信级别,并定义了新连接的处理方式。有如下几种不同的初始化区域: - 阻塞区域(block):任何传入的网络数据包都将被阻止。 - 工作区域(work):相信网络上的其他计算机,不会损害你的计算机。 - 家庭区域(home):相信网络上的其他计算机,不会损害你的计算机。 - 公共区域(public):不相信网络上的任何计算机,只有选择接受传入的网络连接。 - 隔离区域(DMZ):隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接。 - 信任区域(trusted):所有的网络连接都可以接受。 - 丢弃区域(drop):任何传入的网络连接都被拒绝。 - 内部区域(internal):信任网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。 - 外部区域(external):不相信网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。 ## 4.2 显示支持的区域列表 ```bash firewall-cmd --get-zones ``` ## 4.3 获取当前默认区域 ```bash firewall-cmd --get-default-zone ``` ## 4.4 设置默认区域为家庭区域 ```bash firewall-cmd --set-default-zone=home ``` ## 4.5 查看当前区域 ```bash firewall-cmd --get-active-zones ``` ## 4.6 设置当前区域的接口 ```bash firewall-cmd --get-zone-of-interface=enp03s ``` ## 4.7 显示所有公共区域(public) ```bash firewall-cmd --zone=public --list-all ``` ## 4.8 临时修改网络接口(enp0s3)为内部区域(internal) ```bash firewall-cmd --zone=internal --change-interface=enp03s ``` ## 4.9 永久修改网络接口 enp03s 为内部区域(internal) ```bash firewall-cmd --permanent --zone=internal --change-interface=enp03s ``` # 5. 服务管理 [scode type="blue"]注:FirewallD 默认配置文件的默认区域是 public(获取当前默认区域请参考4.3),即当不指定`--zone`时,默认为`--zone=public`[/scode] ## 5.1 显示服务列表 Amanda, FTP, Samba 和 TFTP 等最重要的服务已经被 FirewallD 提供相应的服务,可以使用如下命令查看: ```bash firewall-cmd --get-services ``` ## 5.2 获取已开启服务 ```bash firewall-cmd --list-services ``` ## 5.3 获取SSH服务配置 ```bash firewall-cmd --permanent --info-service=ssh ``` ## 5.4 允许 SSH 服务通过 ```bash firewall-cmd --add-service=ssh ``` ## 5.5 禁止 SSH 服务通过 ```bash firewall-cmd --delete-service=ssh ``` ## 5.6 临时允许 Samba 服务通过 600 秒 ```bash firewall-cmd --add-service=samba --timeout=600 ``` ## 5.7 显示当前服务 ```bash firewall-cmd --list-services ``` ## 5.8 添加 HTTP 服务到内部区域(internal) ```bash firewall-cmd --permanent --zone=internal --add-service=http ``` # 6. 端口管理 [scode type="blue"]注:FirewallD 默认配置文件的默认区域是 public(获取当前默认区域请参考4.3),即当不指定`--zone`时,默认为`--zone=public`[/scode] ## 6.1 打开443/TCP端口 ```bash firewall-cmd --add-port=443/tcp ``` ## 6.2 永久打开3690/TCP端口 ```bash firewall-cmd --permanent --add-port=3690/tcp firewall-cmd --reload ``` ## 6.3 对192.168.148.166开放30000-31000端口段 ```bash firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.142.166" port protocol="tcp" port="30000-31000" accept" firewall-cmd --reload ``` ## 6.4 对192.168.148.1/24开放30000-31000端口段 ```bash firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.142.1/24" port protocol="tcp" port="30000-31000" accept" firewall-cmd --reload ``` ## 6.5 查询80/TCP端口开放情况 ```bash firewall-cmd --zone=public --query-port=80/tcp ``` ## 6.6 查看防火墙配置 ```bash firewall-cmd --list-all ``` # 7. 配置文件 如果 firewalld 服务尚未启动,则需要在防火墙启动前通过编辑配置文件`/etc/firewalld/zones/public.xml`的方式添加端口,示例如下: ``` Public For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted. ``` 在上面的示例中,进行了如下操作: - 添加了 http、https 服务 - 放开了 33000 端口的 TCP 协议 - 放开了 7000-7010 端口的 UDP 协议 - 面向172.16.0.1/16放开了 6000-10000 端口的 TCP 协议 编辑完成后即可启动服务 ``` systemctl start firewalld ``` # 8. 拓展功能 ## 8.1 端口转发 端口转发可以将指定地址访问指定的端口时,将流量转发至指定地址的指定端口。 ### 8.1.1 开启伪装IP 端口转发前需要开启IP伪装 ```bash firewall-cmd --query-masquerade # 检查是否允许伪装IP firewall-cmd --add-masquerade # 允许防火墙伪装IP firewall-cmd --remove-masquerade# 禁止防火墙伪装IP ``` ### 8.1.2 设置端口转发 转发的目的如果不指定 ip 的话就默认为本机,如果指定了 ip 却没指定端口,则默认使用来源端口。 ```bash firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 # 将80端口的流量转发至8080 firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1 # 将80端口的流量转发至192.168.0.1 firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080 # 将80端口的流量转发至192.168.0.1的8080端口 ``` ### 8.1.3 查询端口转发 ```bash firewall-cmd --list-forward-ports ``` ### 7.1.4 删除端口转发 ```bash firewall-cmd --remove-forward-port=port=8080:proto=tcp:toport=8088:toaddr=192.168.22.55 ``` [scode type="blue"]排查问题时需要注意服务情况及伪装IP配置。例如,将本地的 80 端口转发至其他IP的 8080 端口,首先检查本地的 80 端口和目标的 8080 端口是否开放监听了;其次检查是否允许伪装 IP,没允许的话要开启伪装 IP。[/scode] ## 8.2 紧急模式 紧急模式,即Panic模式,Panic的单词含义为“恐慌”、“惊慌”,在firewalld中表示当发生紧急情况(比如遭到攻击)时启用的一种“禁行模式”,启用这种模式后所有的进包和出包都会被丢弃,**包括SSH通讯**,因此开启此模式时需要慎重。 ```bash firewall-cmd --panic-on # 开启紧急模式 firewall-cmd --panic-off # 关闭紧急模式 firewall-cmd --query-panic # 查看紧急模式开启状态 ``` [1]: https://judi.fun/archives/16/ [2]: https://www.cnblogs.com/excelib/p/5150647.html [3]: https://www.cnblogs.com/excelib/p/5155951.html Loading... # 1. 简介 <div class="tip inlineBlock share"> firewall-cmd 是 firewalld的字符界面管理工具,firewalld是centos7的一大特性,和Ubuntu的[ufw][1]一样基于Python编写。它最大的好处有两个:第一是支持动态更新,不用重启服务;第二是加入了防火墙的“zone”概念。 </div> **firewalld跟iptables比起来至少有两大好处:** - firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效。 - firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能。 <div class="tip inlineBlock info"> firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和 iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结 构以及使用方法不一样罢了。 </div> **配置文件** firewalld的配置文件有两个存储位置 1、`/etc/firewalld/` 2、`/usr/lib/firewalld/` 当需要读取配置文件时,firewalld会首先到第一个目录中去查找,如果可以找到,那么就直接使用,否则会继续到第二个目录中查找。 第二个目录中存放的是firewalld提供的通用配置文件,如果我们想修改配置,可以copy一份到第一个目录中,然后再进行修改。这么做利于区分自定义的配置文件与通用配置文件。 - 更多关于firewalld的介绍可参考[https://www.cnblogs.com/excelib/p/5150647.html][2] - 更多关于zone的介绍可参考[https://www.cnblogs.com/excelib/p/5155951.html][3] # 2. 命令格式 ```bash firewall-cmd [选项 ... ] ``` **选项** 通用选项 ```bash -h, --help # 显示帮助信息; -V, --version # 显示版本信息. (这个选项不能与其他选项组合); -q, --quiet # 不打印状态消息; ``` 状态选项 ```bash --state # 显示firewalld的状态; --reload # 不中断服务的重新加载; --complete-reload # 中断所有连接的重新加载; --permanent # 将当前命令的规则永久保存; --runtime-to-permanent # 将当前防火墙的规则永久保存; --check-config # 检查配置正确性; ``` <div class="tip inlineBlock warning"> 添加`--permanent`参数后,会将配置将写入配置文件中,但不会立即生效,需要进行reload </div> <div class="tip inlineBlock warning"> `--reload`与`--complete-reload`的区别就是第一个无需断开连接,就是firewalld特性之一动态添加规则,第二个需要断开连接,类似重启服务 </div> 日志选项 ```bash --get-log-denied # 获取记录被拒绝的日志; --set-log-denied=<value> # 设置记录被拒绝的日志,只能为 'all','unicast','broadcast','multicast','off' 其中的一个; ``` # 3. 服务管理 **安装firewalld** <div class="tip inlineBlock warning"> firewalld已经默认安装在CentOS7系统中,如果提示`firewall-cmd`命令不存在,则需手动安装 </div> ```bash yum install firewalld firewall-config ``` **服务管理** ```bash systemctl start firewalld # 启动 systemctl stop firewalld # 停止 systemctl enable firewalld # 启用自动启动 systemctl disable firewalld # 禁用自动启动 systemctl status firewalld # 或者 firewall-cmd --state 查看状态 ``` # 4. 区域管理 ## 4.1 网络区域简介 通过将网络划分成不同的区域,制定出不同区域之间的访问控制策略来控制不同程序区域间传送的数据流。例如,互联网是不可信任的区域,而内部网络是高度信任的区域。网络安全模型可以在安装,初次启动和首次建立网络连接时选择初始化。该模型描述了主机所连接的整个网络环境的可信级别,并定义了新连接的处理方式。有如下几种不同的初始化区域: - 阻塞区域(block):任何传入的网络数据包都将被阻止。 - 工作区域(work):相信网络上的其他计算机,不会损害你的计算机。 - 家庭区域(home):相信网络上的其他计算机,不会损害你的计算机。 - 公共区域(public):不相信网络上的任何计算机,只有选择接受传入的网络连接。 - 隔离区域(DMZ):隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接。 - 信任区域(trusted):所有的网络连接都可以接受。 - 丢弃区域(drop):任何传入的网络连接都被拒绝。 - 内部区域(internal):信任网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。 - 外部区域(external):不相信网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。 ## 4.2 显示支持的区域列表 ```bash firewall-cmd --get-zones ``` ## 4.3 获取当前默认区域 ```bash firewall-cmd --get-default-zone ``` ## 4.4 设置默认区域为家庭区域 ```bash firewall-cmd --set-default-zone=home ``` ## 4.5 查看当前区域 ```bash firewall-cmd --get-active-zones ``` ## 4.6 设置当前区域的接口 ```bash firewall-cmd --get-zone-of-interface=enp03s ``` ## 4.7 显示所有公共区域(public) ```bash firewall-cmd --zone=public --list-all ``` ## 4.8 临时修改网络接口(enp0s3)为内部区域(internal) ```bash firewall-cmd --zone=internal --change-interface=enp03s ``` ## 4.9 永久修改网络接口 enp03s 为内部区域(internal) ```bash firewall-cmd --permanent --zone=internal --change-interface=enp03s ``` # 5. 服务管理 <div class="tip inlineBlock info"> 注:FirewallD 默认配置文件的默认区域是 public(获取当前默认区域请参考4.3),即当不指定`--zone`时,默认为`--zone=public` </div> ## 5.1 显示服务列表 Amanda, FTP, Samba 和 TFTP 等最重要的服务已经被 FirewallD 提供相应的服务,可以使用如下命令查看: ```bash firewall-cmd --get-services ``` ## 5.2 获取已开启服务 ```bash firewall-cmd --list-services ``` ## 5.3 获取SSH服务配置 ```bash firewall-cmd --permanent --info-service=ssh ``` ## 5.4 允许 SSH 服务通过 ```bash firewall-cmd --add-service=ssh ``` ## 5.5 禁止 SSH 服务通过 ```bash firewall-cmd --delete-service=ssh ``` ## 5.6 临时允许 Samba 服务通过 600 秒 ```bash firewall-cmd --add-service=samba --timeout=600 ``` ## 5.7 显示当前服务 ```bash firewall-cmd --list-services ``` ## 5.8 添加 HTTP 服务到内部区域(internal) ```bash firewall-cmd --permanent --zone=internal --add-service=http ``` # 6. 端口管理 <div class="tip inlineBlock info"> 注:FirewallD 默认配置文件的默认区域是 public(获取当前默认区域请参考4.3),即当不指定`--zone`时,默认为`--zone=public` </div> ## 6.1 打开443/TCP端口 ```bash firewall-cmd --add-port=443/tcp ``` ## 6.2 永久打开3690/TCP端口 ```bash firewall-cmd --permanent --add-port=3690/tcp firewall-cmd --reload ``` ## 6.3 对192.168.148.166开放30000-31000端口段 ```bash firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.142.166" port protocol="tcp" port="30000-31000" accept" firewall-cmd --reload ``` ## 6.4 对192.168.148.1/24开放30000-31000端口段 ```bash firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.142.1/24" port protocol="tcp" port="30000-31000" accept" firewall-cmd --reload ``` ## 6.5 查询80/TCP端口开放情况 ```bash firewall-cmd --zone=public --query-port=80/tcp ``` ## 6.6 查看防火墙配置 ```bash firewall-cmd --list-all ``` # 7. 配置文件 如果 firewalld 服务尚未启动,则需要在防火墙启动前通过编辑配置文件`/etc/firewalld/zones/public.xml`的方式添加端口,示例如下: ``` <?xml version="1.0" encoding="utf-8"?> <zone> <short>Public</short> <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description> <service name="ssh"/> <service name="dhcpv6-client"/> <service name="cockpit"/> <service name="http"/> <service name="https"/> <port port="33000" protocol="tcp"/> <port port="7000-7010" protocol="udp"/> <rule family="ipv4"> <source address="172.16.0.1/16"/> <port port="6000-10000" protocol="tcp"/> <accept/> </rule> <forward/> </zone> ``` 在上面的示例中,进行了如下操作: - 添加了 http、https 服务 - 放开了 33000 端口的 TCP 协议 - 放开了 7000-7010 端口的 UDP 协议 - 面向172.16.0.1/16放开了 6000-10000 端口的 TCP 协议 编辑完成后即可启动服务 ``` systemctl start firewalld ``` # 8. 拓展功能 ## 8.1 端口转发 端口转发可以将指定地址访问指定的端口时,将流量转发至指定地址的指定端口。 ### 8.1.1 开启伪装IP 端口转发前需要开启IP伪装 ```bash firewall-cmd --query-masquerade # 检查是否允许伪装IP firewall-cmd --add-masquerade # 允许防火墙伪装IP firewall-cmd --remove-masquerade# 禁止防火墙伪装IP ``` ### 8.1.2 设置端口转发 转发的目的如果不指定 ip 的话就默认为本机,如果指定了 ip 却没指定端口,则默认使用来源端口。 ```bash firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 # 将80端口的流量转发至8080 firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1 # 将80端口的流量转发至192.168.0.1 firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080 # 将80端口的流量转发至192.168.0.1的8080端口 ``` ### 8.1.3 查询端口转发 ```bash firewall-cmd --list-forward-ports ``` ### 7.1.4 删除端口转发 ```bash firewall-cmd --remove-forward-port=port=8080:proto=tcp:toport=8088:toaddr=192.168.22.55 ``` <div class="tip inlineBlock info"> 排查问题时需要注意服务情况及伪装IP配置。例如,将本地的 80 端口转发至其他IP的 8080 端口,首先检查本地的 80 端口和目标的 8080 端口是否开放监听了;其次检查是否允许伪装 IP,没允许的话要开启伪装 IP。 </div> ## 8.2 紧急模式 紧急模式,即Panic模式,Panic的单词含义为“恐慌”、“惊慌”,在firewalld中表示当发生紧急情况(比如遭到攻击)时启用的一种“禁行模式”,启用这种模式后所有的进包和出包都会被丢弃,**包括SSH通讯**,因此开启此模式时需要慎重。 ```bash firewall-cmd --panic-on # 开启紧急模式 firewall-cmd --panic-off # 关闭紧急模式 firewall-cmd --query-panic # 查看紧急模式开启状态 ``` [1]: https://judi.fun/archives/16/ [2]: https://www.cnblogs.com/excelib/p/5150647.html [3]: https://www.cnblogs.com/excelib/p/5155951.html Last modification:December 26, 2024 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏