防火墙概述
防火墙是一种由硬件和软件组合而成,在内部网和外部网之间、专有网和公共网之间构造的保护屏障,用以保护用户资料和信息安全的一种技术
防火墙作用在于及时发现并处理计算机网络运行时可能存在的安全风险、数据传输等问题,从而实现计算机不安全网络因素的阻断。 确保网络正常运行,保障信息安全,为用户提供良好的网络体验
防火墙分为硬件和软件两种,硬件防火墙是由厂商设计好的主机硬件,其操作系统主要以提供数据包数据的过滤机制为主,并去掉不必要的功能。而软件防火墙则是保护系统网络安全的一套软件(或称为机制),如Linux中的Netfilter和iptables/firewalld等
Netfilter,是一个工作在Linux内核的网络数据包处理框架,是Linux内核中的包过滤功能体系,用于分析进入主机的网络数据包,将数据包的头部数据(如硬件地址、软件地址、TCP、UDP、ICMP等)提取出来进行分析,以决定该连接为放行还是抵挡的机制,称为防火墙的“内核态”
而我们学习的iptables与firewall则是两款不同的防火墙管理工具,真正实现防火墙功能的还是内核Netfilter
firewalld
firewalld是从红帽7系统开始,作为iptables服务的替代品,提供更高级别的防火墙管理功能,是默认的管理防火墙配置的工具,使用iptables作为底层实现
特点
支持动态更新防火墙规则,可以在运行时添加、删除、修改规则,而不需要重新加载整个防火墙配置
支持IPv4、IPv6防火墙设置以及以太网桥
加入了区域(zone,一系列规则的集合)概念
配置分为永久配置和运行时配置
管理区域
阻塞区域(block):任何传入的网络数据包都将被阻止
工作区域(work):相信网络上的其他计算机不会损害你的计算机,只接受选定的传入连接
家庭区域(home):相信网络上的其他计算机不会损害你的计算机,只接受选定的传入连接
内部区域(internal):信任网络上的其他计算机不会损害你的计算机,只有选择接受传入的网络连接
外部区域(external):不相信网络上的其他计算机不会损害你的计算机,只有选择接受传入的网络连接
公共区域(public):在公共场所使用,你不相信网络上的其他计算机不会损害你的计算机,只接受选定的传入连接,也是默认区域
信任区域(trusted):所有的网络连接都可以接受,该区绑定的规则(如网卡、源网段、服务等)不受防火墙阻挡,所有流量均可通过
隔离区域(DMZ):隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用,用于在非军事区内可公开访问但对内部网络有限制访问的计算机,只接受选定的传入连接
丢弃区域(drop):任何传入的网络数据包被丢弃,没有应答,只可能传出网络连接
使用命令
服务操作命令
systemctl start firewalld #启动服务
systemctl stop firewalld #停止服务
systemctl restart firewalld #重启服务
systemctl status firewalld #查看状态
systemctl enable firewalld #设置开机自启动
systemctl disable firewalld #禁用开机自启动
区域操作命令
firewall-cmd --get-default-zone #查看默认区域
firewall-cmd --set-default-zone=public #设置默认区域为public区域
firewall-cmd --get-active-zone #查看当前活动的区域
firewall-cmd --get-zones #查看总共可用的区域
#--list-[区域选项] 查看指定区域的选项配置,all为查看所有配置
#--zone=[区域名] 指定配置的区域,不指定则对默认区域进行设置(public区域)
firewall-cmd --list-all #查看当前激活(active)的区域的配置
firewall-cmd --list-all --zone=work #查看work区域的配置
firewall-cmd --list-port --zone=work #查看work区域的端口配置
区域配置选项
target :默认目标策略,通常是允许或拒绝
icmp-block-inversion :ICMP阻塞反转设置,如果设置为yes
,则默认允许ICMP,并通过规则来阻塞特定的ICMP消息
interfaces :这个区域绑定的网络接口
sources :对特定的源IP地址或网络配置为只允许或拒绝
services :允许通过此区域的服务
ports :允许通过此区域的特定TCP端口
protocols :对特定的协议设置为只允许或拒绝
masquerade :是否启用IP伪装(NAT)
forward-ports :设置端口转发规则
source-ports :源端口设置特定规则
icmp-blocks :没有阻塞的ICMP消息
rich rules :设置富规则(复杂的、自定义的防火墙规则)
配置操作
#对于firewalld的配置,可以对区域内的选项进行配置
#--add-[区域选项配置] 添加(remove为删除)
#允许来自 IP 地址 192.168.221.148 的流量进入 public 防火墙区域
firewall-cmd --add-source 192.168.221.148 --zone=public
#允许来自任意地址的TCP流量通过22端口,在设置端口时建议指定协议
firewall-cmd --add-port=22/tcp
#允许来自任意地址的TCP流量通过8080到8083之间的端口
firewall-cmd --add-port=8080-8083/tcp
#--change-interface 更改该区域绑定的网络接口
#将ens33网络接口绑定到work区域,所有该接口的流量根据work区域的规则进行过滤
firewall-cmd --change-interface=ens33 --zone=work
#使用富规则配置
#使用富规则设置允许192.168.221.148设备发送到TCP端口22的数据包通过防火墙
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.221.148" port port=22 protocol="tcp" accept'
#rule 使用富规则要使用rule关键字
#family 指定Ipv4类型
#source 指定源IP
#address 源IP地址
#port 配置端口号
#port=22 指定端口号为22
#protocol 指定协议
#这里配置都是临时性的,在下一次重启服务或重新加载配置时会失效
#--permanent 设置为永久有效
#永久将ens33网络接口绑定到work区域,所有该接口的流量根据work区域的规则进行过滤
firewall-cmd --change-interface=ens33 --zone=work --permanent
iptables
概述
在早期的Linux系统中默认使用的就是iptables,该防火墙使用链式规则,与firewalld一样,是一款防火墙管理与配置的工具,真正实现防火墙功能的是Linux内核中的Netfilter
iptables是一个命令行工具,只可以通过命令行进行配置,并且iptables的配置是临时的,重启系统后配置会丢失。iptables配置防火墙依靠四个部分实现,分别是:表、规则链、规则、控制类型,可以适应各种不同的网络环境和应用场景。iptables的配置实时生效,不需要重启服务
功能
数据包过滤:可以根据源IP地址、目标IP地址、端口号、协议类型等条件来过滤进出系统的数据包,从而实现访问控制和安全策略的限制
网络地址转换(NAT):可以将私有网络中的IP地址转换为公网IP地址,实现内网访问外网的功能
端口转发:可以将某个端口的数据包转发到另一个指定的端口上,用于实现服务的映射和访问控制
防止DoS攻击:可以通过配置规则来限制来自某个IP地址或IP地址段的连接数,从而减轻系统的负载和防止拒绝服务攻击
日志记录:可以将符合规则的数据包记录到系统日志中,用于分析和审计系统的网络流量
表和链
iptables的四个表是互相独立的,处理优先级为:raw—>mangle—>nat—>filter,此外每个表的作用也各不相同
raw表:是否对数据包进行状态追踪,包含OUTPUT、PREROUTING两个规则链
mangle表:修改数据包内容,可以做流量整型、对数据包设置标记,包含所有的规则链,但是很少使用这个表
nat表:负责地址转换功能,用来修改数据包中的源、目标IP地址或端口,包含OUTPUT、
PREROUTING、POSTROUTING三个规则链
filter表:负责过滤数据包,确认是否放行数据包,包含INPUT、FORWARD、OUTPUT三个规则链
在iptables还有五条规则链,在每个规则表里有不同的规则链,每个规则链内存在不同的规则,每个规则链也有不同的作用,当数据包到达数据链时,从上而下匹配规则,如果没有匹配到,就会执行规则链默认的控制类型
PREROUTING:在进行路由选择前处理数据包
POSTROUTING:在进行路由选择后处理数据包
INPUT:处理入站的数据包,也就是目标是本机的数据包
OUTPUT:处理出站的数据包,也就是处理从本机发出的数据包
FORWARD:处理转发的数据包,也就是处理经过本机的数据包
iptables对于数据包的处理流程可以参考下图
iptables的控制类型
ACCEPT:允许通过
DROP:直接丢弃,不给出任何回应
REJECT:拒绝通过,并给出回应,对方可以知道被拒绝
SNAT:修改数据包的源地址
DNAT:修改数据包的目标地址
LOG:记录日志信息,然后传给下一条规则继续匹配
使用
在CentOS7中,默认使用firewalld防火墙,因此需要先安装iptables,而且两者只能同时使用一个,在使用前要先关闭firewalld
systemctl stop firewalld #关闭firewalld
yum -y install iptables-services iptables #安装iptables
systemctl start iptables #启动服务
systemctl enable iptables #设置开机自启动
#-t 指定表,如果不指定,默认是filter表 -v 查看规则表详细信息
#-n 使用数字形式显示输出结果 -L 查看当前防火墙有哪些策略(规则)
iptables -t raw -nL #查看raw表下的信息
#-F 清空表中所有的策略
iptables -t raw -F #清空raw表中所有的策略
配置规则
#-A 在指定链的末尾添加一条规则 -I 在指定链中插入一条规则,默认在第一行添加
#-p 指定协议类型 -j 指定控制类型
#在filter表的INPUT链第三条规则前添加规则,拒绝所有udp协议的数据包,这里如果链中没有三条或更多的规则
#则会在链的末尾添加,
iptables -t filter -I INPUT 3 -p udp -j REJECT
#-s 指定源地址或网段 -d 指定目的地址 -i 指定入站网卡 -o 指定出站网卡
#丢弃来自192.168.221.150主机并且通过ens33网卡进入的数据包,这里需要两个条件同时满足
iptables -t filter -A INPUT -s 192.168.221.150 -i ens33 -j DROP
#拒绝目标地址为192.168.221网段的IP的主机并且由本机ens33网络接口进行转发的数据包
iptables -t filter -A FORWARD -d 192.168.221.0/24 -o ens33 -j REJECT
#--sport 指定源端口 --dport 指定目标端口
# : 表示一个端口范围 -m multiport --sports 多端口匹配
#丢弃所有来自30到40端口范围的数据包
iptables -t filter -A FORWARD --sport 30:40 -j DROP
#拒绝所有目标端口为40的数据包
iptables -t filter -A FORWARD --dport 40 -j REJECT
#-D 删除规则
#删除filter表中INPUT链的第三条规则,如果不存在该规则,则会提示命令失败
iptables -t filter -D INPUT 3
#-P 设置规则链默认策略
#如果数据包没有匹配到INPUT链的任何被允许通过的规则,就会被拒绝
iptables -t filter INPUT -P REJECT
iptables扩展
#-m 指定扩展模块
#string模块
#丢弃由本机发送的含有字符串kcce的数据包
iptables -t filter -A OUTPUT -m string --algo kmp --string "www.kcce.com" -j DROP
#multiport
#拒绝所有发送到(12,34,56,78,90)端口的数据包
iptables -t filter -A OUTPUT -m multiport --dports 12,34,56,78,90 -j REJECT
iptables导出与导入
由于iptables的配置时临时的,所以可以导出配置,再下次重启服务后再导入进行使用
iptables-save #会将当前iptables的规则输出到终端
iptables-save > /iptables.txt #使用重定向将规则配置写入文件中
iptable-restore #导入规则配置
iptables-restore /iptables.txt #从iptables.txt导入规则配置