代码语言:javascript复制
1 安全知识体系
1.1 安全概述【了解】
1.1.1 安全现状
1.1.2 安全体系
底层硬件 买质量合格的设备
基础环境 版本合适,基本系统优化
应用环境 软件版本、配置参数、等
业务环境 项目和软件之间的配置、部门间的规范执行
运营维护 功能迭代方案、网站维护
1.1.3 安全措施
1.2 防火墙基础【了解】
1.2.1 防火墙简介
分类:
功能:
主机、网络
实现:
软件、硬件
细节:
包过滤、应用网关、应用状态、复合型
1.2.2 数据传输
数据封装
封装:
数据 port信息 ip信息 mac
数据传输
1 内部处理
数据包封装-转发-数据包解封装
2 外部处理
数据包封装-发出去-接受-数据包解封装
1.2.3 防火墙功能【记住】
分层管控
数据链路层
mac
网络层
IP报文首部
Source ip address
destination ip address
Protocol
传输层
TCP、UDP报文首部,依赖IP首部中的Protocol
source Port
destination port
应用层
数据内容
数据包过滤
A 数据包过来 prerouting
B 本机处理 input
C 本机转发 forward
D 本机响应 output
E 数据包出去 postrouting
三种数据场景:
本机接受数据包 prerouting -- input
本机转发数据包 prerouting -- forward -- postrouting
本机响应数据包 output -- postrouting
1.3 小结
2 Iptables快速入门
2.1 iptables简介【了解】
2.1.1 iptables基础
iptables简介
iptables其实是 用户空间的iptables 内核空间的netfilter
默认情况下:iptables实现的是2~4层防火墙功能,7层需要重编内核
注意:
从现在开始,只要不过过多强调,我们说到iptables其实指的就是iptables netfilter
iptables & Firewalls
学习重点:iptables,
Firewalls 是centos7默认的,我们可以关闭掉,来学习iptables
2.2 快速入门【应用】
2.2.1 firewall快速入门
软件信息
firewall 是 Centos7版本默认启动的防火墙
yum info
软件安装
yum install firewalld
简单实践
服务相关命令
systemctl start|stop firewalld
systemctl status firewalld
systemctl enable|disable firewalld
简单命令
firewall-cmd --help
firewall-cmd --state
firewall-cmd --version
常见规则
firewall-cmd --query-panic 检查拒绝规则状态
firewall-cmd --panic-on 拒绝所有数据包
firewall-cmd --panic-off 开启所有数据包
firewall-cmd --reload 更新防火墙规则
2.2.2 iptables快速入门
软件信息
yum info
yum list
软件安装
iptables iptables-services
简单实践
服务相关命令
systemctl start|stop iptables
systemctl status iptables
systemctl enable|disable iptables
简单命令
iptables --help
iptables --version
2.2.3 简单实践
信息查看
-L 列出所有链的规则
-n 将地址和端口以数字的形式展示
-v 显示更多信息
--line-numbers 列出信息的时候,将编号也输出出来
-S 打印出所有的规则
保存规则
iptables-save > iptables_file
清除规则
清除指定:
iptables -D 链名 规则编号|规则样式
清除所有:
-Z 计数器
-X 自定链的删除
-F 所有链中的规则
恢复规则
1: iptables-restore
2: 重启服务
更改规则
-P 修改默认的链规则
iptabels -P 链名 target动作
target动作
ACCEPT 允许数据包通过
DROP 禁止数据包通过
REJECT 拒绝数据包通过
2.2.4 规则简介
规则定义
规则:
存在链中,对接受到的数据包进行匹配获取,并对匹配到的数据包进行处理
规则简介
规则分类:
默认规则
自定义规则
规则命令
iptables [-t 表] -子命令 [链名] [匹配条件] [参数]
处理动作
默认动作 man iptables
ACCEPT
DROP
RETURN
扩展动作 man iptables-extensions
SNAT
REJECT
...
2.2.5 规则实践
增加规则
追加方式:
iptables -A 链名 [匹配条件] [参数]
iptables -A INPUT -s 192.168.8.15 -j DROP
插入方式:
iptables -I 链名 规则编号 [匹配条件] [参数]
iptables -I INPUT -s 192.168.8.15 -j DROP
iptables -I INPUT 2 -s 192.168.8.18 -j ACCEPT
删除规则
-D 链名 编号|匹配条件
iptables -D INPUT 2
iptables -D INPUT -s 192.168.8.15 -j DROP
更改规则
-R 链名 编号 [匹配条件] [参数]
iptables -R INPUT 1 -s 192.168.8.15 -j DROP
iptables -R INPUT 1 -s 192.168.8.15 -j ACCEPT
2.3 五链五表【记住】
2.3.1 链基础
链的简介
作用:
将对数据包的操作规则存放起来,
默认的链:
INPUT FORWARD OUTPUT
五链详解
PREROUTING 对进入的数据包进行预处理
INPUT 数据包本机处理
FORWARD 数据包本机转发
OUTPUT 数据包本机发出
POSTROUTING 对输出的数据包进行预处理
链的关系
场景:
本机处理 PREROUTING INPUT
本机转发 PREROUTING FORWARD POSTROUTING
本机响应 OUTPUT POSTROUTING
2.3.2 链实践【应用】
顺序实践
原则:
对于某个链中的多规则,他们是按照从上到下的顺序来对数据包进行操作的
拓展;
如果多个数据包规则出现内容部分重复的话,强烈注意规则的先后顺序
链实践
-N 创建自定义链
-X 清除自定义链
-E 自定义链改名
systemctl restart iptables
iptables -F
iptables -vnL
iptables -A INPUT -s 192.168.8.15 -j DROP
iptables -vnL
iptables -A INPUT -s 192.168.8.15 -j ACCEPT
iptables -vnL
iptables -i INPUT -s 192.168.8.15 -j ACCEPT
iptables -I INPUT -s 192.168.8.15 -j ACCEPT
iptables -vnL
iptables -N test-local
iptables -vnL
iptables-save
iptables -E INPUT input
iptables -E FORWARD forwar
iptables -E test-local local-test
iptables -vnL
iptables -N nihao
iptables -N nihao1
iptables -N nihao12
iptables -N nihao123
iptables -vnL
iptables -X nihao
iptables -vnL
iptables -X
iptables -vnL
2.3.3 表基础
五表简介
作用:
将不同的链组合在一起实现不同业务场景下的功能
它是由netfilter模块在内存中维护的几个空间
拓展:
不同表中可以存在相同的链
这些链针对的对象是不一样的
五表详解
security表 mac
filter表 数据包过滤 默认的,最重要的
NAT表 网络地址转换
mangle表 数据包拆修封 ,自定义
raw表 特殊的nat表
filter表中有:
INPUT OUTPUT FORWARD
2.3.4 表实践【应用】
表信息查看
iptables -t 表名 -vnL
security表 INPUT OUTPUT FORWARD
filter表 INPUT OUTPUT FORWARD
NAT表 INPUT OUTPUT PREROUTING POSTROUTING
mangle表 INPUT OUTPUT FORWARD PREROUTING POSTROUTING
raw表 PREROUTING OUTPUT
表规则实践
规则命令跟我们之前介绍的完全一样,只不过多了一个 -t 指定我们的规则生效范围
2.3.5 表链关系
表链关系
表中有链,链中有规则
重点记住:表中链
security表 INPUT OUTPUT FORWARD
filter表 INPUT OUTPUT FORWARD
NAT表 INPUT OUTPUT PREROUTING POSTROUTING
mangle表 INPUT OUTPUT FORWARD PREROUTING POSTROUTING
raw表 PREROUTING OUTPUT
拓展记忆:链中表
prerouting :nat、mangle、raw
postrouting :nat、mangle、nat
input :filter、mangle、security
output :filter、nat、mangle、raw、security
forward :filter、mangle、security
规则优先级
表优先级
security > raw > mangle > nat > filter
链优先级
链间
业务流程
链内规则
从上到下
规则编写
1 定方向 表和链
2 定顺序 链中的规则
1 范围 少在上,多在下
2 频率 高在上,低在下
3 场景 看你愿意
4 默认 默认的通用规则
应用场景
security表 mac匹配
filter表 包过滤 -- input forward
NAT表 网络地址转换
mangle表 数据包修改 一般不用
raw表 自定义 一般不用
学习优先级:
filter nat
2.4 规则进阶【应用】
2.4.1 普通匹配1
匹配条件简介
分类:
普通的匹配 iptables -h 或者 man iptables 看到的匹配条件参数
拓展的匹配 看不到的匹配条件参数,它依赖于默写特定的基本匹配条件
多目标实践
-s
, 多地址使用逗号隔开,逗号两侧没有空格
网段 mask
! 非,需要结合默认规则来进行精确的判断
示例:
iptables -A INPUT -s 192.168.8.15,192.168.8.16 -j DROP
iptables -A INPUT -s 192.168.8.19, 192.168.8.20 -j DROP
iptables -A FORWARD -s 192.168.8.0/24 -j DROP
iptables -A INPUT ! -s 192.168.8.14,192.168.8.15 -j DROP
iptables -A INPUT ! -s 192.168.8.15 -j ACCEPT
-d实践
基本使用方法与-s 一致
拓展:
! 不能与多ip地址结合起来使用
! not allowed with multiple source or destination IP addresses
示例:
iptables -A OUTPUT -d 192.168.8.15,192.168.8.17 -j DROP
iptables -A OUTPUT -d 192.168.10.0/24 -j DROP
iptables -A INPUT ! -d 192.168.8.18,192.168.8.16 -j DROP
2.4.2 普通匹配2
协议实践
-p 协议名|协议编号
默认支持9个协议
示例:
iptables -A INPUT -s 192.168.8.15 -P tcp -j DROP
iptables -A INPUT -s 192.168.8.16 -p icmp -j DROP
接口实践
-i 入口 INPUT, FORWARD, PREROUTING
-o 出口 FORWARD, OUTPUT, POSTROUTING
准备环境;
双网卡环境
iptables -A INPUT -s 192.168.8.14 -i eth0 -j DROP
iptables -A INPUT -i eth1 -j DROP
2.4.3 扩展匹配
扩展匹配简介
一些基本匹配条件基础上,增加的其他功能
匹配模块(小写)和目标动作(大写)
模块扩展匹配分类
显式扩展 -m 模块名
隐式扩展 基于协议名称 不加-m 方式来使用扩展功能的方式
端口范围实践
-m tcp --sport --dport
-m multiport --sports --dports --ports
示例:
iptables -A INPUT -s 192.168.8.15 -p tcp -m tcp --sport 22 -j DROP
iptables -vnL
iptables -R INPUT -s 192.168.8.15 -p tcp -m tcp --dport 22 -j DROP
iptables -R INPUT 1 -s 192.168.8.15 -p tcp -m tcp --dport 22 -j DROP
iptables -vnL
iptables -A INPUT -s 192.168.8.16 -p tcp ! --dport 22 -j ACCEPT
iptables -vnL
iptables -P INPUT DROP
iptables -A INPUT -s 192.168.8.2 -p tcp --dport 80:888 -j DROP
iptables -A INPUT -s 192.168.8.2 -p tcp --dport :8889 -j DROP
iptables -A INPUT -s 192.168.8.2 -p tcp --dport 9: -j DROP
iptables -m multiport -h
iptables -A INPUT -s 192.168.8.16 -p tcp -m multiport --dsports 22,12,34,80 -j DROP
iptables -A INPUT -s 192.168.8.16 -p tcp -m multiport --dports 22,12,34,80 -j DROP
iptables -vnL
yum install nginx -y
echo 'iptables test' > /usr/share/nginx/html/index.html
systemctl start nginx
curl 192.168.8.14
netstat -tnulp
iptables -vnL
iptables -A INPUT -s 192.168.8.17 -p tcp -m multiport --dports 12,:90 -j DROP
iptables -A INPUT -s 192.168.8.17 -p tcp -m multiport --dports 12,77:90 -j DROP
地址扩展实践
iptables -m iprange -h
指定ip地址范围 侧重于地址间隔
没有 默认的 -s 效果好 侧重于不连续
iptables -A INPUT -m iprange --src-range 192.168.8.15-192.168.8.17 -j DROP
iptables -vnL
iptables -A INPUT -m iprange --src-range -192.168.8.77 -j DROP
iptables -A INPUT -m iprange --src-range 192.168.8.77 -j DROP
2.4.4 WEB扩展
时间扩展实践
-m time -h
常见属性:
--timestart time
--timestop time
[!] --monthdays value
[!] --weekdays value
注意:
在使用time模块的时候,一定要保证我们的时间是utc时间,
否则的话,使用 --kerneltz
iptables -A OUTPUT -p tcp --dport 80 -m time --timestart 08:00 --timestop 09:00 -j DROP
iptables -A INPUT -p tcp --dport 80 -m time --monthdays 8 -j DROP
字符扩展实践
-m string -h
--algo bm kmp 设定内容匹配的算法
--string 过滤关键字
注意:
我们推荐使用kmp
数据包的对象,源地址和目标地址及数据包所在的链
示例;
iptables -R OUTPUT 1 -d 192.168.8.16 -m string --algo kmp --string "test" -j DROP
iptables -R OUTPUT 1 -d 192.168.8.14 -m string --algo kmp --string "test" -j DROP
连接数量实践
-m connlimit -h
--connlimit-above 设定单个客户端ip连接到本机的最大连接数量
注意:
我们说的最大连接数量针对的是单个客户段而不是针对本机的最大连接
示例:
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP
内容数量实践
-m limit -h
--limit avgrate[/second|/minute|/hour|/day] 平均访问速率
--limit-burst number 设定峰值数量,默认是5
示例:
iptables -A INPUT -p icmp -m limit --limit 10/minute -j ACCEPT
iptables -A INPUT -p icmp -j REJECT
iptables -A INPUT -p tcp --dport 80 -m limit --limit 20/minute -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j REJECT
连接状态实践
-m state -h 基于数据包的连接状态来对数据包进行过滤
-- state
INVALID(无效连接请求),ESTABLISHED(已连接请求),NEW(新建立请求)
RELATE(关联连接请求),UNTRACKED(未可达请求)
实践:
iptables -A INPUT -d 192.168.8.14 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.8.14 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -A INPUT -d 192.168.8.14 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.8.14 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
2.4.5 网络防火墙
场景:
基于路由器的网络转发环境,来实现网络防火墙的功能
步骤:
1 准备基本环境
两个网段,一个路由器主机(开启内核转发功能)
2 防火墙实践
在路由器主机上,关闭默认的转发防火墙策略
iptables -P FORWARD DROP
开启外网通向内网的数据转发
iptables -A FORWARD -d 172.16.10.16,172.16.10.17 -p tcp --dport 80 -j ACCEPT
开启器内网响应外网的数据转发
iptables -A FORWARD -s 172.16.10.16,172.16.10.17 -p tcp --sport 80 -j ACCEPT
3 测试
进阶实践:
开启ssh的协议转发功能
增加一个端口为22的规则就可以
2.4.6 网络地址转换
案例需求
SNAT: 数据包的源ip地址发生了转换,隐藏公司内网的客户端ip地址
DNAT:数据包的目标ip地址发生了转换,隐藏的是公司内网的web服务器地址
PNAT: 将公司内网的多台web服务器,应设在同一ip地址的不同端口上
准备环境
1 防火墙规则清空
2 所有的路由网关清空
SNAT实践
1 准备内网主机通向外网的网关
route add -net 172.16.10.0/24 gw 192.168.8.14
2 设置防火墙的snat规则
iptables -t nat -A POSTROUTING -s 192.168.8.0/24 ! -d 192.168.8.0/24 -j SNAT --to-source 172.16.10.14
注意:
我们的路由器的外网ip准确
3 在外网的web服务器上,查看日志
只要日志的客户端ip地址是转换后的,就成功了
SNAT进阶实践
场景:
路由的外网ip不确定,而且会自动变化,没有办法每次都使用SNAT的--to-source来设置
方法:
使用 MASQUERADE 来解决
步骤:
1 清空防火墙规则
iptables -t nat -F
2 设置防火墙规则
iptables -t nat -A POSTROUTING -s 192.168.8.0/24 ! -d 192.168.8.0/24 -j MASQUERADE
3 测试
在外网的web服务器上,查看日志
DNAT实践
场景:
公司内网的web服务访问
方法:
DNAT
步骤:
1 清空防火墙规则
iptables -t nat -F
2 设置内网web服务的路由
route add -net 192.168.8.0/24 gw 172.16.10.14
3 设置防火墙规则
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 172.16.10.16
4 测试效果
外网访问路由ip地址
内网查日志信息
拓展:
--to-destination [ipaddr[-ipaddr]][:port[-port]]
当我们后端的web服务端口不是80,是99,怎么办
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 172.16.10.16:99