Iptables加固服务器安全

前言

当项目过三级等保或者服务器安全测评时,常常会被客户找的第三方测评公司进行安全扫描,常被扫描出来各种系统问题,针对严重问题可以进行系统升级、服务再次改造等,如果是一些次要问题或者必须要放开一些端口时,这种情况就得使用服务器上的防火墙进行安全加固,例如:iptables、firewalld。再本文中将使用iptables的使用、原理展开学习。


一、iptables是什么?

iptables 是一个用于配置 Linux 内核中 IPv4 数据包过滤器和网络地址转换 (NAT) 的工具。它允许系统管理员根据特定的规则集控制进出系统的网络流量。iptables 提供了一种灵活而强大的方式来保护网络安全、实现网络地址转换、限制流量等。

iptables 的工作原理:
	iptables 是基于 Linux 内核的 Netfilter 框架实现的。当数据包进入或离开系统时,Netfilter 框架会将数据包传递给 iptables 进行处理。iptables 通过检查数据包的源地址、目标地址、协议类型、端口号等信息,并根据预定义的规则集来决定如何处理该数据包。例如:接收、拒绝等。
	
iptables主机型防火墙工作在2,3,4层,主要对TCP/IP数据包进行过滤和限制。属于包过滤型防火墙。(除非编译内核才可以使iptables支持7层)

二、iptables的基本概念

1.四表五链的作用及对应关系

filter表:       过滤数据包
	INPUT链:    负责过滤所有主机目标是本机地址的数据包.就是过滤入主机的数据包
	FORWARD链:	负责转发流经主机的数据包,起转发作用和Nat关系很大
	OUTPUT链:	处理所有源地址是本机地址的数据包.就是处理从主机发出去的数据包
NAT表: 				用于网络地址转换,主要用来修改数据包的IP地址、端口信息
	PREROUTING链:	预路由,数据包到达防火墙时进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口
	POSTROUTING链:	已路由,数据包到达防火墙时进行路由判断之前的执行规则,作用是改变数据包的源地址,源端口
	OUTPUT链:		处理所有源地址是本机地址的数据包.就是处理从主机发出去的数据包
mangle表:		  修改数据包的服务类型,生存周期,为数据包设置标记,实现流量整形、策略路由等
	PREROUTING链: 预路由,数据包到达防火墙时进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口
	POSTROUTING链: 已路由,数据包到达防火墙时进行路由判断之前的执行规则,作用是改变数据包的源地址,源端口
	INPUT链:    负责过滤所有主机目标是本机地址的数据包.就是过滤入主机的数据包
	FORWARD链:	负责转发流经主机的数据包,起转发作用和Nat关系很大
	OUTPUT链:	处理所有源地址是本机地址的数据包.就是处理从主机发出去的数据包
raw表:				主要用来决定是否对数据包进行状态跟踪
	PREROUTING链:   预路由,数据包到达防火墙时进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口
	OUTPUT链:		处理所有源地址是本机地址的数据包.就是处理从主机发出去的数据包

2.iptables表链知识

	表的处理优先级:
		raw-->mangle-->nat-->filter
		常用nat表
	链之间的顺序:
		入站: 比如访问自身的web服务流量。先PREROUTING(是否改地址),再INPUT(是否允许)到达程序。
		转发: 经过linux网关的流量。先PREROUTING(是否改地址),然后路由。转发给FORWARD(转发或者丢弃),最后经过POSTROUTING(看看改不改地址。如NAT)
		出站: 源自linux自身的流量。先OUTPUT,然后路由。再给POSTROUTING(是否改IP)。
	规则的应用顺序:
		ACL规则逐条匹配,匹配到即停止(除过LOG规则)

3.iptables的优缺点

	优点:
		可以通过ACL规则精细的控制流量的转发限制
	缺点:
		由于是线性匹配、全量更新的特点,当规则比较多时,规则列表会变得很长,导致iptables性能下降,服务器CPU飙高,
当并发是1000时,iptables时延为125ms左右,在资源消耗方面,iptables会随着规则的增加消耗更多的服务器内存资源和cpu
		

3.链表图

在这里插入图片描述

4. iptables基础

基本语法格式:
	iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
参数详解:
	-t<表>:指定要操纵的表
	-A:向规则链末尾中添加,追加条目;(append)
	-I:向规则链的开头(或者指定序号)中插入条目,未指定规则序号时,默认作为第一规则;(insert)
	-R:修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换;
	-L:显示规则链中已有的条目;(list)
	
	-D:从规则链中删除条目;(delete)
	-F:清除规则链中已有的条目,若位置定规则序号,则默认清空所有;(flush)
	-Z:清空规则链中的数据包计算器和字节计数器;
	-X:删除没有用户配置文件相关的chain
	
	-N:创建新的用户自定义规则链;
	-P:定义规则链中的默认目标;(police)
	-h:显示帮助信息;
	-p:指定要匹配的数据包协议类型;
	-s:指定要匹配的数据包源ip地址;
	-j<目标>:指定要跳转的目标或动作;
	-i<网络接口>:指定数据包进入本机的网络接口;
	-o<网络接口>:指定数据包要离开本机所使用的网络接口。
	
	-v: 查看规则列表时显示详细信息(verbose)
	--line-number:给每个链中的规则加上行号
	-n:使用数字形式(numeric)显示输出结果
处理动作:
	ACCEPT 通过-j参数指定,允许数据包通过
	DROP   直接丢弃数据包,不作处理,这时候客户端会感觉自己的请求沉入大海,等过了超时时间才会有反应
	REJECT 拒绝数据包,会给一个拒绝的响应 --reject-with ‘message’ 可以指定如果被拒绝的情况下的回应消息,message默认是icmp-port-unreachable
	LOG    在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则
规则的匹配条件:
	通用匹配(协议,地址,接口),可以独立使用
	隐含匹配 --sport/--dport,需要协议的前提
	显示匹配(通过调用模块:lsmod | grep xt_  来加载内核扩展模块,如端口匹配,IP范围,MAC地址,状态等特殊匹配)
iptables高级模块:
	iprange模块: -m iprange:指定IP地址范围,–src-range :指定源IP的范围,–dst-range:指定目标IP的范围
	multiport模块: 多端口匹配,该模块需与-p tcp和-p udp联合使用。–source-ports 或 --sports: 最多允许使用15个端口,–destination-prots或–dprots :目标端口,–ports:仅匹配端口,源端口或端口均可生效
iptables防火墙规则的保存与恢复:
	第一种: 
		使用命令iptables-save来保存规则到文件中,再由目录rc.d下的脚本(/etc/rc.d/init.d/iptables)自动装载,一般用 iptables-save > /etc/sysconfig/iptables 生成保存规则的文件 /etc/sysconfig/iptables
	第二种:
		service iptables save 它能把规则自动保存在/etc/sysconfig/iptables中。
   当服务器重新启动时,rc.d下的脚本将用命令iptables-restore调用这个文件,从而就自动恢复了规则。

三、常用的规则命令

iptables -D INPUT 1  #删除INPUT链的第一条规则
iptables -L    		 #查看iptables规则
iptables -L -vn      #查看iptables规则(详细信息)
iptables -I INPUT -p icmp -j DROP             #服务器禁止ping操作
iptables -I INPUT -s 192.168.122.1 -j REJECT  #拒绝源192.168.122.1主机访问
iptables -I INPUT -s 192.168.122.0/24 -j DROP #禁止源192.168.122网段访问
iptables -I INPUT -s 192.168.100.254/24 -p tcp --dport 80 -j ACCEPT  #允许源地址是192.168.100.254/24的机器访问80端口
IPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  #设置当连接状态为RELATED和ESTABLISHED时,允许数据进入服务器
zookeeper有个漏洞容易被cmd命令攻击,造成服务停止
iptables  -A INPUT  -p tcp -m multiport --dports  2181,80,443   -m iprange --src-range  192.142.91.2-192.142.91.33 -j ACCEPT 
iptables  -A INPUT  -p tcp -m multiport --dports  2181,80,443   -m iprange --src-range   127.0.0.1   -j ACCEPT    
iptables  -A INPUT  -p tcp   -m multiport --dports  2181,80,443   -j DROP
#只允许源地址是192.142.91.2-192.142.91.33和127.0.0.1范围的机器访问zk服务器的2181,80,443端口,其余ip地址全部拒绝
iptables -A INPUT -m iprange --src-range 172.22.67.0/24 -m iprange --dst-range 10.10.179.151-10.10.179.158 -m multiport --dports 22,80,443,18848,28848,38848,
7001:7006,9092,9093,2181,9200,9300,3306,30083,18849,28849,38849,17001:17006,19092,19093,12181,19200,19300 -j ACCEPT
#部署服务和中间件时,需要办公网可以连接服务器进行部署和调试.即允许源地址172.22.67.0/24访问目的地址10.10.179.151-10.10.179.158的多个端口
iptables -A INPUT -m iprange --src-range 10.10.179.151-10.10.179.158 -m iprange --dst-range 10.211.65.54 -m multiport --dports 80,443 -j ACCEPT
#数仓服务器访问harbor镜像仓库
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP  #禁止转发源IP地址为192.168.1.20-192.168.1.99的TCP数据包。
背景:
	项目漏扫发现基于dokcer部署的harbor仓库存在三个nginx相关的漏洞,当关闭了这个harbor容器时,k8s资源有时发生了重启,且拉取镜像的策略是always,就会发生镜像拉取失败,pod重启失败的现象。为了处理这个漏扫,因此采用iptables规则进行安全加固。
解决思路:
	因为Docker启动后,默认任何外部source IP都被允许转发,从而能够从该source IP连接到宿主机上的任何Docker容器实例。如果只允许一个指定的IP访问容器实例,可以插入路由规则到DOCKER-USER链中,从而能够在DOCKER链之前被加载。
方法:
	iptables -L DOCKER-USER -n  //查看DOCKER-USER链规则
	Chain DOCKER-USER (1 references)
	target     prot opt source               destination         
	RETURN     all  --  0.0.0.0/0            0.0.0.0/0

	 iptables -I DOCKER-USER -m iprange -i ens33 ! --src-range 192.168.1.11-192.168.1.13 -j DROP  #丢弃掉源地址不是这个范围类的请求
验证:
	nc -vz docker宿主机地址   harbor暴露出来的端口
	现象,只有192.168.1.11-192.168.1.13三台机器测试连接可以成功,其余机器都显示超时

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值