Python自动化运维之iptables和安全概述

时间:2022-07-23
本文章向大家介绍Python自动化运维之iptables和安全概述,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
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