1.火墙介绍
1.1 netfilter
netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些 信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架,该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、包速率限制等。
1.2 iptables
iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。
Iptables 是用来设置、维护和检查Linux内核的IP包过滤规则的,是用来填写netfilter的工具。
可以定义不同的表,每个表都包含几个内部的链,也能包含用户定义的链。每个链都是一个规则列表,对对应的包进行匹配:每条规则指定应当如何处理与之相匹配的包。这被称作’target’(目标),也可以跳向同一个表内的用户定义的链。
netfilter/iptables 的最大优点是它可以配置有状态的防火墙。
1.3 iptables|firewalld(火墙管理的两种工具)
iptables的防火墙策略是交由内核层面的netfilter网络过滤器来处理的,而firewalld则是交由内核层面的nftables包过滤框架来处理。
相较于iptables防火墙而言,firewalld支持动态更新技术并加入了区域(zone)的概念,即不同的防火墙策略集合,用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。
2.火墙管理工具切换
火墙的管理方式只能有一种
注意:在rhel8中默认使用的是firewalld
2.1 firewalld----->iptables的切换
dnf install iptables-services -y
安装iptables
systemctl stop firewalld
关闭firewall
systemct disable firewalld
开机不启动firewall
systemctl mask firewalld
冻结firewall使不被其他程序打开
systemctl enable --now iptables
启动iptables并设定开机启动
2.2 iptales -------> fiewalld的切换
systemctl disable --now iptables
systemctl mask iptables
systemctl unmask firewalld
systemctl enable --now firewalld
3. iptables 的使用
3.1 iptables 策略记录文件
/etc/sysconfig/iptables | iptables 策略记录文件 |
---|
3.2 永久保存策略
(以下两种方式任选其一即可)
(1)iptales-save > /etc/sysconfig/iptables
读取火墙策略信息并导入iptables策略记录文件
(2)service iptables save
保存策略信息
4.火墙默认策略
4.1 默认策略中的5条链
input | 输入 |
---|---|
output | 输出 |
forward | 转发 |
postrouting | 路由之后 |
prerouting | 路由之前 |
4.2 默认的3张表
filter | 经过本机内核的数据 | (input、output 、forward) |
---|---|---|
nat | 不经过内核的数据 | (postrouting、prerouting、input、output) |
mangle | 当filter和nat表不够用时使用 | (input 、output 、forward 、postrouting、 prerouting) |
4.3 iptables命令
iptables的命令 | 用途 |
---|---|
t | 指定表名称 |
-n | 不做解析(显示主机IP) |
-L | 查看 |
-A | 添加策略 |
-D | 删除策略 |
-p | 协议 |
- -dport | 目的地端口 |
-s | 来源 |
-j | 动作 |
-j ACCEPT | 允许 |
-j DROP | 丢弃(无回应) |
-j REJECT | 拒绝(有回应) |
-j SNAT | 源地址转换 |
-j DNAT | 目的地地址转换 |
-N | 新建链 |
-E | 更改链名称 |
-X | 删除链 |
-D | 删除规则 |
-I | 插入规则 |
-R | 更改规则 |
-P | 更改默认规 |
1.查看表信息:
2.关于策略读取规则:
注意:火墙中的策略读取是 从上到下的读取方式,当所读取到的策略和当前的资源达到的匹配的程度,就执行当前的策略,不会读取后续的策略了。
3.只允许指定IP访问SSH(指定服务)
4.-R更改策略
5.-P更改默认策略
注意:默认策略是ACCEPT,如果想要更改可以使用-P,但注意**-P后面不能指定为REJECT**,只能跟ACCEPT或者DROP
6.对链的控制
-N 新建链
-E 更改链名称
4.4 数据包状态
1.数据包的状态转变 : 为了解决掉在传输数据包时由于火墙读取策略导致的延迟问题,转换数据包的状态可以使已经检测过的数据包再次传输时直接通过火墙策略而不必等候火墙策略的读取。
2.数据包的三种状态:
状态 | 含义 |
---|---|
RELATED | 建立过连接的 |
ESTABLISHED | 正在连接的 |
NEW | 新的 |
3.在添加火墙策略时写入数据包的状态:
(1)设定建立过连接和正在建立连接的数据包的火墙策略为允许:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
(2)设定本机的回环接口允许新的数据包:
iptables -A INPUT -m state --state NEW -i lo -j ACCEPT
(3)对于新的指定服务的数据包添加火墙策略设定为允许:
iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
(4)添加火墙策略,设定除指定IP的所有主机都可以进行的服务:
iptables -A INPUT -m state --state NEW ! -s 192.168.0.200 -p tcp --dport 22 -j ACCEPT
(!代表非)
(5)对于剩余其他新的数据包添加火墙策略设定为拒绝:
iptables -A INPUT -m state --state NEW -j REJECT
(5)永久保存火墙策略
service iptables save
测试:
4.5 NAT表中的SNAT和DNAT
实验环境:
双网卡主机1的IP:192.168.0.60和172.25.254.60主机1相当于路由器(开启内核路由功能)
单网卡主机2的IP:172.25.254.70 主机2相当于内网主机
第三方主机3的IP:192.168.0.200 主机3相当于外网主机
1. SNAT:在路由之后做的源地址转换
实验目的:可以让单网卡主机连接到不同网段的主机 ,使172(内网)--------->192(外网)
在双网卡主机中添加火墙策略:
iptables -t nat -A POSTROUTING -o ens160 -j SNAT --to-source 192.168.1.104
把源地址转换的动作是在路由之后做的,在双网卡主机是数据从ens224网卡进入,从ens160网卡出去的数据做源地址转换,把源地址172.25.254.70转换为192.168.0.60。
测试:
2. DNAT:在路由之前做的目的地地址转换
在双网卡主机中添加火墙策略:
iptables -t nat -A PREROUTING -i ens160 -j DNAT --to-dest 172.25.254.30
把目的地地址转换的动作是在路由之前做的,使主机3通过连接192.168.0.60而真实连接的是172.25.254.70。
5. firewalld
在企业7之后添加了firewalld的管理方式
5.1关于firewalld的域
域名 | 工作内容 | 工作范围(允许的服务) |
---|---|---|
trusted | 接受所有的网络连接 | 全部 |
home | 用于家庭网络,允许接受 | ssh、mdns、ipp-client、samba-client、dhcp-client |
work | 工作网络 | ssh、ipp-client、dhcp-client |
public | 公共网络 | ssh、dhcp-client |
dmz | 军级网络 | ssh |
block | 拒绝所有 | drop (所有数据全部丢弃无任何回复 ) |
internal | 内部网络 | ssh、mdns、ipp-clien、 samba-client、dhcp-client |
external | ipv4网络地址伪装转发 | sshd |
5.2 关于firewalld的设定原理及数据存储
/etc/firewalld | 火墙配置目录 |
---|---|
/lib/firewalld | 火墙模块目录 |
1. 火墙主配置文件更改默认域
(1)可以使用命令firewall-cmd --set-default-zone=
在火墙中更改默认域;
(2)也可以在火墙主配置文件 /etc/firewalld/firewalld.conf中添加数据
2.在火墙中添加服务
添加服务到火墙策略中
(1)可以使用命令firewall-cmd --permanent --add-service=
和firewall-cmd --reload
在火墙中添加服务;
注意:不加- -permanent表示临时添加,- -permanent表示永久添加服务到火墙策略中,重启火墙后,服务还继续存在。
(2)也可以在配置目录中的子目录文件 /etc/firewalld/zones/public.xml中添加服务数据,并重启火墙
3.在火墙中添加不被允许的服务(需要编辑模块目录中的认证文件)
5.3 firewalld的管理命令
firewall-cmd --state
查看火墙状态
firewall-cmd --get-services
查看所有可以设定的服务
firewall-cmd --permanent --add-service=cockpit
添加服务
firewall-cmd --reload
firewall-cmd --permanent --remove-service=cockpit
移除服务
firewall-cmd --reload
firewall-cmd --get-zones
查看所有的域
firewall-cmd --get-active-zones
查看当前火墙中生效的域
firewall-cmd --get-default-zone
查看默认域
firewall-cmd --list-all
查看默认域中的火墙策略
firewall-cmd --list-all --zone=work
查看指定域的火墙策略
firewall-cmd --set-default-zone=trusted
设定默认域
firewall-cmd --permanent --add-source=172.25.254.0/24 --zone=block
指定数据来源访问指定域
firewall-cmd --reload
firewall-cmd --permanent --remove-source=172.25.254.0/24 --zone=block
删除自定域中的数据来源
firewall-cmd --reload
firewall-cmd --permanent --remove-interface=ens224 --zone=public
删除指定域的网络接口
firewall-cmd --permanent --add-interface=ens224 --zone=block
添加指定域的网络接口
firewall-cmd --permanent --change-interface=ens224 --zone=public
更改网络接口到指定域
5.4 firewalld的高级规则
firewall-cmd --direct --get-all-rules
查看高级规则
firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -s 192.168.0.0/24 -p tcp -dport 22 -j ACCEPT
设定高级规则
实验环境: RedhatLinux7系统中,IP:192.168.0.200
为了让效果更加真实,在火墙服务允许列表中移除ssh服务
设定192.168.0.200主机可以通过22端口来访问主机rhel8
测试:
5.5firewalld中的NAT
1. SNAT:做地址伪装
实验环境:
1.双网卡主机,在双网卡主机中开启内核路由功能 (充当路由器),并打开masquerade 地址伪装功能
双网卡主机IP:192.168.0.60和172.25.254.0.60
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
主机2的IP:172.25.254.70(内网),设定网关为双网卡IP172.25.254.0.60
主机3的IP:192.168.0.200(外网)
测试:
2. DNAT:做地址伪装
firewall-cmd --permanent --add-forward-port=port=22:proto=tcp:toaddr=172.25.254.70
firewall-cmd --reload
测试: