防火墙是用来保护主机不会受到任何外部可疑流量访问的一种方法,分为软件防火墙和硬件防火墙两种。软件防火墙其实就是一种应用程序,用于进行主机流量的监控管理。VPS主机提供商常常会提供RHEL/Centos 7 的镜像,而RHEL/Centos 7 默认会安装软件防火墙Firewalld,如果Firewalld玩不熟,会在使用VPS过程中遇到各种问题。
Firewalld允许用户通过一系列的防火墙规则(firewall rules)来定义主机网络流量,简单来说,Firewalld是就阻止和筛选,通过筛选规则来确定流量是放行还是阻止。
本教程将对RHEL/Centos 7 系统的Firewalld命令进行总结,方便备忘使用。
安装和管理Firewalld
安装Firewalld服务,使用如下命令:
# yum install firewalld -y
启动Firewalld服务,使用如下命令:
# systemctl start firewalld
重新启动Firewalld服务,使用如下命令:
# systemctl restart firewalld
停止Firewalld服务,使用如下命令:
# systemctl stop firewalld
查看Firewalld服务状态,使用如下命令:
# systemctl status firewalld
如果只查看Frewalld服务是否运行,使用如下命令:
# firewall-cmd --state
重新加载Firewalld服务,使用如下命令:
为了重新加载Firewalld的永久性规则而又不影响现在已经存在的连接,就需要重新加载Firewalld服务,相当于刷新一次防火墙规则,让Firewalld以新载入的规则来进行流量控制。如果为Firewalld服务添加了新的规则,则需要使用下面的命令载入规则以使规则生效:
# firewall-cmd --reload
设置Firewalld服务是否开机自动启动,使用如下命令:
# systemctl enable firewalld //允许 # systemctl disable firewalld //不允许
防火墙区域(Firewall Zones)
获得Firewalld默认区域:
# firewall-cmd --get-default-zone
获得Firewalld激活区域:
# firewall-cmd --get-active-zones
设置Firewalld默认区域:
# firewall-cmd --set-default-zone=ZoneName
向Firewalld区域中添加网络接口:
以下命令用于向”public”区域添加”eht1″接口
# firewall-cmd --zone=public --change-interface=eth1
显示Firewalld某个区域中信任(即放行流量)的网络端口:
以下命令用于显示”public”区域中所有的信任端口:
# firewall-cmd --zone=public --list-ports
显示Firewalld某个区域中信任(即放行流量)的网络应用协议:
以下命令用于显示”public”区域中所有的信任应用协议:
# firewall-cmd --zone=public --list-service
显示Firewalld活动区域的详细信息:
如果命令中使用”–zone=ZoneName”参数,则会显示指定区域”ZoneName”的详细信息:
# firewall-cmd --list-all
显示全部区域配置的详细信息:
# firewall-cmd --list-all-zones
显示全部区域名称:
# firewall-cmd --get-zones
利用Firewalld管理端口
向Firewalld添加信任端口/协议
如果使用”–permanent”参数,则添加的规则会一直有效,否则会在重新载入Firewalld规则时失效。下面的命令将永久开放主机的80端口用于tcp连接:
# firewall-cmd --permanent --add-port=80/tcp
移除Firewalld信任端口/协议
移动信任命令支持”–zone=ZoneName”参数,可以选择性的移除端口信任;同样如果使用”–permanent”参数,则移除的规则会一直有效,否则会在重新载入Firewalld规则时失效。下面的命令将永久关闭主机”public”区域的80端口tcp连接:
# firewall-cmd --permanent --zone=public --remove-port=80/tcp
利用Firewalld管理协议
显示当前支持的所有协议:
# firewall-cmd --get-services
向Firewalld添加信任协议:
“–zone=ZoneName”参数用于指定添加信任的区域,如果未指定则向全部区域添加信任;”–permanent”参数用于设置永久有效。以下命令将向主机所有区域添加对于”http”协议的信任,即放行http流量:
# firewall-cmd --permanent --add-service=http
移除Firewalld对于特定协议的信任
“–zone=ZoneName”参数用于指定移除信任的区域,如果指定则移除全部区域的信任;”–permanent”参数用于设置永久有效。以下命令将对主机”public”区域的”http”协议移除信任,即阻止http流量:
# firewall-cmd --permanent --zone=public --remove-service=http
端口重定向
以下示例将把80端口的流量重定向至主机的8080端口:
# firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=800
或者使用:
firewall-cmd --add-rich-rule "rule family=ipv4 source address=192.168.0.0/24 forward-port port=80 protocol=tcp to-port=800"
重定向到其它服务器的指定端口
1. 首先激活对应区域的”masquerade”功能:
# firewall-cmd --zone=public --add-masquerade
2. 然后添加重定向规则:
以下的命令会将访问本机80端口的流量重定向到IP地址为192.168.219.130主机的8080端口:
# firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.219.130
移除masquerade规则:
# firewall-cmd --zone=public --remove-masquerade
使用Firewalld的富规则
Firewalld的富规则语法十分丰富,可以参照其帮助页了解详细内容。可以使用”–add-rich-rule;–list-rich-rules;–remove-rich-rule”等参数来管理它们。
示例
允许IP地址为192.168.0.1主机的所有流量进入主机:
# firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.168.0.1 accept'
阻止IP地址为192.168.0.2主机的所有流量访问本机的22端口:
# firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.0.2" port port=22 protocol=tcp reject'
允许IP地址为192.168.0.3主机的所有流量访问本机的80端口,并且将其重定向到本机的8080端口:
# firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 source address=192.168.0.3 forward-port port=80 protocol=tcp to-port=8080'
将访问本机80端口的流量重定向到192.168.0.4主机的8080端口(注意设定的区域启用了”masquerade”):
# firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 forward-port port=80 protocol=tcp to-port=8080 to-addr=192.168.0.4'
显示当然所有的富规则:
# firewall-cmd --list-rich-rules