🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] > [home](https://firewalld.org/) ## firewall-cmd 概述 firewall-cmd 是 firewalld的字符界面管理工具,firewalld是centos7的一大特性, **特性:** 1. 支持动态更新,不用重启服务 2. 第二个就是加入了防火墙的“zone”概念。 **firewalld跟iptables比起来至少有两大好处**: 1. firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效。 2. firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能。 firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和 iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结 构以及使用方法不一样罢了。 ## 安装/启动 安装 ``` yum install firewalld firewall-config ``` 启动 ``` systemctl start firewalld # 启动 systemctl stop firewalld # 停止 systemctl enable firewalld # 启用自动启动 systemctl disable firewalld # 禁用自动启动 systemctl status firewalld # 或者 firewall-cmd --state 查看状态 ``` ## 格式 ``` firewall-cmd [选项 ... ] ``` ## 状态选项 ``` --state # 显示firewalld的状态; --reload # 不中断服务的重新加载; --complete-reload # 中断所有连接的重新加载; --runtime-to-permanent # 将当前防火墙的规则永久保存; --check-config # 检查配置正确性; ``` ## 日志选项 ``` --get-log-denied # 获取记录被拒绝的日志; --set-log-denied=<value> # 设置记录被拒绝的日志,只能为 'all','unicast','broadcast','multicast','off' 其中的一个; ``` ## Zone 区域 将不同类型的网络流量分类到不同的区域中,每个区域有自己的防火墙规则 1. **public**:公共区域,用于不受信任的网络,比如连接到互联网的公共网络。通常设置了最严格的防火墙规则。 2. **private**:私有区域,用于信任的网络,比如局域网。通常设置了较宽松的防火墙规则。 3. **internal**:内部区域,用于内部网络,通常是在私有网络中的受信任主机之间的通信。 4. **dmz**:DMZ(Demilitarized Zone,非军事区),用于将公共网络和受信任的网络分隔开来,通常用于托管公共服务器,如 Web 服务器或邮件服务器。 5. **trusted**:受信任区域,用于完全信任的网络,通常用于管理服务器之间的通信。 6. **external**:外部区域,用于连接到其他外部网络的网络接口。 7. **work**:工作区域,用于信任的工作网络,通常是指办公场所的网络。 8. **home**:家庭区域,用于家庭网络环境,比如家庭内部的局域网。 9. **block**:阻止区域,用于完全阻止特定接口的所有网络流量。 10. **drop**:任何传入的网络数据包都被丢弃,没有回复。只有传出网络连接是可能的。 命令 ``` #显示支持的区域列表 firewall-cmd --get-zones # 设置为家庭区域 firewall-cmd --set-default-zone=home # 查看当前区域 firewall-cmd --get-active-zones # 设置当前区域的接口 firewall-cmd --get-zone-of-interface=enp03s # 显示指定区域 firewall-cmd [--zone=public] --list-all # 临时修改网络接口(enp0s3)为内部区域(internal) firewall-cmd --zone=internal --change-interface=enp03s # 永久修改网络接口enp03s为内部区域(internal) firewall-cmd --permanent --zone=internal --change-interface=enp03s ``` ## 端口管理 ``` # 打开443/TCP端口 ,添加 permanent 表示永久 firewall-cmd --add-port=443/tcp [--permanent] #启动服务 firewall-cmd --reload # 查看防火墙,添加的端口也可以看到 firewall-cmd --list-all ``` ## 服务管理 ``` # 显示服务列表 如FTP, http,mysql 等 firewall-cmd --get-services # 显示当前服务 firewall-cmd --list-services # 创建一个自定义发服务,并进行在`/etc/firewalld/services/` 进行配置 firewall-cmd [--permanent] --new-service=my_custom_service # 显示该服务的相关信息 firewall-cmd --info-service=my_custom_service # 显示该服务的文件的相关路径 firewall-cmd --path-service=my_custom_service # 删除指定服务 firewall-cmd --delete-service=my_custom_service # 永久打开TCP的8080端口 firewall-cmd --enable ports=8080/tcp # 临时允许Samba服务通过600秒 firewall-cmd --enable service=samba --timeout=600 # 添加HTTP服务到内部区域(internal) firewall-cmd --permanent --zone=internal --add-service=http firewall-cmd --reload # 在不改变状态的条件下重新加载防火墙 ``` ### 如何配置一个自定义发服务 firewall 的系统默认服务在`/usr/lib/firewalld/services/` 中如何需要添加一个自定的服务,可从此目录复制一个 xml 的格式 ``` <service [version="string"]> [<short>short description</short>] [<description>description</description>] [<port [port="portid[-portid]"] protocol="protocol"/>] [<module name="helper"/>] [<destination ipv4="address[/mask]" ipv6="address[/mask]"/>] </service> ``` **示例** /etc/firewalld/services/ant.xml ``` <?xml version="1.0" encoding="utf-8"?> <service> <short>Short description of the service</short> <description>Detailed description of the service</description> <port protocol="tcp" port="8000"/> <!-- Add more <port> elements for additional ports --> </service> ``` > 注意名字不能于已有服务的 systemctl 中的名字重名 ``` firewall-cmd --new-service=ant // 注册服务 firewall-cmd --add-service=ant // 添加服务 ``` ## 端口转发 转发的端口或地址不指定,则使用原来的端口或地址 ``` # 将80端口的流量转发至8080 firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 # 将80端口的流量转发至192.168.0.1 firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1 # 将80端口的流量转发至192.168.0.1的8080端口 firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080 ``` 1. 当我们想把某个端口隐藏起来的时候,就可以在防火墙上阻止那个端口访问,然后再开一个不规则的端口,之后配置防火墙的端口转发,将流量转发过去(类似nginx 的端口代理)。 2. 端口转发还可以做流量分发,一个防火墙拖着好多台运行着不同服务的机器,然后用防火墙将不同端口的流量转发至不同机器。