更新 'iptables/企业级防火墙技术IPtables.md'

This commit is contained in:
diandian 2024-05-22 10:58:14 +08:00
parent bf90ec5a6a
commit eaf2b93b9a

View File

@ -1,315 +1,316 @@
<h1><center>企业级防火墙技术IPtables</center></h1> <h1><center>企业级防火墙技术IPtables</center></h1>
------ ------
**作者:行癫(盗版必究)** **作者:行癫(盗版必究)**
## 一:防火墙简介 ## 一:防火墙简介
#### 1.简介 #### 1.简介
​ iptables其实并不是真正的防火墙,我们可以把他理解为一个客户端的代理,用户是通过iptables这个代理,将用户的安全设定执行到对应的“安全框架”中,这个“安全框架”才是真正的防火墙。这个框架叫做netfilter ​ iptables其实并不是真正的防火墙,我们可以把他理解为一个客户端的代理,用户是通过iptables这个代理,将用户的安全设定执行到对应的“安全框架”中,这个“安全框架”才是真正的防火墙。这个框架叫做netfilter
​ netfilter 内核态 位于内核空间 ​ netfilter 内核态 位于内核空间
​ iptables 用户态 位于用户空间 ​ iptables 用户态 位于用户空间
注意: 注意:
​ 企业环境内部服务器需关闭Linux自身防火墙;(解决安全问题尽量不给服务器配置外网IP.需要访问的话,就使用代理转发)因为高并发,iptables会加大延迟。除非并发小,服务器必须处于公网,考虑开启防火墙;大并发的情况,不能开iptables,影响性能因为iptables是要消耗CPU的,利用硬件防火墙提升架构安全 ​ 企业环境内部服务器需关闭Linux自身防火墙;(解决安全问题尽量不给服务器配置外网IP.需要访问的话,就使用代理转发)因为高并发,iptables会加大延迟。除非并发小,服务器必须处于公网,考虑开启防火墙;大并发的情况,不能开iptables,影响性能因为iptables是要消耗CPU的,利用硬件防火墙提升架构安全
#### 2.分类 #### 2.分类
逻辑分类 逻辑分类
​ 主机防火墙:针对单个主机进行防护 ​ 主机防火墙:针对单个主机进行防护
​ 网络防火墙:它往往处于网络入口或者边缘,针对于网络入口进行防护,服务于防火墙背后的局域网 ​ 网络防火墙:它往往处于网络入口或者边缘,针对于网络入口进行防护,服务于防火墙背后的局域网
物理分类 物理分类
​ 硬件防火墙:在硬件级别实现部分防火墙功能,另一部分基于软件实现,性能高,成本高 ​ 硬件防火墙:在硬件级别实现部分防火墙功能,另一部分基于软件实现,性能高,成本高
​ 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上,性能低,成本低 ​ 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上,性能低,成本低
## 二:相关术语 ## 二:相关术语
#### 1.表(tables) #### 1.表(tables)
​ 表(tables)是链的容器,即所有的链(chains)都属于其对应的表(tables),如上,如果把Netfilter看成是某个小区的一栋楼,那么表(tables)就是楼里的其中的一套房子 ​ 表(tables)是链的容器,即所有的链(chains)都属于其对应的表(tables),如上,如果把Netfilter看成是某个小区的一栋楼,那么表(tables)就是楼里的其中的一套房子
#### 2.链(chains) #### 2.链(chains)
​ 链(chains)是规则(Policys)的容器。如果把表(tables)当作有一套房子,那么链(chains)就可以说是房子里的家具(柜子等) ​ 链(chains)是规则(Policys)的容器。如果把表(tables)当作有一套房子,那么链(chains)就可以说是房子里的家具(柜子等)
#### 3.规则(Policy) #### 3.规则(Policy)
​ 规则(Policy)就比较容易理解了,就是iptables系列过滤信息的规范和具体方法条款了.可以理解为柜子如何增加并摆放柜子东西等 ​ 规则(Policy)就比较容易理解了,就是iptables系列过滤信息的规范和具体方法条款了.可以理解为柜子如何增加并摆放柜子东西等
| **Netfilter/iptables** | 表(tables) | 链(chains) | 规则(Policy) | | **Netfilter/iptables** | 表(tables) | 链(chains) | 规则(Policy) |
| ---------------------- | ------------ | ------------ | -------------------- | | ---------------------- | ------------ | ------------ | -------------------- |
| **一栋楼** | 楼里的房子 | 房子里的柜子 | 柜子里衣服,摆放规则 | | **一栋楼** | 楼里的房子 | 房子里的柜子 | 柜子里衣服,摆放规则 |
## 三:Iptables表和链 ## 三:Iptables表和链
​ 默认情况下,iptables根据功能和表的定义划分包含四个表,filter,nat,mangle,raw其每个表又包含不同的操作链(chains ) ​ 默认情况下,iptables根据功能和表的定义划分包含四个表,filter,nat,mangle,raw其每个表又包含不同的操作链(chains )
#### 1.表 #### 1.表
​ raw 追踪数据包 ​ raw 追踪数据包
​ mangle 对数据包打标记 ​ mangle 对数据包打标记
​ nat 地址转换 ​ nat 地址转换
​ filter 数据包过滤 ​ filter 数据包过滤
#### 2.链 #### 2.链
​ PREROUTING 在路由之前 ​ PREROUTING 在路由之前
​ INPUT 数据包进入时 ​ INPUT 数据包进入时
​ FORWARD 数据包经过时 ​ FORWARD 数据包经过时
​ OUTPUT 数据包出去时 ​ OUTPUT 数据包出去时
​ POSTROUTING 在路由之后 ​ POSTROUTING 在路由之后
#### 3.表详情 #### 3.表详情
raw: raw:
Chain PREROUTING (policy ACCEPT) Chain PREROUTING (policy ACCEPT)
​ Chain OUTPUT (policy ACCEPT) ​ Chain OUTPUT (policy ACCEPT)
mangle: mangle:
​ Chain PREROUTING (policy ACCEPT) ​ Chain PREROUTING (policy ACCEPT)
​ Chain INPUT (policy ACCEPT) ​ Chain INPUT (policy ACCEPT)
​ Chain FORWARD (policy ACCEPT) ​ Chain FORWARD (policy ACCEPT)
​ Chain OUTPUT (policy ACCEPT) ​ Chain OUTPUT (policy ACCEPT)
​ Chain POSTROUTING (policy ACCEPT) ​ Chain POSTROUTING (policy ACCEPT)
nat: nat:
Chain PREROUTING (policy ACCEPT) Chain PREROUTING (policy ACCEPT)
​ Chain INPUT (policy ACCEPT) ​ Chain INPUT (policy ACCEPT)
​ Chain OUTPUT (policy ACCEPT) ​ Chain OUTPUT (policy ACCEPT)
​ Chain POSTROUTING (policy ACCEPT) ​ Chain POSTROUTING (policy ACCEPT)
filter: filter:
Chain INPUT (policy ACCEPT) Chain INPUT (policy ACCEPT)
​ Chain FORWARD (policy ACCEPT匹配过的数据包不会在去匹配) ​ Chain FORWARD (policy ACCEPT匹配过的数据包不会在去匹配)
​ Chain OUTPUT (policy ACCEPT) ​ Chain OUTPUT (policy ACCEPT)
#### 4.访问顺序 #### 4.访问顺序
​ 当一个数据包进入网卡,先进入PREROUTING链,内核根据数据包的IP判断是否需要转发 ​ 当一个数据包进入网卡,先进入PREROUTING链,内核根据数据包的IP判断是否需要转发
​ 如果是到本机的,就会到INPUT链,然后本机的所有进程可收到这个包 ​ 如果是到本机的,就会到INPUT链,然后本机的所有进程可收到这个包
​ 如果不是到本机的,且内核允许转发,就会到达FORWARD链,然后到POSRTROUTING链输出 ​ 如果不是到本机的,且内核允许转发,就会到达FORWARD链,然后到POSRTROUTING链输出
​ 本机发出一个数据,会通过OUTPUT链,再到POSRTROUTING链输出 ​ 本机发出一个数据,会通过OUTPUT链,再到POSRTROUTING链输出
注意: 注意:
​ 规则顺序:匹配即刻停止 ​ 规则顺序:匹配即刻停止
<img src="https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20230309194921559.png" alt="image-20230309194921559" style="zoom:50%;" /> <img src="https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20230309194921559.png" alt="image-20230309194921559" style="zoom:50%;" />
## 四:Iptables操作 ## 四:Iptables操作
#### 1.安装 #### 1.安装
```shell ```shell
centos(5/6) centos(5/6)
启动防火墙:#/etc/init.d/iptables start 启动防火墙:#/etc/init.d/iptables start
centos7 centos7
[root@xingdian ~]# yum install -y iptables iptables-services [root@xingdian ~]# yum install -y iptables iptables-services
[root@xingdian ~]# systemctl stop firewalld [root@xingdian ~]# systemctl stop firewalld
[root@xingdian ~]# systemctl disable firewalld [root@xingdian ~]# systemctl disable firewalld
[root@xingdian ~]# systemctl start iptables [root@xingdian ~]# systemctl start iptables
查看版本: 查看版本:
[root@xingdian ~]# iptables -V [root@xingdian ~]# iptables -V
iptables v1.4.21 iptables v1.4.21
配置文件: 配置文件:
/etc/sysconfig/iptables-config /etc/sysconfig/iptables-config
/etc/sysconfig/iptables #记录规则文件 /etc/sysconfig/iptables #记录规则文件
``` ```
#### 2.参数解释 #### 2.参数解释
```shell ```shell
-L:列出一个链或所有链中的规则信息 -L:列出一个链或所有链中的规则信息
-n:以数字形式显示地址、端口等信息 -n:以数字形式显示地址、端口等信息
-v:以更详细的方式显示规则信息 -v:以更详细的方式显示规则信息
--line-numbers:查看规则时,显示规则的序号(方便之处,通过需要删除规则-D INPUT 1 --line-numbers:查看规则时,显示规则的序号(方便之处,通过需要删除规则-D INPUT 1
-F:清空所有的规则(-X是清理自定义的链,用的少;-Z清零规则序号) -F:清空所有的规则(-X是清理自定义的链,用的少;-Z清零规则序号)
-D:删除链内指定序号(或内容)的一条规则 -D:删除链内指定序号(或内容)的一条规则
-P:为指定的链设置默认规则 -P:为指定的链设置默认规则
-A:在链的末尾追加一条规则 -A:在链的末尾追加一条规则
-I:在链的开头(或指定序号)插入一条规则 -I:在链的开头(或指定序号)插入一条规则
-t: 指定表名 -t: 指定表名
.... 更多参数可通过--help查看 .... 更多参数可通过--help查看
``` ```
#### 3.常见操作 #### 3.常见操作
```shell ```shell
1.如果不写-t 默认使用filter表 1.如果不写-t 默认使用filter表
指定表名查看规则 指定表名查看规则
[root@xingdian ~]# iptables -t nat -L [root@xingdian ~]# iptables -t nat -L
默认查看规则: 默认查看规则:
# iptables -L # iptables -L
以数字的形式显示ip和端口与协议 以数字的形式显示ip和端口与协议
# iptables -nL # iptables -nL
显示规则行号 显示规则行号
# iptables -nL --line # iptables -nL --line
清空规则: 清空规则:
#iptables -F #iptables -F
清空单独的某一个链里面的规则 清空单独的某一个链里面的规则
#iptables -F 链名 #iptables -F 链名
保存规则: 保存规则:
# service iptables save # service iptables save
# iptables-save > /etc/sysconfig/iptables # iptables-save > /etc/sysconfig/iptables
# iptables-restore < /etc/sysconfig/iptables # iptables-restore < /etc/sysconfig/iptables
``` ```
#### 4.常见协议 #### 4.常见协议
```shell ```shell
协议:-p (小p) 协议:-p (小p)
tcp ---用的最多 tcp ---用的最多
udp udp
icmp ---ping的时候用的协议 icmp ---ping的时候用的协议
#使用协议的时候可以不指定端口,使用端口的时候必须指定协议。 #使用协议的时候可以不指定端口,使用端口的时候必须指定协议。
案例: 案例:
禁止自己被ping,在filter表的INPUT链插入一个丢弃icmp的规则。 禁止自己被ping,在filter表的INPUT链插入一个丢弃icmp的规则。
[root@xingdian ~]# iptables -F [root@xingdian ~]# iptables -F
[root@xingdian ~]# iptables -A INPUT -p icmp -j REJECT ----拒绝 [root@xingdian ~]# iptables -A INPUT -p icmp -j REJECT ----拒绝
验证: 验证:
[root@xingdian ~]# ping 192.168.246.200 [root@xingdian ~]# ping 192.168.246.200
PING 192.168.246.200 (192.168.246.200) 56(84) bytes of data. PING 192.168.246.200 (192.168.246.200) 56(84) bytes of data.
From 192.168.246.200 icmp_seq=1 Destination Port Unreachable From 192.168.246.200 icmp_seq=1 Destination Port Unreachable
``` ```
#### 5.目标动作 #### 5.目标动作
​ ACCEPT 允许数据包通过(默认策略) ​ ACCEPT 允许数据包通过(默认策略)
​ DROP 直接丢弃数据包,不给任何回应 ​ DROP 直接丢弃数据包,不给任何回应
​ REJECT 拒绝数据包,必要时会给数据发送端一个响应 ​ REJECT 拒绝数据包,必要时会给数据发送端一个响应
​ SNAT 源地址转换,可以解决內网用户用一个公网IP上网问题 POSTROUTING ​ SNAT 源地址转换,可以解决內网用户用一个公网IP上网问题 POSTROUTING
​ DNAT 目标地址转换 PREROUTING ​ DNAT 目标地址转换 PREROUTING
​ REDIRECT 做端口映射 ​ REDIRECT 做端口映射
#### 6.规则案例 #### 6.规则案例
```shell ```shell
添加规则:-A 添加规则:-A
[root@xingdian ~]# iptables -t filter -A INPUT -p icmp -j REJECT [root@xingdian ~]# iptables -t filter -A INPUT -p icmp -j REJECT
[root@xingdian ~]# iptables -t filter -A INPUT -p tcp --dport 22 -s 192.168.122.113 -j REJECT [root@xingdian ~]# iptables -t filter -A INPUT -p tcp --dport 22 -s 192.168.122.113 -j REJECT
插入规则:-I 插入规则:-I
如果不指定插入到第几条,默认插入到第一条 如果不指定插入到第几条,默认插入到第一条
插到那默认就是第几条 插到那默认就是第几条
[root@xingdian ~]# iptables -t filter -I INPUT 2 -p tcp --dport 22 -s 192.168.122.114 -j REJECT 插入到第二条上面 [root@xingdian ~]# iptables -t filter -I INPUT 2 -p tcp --dport 22 -s 192.168.122.114 -j REJECT 插入到第二条上面
[root@xingdian ~]# iptables -t filter -I INPUT -p tcp --dport 22 -s 192.168.122.114 -j REJECT 默认插入到第一行 [root@xingdian ~]# iptables -t filter -I INPUT -p tcp --dport 22 -s 192.168.122.114 -j REJECT 默认插入到第一行
替换(修改)规则:-R 替换(修改)规则:-R
[root@xingdian ~]# iptables -t filter -R INPUT 2 -p tcp --dport 22 -s 192.168.122.115 -j REJECT 把114-->115 [root@xingdian ~]# iptables -t filter -R INPUT 2 -p tcp --dport 22 -s 192.168.122.115 -j REJECT 把114-->115
删除规则:-D 删除规则:-D
[root@xingdian ~]# iptables -t filter -D INPUT -p tcp --dport 22 -s 192.168.122.115 -j REJECT [root@xingdian ~]# iptables -t filter -D INPUT -p tcp --dport 22 -s 192.168.122.115 -j REJECT
[root@xingdian ~]# iptables -L --line (要删除的序号) [root@xingdian ~]# iptables -L --line (要删除的序号)
[root@xingdian ~]# iptables -t filter -D INPUT(链) 2 [root@xingdian ~]# iptables -t filter -D INPUT(链) 2
修改默认策略:-P 只能用DROP和ACCEPT 修改默认策略:-P 只能用DROP和ACCEPT
[root@xingdian ~]# iptables -t filter -P INPUT DROP [root@xingdian ~]# iptables -t filter -P INPUT DROP
[root@xingdian ~]# iptables -t filter -P INPUT ACCEPT [root@xingdian ~]# iptables -t filter -P INPUT ACCEPT
添加自定义链:-N 默认不生效 是用来存储规则的 添加自定义链:-N 默认不生效 是用来存储规则的
[root@xingdian ~]# iptables -N blackrach 自己创建的链 [root@xingdian ~]# iptables -N blackrach 自己创建的链
[root@xingdian ~]# iptables -t filter -A blacrach -p tcp --dport 22 -s 192.168.122.116 -j REJECT 往自定义链上添加 [root@xingdian ~]# iptables -t filter -A blacrach -p tcp --dport 22 -s 192.168.122.116 -j REJECT 往自定义链上添加
[root@xingdian ~]# iptables -A INPUT -j blackrach 关联自定义链,使用自定义链 [root@xingdian ~]# iptables -A INPUT -j blackrach 关联自定义链,使用自定义链
修改自定义链名称:-E 修改自定义链名称:-E
[root@xingdian ~]# iptables -E blackrach blackcloud [root@xingdian ~]# iptables -E blackrach blackcloud
删掉自定义规则:不能被关联,必须是空链 删掉自定义规则:不能被关联,必须是空链
[root@xingdian ~]# iptables -X +链名 删除自定义链 [root@xingdian ~]# iptables -X +链名 删除自定义链
``` ```
#### 7.匹配规则 #### 7.匹配规则
基本匹配 基本匹配
```shell ```shell
协议 -p tcp udp icmp 协议 -p tcp udp icmp
查端口:vim /etc/services 记录的是tcp/udp协议簇 查端口:vim /etc/services 记录的是tcp/udp协议簇
vim /etc/protocols 记录的是icmp vim /etc/protocols 记录的是icmp
-p tcp udp icmp -p tcp udp icmp
端口:使用端口前加协议(-p) 端口:使用端口前加协议(-p)
--sport源端口 --sport源端口
[root@xingdian ~]# iptables -A INPUT -p tcp --sport 22 -s 10.18.44.10 -j REJECT [root@xingdian ~]# iptables -A INPUT -p tcp --sport 22 -s 10.18.44.10 -j REJECT
--dport目标端口 --dport目标端口
[root@xingdian ~]# iptables -A INPUT -p tcp --dport 22 -s 10.18.44.10 -j REJECT [root@xingdian ~]# iptables -A INPUT -p tcp --dport 22 -s 10.18.44.10 -j REJECT
IP IP
-s 源IP source ip地址 网段 逗号可以分开多个地址 -s 源IP source ip地址 网段 逗号可以分开多个地址
-d 目标IP destination -d 目标IP destination
``` ```
扩展规则 扩展规则
```shell ```shell
-m 后面+扩展匹配 -m 后面+扩展匹配
-m multiport 多端口 -m multiport 多端口
[root@xingdian ~]# iptables -A INPUT -m multiport --sports(--source-ports) 80,20,22,1000:2000 -j DROP [root@xingdian ~]# iptables -A INPUT -m multiport --sports(--source-ports) 80,20,22,1000:2000 -j DROP
--dports(--destination-ports) --dports(--destination-ports)
-m iprange 多ip地址 -m iprange 多ip地址
[root@xingdian ~]# iptables -A INPUT -m iprange --src-range 10.18.44.211-10.18.44.250 -j DROP [root@xingdian ~]# iptables -A INPUT -m iprange --src-range 10.18.44.211-10.18.44.250 -j DROP
-m mac -m mac
[root@xingdian ~]# iptables -A INPUT -m mac --mac-source 52:54:00:86:a1:86 -j REJECT [root@xingdian ~]# iptables -A INPUT -m mac --mac-source 52:54:00:86:a1:86 -j REJECT
获取MAC的方式 获取MAC的方式
[root@xingdian opt]# arp -a 10.0.102.101 [root@xingdian opt]# arp -a 10.0.102.101
[root@xingdian opt]# arping -I eth0 10.0.102.101 [root@xingdian opt]# arping -I eth0 10.0.102.101
``` ```
#### 8.网络地址转换 #### 8.网络地址转换
​ 注意:实验环境效果不佳/无 ​ 注意:实验环境效果不佳/无
SNAT:把内网地址转换成公网地址 SNAT:把内网地址转换成公网地址
​ client ----------------iptables----内网ip--公网(baidu公网) ​ client ----------------iptables----内网ip--公网(baidu公网)
​ 一个数据包在经过路由之后(或者说在通过防火墙的过滤之后)才被知道他的源IP是谁,在路由之前只能看到目标IP,如果我看不到你的源IP,那怎么匹配想过滤的数据包并进行源地址转换?我防火墙根本就不能确定你是否是符合匹配条件的IP,所以只能使用POSTROUTING ​ 一个数据包在经过路由之后(或者说在通过防火墙的过滤之后)才被知道他的源IP是谁,在路由之前只能看到目标IP,如果我看不到你的源IP,那怎么匹配想过滤的数据包并进行源地址转换?我防火墙根本就不能确定你是否是符合匹配条件的IP,所以只能使用POSTROUTING
```shell ```shell
[root@xingdian ~]# iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -d 192.168.122.0/24 -j SNAT --to-source 192.168.2.1 [root@xingdian ~]# iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -d 192.168.122.0/24 -j SNAT --to-source 192.168.2.1
``` ```
DNAT:要把别人的公网ip换成我们内部的IP DNAT:要把别人的公网ip换成我们内部的IP
​ web-server iptables client ​ web-server iptables client
​ 如果我不在路由之前就把目标地址转换完成,很显然当数据包到达入口IP之后,他的目的已经达到了,因为他本来的目标IP就是防火墙的对外公网IP,那么数据包还会往里面走吗?显然不可能了,所以只能使用PREROUTING ​ 如果我不在路由之前就把目标地址转换完成,很显然当数据包到达入口IP之后,他的目的已经达到了,因为他本来的目标IP就是防火墙的对外公网IP,那么数据包还会往里面走吗?显然不可能了,所以只能使用PREROUTING
```shell ```shell
[root@xingdian ~]# iptables -t nat -A PREROUTING -d 192.168.1.2 -j DNAT --to-destination 192.168.2.2 [root@xingdian ~]# iptables -t nat -A PREROUTING -d 192.168.1.2 -j DNAT --to-destination 192.168.2.2
[root@xingdian ~]# iptables -t nat -A POSTROUTING -d 192.168.2.2 -j SNAT --to 192.168.2.1 [root@xingdian ~]# iptables -t nat -A POSTROUTING -d 192.168.2.2 -j SNAT --to 192.168.2.1
``` ```
面试题 面试题
```shell ```shell
[root@xingdian ~]# iptables -t nat -A PREROUTING -p tcp -d 192.168.122.1 -dport 80 -j REDIRECT --to-destination 192.168.1.1:8080 访问一个地址的80端口跳转到另外一个地址的8080端口
[root@xingdian ~]# iptables -t nat -A PREROUTING -p tcp -d 192.168.122.1 -dport 80 -j DNAT --to-destination 192.168.1.1:8080
``` ```