linux下的防火墙

linux下的防火墙

一、什么是防火墙
  防火墙是一套能够在两个或两个以上的网络之间,明显区隔出实体线路联机的软硬件设备组合。
被区隔开来的网络,可以透过封包转送技术来相互通讯,透过防火墙的安全管理机制,可以决定哪些
数据可以流通,哪些资料无法流通,藉此达到网络安全保护的目的。
  防火墙产品可以概略归类为硬件式防火墙和软件式防火墙,但实际上无论是硬件式或软件式防火
墙,它们都需要使用硬件来作为联机介接,也需要使用软件来设定安全政策,严格说两者间的差别并
不太大。我们只能从使用的硬件与操作系统来加以区分,硬件式防火墙是使用专有的硬件,而软件式
防火墙则使用一般的计算机硬件,硬件式防火墙使用专有的操作系统,而软件式防火墙则使用一般的
操作系统。
  防火墙依照其运作方式来分类,可以区分为封包过滤式防火墙 (Packet Filter) 、应用层网关
式防火墙 (Application-Level Gateway,也有人把它称为 Proxy 防火墙)、电路层网关式防火墙
(Circuit-Level Gateway)。其中被广为采用的是封包过滤式防火墙,本文要介绍的 iptables 防火
墙就是属于这一种。
  封包过滤是最早被实作出来的防火墙技术,它是在 TCP/IP 四层架构下的 IP 层中运作。封包过
滤器的功能主要是检查通过的每一个 IP 数据封包,如果其标头中所含的数据内容符合过滤条件的设
定就进行进一步的处理,主要的处理方式包含:放行(accept)、丢弃(drop)或拒绝(reject)。
要进行封包过滤,防火墙必须要能分析通过封包的来源 IP 与目的地 IP,还必须能检查封包类型、
来源埠号与目的埠号、封包流向、封包进入防火墙的网卡接口、TCP的联机状态等数据。
  防火墙由于种种理由价格一直居高不下,对于贫穷的中小学来讲要采购一台防火墙,简直是不可
能的任务,而由于 Linux 的风行,使用 Linux 来充作软件式防火墙,似乎是不错的解决之道,本文
拟介绍以 Linux 上最新最强大的 iptables 防火墙软件,建置出适合学校使用的过滤规则,让缺钱
的学校能有一套好用的防火墙来看守校园网络的大门。
  
  二、Linux 防火墙演变简史
  Linux 最早出现的防火墙软件称为 ipfw,ipfw 能透过 IP 封包标头的分析,分辨出封包的来源
IP 与目的地 IP、封包类型、来源埠号与目的埠号、封包流向、封包进入防火墙的网卡界面......
等,并藉此分析结果来比对规则进行封包过滤,同时也支持 IP 伪装的功能,利用这个功能可以解决
IP 不足的问题,可惜这支程序缺乏弹性设计,无法自行建立规则组合(ruleset)作更精简的设定,
同时也缺乏网址转译功能,无法应付越来越复杂的网络环境,而逐渐被淘汰。
  取而代之的 ipchains,不但指令语法更容易理解,功能也较 ipfw 优越;ipchains 允许自订规
则组合(ruleset),称之为 user-define chains,透过这种设计,我们可以将彼此相关的规则组合
在一起,在需要的时候跳到该组规则进行过滤,有效将规则的数量大幅缩减,以往 ipfw 仅能进行循
序过滤,导致规则又臭又长的毛病,就不药而愈了。除了这个明显的好处以外,ipchains 并能结合
本身的端口对应功能和 redir 程序的封包转送机制,模拟出网址转译的能力,而满足 NAT 的完整需
求,堪称为一套成熟的防火墙作品。
  防火墙软件的出现,确实曾经让骇客们晚上睡不着觉,因为防火墙的阻隔能够有效让内部网络不
设防的单机不致于暴露在外,也能有效降低服务器的能见度,减少被攻击的机会,骇客过去所用的网
络探测技术因此受到严格的挑战,越来越多的攻击对象躲藏在防火墙后方,让骇客难以接近,因此必
须针对新的情势,研究出新的探测技术,藉以规避防火墙的检查,达到发现目标并进而攻击入侵的目
的,新的技术非常多,本文并不拟进一步讨论,请自行参考 CERT 组织的技术文件,网址是
www.cert.org ,想看中文请连到 www.cert.org.tw。
  iptables 作为 ipchains 的新一代继承人,当然也针对骇客不断推陈出新的探测技术拟出一些
因应之道,那就是对封包的联机状态,作出更详细的分析,例如:是否为新联机或响应封包、是否为
转向联机、联机是否失去响应,联机时间是否过长......等等,透过这样的分析能对一些可能被骇客
利用的弱点加以阻隔(请详见后文的说明),另外也开发出真正的封包改写能力,不需要透过其它程
序的协助来仿真网址转译,除此之外,iptables 也获得系统核心的直接支持,不需要像 ipchains
那样需要自行重新编译核心。
  iptables 优越的性能使它取代了 ipchains,成为网络防火墙的主流,而 ipchains 并未被淘
汰,目前 ipchains 已经转型成单机防火墙,在安装新版 Linux 时,会自动被安装启用,以保护单
机上未被使用的通讯端口。
  
  三、iptables 防火墙概论
  iptables 防火墙的指令非常类似于 ipchains,使用过 ipchains 的人应该很容易上手,但是
iptables 的机制与 ipchains 有很大的不同,使用 ipchains 的概念来设定规则,将会使防火墙无
法正常运作。ipchains 跟 iptables 最大的不同在于对 INPUT、FORWARD 、OUTPUT 三个网络函式的
定义不同,这三个网络函式是 TCP/IP 驱动程序的一部分,结构如下图所示,是介于网卡驱动程序和
应用程序的中间,Linux 核心预设会启用 INPUT、OUTPUT 和 LOOPBACK,而 FORWARD 函式则必须自
行启用,可以使用下面指令,或直接修改 /etc/sysconfig/network 组态档:
  echo "1" >; /proc/sys/net/ipv4/ip_forward
  左图为 ipchains 概念下的运作图
  从上图可以知道 ipchains 如何处理封包的流动,分述如下:
  • IP INPUT:所有封包都由 IP INPUT 函式负责处理,所以设定过滤规则时,几乎都是设定在
INPUT 规则炼上。
  • IP FORWARD:目的 IP 非本机的 IP,这些封包需要进一步作转送处理,此函式用来处理 IP
伪装和 Port 转送。
  • IP OUTPUT:所有流出的封包都由这个函式处理,通常不需设定任何规则。
  iptables 除了上述三支函式以外,还使用两个新的函式:Prerouting、Postrouting。现在来比
较一下 iptables 的运作模式(loopback 接口与上图相同,所以省略不画):
  
  从上图可以知道 iptables 如何处理封包的流动,分述如下:
  • IP INPUT:只有要到达本机的封包才会 由 INPUT 函式处理,所以会让来自内部网络的封包无
条件放行,来自外部网络的封包则过滤是否为 响应封包,若是则放行。
  • PREROUTING:需要转送处理的封包由此函式负责处理,此函式用来做目的地 IP 的转译动作
(DNAT)。
  • IP FORWARD:所有转送封包都在这里处理,这部分的过滤规则最复杂。
  • POSTROUTING:转送封包送出之前,先透过这个函式进行来源 IP 的转译动作(SNAT)。
  • IP OUTPUT:从本机送出去的封包由这个函式处理,通常会放行所有封包。
  iptables 和 ipchains 都可以自行定义规则群组(rule-set),规则群组被称为规则炼
(chains),前面所描述的函式,也都有相对应的规则炼(INPUT、FORWARD、OUTPUT、Prerouting、
Postrouting),为了有别于自行定义的规则炼,这些规则炼我们就称为内建规则炼,其运作流程仿
真如下图:
  
  
  从上面两张假想图,学员们不难了解 ipchains 为什么要叫做 chains,因为它是将所有规则串
接成一个序列逐一检查过滤,就像一条铁链一样一个环接一个环,在过滤过程中只要符合其中一条规
则就会立即进行处理,如果处理动作是跳到某个规则群组,则继续检查群组内之规则设定,但如果处
理动作是 ACCEPT、REJECT、DROP、REDIRECT 或 MASQUERADE,则会中断过滤程序,而不再继续检查
后面的规则设定,在这样的结构之下,有时候规则顺序的对调会产生完全相反的结果,这一点在设定
防火墙时不能不谨慎。
  而 iptables 是采用规则堆栈的方式来进行过滤,当一个封包进入网卡,会先检查
Prerouting,然后检查目的 IP 判断是否需要转送出去,接着就会跳到 INPUT 或 Forward 进行过
滤,如果封包需转送处理则检查 Postrouting,如果是来自本机封包,则检查 OUTPUT 以及
Postrouting。过程中如果符合某条规则将会进行处理,处理动作除了 ACCEPT、REJECT、DROP、
REDIRECT 和 MASQUERADE 以外,还多出 LOG、ULOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、TOS、
TTL、MARK 等,其中某些处理动作不会中断过滤程序,某些处理动作则会中断同一规则炼的过滤,并
依照前述流程继续进行下一个规则炼的过滤(注意:这一点与 ipchains 不同),一直到堆栈中的规
则检查完毕为止。透过这种机制所带来的好处是,我们可以进行复杂、多重的封包过滤,简单的说,
iptables 可以进行纵横交错式的过滤(tables)而非炼状过滤(chains)。
  虽然 iptables 为了扩充防火墙功能,而必须采用比较复杂的过滤流程,但在实际应用时,同一
规则炼下的规则设定还是有先后顺序的关系,因此在设定规则时还是必须注意其中的逻辑。
  
  四、订定校园网络安全政策
  在实际设定防火墙之前,我们必须根据校园网络的安全需求,先拟定一份安全政策,拟定安全政
策前必须搜集以下资料:
  1. 找出需要过滤保护的服务器
  2. 条列出被保护的服务器将提供何种网络服务
  3. 一般工作站,需要何种等级的保护
  4. 了解网络架构与服务器摆放位置
  根据这些数据,我们可以决定安全政策,以石牌国小为例:
  1. 校内使用 NAT 虚拟网络,IP 数量需要两组 C,所有 IP 均需作 IP 伪装
  2. 校园内安全需求不高,服务器与工作站摆在同一网段,不需采用 DMZ 设计
  3. 由于服务器功能经常扩充,所有服务器均采用一对一对应,不使用 port 转送功能
  4. 所有工作站均能自由使用网络资源,不限制只能看网页
  5. 服务器提供之服务包含:dns、web、mail、ftp、wam、webmin、ssh、rdp、pcaw,不提供
proxy 及其它网络服务
  6. 为增进校园网络之安全性,采用正面表列方式进行封包过滤(定义想放行之封包,其余封包
一律阻挡)
  还有一些网络安全须注意的事项,则是每所学校都应防范的,没有等差之别,例如:联机被绑
架、阻断式攻击、连接端口扫描......等。
  
  五、iptables 指令
  语法:
  iptables [-t table] command [match] [-j target/jump]
  -t 参数用来指定规则表,内建的规则表有三个,分别是:nat、mangle 和 filter,当未指定规
则表时,则一律视为是 filter。各个规则表的功能如下:
  nat 此规则表拥有 Prerouting 和 postrouting 两个规则炼,主要功能为进行一对一、一对
多、多对多等网址转译工作(SNAT、DNAT),由于转译工作的特性,需进行目的地网址转译的封包,
就不需要进行来源网址转译,反之亦然,因此为了提升改写封包的效率,在防火墙运作时,每个封包
只会经过这个规则表一次。如果我们把封包过滤的规则定义在这个数据表里,将会造成无法对同一封
包进行多次比对,因此这个规则表除了作网址转译外,请不要做其它用途。
  mangle 此规则表拥有 Prerouting、FORWARD 和 postrouting 三个规则炼。
  除了进行网址转译工作会改写封包外,在某些特殊应用可能也必须去改写封包(TTL、TOS)或者
是设定 MARK(将封包作记号,以便进行后续的过滤),这时就必须将这些工作定义在 mangle 规则
表中,由于使用率不高,我们不打算在这里讨论 mangle 的用法。
  filter 这个规则表是预设规则表,拥有 INPUT、FORWARD 和 OUTPUT 三个规则炼,这个规则表
顾名思义是用来进行封包过滤的处理动作(例如:DROP、 LOG、 ACCEPT 或 REJECT),我们会将基
本规则都建立在此规则表中。
  常用命令列表:
  命令 -A, --append
  范例 iptables -A INPUT ...
  说明 新增规则到某个规则炼中,该规则将会成为规则炼中的最后一条规则。
  命令 -D, --delete
  范例 iptables -D INPUT --dport 80 -j DROP
  iptables -D INPUT 1
  说明 从某个规则炼中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除。
  命令 -R, --replace
  范例 iptables -R INPUT 1 -s 192.168.0.1 -j DROP
  说明 取代现行规则,规则被取代后并不会改变顺序。
  命令 -I, --insert
  范例 iptables -I INPUT 1 --dport 80 -j ACCEPT
  说明 插入一条规则,原本该位置上的规则将会往后移动一个顺位。
  命令 -L, --list
  范例 iptables -L INPUT
  说明 列出某规则炼中的所有规则。
  命令 -F, --flush
  范例 iptables -F INPUT
  说明 删除某规则炼中的所有规则。
  命令 -Z, --zero
  范例 iptables -Z INPUT
  说明 将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或
缺的工具。
  命令 -N, --new-chain
  范例 iptables -N allowed
  说明 定义新的规则炼。
  命令 -X, --delete-chain
  范例 iptables -X allowed
  说明 删除某个规则炼。
  命令 -P, --policy
  范例 iptables -P INPUT DROP
  说明 定义过滤政策。 也就是未符合过滤条件之封包,预设的处理方式。
  命令 -E, --rename-chain
  范例 iptables -E allowed disallowed
  说明 修改某自订规则炼的名称。
  常用封包比对参数:
  参数 -p, --protocol
  范例 iptables -A INPUT -p tcp
  说明 比对通讯协议类型是否相符,可以使用 ! 运算子进行反向比对,例如:-p ! tcp ,意思
是指除 tcp 以外的其它类型,包含 udp、icmp ...等。如果要比对所有类型,则可以使用 all 关键
词,例如:-p all。
  参数 -s, --src, --source
  范例 iptables -A INPUT -s 192.168.1.1
  说明 用来比对封包的来源 IP,可以比对单机或网络,比对网络时请用数字来表示屏蔽,例如:
-s 192.168.0.0/24,比对 IP 时也可以使用 ! 运算子进行反向比对,例如:-s ! 192.168.0.0/24。
  参数 -d, --dst, --destination
  范例 iptables -A INPUT -d 192.168.1.1
  说明 用来比对封包的目的地 IP,设定方式同上。
  参数 -i, --in-interface
  范例 iptables -A INPUT -i eth0
  说明 用来比对封包是从哪片网卡进入,可以使用通配字符 + 来做大范围比对,例如:-i eth+
表示所有的 ethernet 网卡,也可以使用 ! 运算子进行反向比对,例如:-i ! eth0。
  参数 -o, --out-interface
  范例 iptables -A FORWARD -o eth0
  说明 用来比对封包要从哪片网卡送出,设定方式同上。
  参数 --sport, --source-port
  范例 iptables -A INPUT -p tcp --sport 22
  说明 用来比对封包的来源埠号,可以比对单一埠,或是一个范围,例如:--sport 22:80,表示
从 22 到 80 埠之间都算是符合条件,如果要比对不连续的多个埠,则必须使用 --multiport 参
数,详见后文。比对埠号时,可以使用 ! 运算子进行反向比对。
  参数 --dport, --destination-port
  范例 iptables -A INPUT -p tcp --dport 22
  说明 用来比对封包的目的地埠号,设定方式同上。
  参数 --tcp-flags
  范例 iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
  说明 比对 TCP 封包的状态旗号,参数分为两个部分,第一个部分列举出想比对的旗号,第二部
分则列举前述旗号中哪些有被设定,未被列举的旗号必须是空的。TCP 状态旗号包括:SYN(同
步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)、PSH(强迫推送) 等均可使用于参
数中,除此之外还可以使用关键词 ALL 和 NONE 进行比对。比对旗号时,可以使用 ! 运算子进行反
向比对。
  参数 --syn
  范例 iptables -p tcp --syn
  说明 用来比对是否为要求联机之 TCP 封包,与 iptables -p tcp --tcp-flags SYN,FIN,ACK
SYN 的作用完全相同,如果使用 ! 运算子,可用来比对非要求联机封包。
  参数 -m multiport --source-port
  范例 iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
  说明 用来比对不连续的多个来源埠号,一次最多可以比对 15 个埠,可以使用 ! 运算子进行反
向比对。
  参数 -m multiport --destination-port
  范例 iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
  说明 用来比对不连续的多个目的地埠号,设定方式同上。
  参数 -m multiport --port
  范例 iptables -A INPUT -p tcp -m multiport --port 22,53,80,110
  说明 这个参数比较特殊,用来比对来源埠号和目的埠号相同的封包,设定方式同上。注意:在
本范例中,如果来源端口号为 80 但目的地埠号为 110,这种封包并不算符合条件。
  参数 --icmp-type
  范例 iptables -A INPUT -p icmp --icmp-type 8
  说明 用来比对 ICMP 的类型编号,可以使用代码或数字编号来进行比对。请打 iptables -p
icmp --help 来查看有哪些代码可以用。
  参数 -m limit --limit
  范例 iptables -A INPUT -m limit --limit 3/hour
  说明 用来比对某段时间内封包的平均流量,上面的例子是用来比对:每小时平均流量是否超过
一次 3 个封包。 除了每小时平均一次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时
平均一次,参数如后: /second、 /minute、/day。 除了进行封包数量的比对外,设定这个参数也
会在条件达成时,暂停封包的比对动作,以避免因骇客使用洪水攻击法,导致服务被阻断。
  参数 --limit-burst
  范例 iptables -A INPUT -m limit --limit-burst 5
  说明 用来比对瞬间大量封包的数量,上面的例子是用来比对一次同时涌入的封包是否超过 5 个
(这是默认值),超过此上限的封包将被直接丢弃。使用效果同上。
  参数 -m mac --mac-source
  范例 iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01
  说明 用来比对封包来源网络接口的硬件地址,这个参数不能用在 OUTPUT 和 Postrouting 规则
炼上,这是因为封包要送出到网卡后,才能由网卡驱动程序透过 ARP 通讯协议查出目的地的 MAC 地
址,所以 iptables 在进行封包比对时,并不知道封包会送到哪个网络接口去。
  参数 --mark
  范例 iptables -t mangle -A INPUT -m mark --mark 1
  说明 用来比对封包是否被表示某个号码,当封包被比对成功时,我们可以透过 MARK 处理动
作,将该封包标示一个号码,号码最大不可以超过 4294967296。
  参数 -m owner --uid-owner
  范例 iptables -A OUTPUT -m owner --uid-owner 500
  说明 用来比对来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使用 root
或其它身分将敏感数据传送出去,可以降低系统被骇的损失。可惜这个功能无法比对出来自其它主机
的封包。
  参数 -m owner --gid-owner
  范例 iptables -A OUTPUT -m owner --gid-owner 0
  说明 用来比对来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上。
  参数 -m owner --pid-owner
  范例 iptables -A OUTPUT -m owner --pid-owner 78
  说明 用来比对来自本机的封包,是否为某特定行程所产生的,使用时机同上。
  参数 -m owner --sid-owner
  范例 iptables -A OUTPUT -m owner --sid-owner 100
  说明 用来比对来自本机的封包,是否为某特定联机(Session ID)的响应封包,使用时机同上。
  参数 -m state --state
  范例 iptables -A INPUT -m state --state RELATED,ESTABLISHED
  说明 用来比对联机状态,联机状态共有四种:INVALID、ESTABLISHED、NEW 和 RELATED。
  INVALID 表示该封包的联机编号(Session ID)无法辨识或编号不正确。
  ESTABLISHED 表示该封包属于某个已经建立的联机。
  NEW 表示该封包想要起始一个联机(重设联机或将联机重导向)。
  RELATED 表示该封包是属于某个已经建立的联机,所建立的新联机。例如:FTP-DATA 联机必定
是源自某个 FTP 联机。
  常用的处理动作:
  -j 参数用来指定要进行的处理动作,常用的处理动作包括:ACCEPT、REJECT、DROP、
REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,分别说明如下:
  ACCEPT 将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则炼
(nat:postrouting)。
  REJECT 拦阻该封包,并传送封包通知对方,可以传送的封包有几个选择:ICMP
port-unreachable、ICMP echo-reply 或是 tcp-reset(这个封包会要求对方关闭联机),进行完此
处理动作后,将不再比对其它规则,直接 中断过滤程序。 范例如下:
  iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset
  DROP 丢弃封包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
  REDIRECT 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将 会继续比对其它规
则。 这个功能可以用来实作通透式 porxy 或用来保护 web 服务器。例如:iptables -t nat -A
PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
  MASQUERADE 改写封包来源 IP 为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动
作后,直接跳往下一个规则炼(mangle:postrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪
装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨接连线时,IP 通常是由 ISP 公
司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。范例如下:
  iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000
  LOG 将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 组态档,进行完
此处理动作后,将会继续比对其它规则。例如:
  iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"
  SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理
动作后,将直接跳往下一个规则炼(mangle:postrouting)。范例如下:
  iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source
194.236.50.155-194.236.50.160:1024-32000
  DNAT 改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处
理动作后,将会直接跳往下一个规则炼(filter:input 或 filter:forward)。范例如下:
  iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT
--to-destination 192.168.1.1-192.168.1.10:80-100
  MIRROR 镜射封包,也就是将来源 IP 与目的地 IP 对调后,将封包送回,进行完此处理动作
后,将会中断过滤程序。
  QUEUE 中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进
行其它应用,例如:计算联机费用.......等。
  RETURN 结束在目前规则炼中的过滤程序,返回主规则炼继续过滤,如果把自订规则炼看成是一
个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。
  MARK 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将
会继续比对其它规则。范例如下:
  iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2
  
  六、应用实例
  #!/bin/sh
  #
  # 石牌国小防火墙设定指令稿
  # 2002/8/27
  # 设定者:李忠宪(修改自 iptables tutorial 1.1.11 by Oskar Andreasson )
  # 原文件是依 DMZ 需求设计,已根据校园 NAT 网络之需求修改,其余改动部份包括:
  # 新增通讯协议定义区块
  # 新增执行时,自动清除已设定之规则
  # 支援 FTP
  # 修改所有规则,改采 multiport 方式以简化规则
  # 原文件仅支持 IP 伪装(多对一对应),已扩充为支持一对一对应及多对多对应
  # 原文件仅支援 DNS 及 WEB,新增 ftp、mail、wam、PCAnywhere、ssh......等多种服务器
  # 修改若干规则设定上的小错误
  #
  # Copyright (C) 2001 Oskar Andreasson ;
  #
  # This program is free software; you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; version 2 of the License.
  #
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  # GNU General Public License for more details.
  #
  # You should have received a copy of the GNU General Public License
  # along with this program or from the site that you downloaded it
  # from; if not, write to the Free Software Foundation, Inc., 59 Temple
  # Place, Suite 330, Boston, MA 02111-1307 USA
  #
  ###########################################################################
  #
  # 1. Configuration options.
  #
  # 1.0 Protocols Configuration.
  # 定义会用到的通讯协议
  HTTP="80"
  HTTPS="443"
  FTP="21"
  FTP_DATA="20"
  SMTP="25"
  POP3="110"
  IMAP="143"
  SSH="22"
  TELNET="23"
  PCAW_TCP="5631"
  PCAW_UDP="5632"
  WEBMIN="10000"
  WAM="12000"
  DNS="53"
  
  #
  # 1.1 Internet Configuration.
  #
  # 定义 NIC IP 及 WAN 接口
  INET_IP="163.21.xxx.253"
  HTTP1_IP="163.21.xxx.2"
  HTTP2_IP="163.21.xxx.4"
  HTTP3_IP="163.21.xxx.9"
  HTTP4_IP="163.21.xxx.6"
  HTTP5_IP="163.21.xxx.7"
  HTTP6_IP="163.21.xxx.10"
  FTP1_IP="163.21.xxx.2"
  FTP2_IP="163.21.xxx.6"
  FTP3_IP="163.21.xxx.7"
  MAIL1_IP="163.21.xxx.6"
  MAIL2_IP="163.21.xxx.7"
  PCAW1_IP="163.21.xxx.2"
  PCAW2_IP="163.21.xxx.4"
  WAM1_IP="163.21.xxx.6"
  WAM2_IP="163.21.xxx.7"
  DNS_IP="163.21.xxx.2"
  IP_POOL="163.21.xxx.240-163.21.xxx.250"
  INET_IFACE="eth1"
  
  #
  # 1.2 Local Area Network configuration.
  #
  # 定义 NAT IP 及 LAN 接口
  LAN_IP="192.168.1.253"
  LAN_HTTP1_IP="192.168.1.2"
  LAN_HTTP2_IP="192.168.1.4"
  LAN_HTTP3_IP="192.168.1.9"
  LAN_HTTP4_IP="192.168.1.6"
  LAN_HTTP5_IP="192.168.1.7"
  LAN_HTTP6_IP="192.168.1.53"
  LAN_FTP1_IP="192.168.1.2"
  LAN_FTP2_IP="192.168.1.6"
  LAN_FTP3_IP="192.168.1.7"
  LAN_MAIL1_IP="192.168.1.6"
  LAN_MAIL2_IP="192.168.1.7"
  LAN_PCAW1_IP="192.168.1.2"
  LAN_PCAW2_IP="192.168.1.4"
  LAN_WAM1_IP="192.168.1.6"
  LAN_WAM2_IP="192.168.1.7"
  LAN_DNS_IP="192.168.1.2"
  LAN_IP_RANGE="192.168.0.0/16"
  LAN_BROADCAST_ADDRESS="192.168.1.255"
  LAN_IFACE="eth0"
  
  #
  # 1.4 Localhost Configuration.
  #
  # 定义 Loopback IP 及接口
  LO_IFACE="lo"
  LO_IP="127.0.0.1"
  
  #
  # 1.5 IPTables Configuration.
  #
  # 设定 iptables 指令路径
  IPTABLES="/sbin/iptables"
  
  #
  # 1.6 Other Configuration.
  #
  ###########################################################################
  #
  # 2. Module loading.
  #
  #
  # Needed to initially load modules
  # 整理核心支持模块之清单
  /sbin/depmod -a
  
  #
  # 2.1 Required modules
  # 加载会用到的模块
  /sbin/modprobe ip_tables
  /sbin/modprobe ip_conntrack
  /sbin/modprobe iptable_filter
  /sbin/modprobe iptable_mangle
  /sbin/modprobe iptable_nat
  /sbin/modprobe ipt_LOG
  /sbin/modprobe ipt_limit
  /sbin/modprobe ipt_state
  /sbin/modprobe ip_conntrack_ftp
  /sbin/modprobe ip_nat_ftp
  
  #
  # 2.2 Non-Required modules
  # 其余未使用之模块
  #/sbin/modprobe ipt_owner
  #/sbin/modprobe ipt_REJECT
  #/sbin/modprobe ipt_MASQUERADE
  #/sbin/modprobe ip_conntrack_irc
  #/sbin/modprobe ip_nat_irc
  ###########################################################################
  #
  # 3. /proc set up.
  #
  #
  # 3.1 Required proc configuration
  # 启动 Forward 接口
  echo "1" >; /proc/sys/net/ipv4/ip_forward
  
  #
  # 3.2 Non-Required proc configuration
  # 其余未使用之接口
  #echo "1" >; /proc/sys/net/ipv4/conf/all/rp_filter
  #echo "1" >; /proc/sys/net/ipv4/conf/all/proxy_arp
  #echo "1" >; /proc/sys/net/ipv4/ip_dynaddr
  ###########################################################################
  #
  # 4. rules set up.
  #
  ######
  # 4.1 Filter table
  #
  # 4.1.0 Reset the default policies in the nat table.
  # 清除所有已设定之规则,回复到不设防状态
  $IPTABLES -P INPUT ACCEPT
  $IPTABLES -P FORWARD ACCEPT
  $IPTABLES -P OUTPUT ACCEPT
  $IPTABLES -t nat -P PREROUTING ACCEPT
  $IPTABLES -t nat -P POSTROUTING ACCEPT
  $IPTABLES -t nat -P OUTPUT ACCEPT
  $IPTABLES -t mangle -P PREROUTING ACCEPT
  $IPTABLES -t mangle -P OUTPUT ACCEPT
  $IPTABLES -F
  $IPTABLES -t nat -F
  $IPTABLES -t mangle -F
  $IPTABLES -X
  $IPTABLES -t nat -X
  $IPTABLES -t mangle -X
  
  #
  # 4.1.1 Set policies
  # 定义安全政策为正面表列
  $IPTABLES -P INPUT DROP
  $IPTABLES -P OUTPUT DROP
  $IPTABLES -P FORWARD DROP
  
  #
  # 4.1.2 Create userspecified chains
  #
  #
  # 新增使用者自订规则炼 bad_tcp_packets、 allowed 和 icmp_packets
  $IPTABLES -N bad_tcp_packets
  $IPTABLES -N allowed
  $IPTABLES -N icmp_packets
  
  #
  # 4.1.3 Create content in userspecified chains
  #
  #
  # bad_tcp_packets chain
  # bad_tcp_packets 规则炼的功能是:将要求重导向的联机记录起来,然后将封包丢弃(防止联
机被绑架,但会档掉需要三方交谈的服务,例如:M$ Media Server)
  $IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG --log-level
INFO --log-prefix "New not syn:"
  $IPTABLES -A bad_tcp_packets -p TCP ! --syn -m state --state NEW -j DROP
  
  # allowed chain
  # allowed 规则炼的功能是:允许要求联机封包或响应封包进入,将其余封包丢弃
  $IPTABLES -A allowed -p TCP --syn -j ACCEPT
  $IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
  $IPTABLES -A allowed -p TCP -j DROP
  
  #
  # ICMP rules
  # icmp_packets 规则炼的功能是:允许 ping 封包进入,将其余封包丢弃
  $IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT
  $IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT
  
  #
  # 4.1.4 INPUT chain(过滤要到达防火墙的封包)
  #
  #
  # 进入防火墙主机的 TCP 封包必须先进行 bad_tcp_packets 过滤
  $IPTABLES -A INPUT -p tcp -j bad_tcp_packets
  
  # 从 WAN 进入防火墙主机的 ICMP 封包必须先进行 icmp_packets 过滤,这是为了避免骇客传
送不完整的 IP 封包,系统会响应 ICMP 封包通知对方,导致主机位置被侦测出来
  $IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets
  
  # 从 LAN 进入防火墙主机的全部 unicast 和 broadcast 封包,通通放行;额外检查目的地 IP
可以将 multicast 封包滤除
  $IPTABLES -A INPUT -p ALL -i $LAN_IFACE -d $LAN_IP -j ACCEPT
  $IPTABLES -A INPUT -p ALL -i $LAN_IFACE -d $LAN_BROADCAST_ADDRESS -j ACCEPT
  
  # 从 Loopback 接口进入防火墙主机的所有封包,检查是否来自本机,若是则放行;此规则去检
查来源 IP ,似乎有些画蛇添足,因为只有来自本机的封包才有机会进入 Loopback 接口
  $IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT
  $IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT
  $IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INET_IP -j ACCEPT
  
  # 从 LAN 进入防火墙主机的 DHCP 封包,予以放行,只有当防火墙担任 DHCP 时才使用
  #$IPTABLES -A INPUT -p UDP -i $LAN_IFACE --dport 67 --sport 68 -j ACCEPT
  
  # 从 WAN 进入防火墙主机的所有封包,检查是否为响应封包,若是则予以放行
  $IPTABLES -A INPUT -p ALL -d $INET_IP -m state --state ESTABLISHED,RELATED -j ACCEPT
  
  # 限制过滤规则的比对频率为每分钟平均流量三个封包(超过上限的封包将暂停比对),并将瞬
间流量设定为一次最多处理三个封包(超过上限的封包将丢弃不予处理),这类封包通常是骇客用来
进行阻断式攻击 
  $IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level INFO
--log-prefix "IPT INPUT packet died: "
  
  #
  # 4.1.5 FORWARD chain(过滤要通过防火墙的封包)
  #
  #
  # 通过防火墙的 TCP 封包必须先进行 bad_tcp_packets 过滤
  $IPTABLES -A FORWARD -p TCP -j bad_tcp_packets
  
  # 从 LAN 要到 WAN 的封包通通放行
  $IPTABLES -A FORWARD -i $LAN_IFACE -o $INET_IFACE -j ACCEPT
  
  # 从 WAN 要到 LAN 的封包仅放行回应封包
  $IPTABLES -A FORWARD -i $INET_IFACE -o $LAN_IFACE -m state --state
ESTABLISHED,RELATED -j ACCEPT
  
  # 允许来自 WAN 的 Ping 封包,递送到校内所有的服务器
  $IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP1_IP -j
icmp_packets
  $IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP2_IP -j
icmp_packets
  $IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP3_IP -j
icmp_packets
  $IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP4_IP -j
icmp_packets
  $IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP5_IP -j
icmp_packets
  $IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP6_IP -j
icmp_packets
  
  # 允许来自 WAN 的 HTTP、HTTPS 封包,递送到校内所有的 WEB 服务器
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP1_IP -m
multiport --dport $HTTP,$HTTPS -j allowed
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP2_IP -m
multiport --dport $HTTP,$HTTPS -j allowed
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP3_IP -m
multiport --dport $HTTP,$HTTPS -j allowed
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP4_IP -m
multiport --dport $HTTP,$HTTPS -j allowed
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP5_IP -m
multiport --dport $HTTP,$HTTPS -j allowed
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP6_IP -m
multiport --dport $HTTP,$HTTPS -j allowed
  
  # 允许来自 WAN 的 FTP 封包,递送到校内所有的 FTP 服务器
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_FTP1_IP -m
multiport --dport $FTP,$FTP_DATA -j allowed
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_FTP2_IP -m
multiport --dport $FTP,$FTP_DATA -j allowed
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_FTP3_IP -m
multiport --dport $FTP,$FTP_DATA -j allowed
  
  # 允许来自 WAN 的 SMTP、POP3、IMAP 封包,递送到校内所有的 MAIL 服务器
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_MAIL1_IP -m
multiport --dport $SMTP,$POP3,$IMAP -j allowed
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_MAIL2_IP -m
multiport --dport $SMTP,$POP3,$IMAP -j allowed
  
  # 允许来自 WAN 的 SSH、TELNET、WEBMIN、WAM 封包,递送到校内所有的 LINUX 服务器
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_WAM1_IP -m
multiport --dport $SSH,$TELNET,$WEBMIN,$WAM -j allowed
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_WAM2_IP -m
multiport --dport $SSH,$TELNET,$WEBMIN,$WAM -j allowed
  
  # 允许来自 WAN 的 PCanywhere 封包,递送到校内所有的 PCanywhere 服务器
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_PCAW1_IP --dport
$PCAW_TCP -j allowed
  $IPTABLES -A FORWARD -p UDP -i $INET_IFACE -o $LAN_IFACE -d $LAN_PCAW1_IP --dport
$PCAW_UDP -j ACCEPT
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_PCAW2_IP --dport
$PCAW_TCP -j allowed
  $IPTABLES -A FORWARD -p UDP -i $INET_IFACE -o $LAN_IFACE -d $LAN_PCAW2_IP --dport
$PCAW_UDP -j ACCEPT
  
  # 允许来自 WAN 的 DNS 封包,递送到校内的 DNS 服务器
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_DNS_IP --dport $DNS
-j allowed
  $IPTABLES -A FORWARD -p UDP -i $INET_IFACE -o $LAN_IFACE -d $LAN_DNS_IP --dport $DNS
-j ACCEPT
  
  # 限制过滤规则的比对频率为每分钟平均流量三个封包(超过上限的封包将暂停比对),并将瞬
间流量设定为一次最多处理三个封包(超过上限的封包将丢弃不予处理),这类封包通常是骇客用来
进行阻断式攻击 
  $IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level
DEBUG --log-prefix "IPT FORWARD packet died: "
  
  #
  # 4.1.6 OUTPUT chain(过滤从防火墙送出的封包)
  #
  #
  # 从防火墙送出的 TCP 封包必须先进行 bad_tcp_packets 过滤
  $IPTABLES -A OUTPUT -p TCP -j bad_tcp_packets
  
  # 从防火墙网卡送出的所有封包,通通放行
  $IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
  $IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
  $IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT
  
  # 限制过滤规则的比对频率为每分钟平均流量三个封包(超过上限的封包将暂停比对),并将瞬
间流量设定为一次最多处理三个封包(超过上限的封包将丢弃不予处理),这类封包通常是骇客用来
进行阻断式攻击 
  $IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level
DEBUG --log-prefix "IPT OUTPUT packet died: "
  
  ######
  # 4.2 nat table
  #
  #
  # 4.2.1 Set policies
  #
  #
  # 4.2.2 Create user specified chains
  #
  #
  # 4.2.3 Create content in user specified chains
  #
  #
  # 4.2.4 PREROUTING chain(定义目的地地址转译)
  #
  # 从 WAN 要到校内服务器的封包,在封包过滤前先转译目的地 IP 为 NAT IP
  $IPTABLES -t nat -A PREROUTING -d $HTTP1_IP -j DNAT --to-destination $LAN_HTTP1_IP
  $IPTABLES -t nat -A PREROUTING -d $HTTP2_IP -j DNAT --to-destination $LAN_HTTP2_IP
  $IPTABLES -t nat -A PREROUTING -d $HTTP3_IP -j DNAT --to-destination $LAN_HTTP3_IP
  $IPTABLES -t nat -A PREROUTING -d $HTTP4_IP -j DNAT --to-destination $LAN_HTTP4_IP
  $IPTABLES -t nat -A PREROUTING -d $HTTP5_IP -j DNAT --to-destination $LAN_HTTP5_IP
  $IPTABLES -t nat -A PREROUTING -d $HTTP6_IP -j DNAT --to-destination $LAN_HTTP6_IP
  
  #
  # 4.2.5 POSTROUTING chain(定义来源地址转译)
  #
  # 从校内服务器要到 WAN 的封包,在送出之前先转译来源 IP 为 NIC IP,配合上面区块的设
定,就可以做到一对一对应
  $IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP1_IP -j SNAT --to-source
$HTTP1_IP
  $IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP2_IP -j SNAT --to-source
$HTTP2_IP
  $IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP3_IP -j SNAT --to-source
$HTTP3_IP
  $IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP4_IP -j SNAT --to-source
$HTTP4_IP
  $IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP5_IP -j SNAT --to-source
$HTTP5_IP
  $IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP6_IP -j SNAT --to-source
$HTTP6_IP
  # 从校内一般单机要到 WAN 的封包,在送出之前先转译来源 IP 为预设的 NIC IP,这就是多对
一对应,若指定成 IP 范围,就变成多对多对应,例如本范例即是如此
  $IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $IP_POOL
  
  #
  # 4.2.6 OUTPUT chain
  #
  ######
  # 4.3 mangle table
  #
  #
  # 4.3.1 Set policies
  #
  #
  # 4.3.2 Create user specified chains
  #
  #
  # 4.3.3 Create content in user specified chains
  #
  #
  # 4.3.4 PREROUTING chain
  #
  #
  # 4.3.5 INPUT chain
  #
  #
  # 4.3.6 FORWARD chain
  #
  #
  # 4.3.7 OUTPUT chain
  #
  #
  # 4.3.8 POSTROUTING chain
  #
收下,谢谢!