Linux防火墙

基础

概念:防火墙指的是一个由软件和硬件设备组合而成、在和外部网之间、专用网与公共网之间的边界上构造的保护屏障。

功能:防火墙最基本的功能就是隔离网络,通过将网络划分成不同的区域,制定出不同区域之间的访问控制策略来控制不同信任程度区域间传送的数据流。

原理

计算机网络体系结构如下:

按照OSI体系结构对防火墙分两大类:1.网络层防火墙(3、4层)、2.应用层防火墙(7层,WAF:WEB应用防火墙)。

网络层防火墙:主要借助于数据包的五元组(源IP目的IP源端口目的端口协议)进行包过滤 。

网络层防火墙内核层借助于Netfilter框架实现,用户层借助于防火墙工具iptables(四表五链)去操作防火墙。

Netfilter框架

Netfilter是Linux最新一代内嵌于其内核的防火墙框架,可实现数据包过滤、数据包处理、NAT等功能。它功能强大、使用灵活,提供了一个抽象、通用化的框架,该框架所实现的功能之一就是包过滤。

Netfilter是linux下一个通用的框架,由协议栈(如IPv4,IPv6,DECnet等)中处于不同位置的一系列钩子函数构成。下图描述了在IPv4中,一个数据包通过netfilter框架的流程:

为提高数据包检测效率,netfilter实现了状态检测机制,使用内存表记录每个连接的状态信息,也称作“连接跟踪”。对新建的应用连接,状态检测根据预先设置的过滤规则检查数据包的包头,允许符合规则的连接通过,并在内存中记录下该连接的相关信息,生成状态表,对该连接的后续数据包,只要符合状态表就可以通过。这种方式的好处在于:由于不需要对每个数据包进行规则检查,而是一个连接的后续数据包(通常是大量的数据包)通过散列算法,直接进行状态检查,从而使得性能得到了较大提高。

防火墙检测流程如下:

iptables四表五链

  • 四表:filter、nat、mangle、raw

        filter        :过滤规则,根据预定义的规则过滤符合条件的数据包

        nat          :地址转换(在网络层改)

        mangle   :修改数据标记位(在哪一层都有可能改)

        raw         :关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度

        优先级由高到低的顺序为:raw-->mangle-->nat-->filter(如果规则冲突的话)

  •     五链:进路由(PREROUTING)、进系统(INPUT) 、转发(FORWARD)、出系统(OUTPUT)、出路由(POSTROUTING)

四表五链的对应关系:

数据包过滤匹配流程:

iptables工具

iptables实际是一个在netfilter框架上建立的一种工具,使得插入、删除、修改过滤表中的规则变的容易。

  • iptables命令详解

iptables用来设置、维护和检查Linux内核的IP包过滤规则。对数据包处理的动作有:ACCEPT(通过),DROP(删除),QUEUE(排队),RETURN(返回)。

它的命令行参数有很多,主要可分为四类:指定所操作的IP Tables(-t);指定对该表所进行的操作(-A、-D等);规则描述和匹配;对特定规则的目标动作。

格式 : iptables [-t table] command [match] [target] 

[-t table] :选项允许使用标准表之外的任何表。有三种可用的表选项:filter、nat、mangle和raw 。如果未指定,则 filter 用作缺省表。

command:选项告诉 iptables 命令要做什么,例如,插入规则、将规则添加到链的末尾或删除规则。以下是最常用的一些命令:

-A 或 --append:该命令将一条规则附加到链的末尾。
    $ iptables -A INPUT -s 205.168.0.1 -j ACCEPT #该示例命令将一条规则附加到 INPUT 链的末尾,确定来自源地址 205.168.0.1 的信息包可以 ACCEPT。         

-D 或--delete:通过用 -D 指定要匹配的规则或者指定规则在链中的位置编号,该命令从链中删除该规则。下面的示例显示了这两种方法。
    $ iptables -D INPUT --dport 80 -j DROP #该命令从 INPUT 链删除规则,它指定 DROP 前往端口 80 的信息包
    $ iptables -D OUTPUT 3 #该命令只是从 OUTPUT 链删除编号为 3 的规则。

-P 或 --policy:该命令设置链的缺省目标,即策略。所有与链中任何规则都不匹配的信息包都将被强制使用此链的策略。
    $ iptables -P INPUT DROP #该命令将 INPUT 链的缺省目标指定为 DROP。这意味着,将丢弃所有与 INPUT 链中任何规则都不匹配的信息包。

-N 或 --new-chain:用命令中所指定的名称创建一个新链
    $ iptables -N allowed-chain

-X:删除指定的用户创建的链,系统链不能删除
    $ iptables -X user-chain

-F 或 --flush:如果指定链名,该命令删除链中的所有规则,如果未指定链名,该命令删除所有链中的所有规则。此参数用于快速清除。
    $ iptables -F FORWARD
    $ iptables -F

-Z 或 --zero:如果指定链名,该命令将该链上的连接数清零,如果未指定链名,该命令将所有链上的连接数清零。
    $ iptables -Z FORWARD
    $ iptables -Z

-L 或 --list:列出指定链中的所有规则。
    $ iptables -L allowed-chain

[match] :iptables 命令的可选 match 部分指定信息包与规则匹配所应具有的特征(如源和目的地地址、协议等)。匹配分为两大类:通用匹配和特定于协议的匹配。这里,将研究可用于采用任何协议的信息包的通用匹配。下面是一些重要的且常用的通用匹配及其示例和说明:

-p 或 --protocol:该通用协议匹配用于检查某些特定协议。协议示例有 TCP、UDP、ICMP。
    $ iptables -A INPUT -p TCP, UDP
    $ iptables -A INPUT -p !ICMP

-s 或 --source:该源匹配用于根据信息包的源 IP 地址来与它们匹配。该匹配还允许对某一范围内的 IP 地址进行匹配,可以使用 ! 符号,表示不与该项匹配。缺省源匹配与所有 IP 地址匹配。
示例:
    $ iptables -A OUTPUT -s 192.168.1.1
    $ iptables -A OUTPUT -s 192.168.0.0/24
    $ iptables -A OUTPUT -s !203.16.1.89

命令指定该规则与所有来自 192.168.0.0 到 192.168.0.24 的 IP 地址范围的信息包匹配。第三条命令指定该规则将与除来自源地址 203.16.1.89 外的任何信息包匹配。
在上述示例中,这两条命令都执行同一任务 — 它们指定所有 TCP 和 UDP 信息包都将与该规则匹配。通过指定 ! ICMP,我们打算允许所有其它协议(在这种情况下是 TCP 和 UDP),而将 ICMP 排除在外。

-d 或 --destination:该目的地匹配用于根据信息包的目的地 IP 地址来与它们匹配。该匹配还允许对某一范围内 IP 地址进行匹配,可以使用 ! 符号,表示不与该项匹配。
    $ iptables -A INPUT -d 192.168.1.1
    $ iptables -A INPUT -d 192.168.0.0/24
    $ iptables -A OUTPUT -d !203.16.1.89

[target]:我们已经知道,目标是由规则指定的操作,对与那些规则匹配的信息包执行这些操作。除了允许用户定义的目标之外,还有许多可用的目标选项。下面是常用的一些目标及其示例和说明:

ACCEPT:当信息包与具有 ACCEPT 目标的规则完全匹配时,会被接受(允许它前往目的地),并且它将停止遍历链(虽然该信息包可能遍历另一个表中的其它链,并且有可能在那里被丢弃)。该目标被指定为 -j ACCEPT。

DROP:当信息包与具有 DROP 目标的规则完全匹配时,会阻塞该信息包,并且不对它做进一步处理。该目标被指定为 -j DROP。

REJECT:该目标的工作方式与 DROP 目标相同,但它比 DROP 好。和 DROP 不同,REJECT 不会在服务器和客户机上留下死套接字。另外,REJECT 将错误消息发回给信息包的发送方。该目标被指定为 -j REJECT。示例:
$ iptables -A FORWARD -p TCP --dport 22 -j REJECT

RETURN:在规则中设置的 RETURN 目标让与该规则匹配的信息包停止遍历包含该规则的链。如果链是如 INPUT 之类的主链,则使用该链的缺省策略处理信息包。它被指定为 -jump RETURN。示例:
$ iptables -A FORWARD -d 203.16.1.89 -jump RETURN

还有许多用于建立高级规则的其它目标,如 LOG、REDIRECT、MARK、MIRROR 和 MASQUERADE 等。
  • ipset命令详解

ipset提供了内核空间的地址集合,用来存放多个IP地址、子网、地址端口等属性值,一个set对象为单独的属性集合体。

支持set类型:

    list:set    hash:net,iface    hash:net,port    hash:net   
    hash:ip,port,net    hash:ip,port,ip    hash:service  hash:ip,port    
    hash:ip    bitmap:port    bitmap:ip,mac    bitmap:ip

另外提供了用户空间配置工具ipset,方便进行集合对象的创建、添加、删除、查看、销毁等操作

iptables支持对ipset的match及target扩展,用来在规则中对set集合的引用

格式 : ipset [ OPTIONS ] COMMAND [ COMMAND-OPTIONS ]

COMMANDS := { create | add | del | test | destroy | list | save | restore | flush | rename | swap | help | ver-sion | - }

OPTIONS := { -exist | -output { plain | save | xml } | -quiet | -resolve | -sorted | -name  |  -terse  |  -file filename }

    ipset create SETNAME TYPENAME [ CREATE-OPTIONS ]
    ipset add SETNAME ADD-ENTRY [ ADD-OPTIONS ]
    ipset del SETNAME DEL-ENTRY [ DEL-OPTIONS ]
    ipset test SETNAME TEST-ENTRY [ TEST-OPTIONS ]
    ipset destroy [ SETNAME ]
    ipset list [ SETNAME ]
    ipset save [ SETNAME ]
    ipset restore
    ipset flush [ SETNAME ]
    ipset rename SETNAME-FROM SETNAME-TO
    ipset swap SETNAME-FROM SETNAME-TO
创建一个ipv4地址集合

ipset –N test hash:ip  --family inet --hashsize  1024  --timeout 3600

#添加地址到集合
    ipset –A test 10.0.7.254
    ipset –A test 10.0.11.210

#从集合中删除地址
    ipset –D test 10.0.7.254

#清除set集合
    ipset –F test

#销毁set集合
    ipset –X test

#iptables使用
    iptables –A FORWARD –p tcp –dport 8000 –m set --match-set  test src|dst –j ACCEPT  

创建一个与地址类型无关的service集合
    ipset –N service hash:service --family inet --hashsize  1024

#添加服务到集合
    ipset –A service tcp:80-8080
    ipset –A service udp:8000
    ipset –A service icmpv6:128

#从集合中删除服务
    ipset –D service udp:8000

#清除set集合
    ipset –F service

#销毁set集合
    ipset –X service

#iptables使用
    iptables –A FORWARD –p tcp –dport 8000 –m set --match-set  service src|dst –j ACCEPT  

创建一个与地址类型无关的list集合
    ipset –N list list:set - -size 512

#创建地址成员地址
    ipset -N ipv4 hash:net –family inet
    ipset –A ipv4 10.0.7.0/24
    ipset –N ipv6 hash:ip –family inet6
    ipset –A ipv6 2012::102

#添加地址成员到liset
    ipset –A  list ipv4
    ipset –A list ipv6

#清除set集合
    ipset –F list

#销毁set集合
    ipset –X list

#iptables使用
    iptables –A FORWARD –p tcp –dport 8000 –m set --match-set  list src|dst –j ACCEPT

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值