Linux中的火墙策略化
一、火墙介绍
在Linux中火墙策略是基于netfilter实现的。
1、netfilter:内核上有个安全插件netfilter(访问控制列表),这个列表里有许多详细的规则,当对这个规则允许或拒绝时,可以控制其他主机是否能访问,极大的提高了安全性。
2、iptables:管理netfilter的工具,通过iptables往netfilter表格里面写网络安全策略。
3、iptables | firewalld:对iptables进行管理,用iptables或firewalld手段来写网络安全策略。
二、火墙管理工具切换
在rhel8中默认使用的是firewalld
1、firewalld —> iptables
dnf install iptables-services -y
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl mask firewalld.service
systemctl enable --now iptables.service
2、iptables —> firewalld
systemctl stop iptables.service
systemctl disable iptables.service
systemctl mask iptables.service
systemctl unmask firewalld.service
systemctl enable --now firewalld.service
三、iptables的使用及火墙默认策略
1、火墙策略的永久保存
iptables策略记录文件:/etc/sysconfig/iptables
- 永久保存策略:
iptables-save > /etc/sysconfig/iptables
service iptables save
2、火墙默认策略
默认策略中的5条链
input | 输入(目的地址为本机) |
output | 输出(原地址为本地,向外发送) |
forward | 实现转发 |
postrouting | 路由之后(发送到网卡之前) |
prerouting | 数据包进入路由之前 |
默认策略的3张表
filter | 经过本机内核的数据(input、output、forward) | 过滤,防火墙,过滤数据包 |
nat | 不经过内核的数据(postrouting、prerouting、input、output) | 用于网络地址转换(IP、端口) |
mangle | 当filter 和nat 表不够用时(input、output、forward、postrouting、prerouting) | 拆解报文,作出修改,封装报文 |
以下图片取自https://blog.csdn.net/weixin_46833747/article/details/108230122,感谢大佬的文章!
3、iptables的命令
-F | 清空iptables (如不保存,服务重启后,策略会恢复) |
-t | 指定表名称 (默认查看 filter 表) |
-n | 不做解析 |
-L | 查看 |
-A | 添加策略 |
-p | 协议 |
--dport | 目的地端口 |
--sport | 来源端口 |
-s | 来源 |
-j | 动作ACCEPT :允许DROP :丢弃REJECT :拒绝SNAT :源地址转换DNAT :目的地地址转换 |
-N | 新建链 |
-E | 更改链名称 |
-X | 删除链 |
-D | 删除规则 |
-I | 插入规则 |
-R | 更改规则 |
-P | 更改默认规则 |
(1)清空iptables表
iptables -F
iptables -nL
(2)查看指定表
iptables -t nat -nL
(3)允许指定ip访问
iptables -t filter -A INPUT -s 172.25.250.250 -j ACCEPT
iptables -nL
(4)-I INPUT 2
:插入指定次序规则(INPUT 默认第一行)
iptables -t filter -A INPUT -s 172.25.250.240 -j ACCEPT
iptables -t filter -I INPUT 2 -s 172.25.250.230 -j ACCEPT
iptables -nL
(5)指定tcp协议和dport
iptables -t filter -I INPUT -s 172.25.250.120 -p tcp --dport 80 -j ACCEPT
iptables -nL
(6)删除规则
iptables -t filter -D INPUT 3
iptables -nL
(7)新建链
iptables -N skkk
iptables -nL
(8)删除链
iptables -X skkk
以上操作均没有保存在永久策略文件中,要保存须
service iptables save
或者service iptables save
4、数据包状态
RELATED | 建立过连接的 |
ESTABLISHED | 正在连接的 |
NEW | 新的 |
火墙的策略是从上到下依次匹配,当匹配到适合自己的状态时,便不会向下匹配,通过对策略数据包状态的编写来优化火墙。
-m
:扩展匹配,可加载扩展
(1)添加一个规则,设定火墙允许已建立和正在建立连接的数据包通过;
(2)添加一个规则,状态为新的数据包,访问回环接口的允许访问(lo :允许回环接口);
(3)添加一个规则,状态为新的数据包,使用 tcp协议,访问22端口 ,允许访问;
(4)添加一个规则,状态为新的数据包,拒绝所有主机接入。
iptables -F
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state NEW -i lo -j ACCEPT ##允许从回路接口进入
iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT ##允许所有主机都可通过22端口[ssh服务]进入此主机
iptables -A INPUT -m state --state NEW -j REJECT ##拒绝所有主机接入
iptables -nL
5、NAT表中的SNAT和DNAT
- 实验环境:
真机 ip | 172.25.250.250 |
westosa主机双网卡 | ens3:172.25.250.136 ens9: 172.25.36.1 |
westosb主机 | ens3:172.25.36.2 |
- 开启内核路由功能,使双网卡处于不同网段的ip可以互相通信
sysctl -a
:显示系统所有参数
sysctl -a | grep ip_forward
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 ##开启内核路由功能
sysctl -p ##使修改生效
(1)SNAT(源地址转换)
172.25.36
网段无法直接ping
到172.25.250
网段,须将westosb
的网关设定为172.25.36.1
,再做SNAT。
-o = --out-interface name
iptables -F ##清空iptables表,防止之前设定对实验的影响
iptables -t nat -A POSTROUTING -o ens3 -j SNAT --to-source 172.25.250.136 ##路由之后
iptables -t nat -nL
172.25.36网段可以ping
通172.25.250网段
也可以通过ssh
连接,实现源地址伪装,w -i
:显示登录来源
(2)DNAT(目的地地址转化)
真机无法访问westosb
主机,可以通过访问双网卡的westosa
主机,让westosa
主机将需求转发给westosb
主机,须做DNAT。
-i = --in-interface name
iptables -t nat -A PREROUTING -i ens3 -j DNAT --to-dest 172.25.36.2
iptables -t nat -nL
用真机连接westosa
主机,连接到的是westosb
主机
四、firewalld的使用
1、firewalld的开启
systemctl stop iptables.service
systemctl disable iptables.service
systemctl mask iptables.service
systemctl unmask firewalld.service
systemctl enable --now firewalld.service
2、firewald的域
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-client、samba-client、dhcp-client |
external | ipv4网络地址伪装转发 sshd |
实验:
dnf install httpd -y
systemctl enable --now httpd
echo skk.linux.com > /var/www/html/index.html
curl http://172.25.250.136
(1)当默认域设定为trusted
firewall-cmd --set-default-zone=trusted
firewall-cmd --list-all
此时其他主机都可以访问
(2)当默认域设定为public
firewall-cmd --set-default-zone=public
firewall-cmd --list-all
此时,其他主机不可以访问,但可以通过ssh
连接
(3)当默认域设定为block
firewall-cmd --set-default-zone=block
firewall-cmd --list-all
此时其他主机不能做任何操作
3、firewalld的设定原理及数据存储
(1) 火墙当前域的设定状态文件/etc/firewalld/firewalld.conf
firewalld
服务将域的工作方式设定完成在/usr/lib/firewalld
当中有已经封装好的域的配置文件
(2)火墙的应用模块在/usr/lib/firewalld/services
4、firewalld的管理命令
firewall-cmd --state ##查看火墙状态
firewall-cmd --list-all ##查看默认域中的火墙策略
firewall-cmd --get-active-zones ##查看当前火墙中生效的域
firewall-cmd --get-default-zone ##查看默认域
firewall-cmd --set-default-zone=trusted ##设定默认域
firewall-cmd --list-all --zone=dmz ##查看指定域的火墙策略
--permanent
:表示永久设定,如果不加 --permanent
则即改即生效,但是 reload
之后就失效了;如果加了 --permanent
,则需要 reload
(重新加载火墙策略)才能生效
firewall-cmd --get-services ##查看所有可以设定的服务
firewall-cmd --permanent --add-service=westos ##添加服务
firewall-cmd --reload ##重新加载服务
firewall-cmd --permanent --remove--service=westos ##移除服务
firewall-cmd --permanent --add-source 172.25.36.0/24 --zone=trusted ##指定数据来源访问指定域
firewall-cmd --permanent --remove-source 172.25.36.0/24 --zone=trusted ##删除自定域中的数据来源
firewall-cmd --permanent --remove-interface=ens3 --zone=public #删除指定域的网络接口
firewall-cmd --permanent --add-interface=ens3 --zone=block #添加指定域的网络接口
firewall-cmd --permanent --change-interface=ens3 --zone=public #更改网络接口到指定域
设定默认域为block
,设定36网段的主机在访问westosa时为trusted
域
westosb
主机为172.25.36网段,所以可以访问,真机则不可以
修改ens3到public
域
更改后真机不可以访问,但可以通过ssh
连接
5、firewalld的高级规则
firewall-cmd --direct --get-all-rules ##查看高级规则
firewall-cmd --direct --add-rule ipv4 filter INPUT 1 ! -s 172.25.250.250 -p tcp --dport 80 -j REJECT ##添加规则
firewall-cmd --permanent --direct --remove-rule ipv4 filter INPUT 1 ! -s 172.25.250.250 -p tcp --dport 80 -j REJECT ##删除规则
先将之前实验的规则进行修改,将域改为trusted
,允许所有访问
设定高级规则,除了172.25.250.250主机,其他主机都拒绝访问
真机可以访问,其他主机不能访问
6、firewalld中的NAT
- 实验环境和上面iptables的SNAT和DNAT实验环境一致
(1)SNAT,双网卡主机开启地址伪装
firewall-cmd --permanent --add-masquerade ##开启地址伪装
firewall-cmd --reload
此时172.25.36网段主机就可以ping
通172.25.250网段主机
(2)DNAT,在地址伪装基础上,做目的地址转换
firewall-cmd --permanent --add-masquerade ##开启地址伪装
firewall-cmd --permanent --add-forward-port=port=22:proto=tcp:toaddr=172.25.36.2 ##做目的地址转换
firewall-cmd --reload
用真机连接westosa主机,连接到的是westosb主机