🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 介绍 防火墙守护 firewalld 服务引入了一个信任级别的概念来管理与之相关联的连接与接口。它支持 ipv4 与 ipv6,并支持网桥,采用 firewall-cmd (command) 或 firewall-config (gui) 来动态的管理 kernel netfilter 的临时或永久的接口规则,并实时生效而无需重启服务。 ### Firewall 能将不同的网络连接归类到不同的信任级别,Zone 提供了以下几个级别: ``` 丢弃区域(Drop Zone):如果使用丢弃区域,任何进入的数据包将被丢弃。这个类似与我们之前使用iptables -j drop。使用丢弃规则意味着将不存在响应,只有流出的网络连接有效。 阻塞区域(Block Zone):阻塞区域会拒绝进入的网络连接,返回icmp-host-prohibited,只有服务器已经建立的连接会被通过。 公共区域(Public Zone):只接受那些被选中的连接,而这些通过在公共区域中定义相关规则实现。服务器可以通过特定的端口数据,而其它的连接将被丢弃。 外部区域(External Zone):这个区域相当于路由器的启用伪装(masquerading)选项。只有指定的连接会被接受,而其它的连接将被丢弃或者不被接受。 隔离区域(DMZ Zone):如果想要只允许给部分服务能被外部访问,可以在DMZ区域中定义。它也拥有只通过被选中连接的特性。 工作区域(Work Zone):在这个区域,我们只能定义内部网络。比如私有网络通信才被允许。 家庭区域(Home Zone):这个区域专门用于家庭环境。我们可以利用这个区域来信任网络上其它主机不会侵害你的主机。它同样只允许被选中的连接。 内部区域(Internal Zone):这个区域和工作区域(Work Zone)类似,只有通过被选中的连接。 信任区域(Trusted Zone):信任区域允许所有网络通信通过。 ``` ## CentOS7查看防火墙状态,启动,关闭防火墙 ## systemctl - 启动: `systemctl start firewalld` - 停止: `systemctl stop firewalld` - 重启: `systemctl restart firewalld` - 查看状态: `systemctl status firewalld` - 开机启动: `systemctl enable firewalld` - 开机禁用: `systemctl disable firewalld` - 查看服务是否开机启动: `systemctl is-enabled firewalld` - 查看已启动的服务列表: `systemctl list-unit-files | grep enabled` - 查看启动失败的服务列表: `systemctl --failed` ## firewall-cmd - 查看版本: `firewall-cmd --version` - 显示所有配置: `firewall-cmd --list-all-zones` - 查看帮助: `firewall-cmd --help` - 显示状态: `firewall-cmd --state` - 查看防火墙规则: `firewall-cmd --zone=public --list-all` - 查看所有打开的端口: `firewall-cmd --zone=public --list-ports` - 从public添加 interface: `firewall-cmd --zone=public --add-interface=eno16777736` - 从public移除 interface: `firewall-cmd --zone=public --remove-interface=eno16777736` - 改变网卡接口的所属域(ps:一个接口只能属于一个域): `firewall-cmd --zone=public --change-interface=eth1` - 查看区域信息: `firewall-cmd --get-active-zones` - 查看默认的zone: `firewall-cmd --get-default-zone` - 设置默认的zone: `firewall-cmd --set-default-zone=trusted` - 查看指定接口所属区域: `firewall-cmd --get-zone-of-interface=eth0` - 拒绝所有包: `firewall-cmd --panic-on` - 取消拒绝状态: `firewall-cmd --panic-off` - 查看是否拒绝: `firewall-cmd --query-panic` - 将发往80端口的请求转发到8080: `firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080` - 开放某个端口: `firewall-cmd --zone=public --add-port=80/tcp --permanen` - 查看某个端口是否开放: `firewall-cmd --zone=public --query-port=80/tcp` - 删除某个端口: `firewall-cmd --zone=public --remove-port=80/tcp --permanent` - 开放端口区间: `firewall-cmd --permanent --zone=public --add-port=8080-9999/tcp` - 针对某个IP开放端口规则: `firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.142.166" port protocol="tcp" port="6379" accept"` `firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.0.233" accept"` - 删除某个规则: `firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.1.51" accept"` - 针对一个IP段访问: `firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.0.0/16" accept"` `firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="9200" accept"` - 禁止某个IP访问某个端口: `firewall-cmd --zone=public --add-rich-rule "rule family="ipv4" source address=192.168.1.4 port port=22 protocol=tcp reject"` - 获取全部的服务: `firewall-cmd --get-services` - 查看某域的服务: `firewall-cmd --zone=public --list-services` - 域中添加服务: `firewall-cmd --zone=public --add-service=http` - 删除服务: `firewall-cmd --zone=public --permanent --remove-service=http` - 重新载入使配置立即生效: `firewall-cmd --reload` ### 参数说明: * --zone:指定域 * --permanent :永久生效 * --add-rich-rule:添加一条规则 * source address:来源IP * --query-port:查询某个端口 ## 编写 firewall 服务文件 firewall 的服务配置XML文件位置都存放在 `/usr/lib/firewalld/service` 和 `/etc/firewalld/service` 下面 一份简易的配置示例: ``` <?xml version="1.0" encoding="utf-8"?> <service> <short>SSH</short> <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description> <port protocol="tcp" port="22"/> </service> ``` 一份教复杂的配置示例: ``` <?xml version="1.0" encoding="utf-8"?> <service> <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> <port protocol="tcp" port="80"/> <port protocol="udp" port="8080-9999"/> <rule family="ipv4"> <source address="192.168.0.0/24"/> <accept/> </rule> <rule family="ipv4"> <source address="192.168.142.166"/> <port protocol="tcp" port="6379"/> <accept/> </rule> <rule family="ipv4"> <source address="192.168.1.4"/> <port protocol="tcp" port="22"/> <reject/> </rule> </service> ```