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

This commit is contained in:
diandian 2024-05-22 10:58:14 +08:00
parent bf90ec5a6a
commit eaf2b93b9a
1 changed files with 315 additions and 314 deletions

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
``` ```