欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux -- 防火墙

程序员文章站 2022-07-12 16:54:18
...

防火墙

防火墙类型

  • 入侵检测(IDS)不阴断网络访问进行网络的检测,协助IPS进行工作
  • 入侵防御(IPS)以透明模式分析数据内容,进行有效的防御数据攻击
  • 防火墙 (隔离功能)

防火墙的分类

  • 主机防火墙
    • 服务于当前主机的
  • 网络防火墙
    • 服务于一定范围的网络
  • 硬件防火墙
    • 大部门公司都采用了硬件防火墙,服务于一定范围的网络
    • 优点:处理速度快,专用的防火墙设备
    • 缺点:价格贵
  • 软件防火墙
    • 运行于通用硬件平台之上的防火墙软件
  • 网络层防火墙
    • 适用于OSI 下三层或四层的网络层防火墙
    • 包过滤防火墙,制定ACL 进行数据的源地址及目的地址过滤
    • 优点:过滤目的明确,处理速度快,便于维护。
    • 缺点:数据内容无法进行过滤。
  • 应用层防火墙

    • 应用于OSI七层的防火墙

    Linux-防火墙

    Linux的防火墙已经集成到Linux的内核中,使用的是Netfilter 组件。内核中选取了五个位置进行出入站的规则定义点,这五个点俗称勾子(hook)或链 ,三种报文的流向以及对报文流向处理的四张表

  • 五个勾子

    • INPUT
    • OUTPUT
    • FORWARD
    • PREROUTING
    • POSTROUTING
  • 三种报文流向

    • 入站:PREROUTING –> INPUT –> 进程处理
    • 出站:进程处理 –> OUTPUT –> POSTROUTING
    • 转发:PREROUTING –> FORWARD –> POSTROUTING
      Linux -- 防火墙
  • 四表 :作用在上图三种报文流向的规则库
    • filter
      • 作用在:INPUT , FORWARD , OUTPUT
    • nat
      • 作用在:PREROUTING , POSTROUTING , OUTPUT , INPUT
    • mangle
      • 作用在:PREROUTING , POSTROUTING , INPUT , OUTPUT , FORWARD
    • raw
      • 作用在:PREROUTING , OUTPUT
  • 规则rule的定义,对匹配到的报文进行处理,处理的方式有定义
    • 内建的处理动作:ACCEPT , DROP , REJECT , SNAT , DNAT , MASQUERADE , MARK , LOG …
    • 自定义处理动作: 自定义chain(链)
    • 规则要添加在链上才生效,添加在自定义上不会自动生效
  • 链chain

    • 内置链:每个内置链对应一个勾子
    • 自定义链:用于对内置链进行扩展补充,只有HOOK勾子调用自定义链才生效。
      Linux -- 防火墙
  • 对应的Linux 系统防火墙及命令

    • CentOS 7 firewalld.service , iptables

    • CentOS 6 iptables

    • 对应的命令
      • -t table —-表示表名,默认是filter表
      • -N : new 自定义一条新的规则链
      • -X :delete ,删除自定义的空规则链 (如自定义链被跳用,先清除跳用再清)
      • -P :设置默认策略,ACCEPT , DROP ,REJECT,
      • -E :重命名自定义链
      • -L :list ,列出指定链上的所有规则
      • -n :numberic 以数字格式显示地址和端口号
      • -v :verbose , 详细信息
      • -vv : 更详细信息
      • -x :显示计数器结果的精确值,而非单位转换后的易读值
      • –line -numbers :显示规则的序号
      • -S :命令格式显示链上规则
      • -A :append , 追加
      • -I :插入,要指明插入至的规则编号,默认为第一条
      • -D:delete 删除 1,指明规则序号 2,指明规则本身
      • -R :替换指定链上的规则
      • -F :清空指定的规则链 默认清空INPUT
      • -Z :置零
    • 匹配条件

      • (1). 基本匹配条件,无需加载模块
        • [!] -s , –source address[/mask][,…]; 源IP地址或规定一定范围
        • [!] -d , –destination address[/mask][,…]:目标IP地址或规定一定范围
        • [!] -p , –protocol protocol : 指定协议,0表示所有(all)
        • [!] -i ,–in-interface name :报文入站口
        • [!] -o,–out-interface name:报文出站口
      • (2). 扩展匹配条件,需要加载模块
      • [!] -p tcp
        • [!]–source-port , –port port[:port]:匹配报文源端口,可指定端口范围
        • [!]–destination-port , –dport port[:port]:匹配报文目标端口,可指定范围
        • [!]–tcp-flags mask comp 匹配三次挥手的报文形式
        • 例: iptables -A INPUT -p tcp –tcp-flags SYN,ACK,FIN,RST SYN -j REJECT
        • [!] –syn : 用于匹配第一次握手
      • [!] -p udp
        • [!]–source-port , –port port[:port]:匹配报文源端口,可指定端口范围
        • [!]–destination-port , –dport port[:port]:匹配报文目标端口,可指定范围
      • [!] -p icmp

        • [!] –icmp-type {type[/code]|typename}
          • type/code
            • 0/0 echo-reply –> icmp 应答
            • 8/0 echo-request –>icmp请求
      • 显示扩展:必须使用-m选项指明要调用的扩展模块的扩展机制,要手动加载扩展模块

        • [ -m matchname [ per-match-options ]]
    • 处理动作:

      • -j targetname [per-target-options]
        • 简单,ACCEPT,DROP
        • 扩展:REJECT , REDIRECT , RETURN , LOG , MARK , DNAT , SNAT , MASQUERADE

示例–做用在filter表上

1.multiport扩展的使用–以离散方式定义多个端口,最多15个
用法:

  • [!] –source-ports,–sports port[,port|,port:port]…
  • [!] –destination-ports,–dports port[,port|,port:port]..
  • [!] –ports port[,port|,port:port]…多个源或目标端口
[root@localhost ~]#iptables -A INPUT -s 192.168.3.0/24 -d 172.18.0.0/16 -p tcp -m multiport --dports 20:25,80 -j ACCEPT 

2.iprange扩展的使用 – 指明连续的IP地址范围
用法:

  • [!] –src-range from[-to] 源IP地址范围
  • [!] –dst-range from[-to] 目标IP地址范围

    “`
    [aaa@qq.com ~]#iptables -A INPUT -d 192.168.3.0/24 -p tcp –dport 80 -m iprange –src-range 192.168.3.2-192.168.3.11 -j DROP

3.mac扩展 – 指明源MAC地址
用法:

  • [!] –mac-source MAC
iptables -A INPUT -s 192.168.3.10 -m mac --mac-source 00:0c:29:fd:e7:45 -j REJECT

4.string扩展– 对报文中的应用层数据做字符串匹配检测
用法:

  • –algo {bm|kmp} :字符串匹配检测算法
    • bm: Boyer-Moore
    • kmp:knuth-pratt-morris
  • –for offset 开始偏移
  • –to offset 结束偏移

[!] –string pattern:要检测的字符串模式
[!] –hex-string pattern:要检测字符串模式, 16进制格式

[root@localhost html]#iptables -A OUTPUT -s 192.168.3.3  -p tcp --sport 80 -m string --algo bm --string "test" -j REJECT    作用在出口勾子上,因为是3.3的回应包,没明确指定目标地址就是所有地址

5.time扩展–根据将报文到达的时间与指定的时间范围进行匹配
用法:

  • –datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期
  • –datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
  • –timestart hh:mm[:ss] 时间
  • –timestop hh:mm[:ss]
  • [!] –monthdays day[,day…] 每个月的几号
  • [!] –weekdays day[,day…] 星期几
  • –kerneltz:内核时区,不建议使用, CentOS7系统默认为UTC(注意: centos6 不支持kerneltz , –localtz指定本地时区(默认))
    “`
    [aaa@qq.com ~]#iptables -A INPUT -s 192.168.3.2 -d 192.168.3.3 -p tcp –dport 80 -m time –timestart 00:30 –timestop 23:30 –weekdays Thu -j DROP

6.connlimit扩展–根据每个IP做并发连接数量匹配
用法:

  • –connlimit-upto n:连接的数量小于等于n时匹配
  • –connlimit-above n:连接的数量大于n时匹配

    [aaa@qq.com ~]#iptables -A INPUT -s 192.168.3.2 -p tcp --dport 22 -m connlimit --connlimit-above 1 -j REJECT 

    7.limit扩展–基于收发报文的速率做匹配
    用法:

  • –limit rate[/second|/minute|/hour|/day]

  • –limit-burst number
[root@localhost ~]#iptables -A INPUT -s 192.168.3.2 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT 
[root@localhost ~]#iptables -I INPUT 2 -p icmp -j REJECT

8.state扩展–根据“连接追踪机制”去检查连接的状态
conntrack的几种状态:

  • NEW :新发出的请求,连接追踪信息库中不存在此连接的
    相关信息条目,因此,将其识别为第一次发出的请求
  • ESTABLISHED:NEW状态之后,连接追踪信息库中为
    其建立的条目失效之前期间内所进行的通信状态
  • RELATED: 新发起的但与已有连接相关联的连接,如:
    ftp协议中的数据连接与命令连接之间的关系
  • INVALID : 无效的连接,如flag标记不正确
  • UNTRACKED : 未进行追踪的连接,如raw表中关闭追踪

用法:

  • [!] –state state
[aaa@qq.com ~]#iptables -A INPUT -s 192.168.3.2 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j REJECT

示例–做用在NAT表上

使用在NAT表上的链有:PREROUTING , INPUT , OUTPUT , POSTROUTING
SNAT: 内网地址进行转换,和外网进行通迅的转换过程,我们称之为SNAT;SNAT是修改源地址
DNAT:本局外网地址映射至本局内网地址,我们称之为DNAT;DNAT是修改目标地址
PNAT: 内网地址转换为外网地址加端口号

SNAT示例:SNAT:固定IP
–to-source [ipaddr[-ipaddr]][:port[-port]]
–random

测试:
条件:三台linux虚拟机
描述:A机器,内网地址:192.168.3.2 充当内网客户机
     B机器,内网地址:192.168.3.3 外网地址:172.18.6.50 用防火墙使用
     C机器,外网地址:172.18.6.51 充当外网的website

操作:
A:设置默认路由,下一跳地址是192.168.3.3
B:设置防火墙SNAT的转换,转换地址为172.18.6.50
C:配置下HTTPD的服务 无需设置路由

A的配置
[aaa@qq.com ~]#route add default gw 192.168.3.3
[aaa@qq.com ~]#route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.3.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0         192.168.3.3     0.0.0.0         UG    0      0        0 eth0

B的配置
[aaa@qq.com ~]#iptables -t nat -A POSTROUTING -s 192.168.3.0/24 ! -d 192.168.3.0/24 -j SNAT --to-source 172.18.6.50

操作结果:

A访问C的website
[aaa@qq.com ~]#curl -I 172.18.6.51
HTTP/1.1 200 OK
Date: Sat, 21 Oct 2017 03:27:25 GMT
Server: Apache/2.4.6 (Red Hat Enterprise Linux)
Last-Modified: Sat, 21 Oct 2017 03:26:13 GMT
ETag: "1d-55c0626cb7f3b"
Accept-Ranges: bytes
Content-Length: 29
Content-Type: text/html; charset=UTF-8

ping包
[aaa@qq.com ~]#ping 172.18.6.51
PING 172.18.6.51 (172.18.6.51) 56(84) bytes of data.
64 bytes from 172.18.6.51: icmp_seq=1 ttl=63 time=0.672 ms
64 bytes from 172.18.6.51: icmp_seq=2 ttl=63 time=0.818 ms
64 bytes from 172.18.6.51: icmp_seq=3 ttl=63 time=0.426 ms
64 bytes from 172.18.6.51: icmp_seq=4 ttl=63 time=0.532 ms

SNAT示例:SNAT:MASQUERADE:动态IP,如拨号网络
–to-ports port[-port]
–random

测试:条件如上,只是B机器的外网地址IP随机修改
B的配置
[root@localhost ~]#iptables -t nat -A POSTROUTING -s 192.168.3.0/24 ! -d 192.168.3.0/24 -j MASQUERADE

DNAT示例:外网映射内网IP及端口
–to-destination [ipaddr[-ipaddr]][:port[-port]]

测试:条件如上,这次我们使用172.168.6.50:80的地址及端口映射至内网192.168.3.2:80的地址端口

B的配置:
[aaa@qq.com ~]#iptables -t nat -A PREROUTING -d 172.18.6.50 -p tcp --dport 80 -j DNAT --to-destination 192.168.3.2:80

C使用curl 172.18.6.50得出的结果
[aaa@qq.com ~]# curl 172.18.6.50
this is A website

补充内容:CentOS 7 的防火墙新出了个管理服务firewalld 有图形界面操作工具:firewall-config 也有命令行工具:firewall-cmd 。firewalld与iptables 两者如需使用只能选择其一