在Linux中火墙策略是基于netfilter实现的。
1、netfilter:内核上有个安全插件netfilter(访问控制列表),这个列表里有许多详细的规则,当对这个规则允许或拒绝时,可以控制其他主机是否能访问,极大的提高了安全性。
2、iptables:管理netfilter的工具,通过iptables往netfilter表格里面写网络安全策略。
3、iptables | firewalld:对iptables进行管理,用iptables或firewalld手段来写网络安全策略。
在rhel8中默认使用的是firewalld
dnf install iptables-services -y
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl mask firewalld.service
systemctl enable --now iptables.service
systemctl stop iptables.service
systemctl disable iptables.service
systemctl mask iptables.service
systemctl unmask firewalld.service
systemctl enable --now firewalld.service
iptables策略记录文件:/etc/sysconfig/iptables
iptables-save > /etc/sysconfig/iptables
service iptables save
默认策略中的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,感谢大佬的文章!
-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
iptables -t nat -nL
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
iptables -t filter -I INPUT -s 172.25.250.120 -p tcp --dport 80 -j ACCEPT
iptables -nL
iptables -t filter -D INPUT 3
iptables -nL
iptables -N skkk
iptables -nL
iptables -X skkk
以上操作均没有保存在永久策略文件中,要保存须
service iptables save
或者service iptables save
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
真机 ip | 172.25.250.250 |
westosa主机双网卡 | ens3:172.25.250.136 ens9: 172.25.36.1 |
westosb主机 | ens3:172.25.36.2 |
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
systemctl stop iptables.service
systemctl disable iptables.service
systemctl mask iptables.service
systemctl unmask firewalld.service
systemctl enable --now firewalld.service
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
firewall-cmd --set-default-zone=public
firewall-cmd --list-all
此时,其他主机不可以访问,但可以通过ssh
连接
(3)当默认域设定为block
firewall-cmd --set-default-zone=block
firewall-cmd --list-all
(1) 火墙当前域的设定状态文件/etc/firewalld/firewalld.conf
firewalld
服务将域的工作方式设定完成在/usr/lib/firewalld
当中有已经封装好的域的配置文件
(2)火墙的应用模块在/usr/lib/firewalld/services
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
连接
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主机,其他主机都拒绝访问
真机可以访问,其他主机不能访问
(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