firwalld
提供命令行和图形界面,与直接控制iptables
相比有两个主要区别:
firewalld使用区域(zone)和服务而不是链式规则。
firewalld动态管理规则集,允许更新规则而不破坏现有会话和连接。
区域(zone)简单的解释就是firewalld
预先准备了几套防火墙策略,可以根据不同需求而选择合适的策略,默认是public。
默认带的区域(zone)及策略规则如下
trusted 允许所有的数据包
home 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、mdns、ipp-client、amba-client与dhcpv6-client服务相关,则允许流量
internal 等同于home区域
work 拒绝流入的流量,除非与流出的流量数相关;而如果流量与ssh、ipp-client与dhcpv6-client服务相关,则允许流量
public 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、dhcpv6-client服务相关,则允许流量
external 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量
dmz 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量
block 拒绝流入的流量,除非与流出的流量相关
drop 拒绝流入的流量,除非与流出的流量相关
CentOS7默认已安装firewalld
,但购买的VPS不一定。
yum install firewalld
需要图形界面的话,则再安装
yum install firewall-config
systemctl start firewalld # 启动
systemctl enable firewalld # 开机启动
systemctl stop firewalld # 停止
systemctl disable firewalld # 禁止开机启动
systemctl status firewalld # 进程状态
firewalld
使用XML进行配置但通常不用,而是使用firewall-cmd
直接管理。
配置文件所在目录
/usr/lib/firewalld 默认配置,如默认区域和公用服务。 避免修改它们,因为每次
firewalld
软件包更新时都会覆盖这些文件。
/etc/firewalld 系统配置文件。 这些文件将覆盖默认配置。
命令行: firewall-cmd
图形化界面: firewall configuration
(暂时不讲)
firewall-cmd
具体的使用方法可以
firewall-cmd --help
注意如下两个参数,默认情况下firewall-cmd
命令适用于运行时配置,要永久配置需使用--permanent
参数,而且需要更新规则后生效firewall-cmd --reload
–permanent # 永久修改,
--reload
后生效
–timeout=seconds # 持续效果,到期后自动移除,用于调试,不能与--permanent
同时使用
source: 根据源地址过滤
interface: 根据网卡过滤
service: 根据服务名过滤
port: 根据端口过滤
icmp-block: icmp 报文过滤,按照 icmp 类型配置
masquerade: ip 地址伪装
forward-port: 端口转发
rule: 自定义规则
其中,过滤规则的优先级遵循如下顺序
- source
- interface
- firewalld.conf
查看运行状态
firewall-cmd --state
查看默认区域
firewall-cmd --get-default-zone
修改默认区域
firewall-cmd --set-default-zone=internal
查看网络接口使用的区域
firewall-cmd --get-active-zones
查看eth0网络接口所在的区域:
firewall-cmd --get-zone-of-interface=eth0
特定区域的所有配置
firewall-cmd --zone=public --list-all
查看所有区域的所有配置
firewall-cmd --list-all-zones
查看重启后所有区域被允许的服务,即永久放行的服务
firewall-cmd --get-service --permanent
启动/关闭应急状况模式,阻断一切网络链接(远程登陆时慎用!!)
firewall-cmd --panic-on
firewall-cmd --panic-off
查看默认的可用服务
firewall-cmd --get-services
例如查询、启用、禁用HTTP服务:
firewall-cmd --zone=public --query-service=http
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --zone=public --remove-service=http --permanent
firewall-cmd --reload
允许/拒绝任意端口,端口范围
例如允许/禁用9999端口
firewall-cmd --zone=public --add-port=9999/tcp --permanent
firewall-cmd --zone=public --remove-port=9999/tcp --permanent
firewall-cmd --reload
查询端口是否启用
firewall-cmd --permanent --query-port=9999/tcp
查看允许的端口
firewall-cmd --permanent --list-port
例如允许10000-10100udp端口
firewall-cmd --zone=public --add-port=10000-10100/udp --permanent
firewall-cmd --reload
端口转发
同台服务器80端口转发到8888
firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=8888
转发到其他服务器
激活masquerade
firewall-cmd --zone=public --add-masquerade
添加转发规则
例如80转发到111.111.111.111:8080
firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=111.111.111.111
删除规则
用参数--remove
替换--add
,例如
firewall-cmd --zone=public --remove-masquerade
例如拒绝111.111.111.0/255网段的所有用户访问本机的ssh服务
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="111.111.11.0/255" service name="ssh" reject"
firewall-cmd --reload
在所提供的区域里,dmz只允许SSH和ICMP。所以选择dmz。
将默认区域设为dmz
firewall-cmd --set-default-zone=dmz
将网卡接口添加到dmz区域
firewall-cmd --zone=dmz --add-interface=eth0
将http和https添加永久服务规则到dmz
firewall-cmd --zone=dmz --add-service=http --permanent
firewall-cmd --zone=dmz --add-service=https --permanent
更新规则使其生效
firewall-cmd --reload
此时查看dmz区域所有规则
firewall-cmd --zone=dmz --list-all
输出
dmz (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: http https ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
可以解读为
dmz区域为默认区域,它被用于 eth0 接口中所有网络的源地址和端口。 允许传入 HTTP(端口 80)、HTTPS(端口 443)和 SSH(端口 22)的流量,并且由于没有 IP 版本控制的限制,这些适用于 IPv4 和 IPv6。 不允许IP 伪装以及端口转发。 我们没有 ICMP 块,所以 ICMP 流量是完全允许的。没有丰富Rich规则,允许所有出站流量。
本文参考
CentOS 7 下使用 Firewall
CentOS 上的 FirewallD 简明指南
第8章 Iptables与Firewalld防火墙
更详细请参考官方文档
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html
https://fedoraproject.org/wiki/FirewallD