菜单
本页目录

2 防火墙

一:安全概述

1)常见攻击手段

image-20221215201851907

拒绝服务

DOS攻击:使用同一IP,不断向服务器发送请求			解决:禁用IP访问
DDOS攻击:(DOS的升级)分布式发送请求				解决:云盾,流量清洗
放大攻击

已知漏洞

深海之蓝,勒索病毒	SMB客户端的漏洞
解决:及时更新系统

口令破解

跑字典
解决:尝试次数限制,验证码

社会工程学:非技术能实现

2)常见防御设备

image-20221215202518355

基础防火墙:根据数据报文特征,对数据报文进行操作的模块

IDS类防火墙:入侵检测系统(对入侵进行检测的系统),事后分析

IPS类防火墙:入侵防御系统(对入侵进行防御的系统),攻击数据包特征(利用特征库)

主动类安全防火墙:(应用层)

WAF	web应用防火墙
DAF	数据库应用防火墙

二:防火墙

1、硬件防火墙设置位置

1)内部每个服务器节点之间都设置(有钱的时候)
2)路由器前 或 路由器后(一般情况下)
        根据 吞吐量(每分钟过滤的数据报文量) 决定硬防火墙设置位置:路由器和防火墙,谁的吞吐量大,谁设置在前

2、防火墙分类

软件:firewalld、iptables	等
硬件:联想、IBM、HP、360

CPU、GPU硬件不同的优势:
        CPU:(类似:学历很高,但数量很少)
        GPU:(类似:学历很低,但数量很多),GPU最开始由施乐发行,后来由比尔盖茨、乔布斯发展成现有的图形化

3、防火墙:

​ 工作在主机边缘处或网络边缘处,对进出的数据报文,根据自定义规则,做出操作的模块/设备

4、内核态、用户态

解释LVS防火墙
内核态实际的逻辑核心ipvsnetfilter
用户态命令工具ipvsadmiptables/firewalld

5、linux防火墙:netfilter/iptables(四表五莲)

四表:承载链

表名(小写)作用
raw跳出数据报文的跟踪/NAT
mangle数据报文的修改(标记),和持久化防火墙连接相关
nat地址转换
filter数据报文过滤

五链:承载规则

链名(大写)作用
INPUT入站的数据报文处理(0接口)
OUTPUT出战的数据报文处理(1接口)
FORWARD转发数据报文的处理(2接口)
PREROUTING路由前进行的DNAT(目标地址转换)
POSTROUTING路由后进行的SNAT(源地址转换)

INPUT:

image-20221216165439726

OUTPUT:

image-20221216165530531

FORWARD:

image-20221216165630300

表链关系:

image-20221216170429470

6、LVS拓展:LVS的持久化连接

用于https服务,防止短时间内访问多次进行加密认证(-p 选项)
		ipvsadm -A -t VIP:port -s 算法 -p 秒数

特点:	1、功能比较像SH算法
                2、优先级高于算法
                3、有限的时间

7、持久化连接:

image-20221216165209800

PCC(持久客户端连接):将来自同一个客户端的请求,分配到指定RS

ipvsadm -A -t 172.16.0.8:0 -s wlc -p 120  

PPC(持久端口连接):将来自同一客户端对同一服务(端口)的请求,分配到指定RS

ipvsadm -A -t 172.16.0.8:80 -s rr -p 120  

PFMC(持久防火墙连接):将来自同一客户端对指定服务(端口)的请求,始终分配到指定RS;不过它可以将两个毫不相关的两个端口定义为一个集群

# iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 80 -j MARK --set-mark 10  
# iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 443 -j MARK --set-mark 10
		iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 53-j MARK --set-mark 20    
# service iptables save  
# ipvsadm -A -f 10 -s wlc -p 120		
		ipvsadm -A -f 20 -s RR  -p 120  

8、SNAT、DNAT

SNAT:源地址转换(内部能通过一个共有IP,访问公网)

​ 为了解决互联网的公网IP地址不够用

image-20221216165853769

DNAT:目标地址转换(公网能访问到内部服务器)

image-20221216170009754

9、规则优先级

​ 自定义规则 > 默认规则

10、匹配顺序

    表顺序:	rwa	>	mangle	>	nat	>	filter
    链顺序:	入站:	PREROUTING	>	INPUT
                        出战:	OUTPUT	>	POSTROUTING
                        转发:	PREROUTING	>	FORWARD	>	POSTROUTING
    规则顺序:	自上而下,修改匹配,匹配即停止(log动作除外)
                            访问量大的数据包,应写在防火墙规则前列,可有效提升性能
    结合顺序:表、链结合

image-20221216183721811

rawmanglenatfilter
PREROUTINGPREROUTINGPREROUTING
INPUT INPUT
FORWARD FORWARD
OUPTPUTOUTPUTOUTPUTOUTPUT
POSTROUTINGPOSTROUTING

三:防火墙命令

六版本:	service iptables stop|start|restart|save
					stop:清楚规则		start|restart:应用规则		save:将临时规则保存到持久化文件 /etc/sysconfig/iptables
		  chkconfig iptables on|off			#开机应用|不应用规则
七版本:(systemd兼容init-v脚本)
			systemctl start iptables		#应用规则
			service iptables save			#将临时规则保存到持久化文件

1、语法构成:

iptables [t 表名] 选项 [链名] [条件] [-j 控制类型]
		例: iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
		注意:	 不指定表名时,默认指定filter表
			   不指定链名时,默认指定表内所有的链
			   除非设置链的默认策略,否则必须设置指定匹配条件
			   选项、链名、控制类型都使用大写,其余均小写
		控制类型:
				ACCEPT			#允许通过
				DROP			#直接丢弃,不做出任何回应(比如,访问公网中的3306端口,超时)
				REJECT			#拒绝通过,必要时会给出提示(比如,访问服务器时,提示连接拒绝)
				LOG				#记录日志信息,然后传给下一条规则继续匹配
				SNAT			#修改数据包源地址
				DNAT			#修改数据包目标地址
				REDIRECT		#重定向
		添加新的规则:
				-A				#在链最后追加规则
				-I				#在链最前(或中间)插入规则
					iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
					iptables -t filter -I INPUT -p tcp --dport 443 -j ACCEPT
					iptables -t filter -I INPUT 2 -p tcp --dport 22 -j ACCEPT
					iptables -t filter -L -n --line-numbers
                                num  target     prot opt source               destination         
                                1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443
                                2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
                                3    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
		查看规则列表:
				-L				#列出所有的规则条目,查看当前链规则
				-n				#数字形式显示(地址、端口等)
				-v				#以更详细的方式显示规则信息(可用与判断访问量,再决定规则顺序)
				--line-numbers	#结合-n使用,查看规则时,显示规则的序号
		删除、清空规则:
				-D				#删除链内指定序号(指定内容)的一条自定义规则
				-F				#清空所有的自定义规则
		清空所有表,所有链的规则:
				echo "" > /etc/sysconfig/iptables
				service iptables restart
		更改表中,链的默认规则:
		(默认规则只有ACCEPT或DROP)
				iptables -t 表名 -P 链名 DROP
					例:	iptables -t filter -P INPUT DROP		#将filter表中的INPUT链中的默认规则改为DROP
					

总结:

image-20221216201246523

2、分类:

1)通用匹配:可直接使用,不依赖与其他条件或扩展

包括网络协议(不含应用层的协议,有TCP、UDP、ICMP)、IP地址、网络接口等条件
常用的匹配条件:
		协议匹配:	 -p 协议名
		地址匹配:	 -s 源地址
					-d 目标地址
		接口匹配:	 -i 入站网卡
					-o 出战网卡

2)隐含匹配:

要求特定的协议匹配作为前提(包括端口、TCP标记、TCMP类型条件)

常用的隐含匹配条件:
		端口匹配:	 --sport 源端口
					--dport 目标端口
		TCMP匹配:	  --icmp-type ICMP类型
			例子:死亡之ping
				决死亡之ping:(不让别人ping你,但你可以ping别人)
						iptables -t filter -A INPUT -p icmp --icmp-type 0 -j ACCEPT
						iptables -t filter -A INPUT -p icmp --icmp-type 3 -j ACCEPT
						iptables -t filter -A INPUT -p icmp -j DROP

3)显示匹配

要求以 ”-m 扩展模块“ 的形式明确指出类型(包括多端口、MAC地址、IP范围、数据包状态等条件)

多端口匹配:	-m multiport --sport 源端口列表		--dport 目标端口列表
			(可用!取反)
			例子:
				在filter表OUTPUT链首中插入规则,目标ip为192.168.1.146,源端口为udp的137和138,的出战数据包进行拒绝
					iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j REJECT
				在filter表INPUT链首中插入规则,源ip为192.168.1.146,目标端口为tcp的80到88,的进站数据包进行拒绝
					iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 80:88 -j REJECT
IP范围匹配:-m iprange --src-range    –dst-range
			(可用!取反)
			例子:
				在filter表INPUT链中插入规则,源地址范围为192.168.1.127-192.168.1.146的,都丢弃
					iptables -t filter -I INPUT -m iprange --src-range 192.168.1.127-192.168.1.146 -j DROP
				在filter表OUTPUT链中插入规则,目标地址范围为192.168.1.127-192.168.1.146的,都丢弃
					iptables -t filter -I OUTPUT -m iprange --dst-range 192.168.1.127-192.168.1.146 -j DROP
string模块:
		–algo:指定对应的匹配算法,可用算法为bm、kmp,此选项为必需选项(判断字符串存在的不同算法)。
		–string:指定需要匹配的字符串
		例子:
			在filter表INPUT链中插入规则,源端口为tcp的80,且包含关键字zhangsan的,拒绝
				iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "zhangsan" -j REJECT
			在filter表INPUT链中插入规则,源端口为tcp的80,且包含关键字lisi的,拒绝
				iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo kmp --string "lisi" -j REJECT
时间模块:	-m time
			--timestart		#指定开始时间
				--timestop		#指定结束时间
			--weekdays		#指定周几				(可用!取反)
			--monthdays		#指定一个月内的几号		(可用!取反)
			--datestart		#指定年月日开始时间
				--datestop		#指定年月日结束时间
			例子:
				iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
				iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --weekdays 6,7 -j REJECT
				iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --monthdays 22,23 -j REJECT
				iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --datestart 2017-12-24 --datestop 2017-12-27 -j REJECT

-m  connlimit模块(限制连接量)
			–connlimit-above:单独使用时,表示单个ip的最大连接数
			–connlimit-mask:此选项不能单独使用,在使用–connlimit-above选项时,配合此选项,表示:对网段内的所有IP同时进行连接数限制
			例子:
					iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
					iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT

connlimit模块是对连接数量进行限制的,limit模块是对”报文到达速率”进行限制的

-m limit	 (类似限速)
			-–limit-burst:类比”令牌桶”算法,此选项用于指定令牌桶中令牌的最大数量
			-–limit:类比”令牌桶”算法,此选项用于指定令牌桶中生成新令牌的频率
					可用的时间单位:/second、/minute、/hour、/day
			例子:
					iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT

状态匹配:
-m state --state 连接状态
			NEW,RELATED,ESTABLISHED
		例子:
			仅拒绝新建连接的21端口的入站请求(一般用于服务器更新时,保留已经连接的,拒绝新来连接)
				iptables -I INPUT -p tcp --dport 21 -m state --state NEW -j REJECT
			服务器修复完成后,删除刚才的规则
				iptables -D INPUT 1
			优化防火墙规则(之前已经建立过连接的数据包放行)
				iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

3、自定义链

注意:链名不能以下划线开头

iptables -t filter -N IN_WEB								#创建自定义链
iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB		#引用自定义链
iptables -t filter -I INPUT -p tcp --dport 443 -j IN_WEB
iptables -t filter -I IN_WEB -s 192.168.20.202 -j REJECT	#给自定义链创建规则
iptables -t filter -E IN_WEB WEB							#修改自定义链名(讲IN_WEB改为WEB)
iptables -X WEB												#删除自定义链
					删除条件:1、自定义链没有任何默认链引用(自定义链引用数为0)
							2、自定义链中没有任何规则(自定义链规则为空)
[root@localhost ~]# iptables -t filter -N IN_WEB										#创建自定义链
[root@localhost ~]# iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB				#引用自定义链
[root@localhost ~]# iptables -t filter -I INPUT -p tcp --dport 443 -j IN_WEB
[root@localhost ~]# iptables -t filter -I IN_WEB -s 192.168.20.202 -j REJECT			#给自定义链创建规则

#能实现效果:进站的数据包目标端口是80和443的,都交给IN_WEB链规则,来自192.168.20.202的访问都拒绝

[root@localhost ~]# iptables -t filter -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
IN_WEB     tcp  --  anywhere             anywhere             tcp dpt:https
IN_WEB     tcp  --  anywhere             anywhere             tcp dpt:http

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain IN_WEB (2 references)																#引用了两条
target     prot opt source               destination         
REJECT     all  --  192.168.20.202       anywhere             reject-with icmp-port-unreachable

[root@localhost ~]# iptables -t filter -E IN_WEB WEB			#修改自定义链名(讲IN_WEB改为WEB)
[root@localhost ~]# iptables -X WEB								#删除自定义链

四:SNAT实验

源地址转换、地址伪装(内网通过路由访问公网)
前提:
	1、局域网各主机正确设置IP、mask
    2、正确的指向网关
    3、网关服务器开启路由转发
    
实验核心:
    iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -o ens34 -j SNAT --to-source		#eth1的IP固定的情况
    iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -o ens34 -j MASQUERADE			#适合动态的eth1的IP

实验规划图:

image-20221217161052145

#C7-1作为网关+路由,ens33网卡仅主机模式,ens34网卡nat模式(能访问公网)
				ens33	192.168.20.201
				ens34	192.168.18.176

[root@localhost ~]# ping www.baidu.com						#测试能访问百度
[root@localhost ~]# vim /etc/sysctl.conf					#开启路由转发功能
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1

#设置防火墙规则
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -o ens34 -j SNAT --to-source 192.168.18.176
[root@localhost ~]# iptables -t nat -F
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -o ens34 -j MASQUERADE


#7-2做内网客户端进行测试,ens33网卡仅主机模式,关闭ens34网卡
						ens33	192.168.20.202
[root@localhost ~]# ping www.baidu.com					#在C7-1没有配置完成前,无法访问百度
ping: www.baidu.com: 未知的名称或服务

[root@localhost ~]# ping www.baidu.com					#在C7-1配置完成后,成功访问百度
PING www.a.shifen.com (220.181.38.150) 56(84) bytes of data.
64 bytes from 220.181.38.150 (220.181.38.150): icmp_seq=1 ttl=127 time=4.64 ms
^C
--- www.a.shifen.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 4.648/4.648/4.648/0.000 ms

五:DNAT实验

​ 目标地址转换(外部访问内网服务器)

实验规划图:

image-20221217163336678

虚拟机环境步骤
C7-1内网服务器 vmnat1 ens33 192.168.20.2011.网关指向路由
2.部署网站服务器
C7-2路由+网关 vmnat1 ens33 192.168.20.202
vmnat2 ens34 10.10.10.12
1.开启路由转发
2.设置DNAT防火墙规则
C7-3外部客户端 vmnat2 ens33 10.10.10.133.网关指向10.12,测试访问
#C7-1
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.20.202  0.0.0.0         UG    100    0        0 ens33
192.168.20.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# echo "this is 201...." > /var/www/html/index.html
[root@localhost ~]# systemctl enable httpd --now
[root@localhost ~]# yum -y install tcpdump				#安装tcpdump抓包工具

#C7-2
[root@localhost ~]# vim /etc/sysctl.conf 
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@localhost ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -d 10.10.10.12 -i ens34 -j DNAT --to-destination 192.168.20.201:80
[root@localhost ~]# iptables -t nat -F
[root@localhost ~]# iptables -t nat -A PREROUTING -d 10.10.10.12 -i ens34 -j DNAT --to-destination 192.168.20.201


#C7-3
[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.10.10.12     0.0.0.0         UG    100    0        0 ens33
10.10.10.0      0.0.0.0         255.255.255.0   U     100    0        0 ens33
[root@localhost ~]# curl 10.10.10.12
this is 201....

六、备份

导出备份规则:

iptables-save > 1.iptables

导入备份规则:

iptables-restore < 1.iptables

持久化保存防火墙规则:

service iptables save

注意:

生产环境中不会在线上直接修改防火墙规则:
        1、讲线上系统拷到本地虚拟机,会先提前模拟操作,再执行
        2、利用脚本修改防火墙规则

七、CentOS 7 使用iptables

​ 核心:关闭firewalld工具,开启iptables工具的使用

systemctl stop firewalld
systemctl disable firewalld
yum -y install iptables-services
systemctl enable iptables --now
iptables -F;service iptables save