赞
踩
当项目过三级等保或者服务器安全测评时,常常会被客户找的第三方测评公司进行安全扫描,常被扫描出来各种系统问题,针对严重问题可以进行系统升级、服务再次改造等,如果是一些次要问题或者必须要放开一些端口时,这种情况就得使用服务器上的防火墙进行安全加固,例如:iptables、firewalld。再本文中将使用iptables的使用、原理展开学习。
iptables 是一个用于配置 Linux 内核中 IPv4 数据包过滤器和网络地址转换 (NAT) 的工具。它允许系统管理员根据特定的规则集控制进出系统的网络流量。iptables 提供了一种灵活而强大的方式来保护网络安全、实现网络地址转换、限制流量等。
iptables 的工作原理:
iptables 是基于 Linux 内核的 Netfilter 框架实现的。当数据包进入或离开系统时,Netfilter 框架会将数据包传递给 iptables 进行处理。iptables 通过检查数据包的源地址、目标地址、协议类型、端口号等信息,并根据预定义的规则集来决定如何处理该数据包。例如:接收、拒绝等。
iptables主机型防火墙工作在2,3,4层,主要对TCP/IP数据包进行过滤和限制。属于包过滤型防火墙。(除非编译内核才可以使iptables支持7层)
filter表: 过滤数据包
INPUT链: 负责过滤所有主机目标是本机地址的数据包.就是过滤入主机的数据包
FORWARD链: 负责转发流经主机的数据包,起转发作用和Nat关系很大
OUTPUT链: 处理所有源地址是本机地址的数据包.就是处理从主机发出去的数据包
NAT表: 用于网络地址转换,主要用来修改数据包的IP地址、端口信息
PREROUTING链: 预路由,数据包到达防火墙时进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口
POSTROUTING链: 已路由,数据包到达防火墙时进行路由判断之前的执行规则,作用是改变数据包的源地址,源端口
OUTPUT链: 处理所有源地址是本机地址的数据包.就是处理从主机发出去的数据包
mangle表: 修改数据包的服务类型,生存周期,为数据包设置标记,实现流量整形、策略路由等
PREROUTING链: 预路由,数据包到达防火墙时进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口
POSTROUTING链: 已路由,数据包到达防火墙时进行路由判断之前的执行规则,作用是改变数据包的源地址,源端口
INPUT链: 负责过滤所有主机目标是本机地址的数据包.就是过滤入主机的数据包
FORWARD链: 负责转发流经主机的数据包,起转发作用和Nat关系很大
OUTPUT链: 处理所有源地址是本机地址的数据包.就是处理从主机发出去的数据包
raw表: 主要用来决定是否对数据包进行状态跟踪
PREROUTING链: 预路由,数据包到达防火墙时进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口
OUTPUT链: 处理所有源地址是本机地址的数据包.就是处理从主机发出去的数据包
表的处理优先级:
raw-->mangle-->nat-->filter
常用nat表
链之间的顺序:
入站: 比如访问自身的web服务流量。先PREROUTING(是否改地址),再INPUT(是否允许)到达程序。
转发: 经过linux网关的流量。先PREROUTING(是否改地址),然后路由。转发给FORWARD(转发或者丢弃),最后经过POSTROUTING(看看改不改地址。如NAT)
出站: 源自linux自身的流量。先OUTPUT,然后路由。再给POSTROUTING(是否改IP)。
规则的应用顺序:
ACL规则逐条匹配,匹配到即停止(除过LOG规则)
优点:
可以通过ACL规则精细的控制流量的转发限制
缺点:
由于是线性匹配、全量更新的特点,当规则比较多时,规则列表会变得很长,导致iptables性能下降,服务器CPU飙高,
当并发是1000时,iptables时延为125ms左右,在资源消耗方面,iptables会随着规则的增加消耗更多的服务器内存资源和cpu
基本语法格式:
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三台机器测试连接可以成功,其余机器都显示超时
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。