目录
一、防护墙概述
二、防火墙
2.1名词
2.2使用规则
2.3表与链
2.3.1简介
2.3.2每个表说明
1)filter表
2)nat表
2.4环境的配置
2.5iptables的命令参数
2.6 配置filter表规则
2.6.1备份与恢复
2.6.2案例1:禁止访问22端口
2.6.3案例2:封ip 屏蔽某个ip
2.6.4案例3:只允许指定⽹段连⼊
2.6.5 案例4:指定多个端⼝
2.6.6 案例5:匹配ICMP类型
2.6.7案例6:匹配⽹络状态(TCP/IP连接状态)
2.6.8案例7:限制并发速率
2.7 nat
2.7.1共享上网
2.7.2端口映射
一、防护墙概述
防火墙是一种网络安全设备,用于监控和控制数据包在网络中的流动,以保护网络免受未经授权的访问、恶意攻击和其他安全威胁。防火墙可以是软件、硬件或组合体,其主要功能包括:
- 封端口封ip
- 实现NAT功能
- 共享上网
- 端口映射(端口转发),ip映射
二、防火墙
2.1名词
- 表(table):用来存放链的容器,防火墙最大的概念。
- 链(chain):用来存放规则的容器。
- 规则(policy):准许或拒绝规则,未来书写的防火墙条件就是各种防火墙规则。
2.2使用规则
1. 防⽕墙是 层层过滤 的,实际是按照配置规则的 顺序从上到下 ,从前到后进⾏过滤的。2. 如果 匹配成功 规则,即明确表示是 拒绝 (DROP) 还是接收 (ACCEPT) , 数据包就不再向下匹配新的规则 。3. 如果规则中没有明确表明是阻⽌还是通过的,也就是没有匹配规则,向下进⾏匹配,直到 匹配默认规则 得到明确的阻⽌还是通过。4. 防⽕墙的 默认规则 是 所有规则都匹配完才会匹配的。
那么问题来了,如果是拒绝的规则,我们应该放在哪里呢?
回答:为了能够最快速的筛掉不必要的数据包,我们的拒绝规则肯定是要放在前面的,接受的放在后面。
2.3表与链
2.3.1简介
iptables分成4表五链。
4表:raw表、mangle表、filter表、nat表
五链:INPUT、OUTPUT、FORWARD 、PREROUTING、POSTROUTING
表全是小写字母,链全是大写字母。
2.3.2每个表说明
我们这里主要介绍filter表和nat表,其他的几乎用不到。
1)filter表
filter表 |
强调:主要和主机⾃身相关,真正负责主机防⽕墙功能的(过滤流⼊流出主机的数据包)filter表示iptables默认使⽤的表,这个表定义了三个链(chains) 企业⼯作场景:主机防⽕墙
|
INPUT |
负责过滤所有⽬标地址是本机地址的数据包 通俗来说:
就是过滤进⼊主机的数据包
(
能否让数据包进⼊服务器)
|
OUTPUT |
路过
:
负责转发流经主机的数据包。起转发的作⽤,和
NAT
关系很⼤,后⾯会详细介绍
LVS NAT模式,
net.ipv4.ip_forward=0
|
FORWARD |
处理所有源地址是本机地址的数据包 通俗的讲:就是处理从主机发出去的数据包
|
2)nat表
- 实现共享上⽹(内⽹服务器上外⽹)
- 端⼝映射和ip映射
nat表 |
负责⽹络地址转换的,即来源与⽬的
IP
地址和
port
的转换。
应⽤:和主机本身无关,⼀般⽤于局域⽹共享上⽹或者特殊的端⼝转换服务相关。
⼯作场景:
1.
⽤于企业路由(
zebra
)或网关(
iptables
),共享上⽹(
POSTROUTING
)
2.
做内部外部
IP
地址⼀对⼀映射(
dmz
),硬件防⽕墙映射
IP
到内部服务器,
ftp
服务
(
PREROUTING
)
3. WEB
,单个端⼝的映射,直接映射
80
端口(
PREROUTING
) 这个表定义了
3
个链,
nat
功能相当于⽹络的
acl
控制。和⽹络交换机
acl
类似
|
OUTPUT |
和主机放出去的数据包有关,改变主机发出数据包的⽬的地址。
|
PROROUTING |
在数据包到达防⽕墙时,进⾏路由判断之前执⾏的规则,
作⽤是改变数据包的⽬的地址、
⽬的端口等
就是收信时,根据规则重写收件⼈的地址
例如:把公⽹
IP
:
xxx.xxx.xxx.xxx
映射到局域⽹的
xx.xx.xx.xx
服务器上。
如果是
web
服务,可以报
80
转换为局域⽹的服务器
9000
端⼝上
10.0.0.61 8080(
⽬标端⼝
) ----nat---à 10.0.0.7 22
|
POSTROUTING |
在数据包离开防⽕墙时进⾏路由判断之后执⾏的规则,作⽤改变数据包的源地址,源端⼝等。
写好发件⼈的地址,要让家⼈回信时能够有地址可回。
例如。默认笔记本和虚拟机都是局域⽹地址,在出⽹的时候被路由器将源地址改为了公⽹地址。
⽣产应⽤:
局域⽹共享上⽹
。
|
流程图:
2.4环境的配置
我们需要有root权限(本文测试都是在root用户环境下)
//下载iptables
[root@VM-8-13-centos ~]# yum install -y iptables-services
//将配置文件永久写入文件
cat >>/etc/rc.local<<EOFmodprobe ip_tablesmodprobe iptable_filtermodprobe iptable_natmodprobe ip_conntrackmodprobe ip_conntrack_ftpmodprobe ip_nat_ftpmodprobe ipt_stateEOF//检查文件是否已经了iptables
[root@VM-8-13-centos ~]# lsmod |egrep 'filter|nat|ipt'
//关闭防火墙
[root@VM-8-13-centos ~]# systemctl disabled firewalld
[root@VM-8-13-centos ~]# systemctl disable firewalld
//开启iptables服务
[root@VM-8-13-centos ~]# systemctl start iptables.service
[root@VM-8-13-centos ~]# systemctl enable iptables.service
//查看iptables服务状态
[root@VM-8-13-centos ~]# systemctl status iptables.service
//查看filter中的规则
[root@VM-8-13-centos ~]# iptables -nL
2.5iptables的命令参数
参数 | 含义 |
查看表 | |
-L |
显示表中的所有规则
|
-n |
不要把端⼝ 或
ip
反向解析为名字(查看表的时候更快)
|
指定表
| |
-t |
指定表(不指定默认是
filter
表)
|
指定链接(追加/头部插入/删除) | |
-A |
append
追加 加⼊
准许
类规则
|
-I |
insert
把规则加在链的第
1
条
拒绝
类规则放在所有规则最上⾯
|
-D |
delete
删除
|
-N | 添加用户自定义链 |
-X | 删除自定义链 |
-P | 修改默认规则 |
参数 | 含义 |
-p |
协议
protocal
tcp/udp/icmp/all
|
--doprt |
⽬标端⼝
dest destination
指定端⼝ 加上协议
-p tcp (这里之所以是--是为了和-d参数区分开)
|
--sport |
源端⼝
source
源
|
-s |
source
源
ip
|
-d |
destination
⽬标
ip
|
-m |
指定模块
multiport
|
-i |
input
输⼊的时候 从哪个⽹卡进来
|
-o |
ouput
输出的时候 从哪个⽹卡出去
|
参数 | 含义 |
-j |
满⾜条件后的动作
:
DROP/ACCEPT/REJECT
|
DROP REJECT
拒绝
DROP
把数据丢掉 不会返回信息给⽤户
REJECT
拒绝 返回拒绝信息
(这两个的区别就在于:一个是收到东西后直接丢了不和你说,另一个就是收到后直接和你说不喜欢。)
|
参数 | 含义 |
-F |
flush 清除所有规则,不会处理默认的规则
|
-x |
删除⽤户
⾃定义的链
|
-Z | zero 链的计数器清零(数据包计数器与数据包字节计数器) |
下面是组合用法:
iptables
命令及选项
|
指定表
|
指定链
(
插⼊
/
追加
/
删除
)
|
ip
|
具体要求
(
端⼝
,ip,
协议
)
|
端⼝
|
动作
|
iptables
|
-t nat
|
-A INPUT
|
-s
|
-p tcp/udp/icmp
|
--dport
⽬标端⼝
|
-j DROP
|
-I
|
-d
|
--sport
源端⼝
|
-j REJECT
| |||
-D
|
-j ACCEPT
|
相信看到这么多参数已经头大了,没事,我们下面结合案例来看
2.6 配置filter表规则
2.6.1备份与恢复
备份:iptables-save >/etc/sysconfig/iptables
我们可以cat查看这个目录,这是我们本来保存的规则,我们将现在的内容写入配置文件保存起来。
恢复:iptables-restore </etc/sysconfig/iptables
我们先用 iptable -F清空规则,然后使用恢复。
2.6.2案例1:禁止访问22端口
我们先 iptables -F清空规则,然后加入规则:
[root@VM-8-13-centos ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
这时候可以发现,我们的云服务器直接退出了
这是因为我们登录使用的端口是22号端口,我们把22号端口禁止掉,那么我们相当于自杀了。这时候就需要重启云服务器让它重置到之前的样子。
2.6.3案例2:封ip 屏蔽某个ip
老规矩,先清空规则,然后加入规则:
[root@VM-8-13-centos ~]# iptables -I INPUT -s 106.52.90.67 -j DROP
这时候我们复制一个窗口,ping+自己云服务器的ip地址,这时候我们发现是无法收到自己发给自己的数据包的。因为我们把自己的ip给封禁了。
我们输入 iptables -nL 查看此时表中的规则,如果此时的规则很多,我们删除的时候还需要数删除第几条,那么我们可以输入:
[root@VM-8-13-centos ~]# iptables -nL --line-number
可以看到,现在显示的规则是会带上编号的。
我们删除第一条规则:
[root@VM-8-13-centos ~]# iptables -D INPUT 1
此时我们把封禁的规则删除之后,我们又可以ping了
2.6.4案例3:只允许指定⽹段连⼊
实现阿⾥云⽩名单功能:默认是拒绝 开放端⼝ ⽹段方法一:利⽤ ! 进⾏排除
iptables -I INPUT ! -s 106.52.90.0/24 -j DROP我们通过上面案例,我们知道了怎么封禁单个ip,我们其实只需要加上一个感叹号,就可以实现只允许该ip连入。到这里很多人就迷糊了,这个0/24是什么意思?
在网络中,CIDR(Classless Inter-Domain Routing)表示法用于指定一个IP地址和其对应的网络前缀长度。这个长度告诉我们IP地址中有多少位是网络地址,剩下的位数则是主机地址。
在106.52.90.0/24中,106.52.90.0/24是网络地址,
/24
表示子网掩码,也就是前24位是网络地址,后8位是主机地址。这意味着这个网络中有 2^8 - 2 = 254 个可用的主机地址,因为其中的网络地址和广播地址都不能用于主机。因此,106.52.90.0/24表示了一个包含
106.52.90.0
到 106.52.90.255 的范围内的所有IP地址的网络。这样的表示法在指定网络范围时非常常见。方法二:修改链默认规则 修改为拒绝 添加准许
[root@VM-8-13-centos ~]# iptables -A INPUT -s 106.52.90.0/24 -j ACCEPT[root@VM-8-13-centos ~]# iptables -P INPUT DROP
//重新改回
[root@VM-8-13-centos ~]# iptables -P INPUT ACCEPT
2.6.5 案例4:指定多个端⼝
参数:-m multiport 只要在参数中加一个这个参数,就代表需要设置多个端口。
[root@VM-8-13-centos ~]# iptables -A INPUT -m multiport -p tcp --dport 80,443 -j ACCEPT
如果是连续的多个端口,可以不需要加上这个,只需要用一个冒号:连接起来即可。
[root@VM-8-13-centos ~]# iptables -I INPUT -p tcp --dport 1024:65535 -j DROP
这样就把1024到65535的端口全部禁止掉了
2.6.6 案例5:匹配ICMP类型
- ICMP(Internet Control Message Protocol)Internet控制报⽂协议,ping就是用的ICMP协议
- 整个⽹站核⼼
通过防⽕墙规则 控制是否可以ping//icmp-type8 就是icmp协议的第8种功能,也就是ping功能[root@VM-8-13-centos ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP
通过内核参数 控制 禁⽌被ping
[root@VM-8-13-centos ~]# cat /etc/sysctl.conf#/proc/sys/net/ipv4/icmp_echo_ignore_allnet.ipv4.icmp_echo_ignore_all = 1[root@VM-8-13-centos ~]# sysctl -pnet.ipv4.icmp_echo_ignore_all = 1[root@VM-8-13-centos ~]# echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all[root@VM-8-13-centos ~]# #net.ipv4.icmp_echo_ignore_all=1 写⼊到/etc/sysctl.conf[root@oldboy-m01 ~]# #sysctl -p[root@VM-8-13-centos ~]# echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all
2.6.7案例6:匹配⽹络状态(TCP/IP连接状态)
- -m state --state
- NEW:已经或将启动新的连接
- ESTABLISHED:已建⽴的连接
- RELATED:正在启动的新连接
- INVALID:⾮法或⽆法识别的
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPTiptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT通过指定适当的连接状态,可以根据连接的状态来过滤和处理数据包。例如,你可以设置防火墙规则只允许已建立的连接通过(
ESTABLISHED
),从而增强网络安全性。
2.6.8案例7:限制并发速率
-m limit 限制模块-m limit --limit n/{second/minute/hour}:解释:指定时间内的请求速率”n”为速率,后⾯为时间分别为:秒 分 时例如:-m limit --limit 10/minute #每分钟只能有10个数据包 每6秒⽣成
--limit-burst [n]解释:在同⼀时间内允许通过的请求”n”为数字,不指定默认为5测试:#ping icmp 协议 进⾏测试iptables -Fiptables -I INPUT -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPTiptables -A INPUT -p tcp --dport -j ACCEPTiptables -P INPUT DROP
2.7 nat
2.7.1共享上网
原理:
- 当我的局域网ip想要发送消息给百度的ip的时候,我需要先转成公网ip之后才能找到它。
- 如果消息包中的源ip在进入公网之后还是我的局域网的ip地址,那么当百度想要给我发送包的时候,就会在公网中找不到。因此,我们经过防火墙的SNAT源地址转换的时候,我们会把源ip换成公网的ip,这样在返回的时候才能找到。
操作:
//参数设置为1,开启ip转发功能
[root@VM-8-13-centos ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf//刷新一下
[root@VM-8-13-centos ~]# sudo sysctl -p
//使用 iptables 设置转发规则,将局域网内部的数据包转发到外部网络。[root@VM-8-13-centos ~]# sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
这里假设
eth0
是连接外部网络的网络接口,您需要将其替换为您实际使用的网络接口名称。如果不确定网络接口名称,可以使用ifconfig
命令查看。//根据需要设置防火墙规则,以允许或拒绝特定的网络流量。
例如,允许局域网内部的流量:
sudo iptables -A INPUT -i eth1 -j ACCEPT
2.7.2端口映射
有时候公网用户想要从局域网内某个端口使用局域网,那么我们就可以用端口映射。将我们所需要使用的局域网ip的端口映射到管理机的某个端口上,达到上网的目的。
//将局域网ip为10.0.8.13的22号端口 映射到 目的ip为公网ip 106.52.90.67的9000号端口。
//这里之所以是-d是站在数据包的角度的,数据包是从别的主机出发,目的ip是我们要找到的公网ip
注意:这里还是需要注意一下之前我们在共享上网讲到的SNAT技术,不然往回传数据的时候又会找不到路了。