Skip to content

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 防火墙
内核态 实际的逻辑核心 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:

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

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

总结:

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.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....

六、备份

导出备份规则:

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