Linux高级篇--Linux防火墙

本章概要

    防火墙的概念
    iptables的基本认识
    iptables的组成
    iptables的基本语法
    iptables之地址转换法则
    SNAT源地址转换的具体实现
    DNAT目标地址转换的具体实现
    firewalld介绍
    firewalld配置命令
    rich规则

1、防火墙的概念

安全技术

    入侵检测与管理系统(Intrusion Detection Systems):特点是不阻断任何网络访问,量化、定位来自内外网络的威胁情况,主要以提供报告和事后监督为主,提供有针对性的指导措施和安全决策依据。一般采用旁路部署方式
    入侵防御系统(Intrusion Prevention System):以透明模式工作,分析数据包的内容如:溢出攻击、拒绝服务攻击、木马、蠕虫、系统漏洞等进行准确的分析判断,在判定为攻击行为后立即予以阻断,主动而有效的保护网络的安全,一般采用在线部署方式
    防火墙(FireWall):隔离功能,工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略

知识扩展:

针对AMP模式下,防火墙如何设置: 
AMP模式:
客户端-->apache服务器-->FPM服务器(fastcgi)-->数据库服务器
防火墙设置规则:
    apache服务器为互联网提供服务,针对客户端设置黑名单
    FPM服务器只允许apache服务器把动态资源请求发送给自己,此时apache服务器相对于FPM服务器相当于客户端,针对apache服务器设置白名单,仅允许apache服务器访问,不允许其他服务器访问
    FPM服务器运行时需要访问数据库服务器,此时FPM服务器相对于数据库服务器相当于客户端针对FPM服务器设置白名单,仅允许FPM服务器访问,不允许其他服务器访问
    
服务器面向的对象是明确的,既定的,需要使用白名单;如果面向互联网,需要使用黑名单

使用场景:  
针对远端托管服务器或公有云的服务器
    设置堡垒机或跳板机在内网中,管理员可通过堡垒机直接连接至内网,直接访问内网服务器,因此对堡垒机上的SSH连接做白名单机制

针对实际中的环境:
    本地局域网开发环境
    远程托管机房生产环境和测试环境


防火墙的分类

    防火墙的分类
    分类1:
      主机防火墙:服务范围为当前主机
      网络防火墙:服务范围为防火墙一侧的局域网
    分类2:
      硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现,Checkpoint,NetScreen
      软件防火墙:运行于通用硬件平台之上的防火墙的应用软件
    分类3:
      网络层防火墙:OSI模型下四层
      应用层防火墙/代理服务器:代理网关,OSI模型七层

    网络层防火墙
      包过滤防火墙
      网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,或他们的组合来确定是否允许该数据包通过
      优点:对用户来说透明,处理速度快且易于维护
      缺点:无法检查应用层数据,如病毒等

    应用层防火墙/代理服务型防火墙(Proxy Service)
      将所有跨越防火墙的网络通信链路分为两段
      内外网用户的访问都是通过代理服务器上的“链接”来实现
      优点:在应用层对数据进行检查,比较安全
      缺点:增加防火墙的负载

    现实生产环境中所使用的防火墙一般都是二者结合体
      即先检查网络数据,通过之后再送到应用层去检查

2、iptables的基本知识

iptables简介

    Netfilter组件
      内核空间,集成在linux内核中
      扩展各种网络服务的结构化底层框架
      内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则
      由信息过滤表(table)组成,包含控制IP包处理的规则集(rules),规则被分组放在链(chain)上
    三种报文流向:
      流入本机:PREROUTING --> INPUT–>用户空间进程
      流出本机:用户空间进程–>OUTPUT–> POSTROUTING
      转发:PREROUTING --> FORWARD --> POSTROUTING
    防火墙工具
    iptables
      命令行工具,工作在用户空间
      用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包
    firewalld
      CentOS7 引入了新的前端管理工具
      管理工具:
        firewall-cmd命令行
        firewall-config图形

知识延伸:

报文转发过程:
以TCP/IP协议为例,主要为以下基层
    应用层、传输层、网络层、链路层
    
源主机hostA与目标主机hostB通信
应用层 封装应用层首部信息
传输层 封装传输层首部信息,主要信息是源端口,目标端口
网络层 封装网络层包首部信息,主要信息是源ip地址,目的ip地址
链路层 封装链路层帧首部信息,主要信息是MAC地址信息

HostA与hostB通信,首先在应用对数据进行封装并添加请求报文首部,然后在经过传输层封装源端口、目标端口,网络层封装源ip地址、目标ip地址,链路层封装源MAC、目标MAC地址
HostA把数据发送给本机的网关RTA,网关设备RTA接收报文发现目标MAC地址是自己的MAC地址,解封装链路层首部信息查看目标ip地址,发现目标ip不是自己,于是根据路由表查找下一跳转发该报文,重新封装报文信息,把链路层首部信息中源MAC地址换为自己的MAC地址,目标MAC地址换为路由表中下一跳设备的MAC地址。其中报文中的网络层源ip地址、目标ip地址不变
同理,最后到达HostB主机(目标主机),解封装链路层首部信息,查看ip地址发现目标ip地址是自己的地址,查看传输层首部信息中的端口号,根据端口号找到运行的对应进程和应用程序(协议),解除传输层首部信息,获取应用层首部请求报文。
注意:TCP/IP协议下三层在内核空间进行,应用层在用户空间进行

在报文传输过程中,报文有三种流向:自己发出的报文,接收别人传过来的报文,转发接收到的不是自己的报文
转发报文不会到达用户文件,这是因为转发报文在网络层发现目标ip不是自己就会转发出去,并不会转发到用户空间
自己发出的报文需要应用层封装,接收别人的报文需要到达应用层解封装,因此都会涉及到用户空间
这说明了iptables防火墙中的FORWARD转发和导入INPUT、导出OUTPUT在做策略时并不相关,相互独立

如果是转发报文,该报文不会到达用户空间
这是因为报文在到达网络层发现目标ip地址不是自己就会被重新封装转发出去
如果是源主机发送报文或目标主机接收报文,报文会从用户空间发送或到达用户空间接收报文
这是因为,发送报文时用户空间的应用程序发出,需要封装应用层首部;而目标主机解封报文发现目标ip是自己则会解除传输层封装获取端口号,并根据端口号查找进程,如果找到该进程就会把报文中的数据发送到用户空间的应用程序
由此得出,iptables根据路由表把数据流转发FORWARD链和设备本机的数据流导入INPUT、导出OUTPUT链做策略时两个并不相关,相互独立 

 

3、iptables的组成

    iptables由五个表和五个链以及一些规则组成
    五个表table:filter、nat、mangle、raw、security
      filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包
      nat表:network address translation 地址转换规则表
      mangle:修改数据标记位规则表
      raw:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度
      security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现
      优先级由高到低的顺序为:security -->raw–>mangle–>nat–>filter
    五个内置链chain
      PREROUTING:路由前,刚进入本机还没进去INPUT,还未检查路由表进行转发的
      INPUT:到本机内部来的
      FORWARD:由本机转发
      OUTPUT:由本机内部来的(出去的)
      POSTROUTING:路由后,由本机发出来要离开本机的

Netfilter表和链对应关系

    对应关系如下:
    filter表:INPUT,FORWARD,OUTPUT
    nat表:PREROUTING,INPUT,OUTPUT,POSTROUTING
    mangle表:PREROUTING,INPUT,FORWARD,OUPUT,POSTROUTING
    raw表:PREROUTING,OUTPUT

数据包过滤匹配流程

iptables和路由

    路由功能发生的时间点
      报文进入本机后
        判断目标主机是否为本机
          是:INPUT
          否:FORWARD
      报文离开本机之前
        判断由哪个接口送往下一跳

内核中数据包的传输过程

    内核中数据包的传输过程
      当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去
      如果数据包就是进入本机的,数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROUTING链输出
      如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出

iptables规则

    规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作作出处理
      匹配条件:默认为与条件,同时满足
        基本匹配:IP,端口,TCP的Flags(SYN,ACK等)
        扩展匹配:通过复杂高级功能匹配
      处理动作:称为target,跳转目标
        内建处理动作:ACCEPT,DROP,REJECT,SNAT,DNAT,MASQUERADE,MARK,LOG…
          ACCEPT:通过
          DROP:丢弃请求报文,不回复结果;连接断开需要一定的时间,浪费资源
          REJECT:不让别人访问,直接回复结果;快速失败,连接直接断开
        自定义处理动作:自定义chain,利用分类管理复杂情形
    规则要添加在链上,才生效;添加在自定义上不会自动生效
    链chain:
      内置链:每个内置链对应于一个钩子函数
      自定义链:用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制;只有Hook钩子调用自定义链时,才生效

iptables添加要点

    iptables规则添加时考量点
      要实现哪种功能:判断添加在哪张表上
      报文流经的路径:判断添加在哪个链上
      报文的流向:判断源和目的
      匹配规则:业务需要
    实验环境准备:
      Centos7:systemctl stop firewalld.service
        systemctl disable firewalld.service
      Centos6:service iptables stop
        chkconfig iptables off

知识延伸:

其他主机访问本机某服务的请求,报文方向:请求报文先进入本机,本机在发送响应报文,如果要拒绝该请求:
INPUT方向拒绝最合理
OUTPUT方向拒绝,请求会在计算机内核经过处理后才会被拒绝,这样会消耗大量的计算机资源
本机客户端访问其他主机,报文方向:本机先发送请求报文,再接收其他主机的响应报文,如果要拒绝此类请求报文:
则OUTPUT方向拒绝最合理。
因此,在指定规则时要在请求阶段设置,需要根据报文流向来设置
对于转发的报文,同样有两个方向:一去一回
但对于filer表过滤功能来说,不支持PREROUTING链和POSTROUTING链,因此针对转发报文的规则,只能在FOREWARD链上设置

    1
    2
    3
    4
    5
    6
    7
    8

4、iptables的基本语法

iptables命令

    查看帮助:man 8 iptables

    语法:
    iptables [-t table] {-A|-C|-D} chain rule-specification
    iptables [-t table] -I chain [rulenum] rule-specification
    iptables [-t table] -R chain rulenum rule-specification
    iptables [-t table] -D chain rulenum
    iptables [-t table] -S [chain [rulenum]]
    iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options…]
    iptables [-t table] -N chain
    iptables [-t table] -X [chain]
    iptables [-t table] -P chain target
    iptables [-t table] -E old-chain-name new-chain-name
    rule-specification = [matches…] [target]
    match = -m matchname [per-match-options]
    target = -j targetname [per-target-options]

    Filter表中INPUT规则

    规则格式:iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
    -t table:
      raw, mangle, nat, [filter]默认
    SUBCOMMAND:
      1、链管理:
        -N:new, 自定义一条新的规则链
        -X:delete,删除自定义的空的规则链
        -P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
          ACCEPT:接受
          DROP:丢弃
        -E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除
      2、查看:
        -L:list, 列出指定鏈上的所有规则,本选项须置后
        -n:numberic,以数字格式显示地址和端口号
        -v:verbose,详细信息
        -vv 更详细
        -x:exactly,显示计数器结果的精确值,而非单位转换后的易读值
        --line-numbers:显示规则的序号
        常用组合:
          -vnL
          -vvnxL–line-numbers
        -S selected,以iptables-save 命令格式显示链上规则
      3、规则管理:
        -A:append,追加
        -I:insert, 插入,要指明插入至的规则编号,默认为第一条
        -D:delete,删除
          (1) 指明规则序号
          (2) 指明规则本身
        -R:replace,替换指定链上的指定规则编号
        -F:flush,清空指定的规则链
        -Z:zero,置零
          iptables的每条规则都有两个计数器
            (1) 匹配到的报文的个数
            (2) 匹配到的所有报文的大小之和

    chain:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

    匹配条件
    基本:通用的,PARAMETERS
    扩展:需加载模块,MATCH EXTENTIONS
    1、基本匹配条件:无需加载模块,由iptables/netfilter自行提供
      [!] -s, --source address[/mask][,…]:指定源IP地址或范围
      [!] -d, --destination address[/mask][,…]:指定目标IP地址或范围
      [!] -p, --protocol protocol:指定协议,可使用数字如0(all)
        protocol: tcp, udp, icmp, icmpv6,udplite,esp, ah, sctp, mh or “all”
        参看:/etc/protocols
      [!] -i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链
      [!] -o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链
    2、扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so),方可生效
    查看帮助man iptables-extensions
      (1)隐式扩展:在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块
        -p tcp:隐含了-m tcp;
          [!] --source-port, --sport port[:port]:匹配报文源端口,可为端口范围
          [!] --destination-port,–dportport[:port]:匹配报文目标端口,可为范围
          [!] --tcp-flags mask comp
            mask 需检查的标志位列表,用,分隔
              例如SYN,ACK,FIN,RST
            comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔
    示例:

--tcp-flags SYN,ACK,FIN,RST SYN 表示要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0
--tcp-flags SYN,ACK,FIN,RST SYN,ACK
--tcp-flags ALL ALL
--tcp_flagsALL NONE

    1
    2
    3
    4

[!] --syn:用于匹配第一次握手
        相当于:–tcp-flags SYN,ACK,FIN,RST SYN
    -p udp:隐含了-m udp;
      [!] --source-port, --sport port[:port]:匹配报文的源端口或端口范围
      [!] --destination-port,–dportport[:port]:匹配报文的目标端口或端口范围
    -p icmp:隐含了-m icmp;
      [!] --icmp-type {type[/code]|typename}
        type/code
          0/0 echo-replyicmp应答
          8/0 echo-request icmp请求
隐式扩展示例:

允许192.168.32.0网段访问本机网络的445、139、138、137端口
iptables -t filter -A INPUT -s 192.168.32.0/24 -p tcp -m tcp --dport 445 -j ACCEPT
iptables -t filter -A INPUT -s 192.168.32.0/24 -p tcp -m tcp --dport 139 -j ACCEPT
iptables -t filter -A INPUT -s 192.168.32.0/24 -p udp -m udp --dport 137 -j ACCEPT
iptables -t filter -A INPUT -s 192.168.32.0/24 -p udp -m udp --dport 138 -j ACCEPT

    1
    2
    3
    4
    5

(2)显式扩展:必须使用-m选项指明要调用的扩展模块的扩展机制,要手动加载扩展模块
    [-m matchname[per-match-options]]
  处理动作:
  -j targetname[per-target-options]
    简单:ACCEPT,DROP
    扩展:REJECT:–reject-with:icmp-port-unreachable默认
      RETURN:返回调用链
      REDIRECT:端口重定向
      LOG:记录日志,dmesg
      MARK:做防火墙标记
      DNAT:目标地址转换
      SNAT:源地址转换
      MASQUERADE:地址伪装
      …
      自定义链:

iptables规则"显示扩展"详解

    显式扩展:必须显式地指明使用的扩展模块进行的扩展
      同一种服务,不同检查条件的规则,把条件苛刻的放在上面
      不同的服务,哪种服务访问量大,哪个放上面,如:80和22端口,一般情况下80端口访问量比22端口要大,因此基于80端口的服务放在上面
    使用帮助:
      CentOS 6: man iptables
      CentOS 7: man iptables-extensions
    1、multiport扩展
    检查条件一样时,支持多个离散或连续的端口用一条规则实现,最多支持15个端口
    [!] --source-ports,–sports port[,port|,port:port]… 指定多个源端口
    [!] --destination-ports,–dports port[,port|,port:port]… 指定多个目标端口
    [!] --ports port[,port|,port:port]… 指定多个源或目标端口
    示例:

添加对本机的多端口设置
iptables -I INPUT -d 192.168.32.129 -i ens33 -p tcp -m multiport --dports 21:22,80,443,139,445
iptables -I OUTPUT -s 192.168.32.129 -o ens33 -p tcp -m multiport --sports 21,22,80,443,139,445 

    1
    2
    3

    2、iprange扩展
    指明连续的(但一般不是整个网络)ip地址范围
    注意:指定的ip地址不是一个网络,也不是单个地址,而是指定某网络的某段网址
    [!] --src-range from[-to]源IP地址范围
    [!] --dst-range from[-to]目标IP地址范围
    示例:

允许192.168.32.0网段中192.168.32.191-192.168.32.200范围内的ip地址访问本机的23端口 
iptables -I INPUT 2 -d 192.168.32.0/24 -i ens33 -p tcp --dport 23 -m iprange --src-range 192.168.32.191-192.168.32.200 -j ACCEPT
iptables -I OUTPUT 2 -s 192.168.32.0/24 -o ens33 -p tcp --sport 23 -m iprange --dst-range 192.168.32.191-192.168.32.200

    1
    2
    3

    3、ipset 离散地址集合
    依赖于ipset命令行工具
      man iptables-extensions
    先自定义地址集合,在设置规则时,匹配到该集合
      hash:ip 是指单个ip;ip模式只能写单个ip地址
      hash:net 是指多个ip地址;net模式既可以写单个ip地址也可以写多个ip地址
    示例:

定义地址集合
    ipset create mysqlsrc hash:net maxelem 1000
在地址集合添加地址
    ipset add mysqlsrc 192.168.32.130
    ipset add mysqlsrc 192.168.32.131
    match-set  使用该模块调用地址集合
允许地址集合中的离散ip地址访问本机的3306端口
    iptables -I INPUT 3 -d 192.168.32.129 -i ens33 -p tcp --dport 3306 -m set --match-set mysqlsrc src -j ACCEPT
    iptables -I OUTPUT 3 -s 192.168.32.129 -o ens33 -p tcp --sport 3306 -m set --match-set mysqlsrc dst -j ACCEPT

    1
    2
    3
    4
    5
    6
    7
    8
    9

    4、string扩展
    对报文中的应用层数据做字符串模式匹配检测
    允许访问某服务,在访问该服务时对用户发送的报文进行字符串检测,不允许敏感数据的上传或下载
    –algo{bm|kmp} 字符串匹配检测算法
      bm:Boyer-Moore
      kmp:Knuth-Pratt-Morris
    –from offset 开始偏移
    –to offset 结束偏移
    [!] --string pattern要检测的字符串模式
    [!] --hex-string pattern要检测字符串模式,16进制格式
    示例:

过滤访问本机web服务中包含1024的报文,拒绝其访问
    iptables -I OUTPUT -m string --string "1024" --algo bm -j REJECT
    echo this is 1024 > /var/www/html/test.html
在其他主机测试:
    curl http://192.168.32.129/test.html
注意:该模块的控制在出的方向(OUTPUT)进行控制,因为需要对内容进行检测后才能进行控制

    1
    2
    3
    4
    5
    6

    5、time扩展
    根据报文到达时间与指定时间范围进行匹配度检测
    要注意时区问题
    语法格式:
    –datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]即年月日时分秒 表示开始日期时间
    –datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]即年月日时分秒 表示结束日期时间
    –timestart hh:mm[:ss]即时分秒 表示开始时间
    –timestop hh:mm[:ss]即时分秒 表示结束时间
    如果不指定日期,只指定时间,表示每一天在该时间段受控制
    –weekdays 每周的周几受控
    –monthdays 每月的几号受控
    注意:一般情况下,这两者不同时使用
    –kerneltz 使用内核中配置的时区,因此只需使用此选项,并把时区设置为本地时区即可
    示例:

iptables -I INPUT -d 192.168.32.129 -p tcp --dport 80 -m time --timestart 14:00:00 --timestop 18:00:00 --weekdays Mon,Tue,Wed,Thu,Fri -j REJECT
注意:此时定义的时间所在的时区为UTC
[root@centos7 ~]# iptables -vnL
Chain INPUT (policy DROP 11 packets, 2234 bytes)
 pkts bytes target   prot opt in   out   source       destination         
    0     0 REJECT   tcp  --  *     *   0.0.0.0/0    192.168.32.129    tcp dpt:80 TIME from 14:00:00 to 18:00:00 on Mon,Tue,Wed,Thu,Fri UTC reject-with icmp-port-unreachabl

    1
    2
    3
    4
    5
    6

    6、connlimit扩展
    单ip的并发连接数限制
    如果最大限制数为5,来了10个并发请求,并不会全部拒绝,而是放行5个请求,拒绝5个请求
    –connlimit-upto n:连接数数量小于等于n,此时应该允许;默认规则为拒绝时使用
    –connlimit-above n:连接数数量大于n,此时应该拒绝;默认规则为允许时使用
    通常分别与默认的拒绝或允许策略配合使用
    示例:

访问本机的22端口的连接大于2个就拒绝
iptables -I  INPUT 2 -d 192.168.32.129 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
注意:测试时会话窗口不能使用复制窗口,要新建会话窗口才能生效

    1
    2
    3

    7、limit扩展
    速率限制,每秒单位时间内记录多少个报文
    –limit rate[/second|/minute|/hour|/day]:平均速率
    –limit-burst number:峰值速率
    令牌桶算法:令牌桶,即存放令牌的容器
    峰值:即把空闲的令牌集中起来,等到并发访问较高时,全部发出集中的多个令牌,但需要限制可存放令牌的数量,多余的令牌会被直接扔掉,防止容器被全部占用
    入站类型为8,即echo-request,该命令要加在其他icmp规则之前
    示例:

允许入站访问,限制每秒接收2个报文,峰值速率为20  
iptables -I INPUT 5 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 20 -j ACCEPT
注意:要删除之前编写的默认规则,该规则才能生效
测试命令:hping3  以指定速度发送ping请求,
-i 支持微秒级
--fast 每秒10个请求
-1 工作在icmp模式下
hping3 -1 --fast 192.168.32.129

    1
    2
    3
    4
    5
    6
    7
    8

    8、state扩展
      根据”连接追踪机制“去检查连接的状态,较耗资源
    conntrack机制:追踪本机上的请求和响应之间的关系
    状态有如下几种:
      NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
      ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
      RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
      INVALID:无效的连接,如flag标记不正确
      UNTRACKED:未进行追踪的连接,如raw表中关闭追踪
    [!] --state state
      已经追踪到的并记录下来的连接信息库
        /proc/net/nf_conntrack
      调整连接追踪功能所能够容纳的最大连接数量
        /proc/sys/net/nf_conntrack_max
      不同的协议的连接追踪时长
        /proc/sys/net/netfilter/
      注意:CentOS7 需要加载模块:modprobenf_conntrack
    iptables的链接跟踪表最大容量为/proc/sys/net/nf_conntrack_max,各种状态的超时链接会从表中删除;当模板满载时,后续连接可能会超时
    解决方法两个:
    (1) 加大nf_conntrack_max值
      vi /etc/sysctl.conf
      net.nf_conntrack_max= 393216
      net.netfilter.nf_conntrack_max= 393216
    (2) 降低nf_conntracktimeout时间
    vi /etc/sysctl.conf
      net.netfilter.nf_conntrack_tcp_timeout_established= 300
      net.netfilter.nf_conntrack_tcp_timeout_time_wait= 120
      net.netfilter.nf_conntrack_tcp_timeout_close_wait= 60
      net.netfilter.nf_conntrack_tcp_timeout_fin_wait= 120
      iptables -t nat-L -n
    示例:

开启连接追踪功能后,开启记忆功能,只有第一次访问(三次握手中的第一次握手)时状态为NEW,只要没有超出记忆时间,后续访问均为ESTABLISTIED状态
开启连接追踪功能,只需对进入本机的报文进行规则设置,流出本机的报文会根据进入本机报文的状态自动判断是否让其出去
iptables -A INPUT -d 192.168.32.129 -i ens33 -p tcp -m multiport --dports 80,443,139,445,22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.32.129 -o ens33 -p tcp -m multiport --sports 80,443,139,445,22 -m state --state NEW,ESTABLISHED -j ACCEPT
设置通用规则开启白名单
iptables -A INPUT -j REJECT
iptables -A OUTPUT -j REJECT

开启连接追踪功能,只需对进入本机的报文进行规则设置
iptables -I INPUT 2 -d 192.168.32.129 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 10 -j ACCEPT
[root@centos7 ~]# iptables -I OUTPUT 2 -s 192.168.32.129 -p icmp --icmp-type 0 -j ACCEPT
由于设置连接追踪机制,因此只需允许ESTABLISHED状态的报文流出即可
iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT
注意:设置防火墙规则时,如果只对本机ip地址设置规则,会拒绝本机lo环回网卡的请求报文,造成无法访问自己,因此,在定义入出站规则时排除本机lo接口
在原有通用拒绝规则之上排除本机lo接口
iptables -R INPUT 3 ! -i lo -j REJECT
iptables -R OUTPUT 2 ! -o lo -j REJECT



iptables连接追踪机制

    开放被动模式的ftp服务
    (1) 装载ftp连接追踪的专用模块:
      跟踪模块路径:/lib/modules/kernelversion/kernel/net/netfilter
      vim /etc/sysconfig/iptables-config配置文件
      IPTABLES_MODULES=“nf_conntrack_ftp”
      modproble nf_conntrack_ftp
    (2) 放行请求报文:
      命令连接:NEW, ESTABLISHED
      数据连接:RELATED, ESTABLISHED
      iptables –I INPUT -d LocalIP -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
      iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW -j ACCEPT
    (3) 放行响应报文:
      iptables -I OUTPUT -s LocalI P-p tcp -m state --state ESTABLISHED -j ACCEPT
    示例:

安全开放ftp服务
安装并启动ftp:
    yum install vsftpd
    systemctlstart vsftpd
ftp服务有两种连接:
    命令连接:客户端访问服务端,只需开放21端口
    数据连接:服务端通过命令连接通知客户端传送数据,端口为随机
针对21端口开启连接追踪机制,放行数据连接
    iptables -I INPUT -d 192.168.32.129 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT  开启RELATED功能,放行数据连接。
通过命令连接传输数据,即与已建立连接相关的连接
    iptables -I  INPUT 2 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
注意:此时无需对放行规则进行设置,因为只要开启连接追踪功能,只需放行ESTABLISHED状态的报文即可,而改规则在上面实验中已经设置过,如果是第一次设置则需要再次写入此规则:iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT
此时,ftp服务仍然无法通过本地访问,这是因为RELATED是一个独特的模块,必须手动装入内核模块才能使用该功能
手动装载模块:modprobe nf_conntrack_ftp

如何实现开机自启动该模块:编写脚本放入/etc/sysconfig/modules目录
vim /etc/sysconfig/modules/conntrack.sh
#/bin/bash
#
modprobe nf_conntrack_ftp
chmod +x /etc/sysconfig/modules/conntrack.sh 
下次开机即可自启动

规则优化:
配置iptables规则如下:
[root@centos7 ~]# iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1      100  6664 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
2        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.32.129       tcp dpt:21 state NEW,ESTABLISHED
3      269 18752 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
4     2138  151K ACCEPT     tcp  --  ens33  *       0.0.0.0/0            192.168.32.129       multiport dports 80,443,139,445,22 state NEW,ESTABLISHED
5       19   532 ACCEPT     icmp --  *      *       0.0.0.0/0            192.168.32.129       icmptype 8 limit: avg 2/sec burst 10
6      919  120K REJECT     all  --  !lo    *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     1126  172K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
2       26  2430 REJECT     all  --  *      !lo     0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

规则优化:
INPUT链中,可以删除第3条,第2条、4条可以合并
iptables -D INPUT 3
iptables -R INPUT 2 -d 192.167.32.129 -p tcp -m multiport --dports 21:22,80,443,139,445 -m state --state NEW -j ACCEPT
删除合并后的第三条
iptables -D INPUT 3

优化后的规则:
[root@centos7 ~]# iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1      235 15972 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
2        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.167.32.129       multiport dports 21:22,80,443,139,445 state NEW
3       19   532 ACCEPT     icmp --  *      *       0.0.0.0/0            192.168.32.129       icmptype 8 limit: avg 2/sec burst 10
4     1028  137K REJECT     all  --  !lo    *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     1211  184K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
2       33  3064 REJECT     all  --  *      !lo     0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable



    Target:
      ACCEPT,DROP,REJECT,RETURN
      LOG,SNAT,DNAT,REDIRECT,MASQUERADE,…
      LOG:非中断target,本身不拒绝和允许,放在拒绝和允许规则前
        并将日志记录在/var/log/messages系统日志中
        --log-level level 级别:debug,info,notice, warning, error, crit, alert,emerg
        --log-prefix prefix 日志前缀,用于区别不同的日志,最多29个字符
    示例:
    iptables-I INPUT -s 10.0.1.0/24 -p tcp-m multiport --dports80,21,22,23 -m state --state NEW -j LOG --log-prefix "new connections: "

iptables规则优化

    任何不允许的访问,应该在请求到达时给予拒绝
    规则在链接上的次序即为其检查时的生效次序
    基于上述,规则优化
    1 安全放行所有入站和出站的状态为ESTABLISHED状态连接
    2 谨慎放行入站的新请求
    3 有特殊目的限制访问功能,要在放行规则之前加以拒绝
    4 同类规则(访问同一应用),匹配范围小的放在前面,用于特殊处理
    5 不同类的规则(访问不同应用),匹配范围大的放在前面
    6 应该将那些可由一条规则能够描述的多个规则合并为一条
    7 设置默认策略,建议白名单(只放行特定连接)
      1)iptables-P,不建议
      2)建议在规则的最后定义规则做为默认策略
    规则有效期限:
    使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限
    保存规则:
    保存规则至指定的文件
    CentOS 6
      service iptables save
      将规则覆盖保存至/etc/sysconfig/iptables文件中
    CentOS7
      iptables-save > /PATH/TO/SOME_RULES_FILE
    规则重载
    CentOS 6:
      service iptables restart
      会自动从/etc/sysconfig/iptables重新载入规则
    CentOS 7重新载入预存规则文件中规则:
      iptables-restore < /PATH/FROM/SOME_RULES_FILE
      -n, --noflush:不清除原有规则
      -t, --test:仅分析生成规则集,但不提交
    开机自动重载规则
    开机自动重载规则文件中的规则:
    (1) 用脚本保存各iptables命令;让此脚本开机后自动运行
      /etc/rc.d/rc.local文件中添加脚本路径
      /PATH/TO/SOME_SCRIPT_FILE
    (2) 用规则文件保存各规则,开机时自动载入此规则文件中的规则
      /etc/rc.d/rc.local文件添加
      iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
    (3)自定义Unit File,进行iptables-restore

5、iptables之地址转换法则

网络防火墙

    iptables/netfilter网络防火墙:
      (1) 充当网关
      (2) 使用filter表的FORWARD链
    注意的问题:
      (1) 请求-响应报文均会经由FORWARD链,要注意规则的方向性
      (2) 如果要启用conntrack机制,建议将双方向的状态为ESTABLISHED的报文直接放行

模拟实验1:

实验环境:
客户端 ----  转发服务器 ---- 服务器端
客户端:192.168.32.129
转发服务器网卡1:192.168.32.130 
         网卡2:172.45.0.129
服务器端:172.45.0.128
客户端网关添加路由指向转发服务器的网卡1
服务器端网关添加路由指向转发服务器的网卡2
转发服务器开启转发功能,模拟路由器;

配置:
三台主机分别关闭firewalld服务以及selinux
systemctl stop firewalld
客户端:route add -net 172.45.0.0/16 gw 192.168.32.130
服务器端:route add -net 192.168.32.0/24 gw 172.45.0.129
转发服务器临时打开路由转发功能,模拟路由器
  sysctl -w net.ipv4.ip_forward=1
  或者echo 1 > /proc/sys/net/ipv4/ip_forward

转发服务器使用通用规则设置白名单
    iptables -A FORWARD -j REJECT
此时,由于通过ssh连接转发服务器并不会收到影响,因为ssh请求并不通过FORWARD链
但是客户端ping服务器端时,则无法ping通

在转发服务器上FOREWARD链开启连接追踪机制,对于响应报文只允许ESTABLISHED状态报文通过即可
    iptables -I FOREWARD -m state --state ESTABLISHED -j ACCEPT
对于请求报文来说,只有dport能够确认,因为源端口是随机的
对于响应报文来说,只有sport能够确认,响应报文是服务器发送的,服务器只知道自己服务的端口号
此时只需放行从客户端到服务器端的NEW状态的请求报文即可,而响应报文已经放行过
因此在转发服务器上
    iptables -I FORWARD 2 -d 172.20.0.66 -p tcp -m multiport --dports 21:22,80,139,445 -m state --state NEW -j ACCEPT
对于ftp服务,转发服务器还需要允许RELATED状态报文通过
    iptables -I FOREWARD 3 -d 172.20.0.66 -p tcp -m state --state RELATED-j ACCEPT
需要在服务器端手动转载ftp专用的连接追踪模块
    modprobe nf_conntrack_ftp
注意:在服务器端加载ftp模块,而不是转发服务器

总结来说:
对于请求报文来说只需要在转发服务器放行NEW状态的请求报文
    iptables -I FORWARD 2 -d 172.20.0.66 -p tcp -m multiport --dports 21:22,80,139,445 -m state --state NEW -j ACCEPT
对于响应报文来说只需要在转发服务器放行ESTABLISHED状态的响应报文
    iptables -I FOREWARD -m state --state ESTABLISHED -j ACCEPT
对于ftp服务器还需添加RELATED状态报文
    iptables -I FOREWARD 3 -d 172.20.0.66 -p tcp -m state --state RELATED -j ACCEPT
还需要在服务器端加载ftp模块
    modprobe nf_conntrack_ftp
查看防火墙规则:
[root@centos7 data]# iptables -vnL
Chain INPUT (policy ACCEPT 46 packets, 4282 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            172.45.0.128         state RELATED
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            172.45.0.128         multiport dports 21:22,80,443,445,139 state NEW
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT 26 packets, 5424 bytes)
 pkts bytes target     prot opt in     out     source               destination 

    

模拟实验2:

自定义链
模拟实验:允许客户端ping服务器端
自定义链为:icmp_rules
    iptables -N icmp_rules
为自定义链添加规则允许别人ping通自己并回应报文
    iptables -A icmp_rules -p icmp --icmp-type 8 -j ACCEPT
    iptables -A icmp_rules -p icmp --icmp-type 0 -j ACCEPT
如果自定义链规则都不匹配,则返回主链继续后续规则匹配
    iptables -A icmp_rules -j RETURN
在FORWARD主链调用自定义链
    iptables -I FORWARD 3 -j icmp_rules
注意:自定义链只能通过主链调用才能使用
测试:在客户端 ping 172.45.0.128
查看定义的防火墙规则
[root@centos7 ~]# iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 89 packets, 8794 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all  --  *      *       0.0.0.0/0            172.45.0.128         state RELATED
2        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            172.45.0.128         multiport dports 21:22,80,443,445,139 state NEW
3        6   504 icmp_rules  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
4        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
5        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT 57 packets, 15892 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain icmp_rules (1 references)
num   pkts bytes target     prot opt in     out     source               destination         
1        3   252 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 8
2        3   252 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 0
3        0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0 

删除自定义链
步骤:必须先删除主链,然后清空自定义链规则,最后才能删除主链
    iptables -D FORWARD 3   删除FORWARD主链调用
    iptables -F icmp_rules  清空自定义链规则
    iptables -X icmp_rules  删除自定义链

    

NAT

    NAT: network address translation
      PREROUTING,INPUT,OUTPUT,POSTROUTING
      请求报文:修改源/目标IP,由定义如何修改
      响应报文:修改源/目标IP,根据跟踪机制自动实现
    SNAT:source NAT POSTROUTING, INPUT
      让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装
      请求报文:修改源IP
    DNAT:destination NAT PREROUTING, OUTPUT
      把本地网络中的主机上的某服务开放给外部网络访问(发布服务和端口映射),但隐藏真实IP
      请求报文:修改目标IP
    PNAT: port nat,端口和IP都进行修改

SANT

    nat表的target:
    SNAT:固定IP
      --to-source [ipaddr[-ipaddr]][:port[-port]]
      --random
    iptables-t nat-A POSTROUTING -s LocalNET! -d LocalNet-j SNAT --to-source ExtIP
    示例:
    iptables-t nat-A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24-j SNAT --to-source 172.18.1.6-172.18.1.9
    MASQUERADE:动态IP,如拨号网络
      --to-ports port[-port]
      --random
    iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE
    示例:
    iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j MASQUERADE
    知识延伸:

SNAT转换过程说明:
内网(私网):192.168.32.129
转发服务器内网网卡1:192.168.32.130 
         外网网卡2:172.45.0.129
外网(公网):172.45.0.128

源地址转换SNAT:
私网客户端向公网服务器端发送请求,经过网关服务器时,通过源地址转换(SNAT),把请求报文中源地址(即私网地址)192.168.32.129转换为网关服务器的公网地址172.45.0.129,而报文中的目的地址为172.45.0.128不变,进而访问公网服务器
公网服务器端向私网客户端回复响应报文,到达网关服务器时,通过目的地址转换(DNAT),把响应报文中公网服务器目的地址172.45.0.129转换为网关服务器私网地址192.168.32.130,此时响应报文中的源地址172.45.0.128不变,进而回应私网客户端
根据连接追踪机制,回应报文的转换会由系统自动实现,因此只要进行源地址转换(SNAT)转换即可

SANT必须在POSTROUTING链上制定规则
这是因为报文是否转发必须通过网关服务器内部进行判断后才能决定是否转发,PREROUTING链位置太早不能进行转发,而INPUT和OUTPUT链不能进行转发,而nat地址转换不支持在FORWARD链上进行,因此必须在POSTROUTING链上进行

简单总结来说:
根据连接追踪机制原理:私网向公网发送请求报文,只需做源地址转换(SNAT)把请求报文中的源地址从私网地址转换为网关服务器公网地址即可,只要请求报文能够通过,响应报文回复时会自动被放行
另外,源地址转换SANT必须在POSTROUTING链设置



模拟实验:

内网访问外网
内网知道外网目的地址,而外网不知道内网具体地址
所有内网网关指向网关服务器内网网卡,外网无需设置路由
在服务器端172.45.0.128
删除路由
route del -net 192.168.32.0/24
在网关服务器192.168.32.130
清空防火墙规则
iptables -F
在网关服务器
在POSTROUTING链进行源地址转换
iptables -t nat -I POSTROUTING -s 192.168.32.0/24 -j SNAT --to-source 172.45.0.129
--to-source  指定把私网地址转换为哪个公网地址
--random   如果公网服务器上已存在多个公网地址,则把私网地址随机转换为网关服务器已存在的多个公网地址中的其中一个

如果为拨号上网,则公网ip地址不固定
MASQUERADE  地址伪装
支持动态拨号上网,识别存在的公网地址,自动进行源地址转换;该模式也支持静态地址转换,但是并不推荐,因为该模式会消耗计算资源
iptables -t nat -I POSTROUTING -s 192.168.32.0/24 -j MASQUERADE 
注意:
(1)由于内网访问外网可能是多个服务,因此端口不做限制
(2)源地址转换时,是把内网地址转换为网关服务器的公网地址,即--to-source的地址为网关服务器的公网地址172.45.0.129
测试:ping 172.45.0.128

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

DNAT

    DNAT
      --to-destination [ipaddr[-ipaddr]][:port[-port]]
    iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT]
    示例:

iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 22 -j DNAT --to-destination 10.0.1.22
iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22:8080

    1
    2

知识延伸:

目的地址转换DNAT
内网(私网):192.168.32.129
转发服务器内网网卡1:192.168.32.130 
         外网网卡2:172.45.0.129
外网(公网):172.45.0.128

访问方向:供内网设置web服务,从公网访问内网web服务器时,默认先访问公司网关服务器的外网网关(因为公网之间才能相互通信)
请求报文从公网到达网关服务器时,经过目的地址转换,把请求报文中目标地址由网关服务器公网地址172.45.0.129转换为内网web服务器的地址192.168.32.129,请求报文中源地址172.45.0.128不变
根据连接追踪机制,只要请求报文通过,响应报文即会被系统自动放行

DNAT必须在PRETOUTING链上设置
这是因为,请求报文中的目的地址为本机地址,如果不在OREROUTING链上设置,一旦进入网关服务器,就从进入INPUT链转发给本机,本机找不到请求资源,将会回复无法找到请求资源。该请求报文也不会被转发,无法到达内网web服务器

简单总结来说:
根据连接追踪机制原理:公网访问内网服务器,只需要做目的地址转换DNAT即可,把请求报文中的目的地址转换为内网服务器地址,只要请求报文能够通过,响应报文回复时会自动被放行,目的地址转换DANT必须在PREROUTING链设置

    

模拟实验:

外网访问内网
要注意把内网地址指向网关服务器的内网网卡
在公网主机上无需设置路由(二者在同一网段,无需设置路由;如果有多个路由器则需要指定下一跳设备地址)
在PREROUTING链设置目的地址转换
iptables -t nat -A PREROUTING -d 172.45.0.129 -p tcp  --dport 80 -j DNAT --to-destination 192.168.32.129
注意:
(1)由于公网访问内网web服务,因此只需开放80端口即可
(2)指定转换的目的地址为内网服务器地址,而不是网关服务器的内网地址,即--to-destination 为内网地址172.45.0.128,而不是网关服务器内网地址172.45.0.130

    1
    2
    3
    4
    5
    6
    7
    8

转发

    REDIRECT:
      NAT表
      可用于:PREROUTING OUTPUT 自定义链
      通过改变目标IP和端口,将接受的包转发至不同端口
      --to-ports port[-port]
    地址转换的目的:
      安全:隐藏内网服务器,利用公网网关单个地址隐藏内网服务器地址
      资源:节省ip地址,一个公网ip地址对应多个内网ip地址
    示例:
    iptables -t nat -A PREROUTING -d 172.16.100.10 -p tcp --dport80 -j REDIRECT --to-ports 8080

6、firewalld介绍

firewalld服务

    firewalld是CentOS7.0新推出的管理netfilter的工具
    firewalld是配置和监控防火墙规则的系统守护进程。可以实现iptables,ip6tables,ebtables的功能
    firewalld服务由firewalld包提供
    firewalld支持划分区域zone,每个zone可以设置独立的防火墙规则
    归入zone顺序:
      先根据数据包中源地址,将其纳为某个zone
      纳为网络接口所属zone
      纳入默认zone,默认为public zone,管理员可以改为其它zone
    网卡默认属于public zone,lo网络接口属于trusted zone

firewalld zone分类

预定义服务
7、firewalld配置命令

    firewall-cmd --get-services 查看预定义服务列表
    /usr/lib/firewalld/services/*.xml预定义服务的配置
    三种配置方法
      firewall-config(firewall-config包)图形工具
      firewall-cmd(firewalld包)命令行工具
      /etc/firewalld 配置文件,一般不建议

firewall-cmd命令选项

    常用选项
    –get-zones 列出所有可用区域
    –get-default-zone 查询默认区域
    –set-default-zone= 设置默认区域
    –get-active-zones 列出当前正使用的区域
    –add-source=[–zone=] 添加源地址的流量到指定区域,如果无–zone= 选项,使用默认区域
    –remove-source= [–zone=] 从指定区域中删除源地址的流量,如无–zone= 选项,使用默认区域
    –add-interface=[–zone=] 添加来自于指定接口的流量到特定区域,如果无–zone= 选项,使用默认区域
    –change-interface=[–zone=] 改变指定接口至新的区域,如果无–zone= 选项,使用默认区域
    –add-service= [–zone=] 允许服务的流量通过,如果无–zone= 选项,使用默认区域
    –add-port=<PORT/PROTOCOL>[–zone=] 允许指定端口和协议的流量,如果无–zone= 选项,使用默认区域
    –remove-service= [–zone=] 从区域中删除指定服务,禁止该服务流量,如果无–zone= 选项,使用默认区域
    –remove-port=<PORT/PROTOCOL>[–zone=] 从区域中删除指定端口和协议,禁止该端口的流量,如果无–zone= 选项,使用默认区域
    –reload 删除当前运行时配置,应用加载永久配置
    –list-services 查看开放的服务
    –list-ports 查看开放的端口
    –list-all [–zone=] 列出指定区域的所有配置信息,包括接口,源地址,端口,服务等,如果无–zone= 选项,使用默认区域
    查看默认zone
      firewall-cmd–get-default-zone
    默认zone设为dmz
      firewall-cmd–set-default-zone=dmz
    在internalzone中增加源地址192.168.0.0/24的永久规则
      firewall-cmd–permanent --zone=internal --add-source=192.168.0.0/24
    在internalzone中增加协议mysql的永久规则
      firewall-cmd–permanent –zone=internal --add-service=mysql
    加载新规则以生效
      firewall-cmd–reload

其他规则

    当基本firewalld语法规则不能满足要求时,可以使用以下更复杂的规则
    rich-rules 富规则,功能强,表达性语言
    Direct configuration rules 直接规则,灵活性差
    帮助:man 5 firewalld.direct

8、rich规则

rich规则

    rich规则语法:
    forward-port port=<PORTNUM>protocol=tcp|udp[to-port=<PORTNUM>] [to-addr=<ADDRESS>]

示例1:

转发从192.168.0.0/24来的,发往80/TCP的流量到防火墙的端口8080/TCP
firewall-cmd --zone=work --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 forward-port port=80 protocol=tcpto-port=8080'

    1
    2

示例2:

firewall-cmd --permanent --add-rich-rule 'rule family=ipv4 source address=172.25.X.10/32 forward-port port=443 protocol=tcpto-port=22'
firewall-cmd --reload
ssh -p 443 serverX.example.com

    1
    2
    3

管理rich规则

    rich规则比基本的firewalld语法实现更强的功能,不仅实现允许/拒绝,还可以实现日志syslog和auditd,也可以实现端口转发,伪装和限制速率
    rich语法:
    rule
      [source]
      [destination]
      service|port|protocol|icmp-block|masquerade|forward-port
      [log]
      [audit]
      [accept|reject|drop]
    man 5 firewalld.richlanguage

规则

    规则实施顺序:
      该区域的端口转发,伪装规则
      该区域的日志规则
      该区域的允许规则
      该区域的拒绝规则
    每个匹配的规则生效,所有规则都不匹配,该区域默认规则生效

rich规则选项

rich规则示例:

拒绝从192.168.0.11的所有流量,当address 选项使用source或destination时,必须用family= ipv4|ipv6
    firewall-cmd --permanent --zone=classroom --add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject‘
限制每分钟只有两个连接到ftp服务
    firewall-cmd --add-rich-rule='rule service name=ftp limit value=2/m accept'
抛弃esp(IPsec 体系中的一种主要协议)协议的所有数据包
    firewall-cmd --permanent --add-rich-rule='rule protocol value=espdrop'
接受所有192.168.1.0/24子网端口5900-5905范围的TCP流量
    firewall-cmd --permanent --zone=vnc --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=5900-5905 protocol=tcp accept'

    1
    2
    3
    4
    5
    6
    7
    8

rich日志规则

log [prefix="<PREFIX TEXT>"[level=<LOGLEVEL>] [limit value="<RATE/DURATION>"]  
<LOGLEVEL>可以是emerg,alert,crit,error,warning,notice,info, debug.  
<DURATION>s:秒,m:分钟,h:小时, d:天  
audit [limit value="<RATE/DURATION>"]  

    1
    2
    3
    4

rich日志规则示例:

接受ssh新连接,记录日志到syslog的notice级别,每分钟最多三条信息
    firewall-cmd --permanent --zone=work --add-rich-rule='rule service name="ssh" log prefix="ssh" level="notice" limit value="3/m" accept
从2001:db8::/64子网的DNS连接在5分钟内被拒绝,并记录到日志到audit,每小时最大记录一条信息
    firewall-cmd --add-rich-rule='rule family=ipv6 source address="2001:db8::/64" service name="dns" audit limit value="1/h" reject' --timeout=300

    1
    2
    3
    4

规则示例:

firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.25.X.10/32 service name="http" log level=notice prefix="NEW HTTP " limit value="3/s" accept'
firewall-cmd --reload
tail -f /var/log/messages
curl http://serverX.example.com

    1
    2
    3
    4

伪装和端口转发

    NAT网络地址转换,firewalld支持伪装和端口转发两种NAT方式
    伪装NAT
    firewall-cmd–permanent --zone=–add-masquerade
    firewall-cmd–query-masquerade 检查是否允许伪装
    firewall-cmd–add-masquerade 允许防火墙伪装IP
    firewall-cmd–remove-masquerade 禁止防火墙伪装IP
    示例:
    firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 masquerade'
    端口转发
    端口转发:将发往本机的特定端口的流量转发到本机或不同机器的另一个端口。通常要配合地址伪装才能实现
    firewall-cmd–permanent --zone=–add-forward-port=port=:proto=[:toport=][:toaddr=]
    说明:toport=和toaddr=至少要指定一个

示例:

转发传入的连接9527/TCP,到防火墙的80/TCP到public zone 的192.168.0.254
firewall-cmd --add-masquerade 启用伪装
firewall-cmd --zone=public --add-forward-port=port=9527:proto=tcp:toport=80:toaddr=192.168.

 

posted @ 2020-08-16 04:11  专注it  阅读(914)  评论(0编辑  收藏  举报