文章目录
火墙介绍
数据访问流程:
以apache为例:当外部数据想要访问apache时,首先要通过内核的80端口进行访问内核,内核同意访问,外部数据才能访问到apache上的数据。
火墙:
火墙为内核上的插件,其功能为对来访的数据包进行过滤筛选(起到是否同意访问的功能)。
netfilter:
为了保证数据交换的安全性,内核上开启了一个名为netfilter的插件。
当收到数据访问请求时,数据包(携带信息:从哪来,到哪去)从端口进入内核,同时内核读取netfilter。netfilter为访问策略(也就是火墙),是以表格形式体现(数据包属性的过滤)。
结构
使用iptables对netfilter进行管理的方式有两种,分别为iptables方式和firewalld方式:
火墙管理工具切换
在rhel8中默认使用的是firewalld的管理方式,iptables管理方式没有安装。
将farewelld的管理方式切换到iptables的管理方式:
首先安装iptables:
dnf install iptables-services -y
停止firewalld:
systemctl stop firewalld ##停止firewalled服务
systemctl disable firewalld ##禁止开机启动firewalld服务
systemctl mask firewalld ##冻结firewalld服务
开启iptables:
systemctl enable --now iptables ##启动iptables并设置为开机启动
切换iptables成功!
将iptables的管理方式切换到firewalld的管理方式:
方法同farewelld的管理方式切换到iptables管理方式相同:
关闭iptables服务:
systemctl stop iptables.service ##停止iptables服务
systemctl disable iptables.service ##禁止开机自启iptables服务
systemctl mask iptables ## 冻结iptables服务
启动firewalld:
systemctl unmask firewalld.service ##解冻firewalld服务
systemctl enable --now firewalld ##启动firewalld并设置为开机启动
切换成功!
iptables 的使用
ipdables -L
ipdables的查看(策略信息)
默认三张表,五条链:
这些策略信息默认记录在文件:/etc/sysconfig/iptables
iptables -F
清空规则链
这个时候如果重启iptables,再次查看iptables策略信息:
策略信息恢复,斌没有被清空。这是因为iptables重启后,会读取 /etc/sysconfig/iptables文件。
iptabls策略永久保存:
要想永久修改iptables的策略信息,则需要修改/etc/sysconfig/iptables
方法一:iptables-save > /etc/sysconfig/iptables
可以使用iptables -save来查看策略信息:
为了保证效果明显,首先使用iptables -F 清除策略信息:
所有链上的策略信息被清除,此时,使用iptables -save来读取策略信息:
将读取到的策略信息导入到iptables策略信息保存文件/etc/sysconfig/iptables:
iptables-save > /etc/sysconfig/iptables
即可永久保存iptables策略。
测试:重启iptables后查看策略信息:
重启后,iptables策略信息为空。策略信息保存成功!
方法二:
使用命令:
service iptables save
可直接对策略信息进行保存
火墙默认策略
iptables的三张表,五条链
默认策略中的五条链:
input(输入)和output(输出):
当主机1对主机2发送访问请求时,主机1的数据包的目的地为主机2。
数据包由主机1到达主机2的这个过程叫做input,主机2给主机一返回数据包信息这个过程叫做output。
注意:这里的input , output都是以主机2为目的地或者发送者,都是访问主机2内核。
当主机1与主机3的网段不同时,需借助双网卡主机2进行路由,此时主机1发送对主机3的访问请求,数据包须通过主机2进行数据转发才能到达主机3,同样的,主机3返回的数据包也需要通过主机2进行数据转发。此时对于主机2,主机1对主机3发送的数据请求,经过主机2的这个过程,也叫做input,主机3对主机1返回的数据包经过主机2也叫做output。注意:这里的input,output与上面所说的input与output不同,这里的input,output的目的地不是主机2,而是经过主机2进行数据转发。
forward(转发)
经过主机2进行数据转发的这个过程叫做forward。
postrouting(路由之后)和prouting(路由之前)
主机1发送数据包经主机2路由后,数据包外套上一层网段2的信息到达主机3。
这个过程叫做snat(源地址转换),这个过程时发生在路由之后的。叫做postrouting。
主机3返回主机1的数据包在经过主机2时,数据包原本网段2的外层套上网段1的信息,使其可以经过主机2进行转发。这个过程发生在路由之前,叫做prouting。
默认的三张表
默认的三张表为
filter ,nat, mangle
表名称 | 表内容 |
---|---|
filter | 经过本机内核的数据,包含3链(input,output,forward) |
nat | 不经过本机内核的数据,包含4链(postrouting,proting,input(不是filter中的input),output(不是filter中的output)) |
mangle | 当filter表和mangle表不够用时使用,包含5链(包含所有的链) |
iptables命令的使用
iptables -t filter -L ## 查看filter表(不加-t filter默认指定为filter表)
-t指定表名称 -L查看
-n不做解析(显示ip而不是主机名称):
iptables -A INPUT -j REJECT (filter表)拒绝所有的外部数据连接:
-A 添加策略 -j指定动作
测试:使用另外一台主机远程登录:
远程登录失败。
iptables -D INPUT 序号 ## (filter表)删除指定规则:
将刚才添加的RJECT删除:
使用另一台主机再次尝试远程登录:
登陆成功!
iptables -A INPUT -j DROP ##将外来的数据做丢弃处理
使用另一台主机ping此台主机可以直观看到效果:
可以看到,ping无结果,不显示信息。
若是改为拒绝状态,ping此主机的效果如下:
可以看到,ping的结果为不可到达。
iptables -A INPUT -s 192.168.0.106 -j ACCEPT
接收来自192.168.0.106主机的数据。-s 来源
可以看到,接收192.168.0.106数据这条规则是排在REJECT之后,那么192.198.0.106还可以ping通此主机吗?
可以看到,192.168.0.106主机不能ping通此主机。所以可见:表里的策略规则是由上到下读取!所以在设置火墙策略时,一定要注意先后顺序!!!
我们由上面可以看到,使用A添加火墙规则都是添加到表的最后一行。
可以使用iptables -I INPUT 3 -s 192.168.0.106 -j ACCEPT
将其插入到filter表的第3条规则。(默认插入到第一条)
可以看到,允许192.168.0.106主机的数据访问规则成功插入到第3条规则,在拒绝所有数据访问请求规则的上边,此时我们再次使用192.168.0.106主机ping此主机:
可以看到,192.168.0.106主机成功ping通此主机,REJECT对于192.168.0.106主机不生效。使用其他主机再次ping此主机:
不能ping通此主机,说明REJECT生效。
可以使用iptables -I INPUT 3 -s 192.168.0.120 -p tcp --dport 22 -j ACCEPT
只允许192.168.0.120主机使用tcp协议,22端口来访问此主机
-p 指定协议 --dport 目的地端口
首先使用192.168.0.120主机ping此主机:
不能ping通。使用ssh远程登录:
虽然不能ping通,但是能够使用ssh远程访问。
使用iptables -R INPUT 3 -s 192.168.0.120 -p tcp --dport 80 -j ACCEPT
对已有规则策略进行更改, -R 更改。
若无匹配规则,则使用的是默认策略:ACCEPT
默认策略的更改:
使用ptables -P 链 动作
对默认策略进行更改。(只有ACCEPT和DROP)
iptables -P INPUT DROP 将INPUT链的默认策略更改为DROP
使用iptables -N 新链名称
新建链
新建xng链:iptables -N xng
使用iptables -E 老链名称 新链名称
对链名进行更改。
将xng链名更改为HAHA
iptables -E xng HAHA
更改成功!
使用iptables -X 链名 删除指定链:
iptables -X HAHA ##删除HAHA链
数据包状态
状态 | 含义 |
---|---|
RELATED | 建立过连接的 |
ESTABLISHED | 正在连接的 |
NEW | 新的 |
应用小示例:
现搭建了一台dns,apache的服务器,
要求:除了访问dns和apache,不允许任何人访问其他服务。
理论思路如下:
首先允许本机回环接口:
iptables -A INPUT -i lo -j ACCEPT
-i 指定网络接口
允许tcp协议的80,443,53端口:
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
设置完成。理论上确实设这样子设置的。
但是!这样子设置的结果就是每一 个访问本机的数据包都需要经过我们设置的火墙策略。我们想要访问本机的dns(53端口),但是由于企业中的火墙策略过多,可能有有成千条策略,而允许53端口的访问恰恰在最后一条,每当客户访问dns时,就会造成很高的延迟。是火墙访问策略的延迟。
所以可以用数据包状态进行判定。
允许已经建立过连接关系的数据包通过,允许正在连接的数据包通过,所以每次只用检测新的数据包即可。
所以,可以这么做:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
使已经建立过连接关系及正在建立连接的数据包通过。
对于新的数据包:
允许其接入回环接口,并且允许访问80,443,53端口,除此之外其他数据请求都拒绝:
iptables -A INPUT -m state --state NEW -i lo -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 453 -j ACCEPT
iptables -A INPUT -j REJECT

即设置成功,新的数据包被检测一次后再次进行访问时就不对其进行火墙策略的检测。大大提高了数据传输的性能!
数据转发(dnat和snat)
实验环境:
iptables主机,双网卡:
ip:192.168.0.120 172.25.254.120
单网卡主机1:
ip:172.25.254.50 ,GATEWAY=172.25.254.120
单网卡主机2:
ip:192.168.0.42
========================================
首先检查双网卡主机内核路由功能是否打开:
sysctl -a | grep ip_forward
内核路由功能是打开的。
在net表中进行相关设置:
双网卡主机ip:
使用iptables -F 将nat表刷掉之后:
iptables -t nat -A POSTROUTING -o ens160 -j SNAT --to-source 192.168.0.120
-o 流出
设置从ens160网卡流出的数据地址伪装成192.168.0.120
(源地址转化)在POSTROUTING
测试:使用单网卡主机1(ip:172.25.254.50)通过双网卡主机做数据转发ssh连接单网卡主机2(ip:192.168.0.42)
成功连接到单网卡主机2。
使用w -i
查看当前登录用户:
显示为192.168.0.120主机登录,但是实际登录的主机为172.25.254.50,完成源地址转换(snat)
也可以设置目的地地址转换(dnat):
效果为:使用单网卡主机2(ip:192.168.0.42)连接双网卡主机,但是实际连接的为单网卡主机1(ip:172.25.254.50)在PREROUTING。
iptables -t nat -A PREROUTING -j DNAT --to-dest 172.25.254.50
-i 流进的数据
测试:
在单网卡主机2使用ssh连接双网卡主机192.168.0.120:
可以看到,连接的时192.198.0.120主机,但是真实连接的主机位172.25.254.50.
目的地地址转化完成。