2 防火墙
一:安全概述
1)常见攻击手段
拒绝服务:
已知漏洞:
口令破解:
社会工程学:非技术能实现
2)常见防御设备
基础防火墙:根据数据报文特征,对数据报文进行操作的模块
IDS类防火墙:入侵检测系统(对入侵进行检测的系统),事后分析
IPS类防火墙:入侵防御系统(对入侵进行防御的系统),攻击数据包特征(利用特征库)
主动类安全防火墙:(应用层)
二:防火墙
1、硬件防火墙设置位置
2、防火墙分类
软件:firewalld、iptables 等
硬件:联想、IBM、HP、360
CPU、GPU硬件不同的优势:
CPU:(类似:学历很高,但数量很少)
GPU:(类似:学历很低,但数量很多),GPU最开始由施乐发行,后来由比尔盖茨、乔布斯发展成现有的图形化
3、防火墙:
工作在主机边缘处或网络边缘处,对进出的数据报文,根据自定义规则,做出操作的模块/设备
4、内核态、用户态
| 解释 | LVS | 防火墙 | |
|---|---|---|---|
| 内核态 | 实际的逻辑核心 | ipvs | netfilter |
| 用户态 | 命令工具 | ipvsadm | iptables/firewalld |
5、linux防火墙:netfilter/iptables(四表五莲)
四表:承载链
| 表名(小写) | 作用 |
|---|---|
| raw | 跳出数据报文的跟踪/NAT |
| mangle | 数据报文的修改(标记),和持久化防火墙连接相关 |
| nat | 地址转换 |
| filter | 数据报文过滤 |
五链:承载规则
| 链名(大写) | 作用 |
|---|---|
| INPUT | 入站的数据报文处理(0接口) |
| OUTPUT | 出战的数据报文处理(1接口) |
| FORWARD | 转发数据报文的处理(2接口) |
| PREROUTING | 路由前进行的DNAT(目标地址转换) |
| POSTROUTING | 路由后进行的SNAT(源地址转换) |
INPUT:
OUTPUT:
FORWARD:
表链关系:
6、LVS拓展:LVS的持久化连接
用于https服务,防止短时间内访问多次进行加密认证(-p 选项)
ipvsadm -A -t VIP:port -s 算法 -p 秒数
特点: 1、功能比较像SH算法
2、优先级高于算法
3、有限的时间
7、持久化连接:
PCC(持久客户端连接):将来自同一个客户端的请求,分配到指定RS
PPC(持久端口连接):将来自同一客户端对同一服务(端口)的请求,分配到指定RS
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地址不够用
DNAT:目标地址转换(公网能访问到内部服务器)
9、规则优先级
自定义规则 > 默认规则
10、匹配顺序
表顺序: rwa > mangle > nat > filter
链顺序: 入站: PREROUTING > INPUT
出战: OUTPUT > POSTROUTING
转发: PREROUTING > FORWARD > POSTROUTING
规则顺序: 自上而下,修改匹配,匹配即停止(log动作除外)
访问量大的数据包,应写在防火墙规则前列,可有效提升性能
结合顺序:表、链结合
| raw | mangle | nat | filter |
|---|---|---|---|
| PREROUTING | PREROUTING | PREROUTING | |
| INPUT | INPUT | ||
| FORWARD | FORWARD | ||
| OUPTPUT | OUTPUT | OUTPUT | OUTPUT |
| POSTROUTING | POSTROUTING |
三:防火墙命令
六版本: 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
总结:
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
实验规划图:
#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实验
目标地址转换(外部访问内网服务器)
实验规划图:
| 虚拟机 | 环境 | 步骤 |
|---|---|---|
| C7-1 | 内网服务器 vmnat1 ens33 192.168.20.201 | 1.网关指向路由 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.13 | 3.网关指向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....
六、备份
导出备份规则:
导入备份规则:
持久化保存防火墙规则:
注意:
七、CentOS 7 使用iptables
核心:关闭firewalld工具,开启iptables工具的使用












