FirewallD 是 CentOS 7 服务器上默认可用的防火墙管理工具。基本上,它是 iptables 的封装,有图形配置工具 firewall-config 和命令行工具 firewall-cmd
。使用 iptables 服务,每次改动都要求刷新旧规则,并且从 /etc/sysconfig/iptables
读取新规则,然而 firewalld 只应用改动了的不同部分。
防火墙基本操作 查询防火墙状态 1 2 3 4 5 firewall-cmd --state # 显示firewalld的状态; systemctl status firewalld # 显示firewalld的状态; firewall-cmd --zone=public --list-all #查询public区域的所有信息 firewall-cmd --zone=public --list-ports #查询public区域放行的端口信息 firewall-cmd --zone=public --list-services #查询public区域放行的服务信息
应急模式 1 2 3 firewall-cmd --query-panic # 查看是否为应急模式 firewall-cmd --panic-on # 拒绝所有包,远程连接会立即断开,只有本地能登陆 firewall-cmd --panic-off # 取消拒绝状态,但需要重启firewalld后才可以远程ssh
启动、关闭防火墙 1 2 3 4 systemctl start firewalld #启动防火墙 systemctl enable firewalld #开机自启动 systemctl stop firewalld #关闭防火墙 systemctl disable firewalld #关闭开机自启动
重新加载防火墙设置 1 2 3 4 firewall-cmd --reload #不中断用户连接 firewall-cmd --complete-reload #中断用户连接 firewall-cmd --runtime-to-permanent #将当前防火墙的规则永久保存 firewall-cmd --check-config # 检查配置正确性
区域 FirewallD 使用服务(service )和区域(zone)来代替 iptables 的规则(rule)和链(chain)。
默认情况下,有以下的区域(zone)可用:
drop 丢弃所有传入的网络数据包并且无回应,只有传出网络连接可用 block 拒绝所有传入网络数据包并回应一条主机禁止的 ICMP 消息,只有传出网络连接可用。 public 只接受被选择的传入网络连接,用于公共区域。 external 用于启用了地址伪装的外部网络,只接受选定的传入网络连接 dmz DMZ 隔离区,外部受限地访问内部网络,只接受选定的传入网络连接 work 对于处在你工作区域内的计算机,只接受被选择的传入网络连接 home 对于处在你家庭区域内的计算机,只接受被选择的传入网络连接 internal 对于处在你内部网络的计算机,只接受被选择的传入网络连接 trusted 所有网络连接都接受
1 2 3 4 5 6 firewall-cmd --get-zones #列出所有可用的区域 firewall-cmd --get-default-zone #列出默认的区域 firewall-cmd --set-default-zone=dmz #设置默认的区域 firewall-cmd --get-zone-of-interface=ens33 #查看指定接口所属区域 firewall-cmd --zone=dmz --change-interface=ens33 #永久修改网络接口ens33为dmz区域 firewall-cmd --zone=dmz --remove-interface=ens33 #删除绑定在ens33接口上的Zone网络区
端口管理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # 查询打开的端口 firewall-cmd --list-ports #放行 firewall-cmd --add-port=portid[-portid]/protocol [--permanent] [--zone=zone] firewall-cmd --add-port=80/tcp --zone=public --permanent 参数(portid[-portid]):要开放的端口号,如果是一个范围则使用10000-12000表达一个范围。 参数(protocol):TCP/UDP协议 可选参数(zone):将规则添加到哪个Zone网络区中,如果缺省该参数则添加到默认Zone网络区中。 可选选项(–permanent):规则永久保存,重新加载防火墙后生效。如果缺省该参数则修改的规则立即生效,但是重新加载防火墙后规则会失效。 #移除 firewall-cmd --remove-service=https [--permanent] [--zone=zone] firewall-cmd --zone=public --remove-port=80/tcp --permanent # 加载配置文件、使规则生效 firewall-cmd --reload
服务管理 FirewallD 服务使用 XML 配置文件,记录了 firewalld 服务信息,XML 配置文件存储在 /usr/lib/firewalld/services/
和 /etc/firewalld/services/
目录下。
查询服务 1 2 3 4 firewall-cmd --get-services #查询所有支持的服务 firewall-cmd --add-service=telnet #添加服务 firewall-cmd --list-services #查询放行的服务 firewall-cmd --permanent --service=telnet --get-port #查看服务对应的端口号
禁ping 1 2 3 4 5 6 7 8 9 # tcp/ip实现方式 echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all 或 sysctl -w net.ipv4.icmp_echo_ignore_all=1 # firewalld实现方式 firewall-cmd --permanent --add-icmp-block=echo-request #开启禁ping firewall-cmd --permanent --remove-icmp-block=echo-request #关闭禁ping firewall-cmd --reload
放行/关闭服务 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #放行 firewall-cmd --add-service=service [--permanent] [--zone=zone] [--timeout=timeval] 例:firewall-cmd --add-service=zabbix-agent --zone=public --permanent 参数(–-add-service):要放行的服务名,如ssh、http、https。 可选参数(–-zone=zone):将此规则添加到网络区,如果缺省该参数,添加到默认网络区内。 可选参数(–-timeout=timeval):临时生效时间,不可与--permanent连用。表达方式可以是--timeout=[100s | 100m | 100h]。(timeval is either a number (of seconds) or number followed by one of characters s(seconds), m(minutes), h(hours)) 可选选项(–permanent):规则永久保存,重新加载防火墙后生效。如果缺省该参数则修改的规则立即生效,但是重新加载防火墙后规则会失效。 #移除 firewall-cmd --remove-service=service [--permanent] [--zone=zone] firewall-cmd --remove-service=zabbix-agent --zone=public --permanent # 加载配置文件、使规则生效 firewall-cmd --reload
端口转发 端口转发可以将指定地址访问指定的端口时,将流量转发至指定地址的指定端口。转发的目的如果不指定 ip 的话就默认为本机,如果指定了 ip 却没指定端口,则默认使用来源端口。 如果配置好端口转发之后不能用,可以检查下面两个问题:
比如我将 80 端口转发至 8080 端口,首先检查本地的 80 端口和目标的 8080 端口是否开放监听了 其次检查是否允许伪装 IP,没允许的话要开启伪装 IP 1 2 3 firewall-cmd --query-masquerade # 检查是否允许伪装IP firewall-cmd --add-masquerade # 允许防火墙伪装IP(转发到其他IP上时必须开启,仅转发本地端口则非必须开启) firewall-cmd --remove-masquerade # 禁止防火墙伪装IP
1 2 3 4 5 firewall-cmd --add-forward-port=port=[访问端口]:协议=[tcp/udp]:toaddr=[需要转发的主机地址]:toport=[需要转发的端口] 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端口
当我们想把某个端口隐藏起来的时候,就可以在防火墙上阻止那个端口访问,然后再开一个不规则的端口,之后配置防火墙的端口转发,将流量转发过去。 端口转发还可以做流量分发,一个防火墙拖着好多台运行着不同服务的机器,然后用防火墙将不同端口的流量转发至不同机器。 参考链接:
https://wangchujiang.com/linux-command/c/firewall-cmd.html
https://blog.yeefire.com/2020_02/Linux_Firewalld.html