防火墙

防火墙可以隔离局域网与外网、限制网络互访,以此来保护内部网络

防火墙特点

位置权威性。网络规划中,防火墙必须位于网络的主干线路。只有当防火墙是内外网络之间通信的唯一通道时,才可以全面、有效地保护企业内部的网络安全。

检测合法性。防火墙最基本的功能是确保网络流量的合法性,只有满足防火墙策略的数据包才能进行相应转发。

性能稳定性。防火墙处于网络边缘,是连接网络的唯一通道,时刻都会经受网络入侵的考验,所以其稳定性至关重要。

防火墙种类

传统意义上讲,防火墙大致分为三类,分别是“包过滤”、“应用代理”和“状态检测”。

  1. 包过滤防火墙

    包过滤防火墙检查每一个接受的数据包,查看包中可用的基本信息,如源地址和目的地址、端口号、协议等。然后将这些信息与设立的规则相比较,符合规则的数据包通过,否则将被拒绝。

    现在防火墙使用的包过滤技术基本都属于“动态包过滤”技术,它的前身是“静态包过滤”技术。

    静态包过滤技术是包过滤防火墙的第一代模型,这种技术只能根据预设的过滤规则进行判断,显得有些笨拙。

    动态包过滤技术在保持静态包过滤技术优点的基础之上,增加了对于已经成功与计算机连接的报文传输跟踪,并判断该连接发送的数据包是否会对系统构成威胁,从而有效地组织了有害的数据继续传输。

    与静态包过滤技术相比,虽然动态包过滤技术需要消耗更多的系统资源和时间,但这是目前市场上通用的技术。

  2. 代理防火墙

    代理防火墙接受来自内部网络用户的通信请求,然后建立与外部网络服务器单独的连接,并为每个应用服务建立一个专门的代理。代理防火墙的内外部网络之间的通信不是直接的,都需要经过代理服务器审核,通过审核后再由代理服务器代为连接。

    应用代理技术使用了“应用协议分析”技术,其工作在 OSI 模型的应用层,可以比包过滤技术更有效地检查数据是否存在危害。而且,由于应用代理防火墙工作在应用层,可以实现双向限制,在过滤外部数据的同时还能监控内部网络的数据。

    代理防火墙通常支持的服务有:HTTP、HTTPS/SSL、SMTP、POP3、IMAP、NNTP、TELNET、FTP、IRC。

    虽然应用代理技术比包过滤技术更加完善,但当用户对网络要求比较高时,代理防火墙会成为网络出口的瓶颈。防火墙需要为不同的网络服务建立专门的代理服务,因此也会增加网络延时。

  3. 状态检测技术

    状态检测技术是基于“动态包检测”技术并添加了“状态检测”模块的新技术,它会在不影响网络正常工作的情况下,采用抽取相关数据的方法对网络通信的各个层进行监测,并根据各种过滤规则做出安全决策。

    状态检测技术在每个连接建立时,都会为这个连接构造一个会话状态,里面包含了这个连接数据包的所有信息(比如数据包的头部、协议、地址、端口等信息),以后对该连接的检测都基于这个会话状态进行。并且会话状态的保留时间是有限的,在限制范围内如果没有再进行数据传输,这个会话状态就会被丢弃。

    状态检测技术的优点是能对每个数据包的内容进行监控,一旦建立了一个会话状态,此后的数据传输都要以这个会话状态作为依据。它可以对包的内容进行分析,从而摆脱了传统防火墙仅局限于过滤包头信息的弱点,而且这种防火墙不必开放过多端口,从而进一步杜绝了因开放端口过多带来的隐患。

iptables 简介

Netfilter/iptables IP 信息包过滤系统实际由 netfilter 和 iptables 两个组件构成。Netfilter 是集成在 Linux 内核中的一部分,它的作用是定义、保存相应的规则。Iptables 是一种工具,用以修改信息的过滤规则及其他配置。用户通过 iptables 来设置适合当前环境的规则,而这些规则将会保存在内核空间 netfilter 中。

  1. iptables 工作原理

    netfilter 提供了一系列的表(table),每个表由若干个链(chain)组成,每条链由若干条规则(rule)组成。实际上,netfilter 是表的容器,表是链的容器,链是规则的容器。

    规则(rule)是设置过滤数据包的具体条件,如 IP 地址、端口、协议以及网络接口等信息。

    条件 说明
    Address 数据包内的地址信息,包括源地址(Source Address)、目的地址(Destination Address)和网卡地址(MAC Address)
    Port 数据包内的端口信息,包括源端口(Source Port)、目的端口(Destination Port)
    Protocol 通信协议,包括 TCP、UDP 或者 ICMP 等协议
    Interface 接口,包括封包接收或者输出的网络适配器名称
    Fragment 不同 Network Interface 的网络系统会有不同的封包长度的限制,因此在不同的网络系统间传输数据时,数据包可能会被裁切(Fragment)。此规则针对裁切后的封包信息进行监控和过滤。
    Counter 数据包的数量

    动作(target)是对 netfilter 检测通过的数据包的操作内容。

    动作 说明
    ACCEPT 允许数据包通过
    DROP 丢弃数据包
    REJECT 拒绝数据包,并返回错误信息
    LOG 将数据包信息写入日志
    QUEUE 传送给应用程序处理该数据包

    链(chain)是数据包传递过程中所有规则的组合,规则链通常分为内置链(Build-in Chains)和用户自定义链(User-Defined Chains)。netfilter 常用有五个内置链:

    内置链 说明
    PREROUTING 数据包进入本机,但在进入路由表之前
    INPUT 数据包通过路由表,目的地为本机
    OUTPUT 数据包从本机发出
    FORWARD 数据包通过路由表,目的地不为本机
    POSTROUTING 数据包通过路由表后,发送到网卡接口之前

    表(table)是 netfilter 根据数据包处理需求(过滤、地址转换或信息变更)对链进行的组合,共有三个表:filter、nat 和 mangle。

    filter 是 netfilter 默认的表,通常使用该表进行过滤的设置,其包含 INPUT、FORWARD 和 OUTPUT 内置链,几乎可以设定所有的动作。

    nat 可以修改数据包并完成网络地址转换,包含 PREROUTING、OUTPUT 和 POSTROUTING 链。nat 表仅用于网络地址转换,可转换包的源地址或目标地址,具体的动作包含 DNAT、SNAT 和 MASQUERADE。

    mangle 用于数据包的特殊变更操作,包含所有内置链 PREROUTING、INPUT、FORWARD、OUTPUT 和 POSTROUTING,其支持 TOS、TTL 和 MARK 的操作。

TOS 操作用来设置或改变数据包的服务类型,常用来设置网络上的数据包如何被路由等策略。 TTL 操作用来改变数据包的生存时间,通过让所有数据包共用同一个 TTL 来避免通过 TTL 检测连接网络的主机数量。 MARK 用来给数据包设置标记,并根据不同的标记来决定不同的路由,可用于做宽带限制和基于请求的分类。

iptables 工作流程

Route 1

数据包进入防火墙 -> mangle:PREROUTING -> nat:PREROUTING -> 路由 -> mangle:INPUT -> filter:INPUT -> 本机进程

数据包进入防火墙后,首先进入 mangle 表的 PREROUTING 链并按照设定修改数据包信息,然后进入 nat 表的 PREROUTING 链按照规则进行网络地址转换。

数据包信息修改完成,进入路由,判断数据包是否发送给本机或者向其他网络转发。

发往本机的数据包将进入 mangle 表的 INPUT 链,根据需要修改数据包信息,然后进入 filter 表的 INPUT 链进行数据过滤。

最后通过的数据包将进入本机的处理进程。

Route 2

数据包进入防火墙 -> mangle:PREROUTING -> nat:PREROUTING -> 路由 -> mangle:FORWARD -> filter:FORWARD -> mangle:POSTROUTING -> nat: PSOTROUTING -> 外网

数据包进入防火墙后,首先进入 mangle 表的 PREROUTING 链并按照设定修改数据包信息,然后进入 nat 表的 PREROUTING 链按照规则进行网络地址转换。

数据包信息修改完成后,进入路由,判断数据包是否发送给本机或者向其他网络转发。

转发至其他主机的数据包将进入 mangle 表的 FORWARD 链进行数据包信息的修改,然后进入 filter 表的 OUTPUT 链进行过滤。通过的数据包将依次进入 mangle 表的 POSTROUTING 链和 nat 表的 POSTROUTING 链进行数据包信息的修改和网络地址转换。

最后数据包转发至其他主机。

Route 3

数据在本地封包 -> 路由 -> mangle:OUTPUT -> nat:OUTPUT -> filter:OUTPUT -> mangle:POSTROUTING -> nat:POSTROUTING -> 外网

数据包由本机产生并封包,首先进入路由,然后经过 mangle 表的 OUTPUT 链并进行数据包信息的修改,在进入 nat 表的 OUTPUT 链进行网络地址转换。

数据包信息修改完成,进入 filter 表的 OUTPUT 链进行过滤,通过的数据包将依次进入 mangle 表的 POSTROUTING 链和 nat 表的 POSTROUTING 链进行数据包信息的修改和网络地址转换。

最后数据包发送至外网。

NAT 简介

网络地址转换器(Network Address Translator)位于专用网络和公网之间,用于实现以下功能:

  • 从专用网络内部传出的数据包由 NAT 实现专用地址转换为公网地址

  • 从公网传入的数据包由 NAT 将公网地址转换为专用网络内部的地址

  • 支持多重服务器和负载均衡

  • 实现透明代理

在内网中计算机使用未注册的专用网络 IP 地址,而在外部网络通信时使用注册的公网 IP 地址,大大降低了连接成本。同时 NAT 也可以将内部网络隐藏起来,对外只暴露注册的公网 IP 地址,可以保护内网。

NAT 工作过程

客户机将数据包发给运行 NAT 的计算机,NAT 将数据包中的源 IP 地址和端口号换成已注册的公网 IP 地址(即运行 NAT 的计算机自己的 IP 地址)和端口号,然后将数据包发送给目的主机,同时在映像表中记录一个跟踪信息,以便向客户机发送回答信息。

外部网络发送信息给运行 NAT 的计算机,NAT 将收到的数据包的公网 IP 地址和端口号转换为专用网络的 IP 地址和端口号,并根据映像表中的记录转发给客户机。

NAT 转换对于网络内部的主机和网络外部的主机都是透明的,如同直接通信一般。

NAT 分类

源 NAT(Source NAT, SNAT)指修改第一个包的源 IP 地址,其会在包送出之前的最后一刻做好 Post-Routing 的动作,比如 Linux 中的 IP 伪装(MASQUERADE)。

目的 NAT(Destination NAT, DNAT)指修改第一个包的目的 IP 地址,其会在包进入后立刻进行 Pre-Routing 动作,比如端口转发、负载均衡和透明代理。

代理服务器

  • 工作原理

Route 1

客户端发送 web 请求至代理服务器 -> 代理服务器检查缓存中是否有客户端所需数据 -> 将缓存数据返回给客户端

Route 2

客户端发送 web 请求至代理服务器 -> 代理服务器检查缓存中是否有客户端所需数据 -> 代理服务器请求 web 服务器并将转发至客户端 -> 代理服务器将请求结果保存在缓存中

  • 作用

提高访问速度。代理服务器会将请求结果缓存在本地,所以当再次请求相同内容时,就可以直接从代理服务器的硬盘中读取,提高访问速度。

用户访问限制。所有用户都必须通过代理服务器访问或请求远程站点,因此通过设置代理服务器可以限制用户访问范围。

加强安全性能。使用代理服务器时,所有客户端对外暴露的都是代理服务器的相关信息,而真实的客户端 IP 会被隐藏,可以提高使用者的安全性。