linux学习笔记(26)firewalld防火墙
【1】firewalld 的安装与基本概念
FirewallD 是 CentOS 7 服务器上默认可用的防火墙管理工具。
基本上,它是 iptables 的封装,有图形配置工具 firewall-config 和命令行工具 firewall-cmd
。
使用 iptables 服务,每次改动都要求刷新旧规则,并且从 /etc/sysconfig/iptables
读取新规则,然而 firewalld 只应用改动了的不同部分。
(1.0)安装并查看状态
yum install firewalld 启动服务,并在系统引导时启动该服务: systemctl start firewalld systemctl enable firewalld 停止并禁用: systemctl stop firewalld systemctl disable firewalld 检查防火墙状态。输出应该是 running 或者 not running # firewall-cmd --state running 默认情况下,firewalld 处于运行状态,并拒绝所有传入流量,但有几个例外,如 SSH。 查看 FirewallD 守护进程的状态: systemctl status firewalld
(1.1)Zone的概念
Zone :名称 Zone 描述block :所有进入的网络连接都会被拒绝。对于 IPV4,回复 icmp-host-prohibited 消息。对于 IPV6,回复 icmp6-adm-prohibited 消息。只有由内部发起的网络连接可以通行。
dmz :对于在非军事区域的服务器,外部网络可以在受限制的情况下进入内网,只有特定的网络连接请求被接受。
drop :所有的进入的网络包都会被丢掉,并且没有任何的回应。只有向发起的连接请求可以被放行。
external :用于开始伪装的外部网络,特别是作为路由器。任务外部的网络会损坏你的计算机,只有特定的网络连接请求被接受。
internal :在内部网络使用,信任当前网络下其他的计算机。只有特定的网络连接请求被接受。
work :在工作网络中使用,信任网络上的其他计算机。只有特定的网络连接请求被接受
home :允许访问 cockpit、dhcpv6-client、mdns、samba-clent、ssh,拒绝其他所有。
public :允许访问 cockpit、dhcpv6-client、、ssh,拒绝其他所有。
trusted :允许所有。
block :默认决绝所有
(1.2)策略制定的规则
我们可以根据服务的类型,端口号,协议号,源端口,接口,来源等等来设定防火墙的规则;
(1.3)策略的有效期(如何永久生效)
运行时:本次运行有效,防火墙重启后失效;
永久:永久有效; (-permanent)
使用 firewalld 配置的防火墙策略默认为运行时(Runtime)模式,随着系统的重启会失效。
如果想让配置一直存在,就需要使用永久(Permanent)模式,方法就是在用 firewall-cmd 命令时添加 –permanent 参数,设置之后需要执行 firewall-cmd –reload 命令重启,如下
用命令怎么实现呢?我们假设现在要添加smtp服务到public区域中: firewall-cmd -zone=public -add-service=smtp //运行时有效,重启失效 firewall-cmd -permanent -zone=public -add-service=stmp //永久有效,重启后开始生效
firewall-cmd -runtime-to-permanent //将运行时配置转为永久配置
#永久开放6379端口
firewall-cmd --add-port=6379/tcp --permanent --zone=public
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
【2】firewalld 常用命令
(2.1)基本命令
firewalld-cmd --version //查看firewalld版本 firewalld-cmd --help //查看firewalld用法 man firewalld-cmd //查看firewalld用法 systemctl status firewalld //查看firewalld状态 firewalld-cmd --reload //重载firewalld,当前已经生效的连接不中断 firewalld-cmd --compulete-reload //重载firewalld,当前连接中断 firewalld-cmd --get-services //列出所有预设服务,如上图的“3” firewalld-cmd --list-services //列出当前正在生效的服务 firewalld-cmd --permanent --zone=public --add-service=smtp //在public区域中的永久配置中启用smtp服务 firewalld-cmd --permanent --zone=public --remove-service-smtp //在public区域中的永久配置中移除smtp服务 firewalld-cmd --zone=public --list-ports //列出public区域中已经启用的端口号 firewalld-cmd --permanent --zone=public --add-port=8080/tcp //在public区域中的永久配置中启用8080端口 firewalld-cmd --permanent --zone=public --remove-port=8080/tcp //在public区域中的永久配置中移除8080端口 firewalld-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=90 //将本机的80端口流量转发到90端口,区域为public //将本机80端口的流量转发到192.168.1.1这台主机的8080端口上 firewall-cmd --zone=public --add-masquerade //不同服务器端口转发,要先开启 masquerade firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.1 firewall-cmd --get-zones //查看所有可用区域 firewall-cmd --get-active-zones //查看当前活动的区域 firewall-cmd --list-all-zones //列出所有区域的所有配置 firewall-cmd --zone=work --list-all //列出指定区域(如:work区域)的所有配置 firewall-cmd --get-default-zone //查看默认区域 firewall-cmd --set-default-zone=public //设定默认区域
//设定某一网段为内网段(然后可以创建策略为只允许内网访问呀) firewall-cmd --permanent --zone=internal --add-source=192.168.122.0/24 firewall-cmd --permanent --zone=internal --remove-source=192.168.122.0/24 //移除
(2.2)富规则 rich-rule
firewall-cmd –list-rich-rules //列出所有富规则
复杂规则配置案例:
//允许来自主机 192.168.0.14 的所有 IPv4 流量 firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.168.0.14 accept' //拒绝来自主机 192.168.1.10 到 22 端口的 IPv4 的 TCP 流量 firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject' //允许来自主机 10.1.0.3 到 80 端口的 IPv4 的 TCP 流量,并将流量转发到 6532 端口上 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' //将主机 172.31.4.2 上 80 端口的 IPv4 流量转发到 8080 端口(需要在区域上激活 masquerade) 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' //允许192.168.122.0/24主机所有连接 firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.122.0" accept' //每分钟允许2个新连接访问ftp服务 firewall-cmd --add-rich-rule='rule service name=ftp limit value=2/m accept' //同意新的IPv4和IPv6连接FTP ,并使用审核每分钟登录一次 firewall-cmd --add-rich-rule='rule service name=ftp log limit value="1/m" audit accept' //允许来自1192.168.122.0/24地址的新IPv4连接连接TFTP服务,并且每分钟记录一次 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' //丢弃所有icmp包 firewall-cmd --permanent --add-rich-rule='rule protocol value=icmp drop' //当使用source和destination指定地址时,必须有family参数指定ipv4或ipv6。如果指定超时,规则将在指定的秒数内被激活,并在之后被自动移除 firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.122.0/24 reject' --timeout=10 //拒绝所有来自2001:db8::/64子网的主机访问dns服务,并且每小时只审核记录1次日志 firewall-cmd --add-rich-rule='rule family=ipv6 source address="2001:db8::/64" service name="dns" audit limit value="1/h" reject' --timeout=300 //允许192.168.122.0/24网段中的主机访问ftp服务 firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.122.0/24 service name=ftp accept' //转发来自ipv6地址1:2:3:4:6::TCP端口4011,到1:2:3:4:7的TCP端口4012 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"'
【3】最佳实践
(3.1)构建自定义区域来 指定IP 访问 指定端口
首先创建一个适当的区域名称(在我们的例子中,我们使用了mariadb access来允许访问MySQL数据库服务器)。
# firewall-cmd --new-zone=mariadb-access --permanent
接下来,重新加载firewalld设置以应用新更改。如果跳过此步骤,则在尝试使用新区域名称时可能会出错。这一次,新区域应该出现在区域列表中,如下面的屏幕截图所示。
# firewall-cmd --reload
# firewall-cmd --get-zones
接下来,添加要在本地服务器上打开的源IP地址(10.24.96.5/20)和端口(3306),如图所示。然后重新加载防火墙设置以应用新更改。
# firewall-cmd --zone=mariadb-access --add-source=10.24.96.5/20 --permanent # firewall-cmd --zone=mariadb-access --add-port=3306/tcp --permanent # firewall-cmd --reload
或者,您可以允许从整个网络(10.24.96.0/20)到服务或端口的流量。
# firewall-cmd --zone=mariadb-access --add-source=10.24.96.0/20 --permanent # firewall-cmd --zone=mariadb-access --add-port=3306/tcp --permanent # firewall-cmd --reload
要确认新分区具有上面添加的所需设置,请使用以下命令检查其详细信息。
# firewall-cmd --zone=mariadb-access --list-all
(3.2)富规则 实现 指定IP 访问指定端口
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="1.2.3.4/32" port protocol="tcp" port="4567" accept'
firewall-cmd --reload
(3.3)多个端口
# 多个端口 firewall-cmd --zone=mariadb-access --add-port=3306-3309/tcp --permanent
【4】如何配置日志
实验效果
记录所有被防火墙拦截的数据包,并且保存以用于后续分析服务器是否被"端口扫描"
配置步骤
(4.1)启用防火墙日志记录功能
可以使用 firewall-cmd 命令修改
[root@localhost ~]# firewall-cmd --set-log-denied=unicast --permanent
[root@localhost ~]# firewall-cmd --reload
(4.2)配置日志文件单独保存
默认情况下,防火墙的拒绝日志会被保存在/var/log/messages 文件中。
但随着时间流逝,大量的拒绝日志可能会充斥该文件,并且默认系统会对 messages 文件进行日志旋转,不利于后续的准确分析。
可以通过 rsyslog 来捕获日志,并将其重定向到其他指定的文件中。
在 /etc/rsyslog.d/ 目录下创建一个 firewalld.conf 的文件,内容如下:
:msg,contains,"_DROP" /var/log/firewalld.log & stop :msg,contains,"_REJECT" /var/log/firewalld.log & stop
然后重启 rsyslog 服务
[root@localhost ~]# systemctl restart rsyslog
(4.3)审计日志
直接查看该文件( /var/log/firewalld.log )很难统计出所有的信息,因为日志条目太长了,并且数量也多。
需要借助 grep 命令 awk 等命令帮助列出有用的信息。
最终我们想要看到的日志条目格式如下:
源IP地址-->协议/TCP:目的端口
源IP地址-->协议/UDP:目的端口
创建一个自定义命令 analyze-firewall 写入以下内容:
#!/bin/bash cat /var/log/firewalld.log | awk '{print $10"="$17":"$19}' | grep -vE "SRC=0000*|SRC=fe80*" | grep DPT >deny_analyze cat /var/log/firewalld.log | awk '{print $10"="$18":"$20}' | grep -vE "SRC=0000*|SRC=fe80*" | grep DPT >>deny_analyze cat deny_analyze | awk -F= '{gsub("PROTO","协议",$3);gsub("DPT","",$4);print $2"->"$3"/"$4$5}' | sort -nr | uniq -c | sort -nr | head -5
(4.4)运行效果
[root@localhost ~]# analyze-firewall 202 172.25.250.11->协议/TCP:8888 75 172.25.250.11->协议/TCP:23 52 172.25.250.11->协议/TCP:943 40 172.25.250.12->协议/TCP:80 32 172.25.250.11->协议/TCP:53
(4.5)参考文档
该部分转自:https://www.bilibili.com/read/cv20486259/ 出处:bilibili
相关参考:https://baijiahao.baidu.com/s?id=1685684533566281761&wfr=spider&for=pc