实验环境:
test主机: 172.25.254.30
iptables主机: 172.25.254.20 / 192.168.0.20
71kelongji 主机:192.168.0.10
1.火墙介绍
1.netfilter介绍
Netfilter时新一代的Linux防火墙机制,是linux内核的一个子系统。其重要工具模块IPTables从用户态的iptables连接到内核态的Netfilter的架构中,Netfilter与IP协议栈是无缝契合的,并允许使用者对数据报进行过滤、地址转换、处理等操作。他是一种表格。
2.iptables 往 netfilter 中写内容的工具
3.管理 iptable 策略的方式
1.iptables 2.firewalld
2.火墙管理工具切换
在rhel8中默认使用的是firewalld管理
firewalld----->iptables
dnf install iptables-services -y
systemctl stop firewalld
systemctl disable firewalld
systemctl mask firewalld 冻结服务
systemctl enable --now iptables 开启iptables服务
iptales -------> fiewalld
systemctl stop iptables
systemctl disable iptables
systemctl mask iptables
systemctl enable --now firewalld
3. iptables 的使用
iptables 的查看:
这些信息都保存在 /etc/sysconfig/iptables 中 ##iptables 策略记录文件
iptables 的清除:
iptables -F
里面的内容都被刷掉了。重启服务后又刷新出 /etc/sysconfig/iptables 中的策略内容
永久保存 iptables 策略
当我们执行 iptables -F 后,执行以下命令
iptales-save > /etc/sysconfig/iptables 或者 service iptables save
可以看出策略内容已经被永久更改,因为策略文件已经被改过了。
4.火墙默认策略
默认策略中的5条链
input ##输入
output ##输出
forward ##转发
postrouting ##发生在路由之后,对应SNAT
prerouting ##发生在路由之前,对应DNAT
SNAT: 改变数据包的源地址。当内网数据包到达防火墙后,防火墙会使用外部地址替换掉数据包的源IP地址(目的IP地址不变),使网络内部主机能够与网络外部主机通信。
DNAT: 改变数据包的目的地址。当防火墙收到来自外网的数据包后,会将该数据包的目的IP地址进行替换(源IP地址不变),重新转发到内网的主机。
默认的3张表
filter #经过本机内核的数据(input,output,forward)
nat #不经过内核的数据(postrouting,prerouting,input,output)
mangle #当filter和nat表不够用时使用(input,output,forward,postrouting,prerouting)
5.iptables命令
参数:
-t ##指定表名称
-n ##不做解析,显示IP地址
-L ##查看
由于刚才 -F 清刷掉了数据,所以暂时没有内容 。
-A ##添加策略
-p ##协议
–dport ##目的地端口
-s ##来源
-j ##动作
ACCEPT #允许
DROP #丢弃
REJECT #拒绝
SNAT #源地址转换
DNAT #目的地地址转换
-D ##删除规则
-I ##插入规则
-R ##更改规则
-P ##更改默认规则
此时连接和访问都被拒绝。
执行 iptables -D INPUT 1 删除规则。1是指第一条。
DROP 不同于REJECT 的是,REJECT会给与回应直接拒绝,而DROP会使在访问时一直尝试连接。一般情况下在拒绝时我们是用REJECT
当我们把第二条设置为允许 10主机时,
还是无法访问的,因为iptables火墙策略的规则是从上到下依次读取,当第一条条件与当前资源匹配,则不回去询问第二条,无论第二条是否匹配。
我们可以使用 -I 插入,默认插入位置为第一条。此时我们在尝试用另外一台主机访问。
就可以建立连接了。
当我们只想让 ssh 连接时,我们可以只开放22 端口:
更改第一条策略:
就将端口改为80端口了。
当没有策略时会使用默认策略,
那我们如何更改它:
且只能改为 ACCEPT , DROP , REJECT
-N ##新建链
-E ##更改链名称
-X ##删除链
当我们只想要只能访问本机的dns 和Apache服务时,我们应做如下设定;
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport=80 -j ACCEPT
iptables -A INPUT -p tcp --dport=443 -j ACCEPT
iptables -A INPUT -p tcp --dport=53 -j ACCEPT
iptables -A INPUT -j REJECT
然而在企业中,火墙策略可能有成千上万条,当我们所需要的的规则在最后一条时,就会造成延迟,为了解决这一问题,我们需要建立数据包状态。
数据包状态
RELATED ##建立过连接的
ESTABLISHED ##正在连接的
NEW ##新的
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 80 -j ACCEPT
新数据包访问80端口允许
iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT
新数据包访问443端口允许
iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT
访问53端口允许
iptables -A INPUT -m state --state NEW ! -s 192.168.0.10 -p tcp --dport 22 -j ACCEPT
除了10主机以外的主机访问22端口允许,!意为除了
iptables -A INPUT -m state --state NEW -j REJECT
新数据宝状态为拒绝
service iptables save 永久刷新策略
nat表:
一、dnat snat
我们先设定双网卡主机
设定test主机的网关为 172.25.254.20 :
然后用另外两台不同网段的主机互相ping:
ping不通。
查看内核路由功能开启了没有:
1为开启,然后我们编写火墙策略
二、snat 源地址转换
iptables -t nat -A POSTROUTING -o ens160 -j SNAT --to-source 192.168.0.20
-o<网络接口>:指定数据包要离开本机所使用的网络接口。
可以ping通。
我们在从172.25.254.30 test主机 ssh 192.168.0.10
可见源地址转换成功。因为它的网关是172.25.254.20,所以会先经过20主机路由,再做一个源地址转换到达192.168.0.10主机上
我们从 192.168.0.10 主机 ssh 192.168.0.20 主机时,连接的就是20主机本身,我们想在连接20主机时,转换到 172.25.254.30主机。
dnat 目的地地址转换
iptables -t nat -A PREROUTING -i ens160 -p tcp --dport 22 -j DNAT --to-dest 172.25.254.30
-i<网络接口>:指定数据包进入本机的网络接口;
可见连接192.168.0.20主机时,实际访问到的是172.25.254.30主机,目的地地址转换成功。