万字讲解OpenWrt防火墙iptables,并使用UCI配置防火墙

一、防火墙简介

  • “防火墙”(Firewall)术语来自建筑设计领域,是指用来起分割作用的墙,当某一部分 着火时可以减缓或保护其他部分免受火灾影响。在计算机网络中,防火墙是在两个或多个 网络之间用于设置安全策略的一个或多个系统的组合。防火墙起到隔离异常访问的作用, 仅允许可靠的流量通过,从而保护了家庭和企业内部网络信息的安全。
  • 下图是一 个典型的防火墙部署结构。

  • Linux防火墙通常包含两部分,分别为:
    • iptables。
    • netfilter。

二、iptables防火墙工具简介

  • iptables是用C语言实现的,最新版本是1.4.21,并以GNU许可协议发布。它实际上包含两部分:内核netfilter和用户空间工具 iptables。
  • 管理员通过iptables工具集和内核打交道,将防火墙规则写入内核中。内核netfilter执行报文过滤规则。
  • iptables是Linux管理防火墙规则的命令行工具,处于用户空间。netfilter执行报文过滤,处于Linux内核空间。有时候也会用 iptables 来统称Linux防火墙。
  • iptables 是一个报文状态检测防火墙,这意味着防火墙内部存储每一个连接的信息,并且可以将每一个报文关联到它所属的连接。这个信息非常有用,它用于自动打开响应报文的传输路径,因此在创建防火墙规则时,通常没有必要创建相反方向的防火墙规则,防火 墙将自动计算出这个规则。

三、iptables中的表

  • iptables根据功能划分不同的表来处理不同的功能逻辑,当前包含5个表,分别为filter、nat、mangle、raw和security。

filter(过滤表)

  • filter是iptables的默认表,主要用于报文过滤,在这里根据报文的内容对报文进行丢 弃或者接收。
  • 它包含有 3 个内置规则链:
    • ①INPUT输入链:处理目标地址为本机 IP 地址的报文。
    • ②OUTPUT输出链:处理本机 IP 地址产生的报文。
    • ③FORWARD转发链:处理经过本机路由的报文。
  • 这样每一个IP报文只经过这3个内置链中的一个,便于进行数据报文匹配和处理。 这里是真正实现防火墙处理的地方。
  • 注意:
    • ①经过本机转发的报文经过 FORWARD 链,不经过 IPPUT 链和 OUTPUT 链。
    • ②本机产生的报文经过 OUTPUT 链,其他的链不经过。
    • ③去往主机的报文经过该主机的 INPUT 链,其他的链不经过。

nat(网络地址转换表)

  • nat用来完成源/目的地址和端口的转换,当一个报文在创建一个新的连接时进入该表。
  • 它也有3个内置规则链:
    • ①PREROUTING:用于修改到来的报文,只用来做网络地址转换。
    • ②OUTPUT:用于修改本机产生的并且在路由处理之前的报文。
    • ③POSTROUTING:用于修改准备出去的报文的地方。
  • 通过目的地址转换,你可以将服务器放在防火墙后面,并使用私有 IP 地址。一些协 议通过 nat 转换有困难(例如 FTP 或 SIP),连接跟踪将打开这些协议的数据/媒体流路径。nat 表不能用于报文过滤和报文修改,因为每一个连接流仅有一次机会进入该表中的规则链。
  • 网络地址转换在路由功能前后都可能发生,源地址转换是在数据包通过路由之后在 POSTROUTING 规则链进行地址转换。目的地址转换是在路由之前,在 PREROUTING 规 则链进行地址转换。

mangle(修改表)

  • 这个表主要用来进行报文修改。
  • 有5个内置规则链:
    • ①REROUTING:针对到来的报文,在路由之前修改的地方。
    • ②INPUT:针对目的地址为网关本身的报文。
    • ③FORWARD:针对通过网关路由转发的报文。
    • ④POSTROUTING:将要发送出去的报文的地方。
    • ⑤OUTPUT:本机产生报文在路由之前修改的地方。
  • 通常使用该表进行报文修改,以便进行 QoS 和策略路由。通常每一个报文都进入该表,但不使用它来做报文过滤。

raw(原始表)

  • 这个表很少被用到,主要用于配置连接跟踪相关内容,在 ip_conntrack 之前调用。
  • 它提供了两个内置规则链:
    • ①PREPROUTING:到达本机的报文。
    • ②OUTPUT:本机进程产生的报文。
  • 这里是能够在连接跟踪生效前处理报文的地方,你可以标记符合某种条件的报文不被 连接跟踪处理。一般很少使用。

security表

  • 这个表用于安全Linux的防火墙规则,是iptables最近的新增 表,在实际项目中还很少用到。

四、处理目标

  • 防火墙规则检测报文的特征是否符合规则,如果匹配,就进入规则的处理目标(TARGET)中。如果报文不匹配则进入该规则链的下一条规则进行检测。就这样逐条规则进行比较,直到整个规则链比较完成

系统内置的4种处理方式

  • ACCEPT(接收):表示让这个报文通过。
  • DROP(丢弃):表示将这个报文丢弃。详细的介绍可以看下面的REJECT处理介绍。
  • QUEUE(入队):表示把这个报文传递到用户空间的队列中。
  • RETURN(返回):表示停止这条规则链的匹配,返回到调用这个规则链的上一条 规则链的规则处执行。如果到达了一个内建的规则链的末端,或者遇到内置链的 规则目标是 RETURN,报文的命运将由规则链指定的默认目标处理方式决定。
  • 还有其他扩展的目标处理方式,例如REJECT、DNAT、SNAT、MASQUERADE、LOG和 REDIRECT等。

REJECT(拒绝)

  • 概念:REJECT 和 DROP 一样丢弃报文。
  • 特点:但REJECT 的不同之处在于同时还向发送者返回一 个ICMP错误消息。这样发送者将知道报文被丢弃,如果发送端检测到返回的错误信息, 将不再尝试发送报文,这样可以在特定条件下减少发送端重发报文。
  • 例如:禁止访问主机上80端口的服务,访问者将收到端口不可达的ICMP消息。
iptables -A IPNUT -p tcp --dport 80 -j REJECT
  • DROP和REJECT含义的比较:
    • DROP 和 REJECT 报文,许多人选择丢弃报文,因为其安全优势超过拒绝,因为这样 暴露给攻击者的信息较少,然而在调试网络问题时会遇到困难,应用程序也不知所措。
    • 如果报文被 REJECT:路由器将响应一个 ICMP 目的端口不可达消息,这样连接将立即失 败。这意味着每一个试图连接特定端口都会有 ICMP 响应报文产生。如果有大量的访问或攻 击,这样做会有大量的 ICMP 消息产生,导致占用所有的带宽而合法的连接不可用(DOS)。
    • 当使用DROP时:客户端不知道报文被丢弃,会继续使用重传机制来发送报文,直到 连接超时。具体行为依赖于客户端软件的实现,这将导致程序挂起等待超时,然后才会继续执行。
  • DROP和REJECT利弊如下:
  • DROP:
    • 信息暴露较少。
    • 攻击面减少。
    • 客户软件可能无法很好地处理它(程序挂起直到连接超时)。
    • 可能使网络调试复杂化(报文丢弃,不清楚导致问题出现的原因,可能是路由器 的问题,或者报文丢失)。
  • REJECT
    • 暴露了防火墙的 IP 地址信息(例如流量被实际阻挡的 IP)。
    • 客户端软件能立即从拒绝连接尝试中恢复过来。
    • 网络调试更容易(路由和防火墙问题可以清晰地区分出来)。

DNAT(目的网络地址转换)

  • 特点:当你的局域网内的多个服务器需要对互联网的机器提供服务时,你就会用到这个目标处理方式。这个目标是用来实现目的网络地址转换的,就是重写报文的目的IP地址。如果一个报文被匹配了,那么和它属于同一个流的所有报文都会被自动转换,然后就可以被路由到正确的主机或网络。
  • 这个处理目标仅可以用在nat表中的PREROUTING和OUTPUT链以及被这些链调用的自定义链中。
  • 例如:将访问路由器的80端口的流量重定向到192.168.6.100上:(这样Web服务器就可以搭建在局域网的主机(192.168.6.100)上对外提供服务,处理流程如下)。
    • ①报文进入防火墙之后,将目标地址修改为 192.168.6.100,然后离开防火墙到达 HTTP 服务器。
    • ②HTTP 服务器处理完成后,将源地址改为目标地址,使用自身 IP 作为源地址发送 报文。
    • ③ 防火墙收到响应报文后将报文的源地址转换为防火墙的出接口地址,然后返回给 请求方。整个通信流程完成。
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.6.100

SNAT(源网络地址转换)

  • 这是另外一种网络地址转换方式。
  • 仅仅在nat表的POSTROUTING和INPUT链,以及和被这些链调用的自定义链中可以使用。
  • 它指定报文的源地址将被修改,它至少需要一 个参数-源地址,报文的源地址将被指定地址替换。此连接的后续报文并不进入该规则中, 连接中的报文源IP均被自动替换。
  • 设置参考命令如下:
iptables -t nat -A POSTROUTING –s 192.168.6.0/24 –o eth0 \
-j SNAT --to-source 10.0.2.15
  • 这个目标处理方式经常用于仅有少量固定 IP 地址上网的情形,局域网的私有地址在 访问因特网时,源地址被路由器外网地址替换。

MASQUERADE(伪装)

  • MASQUERADE是最常用的处理目标,因为大多数情况下,路由器并没有一个固定的IP 地址。我们的路由器是通过 PPPoE 拨号上网或者是通过DHCP自动分配的 IP 地址。这 个处理目标和SNAT处理目标作用是一样的,区别就是它不需要指定源地址。
  • MASQUERADE是被专门设计用于那些动态获取IP地址的连接,比如拨号上网、DHCP连接等。
  • 如果你有固定的IP地址,还是用SNAT处理目标,这样可以节省计算资源。
  • MASQUERADE只能用于nat表的POSTROUTING链。
  • 例如:局域网来自192.168.6.0网络的报文通过MASQUERADE进行源地址转换。
iptables -t nat -A POSTROUTING –s 192.168.6.0/24 –o eth0 -j MASQUERADE

LOG

  • 为匹配的报文开启内核记录。
  • 当在规则中设置了这一选项后,Linux内核会通过printk函数打印一些关于匹配包的信息,然后通过syslog机制记录在日志文件中。该处理目标并非最终目标,处理完成后,报文还会接着进入下一条规则继续匹配。
  • 有以下几个选项可以设置:
    • --log-level:日志级别。
    • --log-prefix:prefix 在记录 log 信息前加上的特定前缀:最多 14 个字母长,用来和 日志中其他信息区别。
    • --log-tcp-sequence:记录 TCP 序列号。
    • --log-tcp-options:记录 TCP 报文头部的选项。
    • --log-ip-options:记录 IP 报文头部的选项。

REDIRECT

  • 只适用于nat表的PREROUTING和OUTPUT链,以及它们调用的用户自定义链。
  • 修改报文的目标IP地址来发送报文到机器自身(本地生成的报文被设置为地址127.0.0.1)。经常用于HTTP代理,例如将80端口的HTTP请求重定向到SQUID的3128端口。
  • 它包含一个选项:
--to-ports []
  • 指定使用的目的端口或端口范围。不指定的话,目标端口不会被修改。只能用于指定了TCP或UDP的规则。
  • 注意,iptables中的所有表都是小写字母表示,内置规则链均大写字母表示,所有处理目标均以大写字母表示。

五、接收报文处理流程

  • iptables有5个表,每一个表中又有几个不同的链,不同的表中有相同名称的规则链, 但这些规则链处理的任务是不同的。报文按照预定的流程来顺序进入到各个规则链中。
  • 同一名称规则链根据表的先后顺序进入,进入顺序依次是 raw、 mangle、filter 和 nat。

总体流程

  • 报文处理流程如下图所示:
  • 报文从网络来的,首先进入到 PREROUTING 链中进行处理,再对目标 IP 地址进行判 断,如果目标 IP 地址和本机相同就会把报文转到 INPUT 链,再转到应用程序。如果报文 的 IP 地址和本机不同,则是转发报文,进入 FORWARD 链,再经过 POSTROUTING 链发出报文。

详细步骤

  • (1)首先网卡从网络上收到 IP 报文。
  • (2)报文进入 raw 表的 PREROUTING 链。 这里能够在连接跟踪生效前对报文进行处理, 你可以标记某种类型的报文不被连接跟踪处 理。一般很少使用。
  • (3)报文进入到连接跟踪处理。这里是收 到报文进行连接跟踪处理的位置。
  • (4)报文进入到 mangle 表的 PREROUTING 链。这里是报文进入网关之后、路由之前修改 报文的地方。
  • (5)报文进入到 nat 表的 PREROUTING 链。在这里我们做目的地址转换(DNAT)。这 里不能用于报文过滤,因为每一个连接数据流 仅第一个报文进入到这里。
  • (6)进行路由决策,因为前面的 mangle 和 nat 表可能修改了报文的 IP 地址信息。
    • 如果目标地址为网关,则直接进入到 INPUT 链 中。
      • 报文进入到 mangle 表的 INPUT 链。这里是报文进入网关时修改报文的地方,在 这里做报文过滤是不被推荐的,因为它可能有副作用。通常也很少修改报文。
      • 报文进入到 filter 表的 INPUT 链。这里是对收到报文做过滤的地方,然后将报文 转到应用程序。
    • 如果和本机地址不同,则是进入路由转发。
      • 对于转发报文进入到 mangle 表的 FORWARD 链。这里是对转发报文进行修改的地方。
      • 报文进入到 filter 表中的 FORWARD 链,对转发报文进行过滤。这里是唯一适合 对转发报文过滤的地方。所有的转发报文均经过这个规则链。
      • 报文进入到 mangle 表的 POSTROUTING 链。这条链可能被两种报文遍历,一种 是转发的报文,另外就是本机产生的报文。这个链通常很少使用。
      • 报文进入到 nat 表的 POSTROUTING 链。在这里我们做源地址转换(SNAT)。 这里不能用于报文过滤,因为每一个数据 流仅有第一个报文进入到这里。
      • 最后经过网卡发送报文。

六、发送报文的处理流程

  • 如果是本机应用程序发送报文则在 netfilter 中是另外的处理流程。
  • 如下图所示。报文则首先通过OUTPUT链,然后经过POSTROUTING链再发送报文。网络报文在各个表中的规则链中流动,按照 raw、 mangle、filter和nat表的顺序依次进行匹配。

详细步骤

  • (1)首先本地进程产生报文,并进行 路由选择,选择源 IP 地址及出接口设备。 如果没有找到路由将直接返回失败。
  • (2)进入 raw 表 OUTPUT 链。这里是 能够在连接跟踪生效前处理报文的地方, 你可以标记某种类型的报文不被连接跟踪处理。一般很少使用。
  • (3)连接跟踪。这里是本地发出报文进行连接跟踪处理的位置。
  • (4)进入到 mangle 表的 OUTPUT 链。这里是我们修改报文的地方。不推荐在这里做 报文过滤,因为它可能有副作用。
  • (5)进入到 nat 表 OUTPUT 链。这里对于本机发送的报文做目的地址转换(DNAT)。 不能用于过滤,因为每一个数据流仅第一个报文进入到这里。
  • (6)进入路由决策。因为前面的 mangle 和 nat 表可能修改了报文的 IP 地址信息。
  • (7)进入到 filter 表的 OUTPUT 链。对本机发出报文做过滤的地方。
  • (8)进入到 mangle 表的 POSTROUTING 链。这条链可能被两种报文遍历,一种是转 发的报文,另外就是本机产生的报文。
  • (9)进入到 nat 表的 POSTROUTING 链。在这里我们做源地址转换(SNAT)。这里 不 能用于报文过滤,因为每一个数据流仅有第一个报文进入到这里。
  • (10)在网卡接口上发出报文,报文离开主机。

七、报文匹配规则

  • 防火墙规则用于匹配报文,有多种匹配报文特征的方法,常见的有根据数据链路层、 IP 层及传输层特征进行匹配,甚至可以根据应用层特征进行匹配,例如用户、域名以及内 容匹配等。

MAC地址

  • MAC 地址过滤用于匹配报文以太网卡的物理地址。必须是 XX:XX:XX:XX:XX:XX 这样 的格式。它只对来自以太网设备并进入 PREROUTING、FORWORD 和 INPUT 链的报文有 效。注意:MAC 地址过滤只对源 MAC 地址有效。
  • 格式为:-m mac --mac-source [!] address。
  • 如下面所示的规则将丢弃来自指定 MAC 的报文。
iptables -I INPUT -m mac --mac-source 28:D2:44:15:D5:A4 -j DROP

IP层匹配

  • 常用的有协议、源 IP 地址和目标 IP 地址,经常和传输层的端口一起使用。
  • -p 用于匹配 IP 层报头所指定的传输层协议。常见的协议为 TCP、UDP、IGMP、ICMP 或者 ALL,等等。也可以是一个数字,数字代表的协议在文件/etc/protocols 描述。数字零 表示所有协议。例如禁止 UDP 5060 报文通过命令如下:
iptables -A FORWARD -p UDP --m udp dport 5060 -j DROP
  • s 和-d 用于匹配 IP 报文的源和目标 IP 地址。IP 地址可以是网络地址、主机名或具体 的 IP 地址。如果是主机名,在插入到内核之前将被解析为 IP 地址。网络掩码长度是指 IP 地址左边“1”的个数。例如 24 表示 255.255.255.0。例如禁止 192.168.1.0 网段访问本机的 设置命令如下:
iptables -A INPUT -s 192.168.1.0/24 -j DROP

owner模块

  • owner 模块用于匹配报文发起者,用于本机进程产生的报文,一般为用户或用户组 ID。 这些规则仅可以在 OUTPUT 和 POSTROUTING 链中使用。转发的报文不会匹配到任何的用 户信息,内核线程产生的报文也没有所有者,例如 ICMP 信息。这在一些严格限制仅限定用 户进程可以通过的场合使用,每一个进程一个用户,这样可以非常方便地对进程加以区分。
  • 例如,允许 1002 用户进程的报文通过:
iptables -I OUTPUT -m owner --uid-owner 1002 -j ACCEPT

接口匹配

  • 模块提供了根据报文的出入接口来匹配的方法,如果不限定接口,规则将匹 配所有的网卡接口网络。可以通过以下方法来设置匹配接口
  • -i [name]:这是报文经由该接口接收的流入接口名称,报文通过该网卡接口接收 (在规则链 INPUT、FORWORD 和 PREROUTING 中进入的报文)。
  • -o [name]:这是报文经由该接口发出的流出接口名称,报文通过网卡该口发送(在 规则链 FORWARD、OUTPUT 和 POSTROUTING 中送出的报文)。
  • 当在接口名称前使用“!”修饰后,指的是不为该接口的报文,如果接口名后面加上“+”, 则所有以此接口名开头的接口都会被匹配。如果不指定这个选项,那么将匹配任意网卡接 口的报文。

conntrack连接跟踪

  • conntrack连接跟踪是有状态防火墙的核心机制,用于存取这个报文的连接跟踪状态来 计算匹配返回的报文。state是连接跟踪的子集,用于存取连接跟踪的报文状态。
  • 可选的状态列表如下:
    • NEW:这个报文开始新的连接,是连接建立的第一个报文。例如 TCP 连接的第一 个请求报文。
    • ESTABLISHED:连接建立,这个报文关联的连接已经在双方向看到报文。
    • RELATED:这个报文开始新的连接,但是关联到一个已存在的连接上,例如一个 FTP 数据传输或者一个 ICMP 错误。
    • UNTRACKED:这个报文没有连接跟踪,如果你在 raw 表中使用-j CT -notrack 进 行了设置。
    • INVALID:这个报文没有关联到已知的连接。例如收到不属于已有连接的 ICMP 错误信息。
  • 可以和任何网络协议一起来使用 iptables 连接跟踪的状态功能,状态功能支持 TCP、 UDP 和 ICMP 协议。下面的例子使用连接跟踪来只转发与已建立连接相关的分组报文,这 种情况通常是禁止转发广域网的直接发起请求报文,这样就可以只用加入一条规则来允许 局域网指定协议可以通过。
iptables -A FORWARD -i eth0 -m state --state ESTABLISHED,RELATED -j
ACCEPT
  • iptables 还支持很多扩展模块,例如 connlimit,用于限制并行连接数等。

八、管理防火墙规则

  • iptables 工具提供了管理防火墙规则的功能,以下将介绍增加、删除、查看规则功能 如何使用。
iptables [-t table] {-A|-C|-D} chain rule-specification
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
  • 一个防火墙规则包含报文匹配规则和处理目标,处理目标在上面已经讲述,匹配规 则用于检测报文是否符合该规则标准。一般根据报文的 IP 特征进行匹配,典型根据报文 协议、IP 地址和端口进行匹配,在上面已经讲述。

命令

  • -A --append:将防火墙规则增加到所选规则链的末尾。
  • -D --delete:在指定的规则链中删除规则。可以通过指定规则号来删除,也可以通 过规则匹配来删除。规则编号是指规则在规则链中的顺序号,顺序号从 1 开始增加。
  • 注意:规则在规则链中的规则编号不是固定的,如果删除前面的规则,则后面的规则 自动往前移动。
  • -I,--insert chain [rulenum] rule-specification:插入到规则链中的指定位置,如果不 指定插入位置,则插入到规则链的第一个位置处。
  • -L,--list [chain]:查看防火墙规则,如果没有指明规则链,则所有的规则链均显 示出来。
  • 所有的 iptables 命令,如果没有指定防火墙表就使用默认的 filter 表,所以查看网络地址 转换规则使用 iptables -t nat -n -L,注意经常使用的-n 选项,是为了避免长时间的 DNS 解析。
  • iptables -F 清空所选的规则链中的规则。如果没有指定链,则清空指定表中的所有链 的规则。如果什么都没有指定,就清空默认表所有的链规则。当然也可以一条一条地删除, 但用这个命令会比较方便。例如清空 filter 表中 INPUT 链的规则:
iptables -t filter -F INPUT
  • ①默认策略的设置。每一条内置链的策略都是用来处理那些在相应的规则链中没有 被规则匹配的报文。也就是说,如果有一个报文没有被规则集中的任何规则匹配,那默认 策略就会命中,执行默认策略的行为。一般有两种策略行为,默认通过(ACCEPT)和默认丢弃(DROP),在白名单模式会 使用默认丢弃,在黑名单模式下会默认通过。设置命令形式如下:
iptables [-P {chain} {policy}]

例如设置输入链为默认拒绝:iptables -P INPUT DROP
  • ②自定义规则链的创建。对于复杂规则,我们通常会创建自定义规则链来进行匹配, 并把自定义规则链加入到已有的规则链中,这样我们在删除及加载时非常方便。自定义规 则链设置命令如下:
iptables -N UDP_FILTER
  • ③清空整个防火墙。通常在进行防火墙配置前,需要将以前的规则全部删除,因此 我们清空整个防火墙。
iptables -F
iptables -t nat -F
iptables -t mangle –F
  • ④一个典型路由器的配置。如果我们没有使用其他的额外的工具,我们手动进行 配置一个典型路由器防火墙如下图所示。从局域网发起的流量均可以通过,从互联 网发起的主动流量不能通过,从互联网来的被动报文也允许通过,因为这是局域网主机 请求的响应报文。所有局域网的请求转发后均进行网络地址转换,将源地址改为路由器 地址。

  • ⑤如果我们需要停止防火墙,我们可以逐条删除规则,也可以直接清空规则,并设置其 默认策略,下图将停止防火墙。

九、其他工具集(iptables-save、iptables-restore)

  • iptables提供了两个很有用的工具用来处理大规则集:iptables-save 和 iptables-restore, 它们把规则存入一个与标准脚本代码只有细微差别的特殊格式的文件中,或从中恢复 规则。
  • 一般的 iptables 一次仅执行一条指令,如果对于很大的规则集也采用 iptables 来设置, 那就需要反复在内核和用户空间进行通信,这样将浪费很多的 CPU 时间,而这两个命令 通过一次调用就可以装载和保存整个规则集,这样节省了大量的时间。
  • iptables-save:导出 iptables 规则到标准输出(即屏幕)中,我们使用 shell 的重定向命令可以将规则写入文件中。内容格式和 iptables 类似但稍有不同,这个格式便于程序解析。
  • iptables-restore:用于加载导出的防火墙规则,使用标准输入的内容来导入,一般都是 通过 shell 提供的重定向从文件中读取规则之后来向内核导入规则。

十、UCI介绍

  • OpenWrt 使用 Netfilter 来实现报文过滤、网络地址转换和报文修改。UCI 防火墙封装 了 Netfilter 的配置接口,抽象了防火墙系统特征来提供简单的配置模型,适合大多数场景。 UCI 配置还提供了扩展接口,用户自己需要特殊 iptables 命令时也可直接配置

十一、安全域的概念

  • 防火墙的核心是防火墙规则,所有的规则在一起就是规则集。这些规则允许或拒绝某 些主机去访问另外一个网络的主机。通过组合这些规则,就可以创建非常复杂的强大规则 集。但是手动维护这些规则集将非常困难,因此 OpenWrt 定义了安全域(Zone)的概念, 可以减少管理的负担。
  • UCI 防火墙映射一个或多个接口在一起为一个安全域,这样可以简化配置模型。安全 域是一个相同规则的区域,一个安全域根据接口来划分,可以包含一个或多个接口。可以 同时定义多个接口的默认规则,以及接口之间的转发规则,还有前两步未覆盖到的其他规 则。安全域也用于配置网络地址转换、端口转发规则、重定向等。
  • 安全域必须映射到一个或多个接口,并最终映射到多个物理接口设备,因此安全域不能用于指定子网和按照 iptables 规则来操作物理设备接口。当接口的子网包含另外一个网 关时,可以用来达到目的地不属于自己的子网网络。通常转发是在局域网和广域网之间的 接口完成,因此使用路由器作为局域网和因特网之间的边缘网关。UCI 的防火墙默认配置 提供了这样的一个共同设置。典型智能路由器设置为两个安全域,wan-连接互联网,lan连接局域网。

十二、防火墙配置文件(/etc/config/firewall)

  • 报文匹配规则:Netfilter 系统是数据包通过各个规则的链式处理过滤器。第一个规则如果没有匹配, 则继续下一个规则匹配,直到数据报文命中 ACCEPT、DROP 或 REJECT 之一。如果直到 最后一个仍未匹配,默认规则最后生效,具体的规则首先起作用。OpenWrt 的防火墙规则 也是如此,在配置文件中,默认规则在最前面,但最后生效,同级别的规则按照配置文 件顺序先后生效。
  • 路由器的最小防火墙配置通常有一个缺省(defaults)部分、至少两个安全域(局域网 和广域网)和一个转发——允许数据从局域网到广域网。
  • 配置文件:防火墙配置文件位于 / etc/config/firewall 中。UCI 配置文件没有区分类型,但防火墙模块解析处理过程需要区分 类型,因此配置文件的配置项需要填入指定类型的值,主要有字符串、布尔值、整型值、 MAC 地址和 IP 地址等类型。

Defaults配置节

  • Defaults 配置节定义了不属于特定区域的全局防火墙设置。配置类型为“defaults”。
  • 下标所示的是这个配置节的主要定义选项。

  • 例如:

Zones-安全域配置节

  • 一个安全域根据接口来划分,可以包含一个或多个接口,在源和目的地之间进行转发、 生成规则和重定向。输出的流量伪装是每一个安全域的基础控制。注意伪装是对即将报文 离开的接口进行定义,是将报文的源 IP 地址转换为路由器的出口 IP 地址
  • 规则:
    • INPUT 规则用于匹配流量从这个安全域的接口到达路由器本身,即目的地址为路由器 IP 地址的流量
    • OUTPUT 规则用于处理从路由器自己产生的报文并通过安全域的接口, 即作用于源地址为路由器地址的报文
    • FORWARD 规则用于处理从一个安全域到另外一个 安全域的报文,即经过路由器来转发的报文
  • 安全域的配置节类型为“zone”,其主要选项在下标有详细描述

  • 例如:

转发配置节(forwarding)

  • 转发部分控制安全域之间的数据流量,可以使 MSS(最大分片大小)为特定的方向。
  • 一个转发规则仅代表一个方向。允许两个区域之间的双向流量,这需要两个转发规则,src 和 dest 部分颠倒过来即可,转发配置节的类型为“forwarding”。
  • iptables 规则生成该部分依靠需要连接跟踪工作来生成状态匹配。在 src 和 dest 安全域 至少需要有一个连接跟踪通过 MASQ 或连接跟踪选项启用。如果没有启用连接跟踪机制,那 报文只能单向通过,返回的报文将被拒绝。
  • 主要选项在下标中描述:

  • 例如:下面表示允许局域网到广域网的报文转发。

重定向配置节(redirect)

  • 目的地址转换(DNAT)定义在重定向配置节。在指定源安全域的所有进入的报文如 果匹配给定的规则将重定向到指定的内部主机上。
  • 重定向也叫“端口转发”或“端口映射”。端口访问可以以“start:stop”来指定,例如 8080:8090,语法和 iptables 类似。技术上来说,端口映射是目的地址转换的另一个术语, 报文发送到防火墙并被转换为一个新的目的地址,这个处理过程完全由防火墙自动完成。 对于设置这个规则,需要新老目的地址,并且可以选择源地址或者其他约束条件进行匹配。
  • 配置选项在下表详细描述。

  • 下图将转发从 wan 接口的 HTTP 请求报文到 IP 地址为 192.168.1.100、端口为 80 的 Web 服务器上,没有指定转换后端口号,那就是目的端口不变。

规则(rule)

  • 规则(rule)用于定义基本的接受或拒绝规则来允许或限制你访问指定主机或端口。 真正的防火墙规则在这里进行设置。
  • 端口范围使用 start:stop,例如 8080:8090。这和 iptables 的语法完全一致。规则的配置 类型为“rule”,防火墙规则中如果指定了时间,则需要路由器的时间准确,否则和自己的 期望将完全不同。
  • 规则定义如下:
    • 如果 src 和 dest 均指定,规则作用于转发流量。
    • 如果仅指定了 src,规则匹配流入本机的流量,即目的地址为防火墙的报文。
    • 如果仅指定了 dest,规则匹配本机作为源地址的流量。
    • 如果 src 和 dest 均没有给出,则默认作用于本机作为源地址的流量。
  • 具体的配置选项在下表中详细描述。

  • 默认的防火墙配置是接受所有的局域网流量,但是阻断所有的 WAN 入口主动流量, 除了当前 NAT 或连接的被动流量。如果要打开服务的端口,可以像下图一样增加规 则。下图配置将允许互联网上的主机通过 SSH 协议访问路由器。

  • 下图用于阻止局域网主机到广域网主机 121.42.62.172 的全部连接。源主机将 收到目标端口不可达的 ICMP 消息。这就是把这个 IP 地址加入了访问黑名单,不允许 访问。

  • 下图用于创建一个输出规则,阻止从路由器ping IP 为 8.8.8.8 的主机。这个规则没有src字段,因此仅匹配从路由器发出的报文。

  • 下图用于限制从局域网到广域网的目的端口为 1024~65535 的报文转发。

include配置节

  • include 用于包含自定义的防火墙规则。在防火墙配置中可以指定一条或多条 include配置节。
  • 类型为“include”,仅有一个必须的参数是包含的文件路径,所有的可选参数如下表所示。

  • 包括类型的脚本可以包含任意的命令,例如高级的 iptables 规则或流量整形所需的 tc 命令。由于自定义 iptables 规则要比一般的更具体,所以必须确保使用“-I”来插入而不是 一个“-A”来附加到最后,这样自定义规则将出现在默认规则的前面。

十三、常见用法

MAC 地址黑白名单

  • MAC 地址过滤是家用路由器的一个常见功能,它可以防止未授权的 MAC 地址访问路 由器和通过路由器访问网络。例如网络上有恶意用户,可以通过 MAC 地址限制指定恶意 用户主机连接到路由器,即使他拥有路由器的密码。
  • OpenWrt 没有单独的 MAC 接入控制模块,但可以通过设置防火墙规则来实现。MAC 地址是计算机网卡的物理地址,它就像是网卡的身份证,在网络中进行通信时对网卡的 识别都是通过这个地址进行的。通常一个计算机仅有一个网卡,那这个网卡就可以代表 这个计算机,限制这个 MAC 地址即可控制计算机能否接入网络,从而有效控制了网络用户的上网权限。
  • 通常有两种方式来控制:白名单和黑名单
    • 黑名单是指在名单内的设备不能接入网络。例如小孩的计算机不能访问。
    • 白名单是指名单内的设备可以接入网络,其他设备均不能访问。
  • 下图用于阻止指定客户端连接到因特网,第一个规则禁止黑名单访问网络, 第二个规则阻止从客户端连接路由器。这样该机器就不能通过该 OpenWrt 路由器访问 任何资源。

  • 如果以自定义规则来实现黑名单,则使用如下 4 条规则进行设置:第一行首先定义了自定义链 MAC_FILTER,然后紧接着将 IPNUT 链的报文转到 MAC_FILTER,由它将匹配目标地址为路由器 IP 的报文。第三行规则将 FORWARD 链转 到 MAC_FILTER 自定义链中,这个将匹配经过路由器转发的流量。最后一个规则将源 MAC 地址的规则加入到 MAC_FILTER 链中。通常防火墙是默认允许局域网报文通过的, 因此可以仅设置拒绝通过的 MAC 即可。

  • 例如,某企业想要保证仅授权用户可以连接 Wi-Fi。因为通常 Wi-Fi 的连接密码只有一个,如果多个人访问,经常会导致密码透露给非授权用户。白名单技术就在这时派上用 场,将授权用户的 MAC 地址增加到防火墙中,这样即使 Wi-Fi 连接密码泄露,非授权用 户也不能通过无线路由器访问网络。如果要设置白名单模式,则需要在规则的最后增加一 个默认拒绝规则。

家长控制

  • OpenWrt 没有专门的家长控制模块,我们可以在防火墙功能中实现设置。例如, 禁止小孩在周一到周五上网,通过设置小孩专用的计算机 MAC 来禁止访问任何网络。
  • 下图用于禁止指定 MAC 周一到周五将报文转发到互联网,weekdays 用来表示一 周中的第几天。

  • 在企业也是同样的情况,有些公司在工作的时间会禁止使用互联网,或者是根据公司 管理策略仅能访问一些授权的网站。这些策略最难的部分在于管理政策中哪些允许哪些不 允许,这通常很难做出决定。在技术上使用防火墙来实现,UCI 配置只能从 IP 层进行限 制,因此如果限制访问域名,需要转换为 IP 地址。
  • 下图所示的配置实现了周一到周五的工作时间内禁止局域网用户访问网络,并允 许来自你自己 MAC 主机的网络访问。

十四、防火墙管理

  • OpenWrt 12.09 的防火墙模块脚本目录为 /lib/firewall,管理脚本为/bin/fw:

  • 在配置修改之后,通过执行/etc/init.d/firewall restart 生效;调用/etc/init.d/firewall stop 将删除所有自定义的规则,并设置所有标准的规则链为接受(ACCEPT)。手动启动防火墙 执行/etc/init.d/firewall start。

①永久停用防火墙

  • 防火墙可以通过执行/etc/init.d/firewall disable 永久禁用,需要 重启生效。注意:禁用不会删除已生效的规则。使用 enable 可重新激活使用防火墙。

②停用防火墙

  • 运行/etc/init.d/firewall stop 以删除所有规则和设置默认策略为接受。 重启防火墙,运行/ etc/init.d/firewall start。

③删除规则

  • 如果你增加了一个错误的规则,你可以通过以下方式删除。首先,错 误的命令规则可以通过以下命令找出索引:

  • 现在进行删除。例如删除 OUTPUT 链的第三条规则,可执行以下命令:

④调试产生的规则集

  • 观察通过防火墙程序产生的 iptables 命令是非常有用的,跟 踪防火墙重启的 iptables 错误,或者验证特定 UCI 配置规则的结果及作用。
  • 为了看到执行过程中的规则,运行 fw 命令之前将 FW_TRACE 环境变量设置为 1。 FW_TRACE 变量使用在/lib/firewall/fw.sh 中,判断是否定义,如果已经定义,将输出执行 的每条规则:

  • 将执行输出重定向到一个文件中供以后分析,使用以下命令:

  • 在 OpenWrt 15.05 版本中防火墙使用 C 语言来重新实现,编译安装后为 fw3,使用“-d” 选项来进行输出 iptables 命令。
  • 还有另外一个命令也支持输出防火墙规则:

十五、测试防火墙

  • 防火墙规则配置越多,它就越复杂。在正式使用之前,首先需要对配置进行测试。在 配置修改完成后,需要调用以下命令来重启防火墙:

  • 对于目标进行测试可以有非常方便的目标地址测试,但是如果有黑名单或者时间 控制,就比较麻烦。测试时间需要你改变路由器系统时间进行测试,或者等待足够长的 时间。
  • 对于网络是否正常,可以使用 ping 命令进行进行测试。对于端口是否开放,可以用 NetCat 工具进行验证,NetCat 请参考在“测试工具”中描述的技术。

十六、附加


  • 我是小董,V公众点击"笔记白嫖"解锁更多OpenWrt资料内容。

  • 28
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董哥的黑板报

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值