Mission 5
——iptable的控制
Tool:
Xshell; WinSCP; Openwrt;Newifi
Reference:
《智能路由器开发指南》
Procedure:
学完了UCI API,其实我也不知道问什么要学。这时候先总结一下之前的内容。
我已经掌握的了,或者说可以做到的事情,是在web页面上创建一个额外的界面,然后这些界面上的选项可以基于我得选择自己设计,并且每个选项都能对应到一个UCI配置文件中,修改配置文件里的值。
那下面如何实现在openwrt的界面上增加一个添加黑名单的功能,允许用户添加特定的ip地址清单,然后过滤掉来自和去向这个清单中的报文。
这个功能就要用到iptable这个自带功能,所以开始学习书的12和13章,iptable防火墙和UCI防火墙。
12.1 防火墙概述
Firewall在计算机网络中,是在两个或多个网络之间用于设置安全策略的一个或多个系统的组合。防火墙起到隔离异常访问的作用,仅允许可靠的流量通过,从而保护了家庭和企业内部网络信息的安全。
Linux防火墙通常包含iptable和netfilter两部分。iptable是Linux管理防火墙规则的命令行工具,处于用户空间。netfilter执行报文过滤,处于Linux内核空间。有时候也会用iptable来统称Linux防火墙。
iptables是一个报文状态检测防火墙,这意味着防火墙内部储存每一个连接的信息,并且可以将每一个报文关联到它所属的连接。这个信息非常有用,它用于自动打开相应报文的传输路径,因此在创建防火墙规则时,通常没有必要创建相反方向的防火墙规则,防火墙将自动计算出这个规则。
12.2 iptables中的表
iptables是用C语言实现的,以GNU许可发布。它实际上包含两部分,即netfilter和iptables。管理员通过iptables工具集和内核打通,将防火墙规则写入内核中。内核netfilter执行报文过滤规则。iptables根据功能划分不同的表来处理不同的逻辑功能,当前包含五个表,分别为filter、nat、mangle、raw和security。这里先介绍了几个表的功能,随后将
12.2.1 filter(过滤表)
Filter是iptables的默认表,主要用于过滤报文,在这里根据报文的内容对报文进行丢弃或者接收。它包含有3个内置链。
n INPUT输入链,处理目标地址为本机IP地址的报文。
n OUTPUT输出链,处理本机IP地指产生的报文。
n FORWARD转发链,处理经过本机路由的报文。
这样每一个IP报文只经过3个内置链中的一个,便于进行数据报文匹配和处理。这里是真正实现防火墙处理的地方。注意:
n 经过本机转发的报文是FORWARD链,不经过INPUT和OUTPUT链。
n 本机产生的报文经过OUTPUT链不经过其他的。
n 去往主机的报文经过该主机的INPUT链,其他的链不经过。
12.2.2 nat(网络地址转换表)
nat用来完成源/目的地址和端口的转换,当一个报文在创建一个新的连接时进入该表。它也有3个内置规则链。
n PREROUTING:用于修改到来的报文,只用来做网络地址转换。
n OUTPUT:用于修改本机产生的并且在路由处理之前的报文。
n POSTROUTING:用于修改准备出去的报文的地方。
通过目的地址转换,你可以将服务器放在防火墙后面,并使用私有IP地址。一些协议通过nat转换有困难(例如FTP或SIP),连接跟踪将打开这些协议的数据/媒体流路径。nat表不能用于报文过滤和报文修改,因为每一个连接流仅有一次机会进入该表中的规则链。
网络地址转换在路由功能前后都可能发生,源地址转换是在数据包通过路由之后在POSTROUTING规则链进行地址转换。目的地址转换是在路由之前,在PREROUTING规则链进行地址转换。
12.2.3 mangle(修改表)
这个表主要用来进行报文修改,有5个内置规则链。
n PREROUTING:针对到来的报文,在路由之前修改的地方。
n INPUT:针对目的地址为网关本身的报文。
n FORWARD:针对通过网关路由转发的报文。
n POSTROUTING:将要发送出去的报文的地方。
n OUTPUT:本机产生报文在路由之前修改的地方。
通常使用该表进行报文修改,以便进行QoS和策略路由(即解决网络拥堵反方案)。通常每一个报文都进入该表,但不使用它来过滤报文。
12.2.4 raw(原始表)
这个表很少被用到,主要用于配置连接跟踪相关内容,在ip_conntrack之前调用。它提供了两个内置规则链。
n PREROUTING:到达本机的报文。
n OUTPUT:本机进程产生的报文。
这里是能够在连接跟踪生效之前处理报文的地方,你可以标记符合某种条件的报文不被连接跟踪处理。一般很少使用。此外,还有security表, 这个表用于安全Linux的防火墙规则,是iptables最近的新增表,在实际项目中还很少用到。(2015)