一、Firewalld概述
Filewalld(动态防火墙)作为redhat7系统中变更对于netfilter内核模块的管理工具
iptables service 管理防火墙规则的模式(静态):
用户将新的防火墙规则添加进 /etc/sysconfig/iptables 配置文件当中,再执行命令 /etc/init.d/iptables reload 使变更的规则生效。在这整个过程的背后,iptables service 首先对旧的防火墙规则进行了清空,然后重新完整地加载所有新的防火墙规则,如果加载了防火墙的模块,需要在重新加载后进行手动加载防火墙的模块;
firewalld 管理防火墙规则的模式(动态):
任何规则的变更都不需要对整个防火墙规则列表进行重新加载,只需要将变更部分保存并更新到运行中的 iptables 即可。还有命令行和图形界面配置工具,它仅仅是替代了 iptables service 部分,其底层还是使用 iptables 作为防火墙规则管理入口。
二、Firewalld与iptables对比
firewalld 是 iptables 的前端控制器
iptables 静态防火墙 任一策略变更需要reload所有策略,丢失现有链接
firewalld 动态防火墙 任一策略变更不需要reload所有策略 将变更部分保存到iptables,不丢失现有链接
firewalld 提供一个daemon和service 底层使用iptables
基于内核的Netfilter
1.配置Firewalld
1.配置方式
firewall-config 图形界面
firewall-cmd 命令行工具
2.运行时配置和永久配置
firewall-cmd - –zone=public - –add-service=smtp 运行时配置,重启后失效(临时)
firewall-cmd - –permanent - –zone=public - –add-service=smtp 永久配置,不影响当前连接,重启后生效
firewall-cmd - –runtime-to-permanent 将运行时配置保存为永久配置
三、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 | 拒绝流入的流量,除非与流出的流量相关; |
block | 拒绝流入的流量,除非与流出的流量相关; |
drop | 拒绝流入的流量,除非与流出的流量相关; |
服务管理
yum -y install firewalld firewall-config #安装firewalld
systemctl enable|disable firewalld #开机启动|关闭firewalld
systemctl start|stop|restart firewalld #启动、停止、重启firewalld
如果想使用iptables配置防火墙规则,要先安装iptables并禁用firewalld
yum -y install iptables-services #安装iptables
systemctl enable iptables #开机启动
systemctl start|stop|restart iptables #启动、停止、重启iptables
四、终端管理工具
1、firewall-cmd
firewall-cmd命令一般使用长格式选项,所以命令比较长,但是不用担心,在7系列系统当中firewall-cmd命令的选项可以利用tab补齐
2、firewall-cmd命令中使用的参数以及作用
# 查看默认的区域名称
firewall-cmd --get-default-zone
#设置默认的区域,使其永久生效
firewall-cmd --set-default-zone=<区域名称>
#显示可用的区域
firewall-cmd --get-zones
#显示预先定义的服务
firewall-cmd --get-services
#显示当前正在使用的区域与网卡名称
firewall-cmd --get-active-zones
#将源自此IP或子网的流量导向指定的区域
firewall-cmd --add-source=
#不再将源自此IP或子网的流量导向指定的区域
firewall-cmd --remove-source=
#将源自该网卡的所有流量都导向某个指定区域
firewall-cmd --add-interface=<网卡名称>
#将某个网卡与区域进行关联
firewall-cmd --change-interface=<网卡名称>
#显示当前区域的网卡配置参数、资源、端口以及服务等信息
firewall-cmd --list-all
#显示所有区域的网卡配置参数,资源、端口以及服务等信息
firewall-cmd --list-all-zones
#设置默认区域允许该服务的流量
firewall-cmd --add-service=<服务名>
#设置默认区域允许该端口的流量
firewall-cmd --add-port=<端口号/协议>
#设置默认区域不再允许该服务的流量
firewall-cmd --remove-service=<服务名>
#设置默认区域不再允许该端口的流量
firewall-cmd --remove-port=<端口号/协议>
#让“永久生效”的配置规则立即生效,并覆盖当前的配置规则
firewall-cmd --reload
#开启应急状况模式(将断开与当前主机的所有连接,进入维护模式\脱机模式)
firewall-cmd --panic-on
#关闭应急状况模式
firewall-cmd --panic-off
3、命令演示
查看firewall服务当前所使用的区域
[root@linuxli ~]# firewall-cmd --get-default-zone
public
查询ens33网卡在firewall服务中的区域
[root@linuxli ~]# firewall-cmd --get-zone-of-interface=ens33
public
把firewalld服务中ens33网卡的默认区域修改为external,并在系统重启后生效,分别查看当前与永久模式下的区域名称
[root@linuxli ~]# firewall-cmd --permanent --zone=external --change-interface=ens33
The interface is under control of NetworkManager, setting zone to 'external'.
success
[root@linuxli ~]# firewall-cmd --get-zone-of-interface=ens33
external
启动/关闭firewalld防火墙服务的应急状况模式,阻断一切网络连接(当远程控制服务器时请慎用!)
[root@linuxli ~]# firewall-cmd --panic-on
success
[root@linuxli ~]# firewall-cmd --panic-off
success
查询区域是否允许请求SSH和HTTPS协议的流量:
[root@linuxli ~]# firewall-cmd --zone=public --query-service=ssh
yes
[root@linuxli ~]# firewall-cmd --zone=public --query-service=https
no
把firewalld服务中请求HTTPS协议的流量设置为永久允许,并立即生效:
[root@linuxli ~]# firewall-cmd --zone=public --add-service=https
success
[root@linuxli ~]# firewall-cmd --permanent --zone=public --add-service=https
success
[root@linuxli ~]# firewall-cmd --reload
success
把firewalld服务中请求HTTP协议的流量设置为永久拒绝,并立即生效:
[root@linuxli ~]# firewall-cmd --permanent --zone=public --remove-service=http
success
[root@linuxli ~]# firewall-cmd --reload
success
把在firewalld服务中访问8080和8081的端口流量策略设置为允许,但仅限当前生效:
[root@linuxli ~]# firewall-cmd --zone=public --add-port=8080-8081/tcp
success
[root@linuxli ~]# firewall-cmd --zone=public --list-ports
8080-8081/tcp
把原本访问本机888端口的流量转发到22端口,且要求当前和长期均有效(SNAT)
注:流量转发命令格式为firewall-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:porto=<协议>:toport=<目标端口号>:toaddr=<目标IP地址>
[root@linuxli ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.100.1
success
[root@linuxli ~]# firewall-cmd --reload
success
富规则
firewall-cmd --list-rich-rules 列出所有规则
firewall-cmd [--zone=zone] --query-rich-rule=’rule’ 检查一项规则是否存在
firewall-cmd [--zone=zone] --remove-rich-rule=’rule’ 移除一项规则
firewall-cmd [--zone=zone] --add -rich-rule=’rule’ 新增一项规则
复杂规则配置案例
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.168.0.14 accept' 允许来自主机 192.168.0.14 的所有 IPv4 流量
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.100.10" port port=22 protocol=tcp reject' 拒绝来自主机 192.168.100.10 到 22 端口的 IPv4 的 TCP 流量
firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 source address=10.1.0.3 forward-port port=80 protocol=tcp to-port=6532' 允许来自主机 10.1.0.3 到 80 端口的 IPv4 的 TCP 流量,并将流量转发到 6532 端口上
firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 forward-port port=80 protocol=tcp to-port=8080 to-addr=172.31.4.2' 将主机 172.31.4.2 上 80 端口的 IPv4 流量转发到 8080 端口(需要在区域上激活 masquerade)
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.122.0" accept' 允许192.168.122.0/24主机所有连接
firewall-cmd --add-rich-rule='rule service name=ftp limit value=2/m accept' 每分钟允许2个新连接访问ftp服务
firewall-cmd --add-rich-rule='rule service name=ftp log limit value="1/m" audit accept' 同意新的IPv4和IPv6连接FTP ,并使用审核每分钟登录一次
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.122.0/24" service name=ssh log prefix="ssh" level="notice" limit value="3/m" accept' 允许来自1192.168.122.0/24地址的新IPv4连接连接TFTP服务,并且每分钟记录一次
firewall-cmd --permanent --add-rich-rule='rule protocol value=icmp drop' 丢弃所有icmp包
firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.122.0/24 reject' --timeout=10 当使用source和destination指定地址时,必须有family参数指定ipv4或ipv6。如果指定超时,规则将在指定的秒数内被激活,并在之后被自动移除
firewall-cmd --add-rich-rule='rule family=ipv6 source address="2001:db8::/64" service name="dns" audit limit value="1/h" reject' --timeout=300 拒绝所有来自2001:db8::/64子网的主机访问dns服务,并且每小时只审核记录1次日志
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.122.0/24 service name=ftp accept' 允许192.168.122.0/24网段中的主机访问ftp服务
firewall-cmd --add-rich-rule='rule family="ipv6" source address="1:2:3:4:6::" forward-portto-addr="1::2:3:4:7" to-port="4012" protocol="tcp" port="4011"' 转发来自ipv6地址1:2:3:4:6::TCP端口4011,到1:2:3:4:7的TCP端口4012
实用:
1、查看访问网站次数最多的IP地址:
cat /etc/httpd/logs/access_log |awk '{print $1}' |sort |uniq -c |sort -nr
2、禁止访问网站最多的陌生IP访问网站:
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.100.1" port port="80" protocol="tcp" reject"
五、图形管理工具(须安装firewall-config工具,然后reboot重启生效)
1.firewalld界面如图所示,其功能具体如下:
- 选择”立即生效“或”重启后依然生效“配置。
- 区域列表。
- 服务列表。
- 当前选中的区域。
- 被选中区域的服务。
- 被选中区域的端口。
- 被选中区域的伪装。
- 被选中区域的端口转发。
- 被选中区域的ICMP包。
- 被选中区域的富规则。
- 被选中区域的网卡设备。
- 被选中区域的服务,前面有√的表示允许。
- firewalld防火墙的状态
乱码:执行 LANG=en_US 命令(原因:不支持中文,将其默认语言改成英文)
firewall-config图形化管理工具中没有保存/完成按钮,只要修改就会生效。
允许其他主机访问http服务,仅当前生效:
允许其他主机访问8080-8088端口且重启后依然生效:
开启伪装功能,重启后依然生效:
firewalld防火墙的伪装功能实际就是SNAT技术,即让内网用户不必在公网中暴露自己的真实IP地址。
将向本机888端口的请求转发至本机的22端口且重启后依然生效:
过滤所有”echo-reply”的ICMP协议报文数据包,仅当前生效:
ICMP即互联网控制报文协议”Internet Control Message Protocol“,归属于TCP/IP协议族,主要用于检测网络间是否可通信、主机是否可达、路由是否可用等网络状态,并不用于传输用户数据。
仅允许192.168.10.20主机访问本机的1234端口,仅当前生效:
富规则代表着更细致、更详细的规则策略,针对某个服务、主机地址、端口号等选项的规则策略,优先级最高。
查看网卡设备信息: