您的位置:首页 > 运维架构 > Linux

Linux 防火墙与NAT服务

2013-10-26 17:30 190 查看
防火墙与NAT服务器

Linux的防火墙主要透过Netfilter与TCPWrappers两个机制来管理的,其中Netfilter防火墙机制,可以让我们的私有IP的主机上网(IP分享器功能)

并且也能够让Internet连接到我们内部的私有IP所架设的Linux服务器(DNAT功能),网络安全除了随时注意软件的漏洞以及网络上的安全通报之外,最好能够

依据自己的环境来制定防火墙机制,透过一些有顺序的规则,并管制进入到我们网域内的主机(或者说是网域)数据封包的一种机制,广义的说,就是只能能够

分析与过滤进出我们管理之网域的封包数据,那就是防火墙

防火墙分为硬件防火墙与本机的软件防火墙,硬件防火墙是由厂商设计好的主机硬件,这部硬件防火墙内的操作系统主要以提供封包数据的过滤机制为主

并将其他不必要的功能拿掉,软件防火墙本身就是在保护系统网络安全的一套软件(或称为机制),例如Netflter与TCP Wrappers都可以称为软件防火墙

反正防火墙就是用来保护我们网络安全的咚咚,Linux系统本身提供的软件防火墙的功能,那就是Netfilter,还有就是TCPWrappers

Netfilter这种封包过滤式的防火墙机制,会用到基础的封包与讯框的概念,例如MAC,IP,ICMP,TCP,UDP等封包表头数据的认识,以及

Network/Netmask的整体网域写法。

虽然Filter机制可以通过iptables指令的方式来进行规则的排序与修改,但是最好还是利用shell script来撰写属于自己的防火墙机制比较好,因为对于规则的排序

与汇整比较包的观察性,可以让防火墙规则比较清晰一点,再写之前需要对一些知识有所了解

已经认识Shell以及Shell script,网络基础知识,网络安全知识,路由器概念,最好拥有两部主机以上的小型局域网络环境,以方便测试,做好区域防火墙

的Linux主机最好有两张实体网卡,可以进行多种测试,并架设NAT服务器

封包进入主机时,会通过防火墙,服务器软件程序,SELinux与文件系统,如果你的系统(1)已经关闭不需要而且危险的服务,(2)已经将整个系统的所有软件都保持在最新的状态

(3)权限设定妥当而且定时进行备份工作 (4) 已经教育用户具有良好的网络,系统操作习惯,那么你的系统实际上已经颇有安全了,最后要不要架设防火墙就要看你自己了

不过,万一哪一天你在进行某个服务的测试时,主机突然就启动了一个网络服务,如果没有管制该服务的使用范围,那么该服务就等于对所有Internet开放,那就麻烦了

因为该服务可能可以允许任何人登录你的系统,那就危险了。

那么防火墙最大的功能就是帮助你【限制某些服务的存取来源】,例如:(1) 你可以限制文件传输服务(FTP)只能在子域内的主机才能够使用,而不对整个Internet开放

(2) 你可以限制整部Linux主机仅可以接受客户端的WWW要求,其他的服务予以关闭 (3) 还可以限制整部主机仅能主动对外联机,反之,若有客户端对我们

的主机发送主动联机的封包状态(TCP 封包的SYN flag)就予以抵挡等等,这些就是最重要的防火墙功能了

防火墙最重要的任务就是在规划出:

1.切割被信任(如子域)与不被信任(如Internet)的网段;

2.划分出可提供Internet的服务与必须受保护的服务;

3.分析出可接受与不可接受的封包状态;

当然Linux的iptables防火墙软件还可以进行更细部深入的NAT的设定,并进行更弹性的IP封包伪装功能,不过,不过对于单一主机的防火墙来说

最简单的任务就是上面的那三项,架设防火墙时你必须要知道那些数据与服务需要保护,针对需要受保护的服务来设定防火墙的规则,那在Linux上头常见的防火墙类型有哪

些? 系统上防火墙的主要类别:基本上依据防火墙管理的范围,可以将防火墙分为网域型与单一主机型的控管,在单一主机型的控管方面,主要的防火墙有封包

过滤型的Netfilter与依据服务软件程序作为分析的TCP Wrappers两种,若为区域型的防火墙,由于此防火墙都是当作路由器的角色,因此防火墙类型主要有

封包过滤的Netfilter与利用代理服务器(proxy server)进行存取代理的方式

Netfilter (封包过滤机制)

所谓封包过滤,亦即是分析进入主机的网络封包,将封包的表头数据捉出来进行分析,以决定该联机为放行或抵挡的机制,由于这种方式可以直接分析封包表头数据,包括

硬件地址(MAC), 软件地址 (IP), TCP, UDP, ICMP 等封包的信息都可以进行过滤分析的功能,因此用途广泛(其主要分析的是OSI七层协议的2,3,4层),在Linux上面使用

核心内建的Netfilter这个机制,而Netfilter提供了ipbtales这个软件来作为防火墙封包过滤的指令,由于Netfilter是核心内建的功能,因此他的效率非常的高,非常适合于一般

小型环境的设定,Netfilter利用一些封包过滤的规则设定,来定义出什么资料可以接受,什么资料需要剔除,以达到保护主机的目的

TCP Wrappers(程序控管)

另一种抵挡分包进入的方法,为透过服务器程序的外挂(tcpd)来处置的,与封包过滤不同的是,他主要分析谁对某程序进行存取,然后透过规则去分析该服务器程序谁能够联机

,谁不能联机,由于主要是分析服务器程序来控管,因此与启动的端口无关,只与程序的名称有关,例如FTP启动在21端口进行监听,当你透过Linux内建的TCP Wrappers

限制FTP时,那么你只要知道FTP的软件名称(vsftpd),然后对他作限制,则不管FTP启动在哪个端口,都会被该规则管理的

Proxy (代理服务器)

其实代理服务器是一种网络服务,他可以代理用户的需求,而代为前往服务器取得相关的资料:

1.client 会向 proxy server 要求数据,请 proxy 帮忙处理;

2.proxy 可以分析使用者 IP 来源是否合法?使用者想要去Google 服务器是否合法? 如果这个 client 的要求都合法的话,那么proxy 就会主动的帮忙 client 前往 Google 取得资料

3.Google 所回传的数据是传给 proxy server 的,所以Google服务器上面看到的是proxy server的IP

4.最后proxy将Google回传的数据送给client

其实client并没有直接链接上internet,只要proxy与Client可以联机就可以了,此时client甚至不需要拥有public IP,而当有人想要攻击client端的主机,除非他能攻破proxy

server ,否则是无法与client联机的,一般proxy主机开放port 80, 21, 20 等 WWW 与 FTP 的埠口而已,而且通常Proxy就架设在路由器上面,因此可以完整的掌握局域网

内的对外联机,让你的LAN变的更安全,有兴趣可以参考一下squid这个软件服务

防火墙的布线:前面提到防火墙除了可以保护防火墙机制本身所在的那部主机之外,还可已保护防火墙后面的主机,也就是说,防火墙除了可以防备本机被入侵外,还可以

架设在路由器上面控管进出本地端网域的网络封包,这种规划对于内部私有网域的安全也有一定程度的保护作用:目前常见的防火墙与网络布线的配置:

单一网域,仅有一个路由器:

防火墙可以作为Linux本机的基本保护之外,还可以架设在路由器上面以控管整个局域网络的封包进出,因此这类的防火墙上面通常至少需要两个接口,将可信任的内部与

不可以信任的Internet分开,所以设定两块网络接口的防火墙规则,只要管理一部主机就能够造福整个LAN里面的PC,很划算,如果想要将局域网络控管的更严格的话,可以

在这部Linux防火墙上面架设更严格的代理服务器,让客户端仅能连上你所开放的WWW服务器而已,而且还可以透过代理服务器的登录文件分析功能,明确的查处来那个使用

者在某个时间点曾经连上哪些WWW服务器,如果在防火墙上面再加装类似MRTG的流量控制软件,还能针对整个网域的流量进行监测,这样配置的优点:

1. 内外网域已经分开,所以安全维护在内部可以开放的权限较大。

2.安全机制的设定可以针对LInux防火墙主机来维护即可。

3.对外只看的到Linux防火墙主机,所以对于内部可以达到有效的安全防护

内部网络包含安全性更高的子网,需内部防火墙切开子网:

一般来说,我们的防火墙对于LAN的防备都不会设定的很严格,因此是我们自己的LAN,所以是信任网域之一,不过,最常听到的入侵方法也是使用这样的一个信任漏洞,因为

你不能保证所有使用企业内部计算机的用户都是公司的员工,也不能保证员工不会搞破坏,更多时候是由于某些外来访客利用用笔记本电脑连接到公司内部网络来加以窃取

企业内部的重要信息,
1b136
所以,将特别重要的部门需要更安全的保护网络环境,那么将LAN里面再加设一个防火墙,将安全等级分类,那么将会让你的重要数据获得更佳的保护

在防火墙的后面假设网络服务器主机

将提供网络服务的服务器放在防火墙后面,好处:WEB,MAIL与FTP都是透过防火墙连到Internet上面去,在internet上面的Public IP都是一样的(这个观念会在底下de NAT

服务器的时候再次的强调),只是透过防火墙的封包分析后,将WWW的要求封包送到WEB主机,将MAIL送给MAIL Server去处理而已(透过端口的不同来传递),因为这几部

服务器在Internet上面看到的IP相同,但是事实上却是不同的主机,当有攻击者想要入侵你的FTP主机时,他使用各种分析方法去进攻的主机其实是防火墙那一部主机,攻击者

想要攻击内部的服务器主机,除了他能成功的搞定你的防火墙,否则很难入侵你的内部主机

而且,由于主机放置在两部防火墙中间,内部网络发生状况时,是不会影响到网络服务器的正常工作的,这种方式适用与比较大型的企业当中,对企业来说,网络主机能否提供

正常稳定的服务是很重要的。不过,这种架构下所进行的设定就得包含端口的转递,而且要有很强的网络逻辑概念,可以理清封包双向沟通时的流动方式,

将网络服务器独立放置在两个防火墙中间的网络,我们称为非军事区域 (DMZ),DMZ的目的就是保护服务器本身,所以将Internet与LAN都隔离开来,如此一来不论是服务器

本身,或者LAN被攻陷,另一个区块还是完好无缺的。

防火墙的使用限制

我们知道防火墙主要在分析OSI七层协议当中的2,3,4层,既然如此,Linux的Netfilter机制到底做了些什么事情?其实可以进行的分析工作主要有:

拒绝让Internet的封包进入主机的某些端口:例如你的port 21这个FTP相关端口,若只想要开放给内部网络的话,那么当Internet来的封包想要进入你的port 21时,就可以将

该数据封包丢掉,因此我们可以分析的到该封包表头的端口号码

拒绝让某些来源IP的封包进入:例如你已经发现某个IP主要都是来自攻击行为的主机,那么只要将来自该IP的数据封包,将他丢弃,可以达到基础的安全

拒绝让带有某些特殊旗标(flag) 的封包进入:最常拒绝的就是带有SYN的主动联机的旗标,只要一经发现,就可以将该封包丢弃

分析硬件地址 (MAC) 来决定联机与否:如果你使用IP抵挡攻击者时,他会更换一个IP,此时就需要死锁他的网络卡硬件地址,因为MAC是焊在网络卡上面的,所以你只要分析

到该使用者使用的MAC之后,可以利用防火墙将该MAC锁住,除非他能够一换再换他的网络卡来取得新的MAC,否则换IP是没有用的

虽然 Netfilter 防火墙已经可以做到这么多的事情,不过,还是有很多事情没有办法透过Netfilter来完成,防火墙虽然可以防止不受欢迎的封包进入我们的网络中,不过,某些

情况下,他并不能保证我们的网络一定就很安全,例如:

防火器并不能很有效的抵挡病毒或木马程序:假设你开放了WWW的服务,那么你的WWW主机上面,防火墙一定得要将WWW服务的port开放给client端登录才行,否则WWW

主机设定等于没有,也就是说:只要进入你的主机的封包是WWW数据的,就可以通过你的防火墙,万一你的WWW服务器软件有漏洞,或者本身向你要求WWW服务的封包

就是病毒在侦测你的系统时,你的防火墙一点办法也没有,因为本来设定的规则就是会让他通过的

防火墙对于内部LAN的攻击较无承受力:我们对于LAN里面的主机没有什么防火墙的设定,因为是自己的LAN,当然设定为信任网域了,不过,LAN里面总是可能有些网络

破坏者,这个时候就很糟糕,因为防火墙对于内部的规则设定通常比较少,所以就容易造成内部员工对于网络误用或滥用的情况

所以在你的 Linux 主机实地上网之前,还是得先: 关闭几个不安全的服务,升级几个可能有问题的套件,架设好最起码的安全保护--防火墙--

TCP Wrappers

TCP Wrappers是透过客户端想要链接的程序文件名,然后分析客户端IP,看看是否放行的,哪些程序支持 TCP wrappers 的功能,TCP Wrappers如何设定:

TCP wrappers 就是透过 /etc/hosts.allow, /etc/hosts.deny 这两个文件来管理一个类似防火墙的机制,但并非所有的软件都可以透过这两个档案来控管,只有底下的软件才

能够透过这两个档案来管理防火墙规则,分别是:

由 super daemon (xinetd) 所管理的服务;经由xinted管理的服务,配置文件在/etc/xinted.d/里面的服务就是xinted所管理的,通过chkconfig xinetd on来查看xinetd下的服务

有支援 libwrap.so 模块的服务,查看rsyslogd, sshd, xinetd, httpd这四个程rsyslogd, sshd, xinetd, httpd

序有没有支持tcp wrappers的抵挡功能?

由于支持tcp wrappers的服务必定包含libwrap这个动态函式库,因此可以使用ldd来观察该服务即可,使用方式:

ldd $(which rsyslogd sshd xinetd httpd)这个方式可以将所有的动态函式库取出来查阅

for name in rsyslogd sshd xinetd httpd;  do echo $name;  ldd $(which $name) | grep libwrap; done 透过这个方式来处理更快更直观

上述的结果中,在该档名下有出现libwrap的,代表有找到该函式库,才有支持tcp wrappers ,所以sshd xinetd有支持,但是rsyslogd,httpd这两支程序

则不支持,也就是说,httpd与rsyslogd不能够使用/etc/hosts.{allow|deny}来进行防火墙机制的控管

/etc/hosts.{allow|deny} 的设定方式

那如何透过这两个档案来抵挡有问题的IP来源? 这两个档案的语法都一样:

service(program_name)              IP, domain, hostname                

服务(亦即程序名称)                   IP 或领域 或主机名

之前说过Netfilter的规则是有顺序的,那么这两个档案与规则的顺序优先是如何的? 基本上如下:

先以 /etc/hosts.allow 为优先比对,该规则符合就予以放行;

再以 /etc/hosts.deny 比对,规则符合就予以抵挡;

若不在这两个档案内,亦即规则都不符合,最终则予以放行。

例题:先开放本机的127.0.0.1可以进行任何本机的服务,然后,让区网(192.168.1.0/24) 可以使用 rsync,同时 10.0.0.100 也能够使用 rsync

,但是其他来源则不允许使用rsync的,我们先要知道rsync的服务启动的档名为何,因为tcp wrappers是透过启动服务的档名来管理的,当我们观察rsync的配置文件时

cat /etc/xinetd.d/rsync ,可以发现启动档名叫做rsync

编辑 vim /etc/hosts.allow

ALL: 127.0.0.1  <==这就是本机全部的服务都接受!

rsync: 192.168.1.0/255.255.255.0 10.0.0.100 不同的内容以空格符隔开

编辑 vim /etc/hosts.deny

rsync: ALL 这个服务拒绝所哟。

从上面的设定中有几个重点需要注意:首先tcp wrappers理论上不支持192.168.1.0/24这种透过bit数值来定义的网域,只支持netmask的地址显示方式

如果有多个网域或者是单一来源,可以透过空格来累加,写成多行也可以,多写几行【kshd : IP】的方式也可以,不必要将所有数据集中在一行,因为tcp wrappers也是

一条一条规则比对的。

基本上,主要了解这些数据即可,因为绝大多数的时刻,我们建议使用Netfilter的机制来抵挡封包。

Linux封包过滤软件:iptables

不同Linux版本的防火墙软件:LInux的防火墙就是由Linux核心所提供,由于直接经过核心来处理,因此效能非常好,不过不同核心版本所使用的防火墙软件

是不一样的,因此核心支持的防火墙是逐渐而来的

Version 2.0:使用 ipfwadm 这个防火墙机制;

Version 2.2:使用的是 ipchains 这个防火墙机制;

Version 2.4 与 2.6 :主要是使用 iptables 这个防火墙机制

不同核心使用的防火墙机制不同,且支持的软件指令与语法也不相同,所以在Linux上头设定属于你自己的防火墙规则时,要注意,先用uname -r

追踪一下你的核心版本再说,如果是安装2004年以后推出的distributions,那就不需要担心,因为distributions 几乎都使用 kernel 2.6 版的核心

封包进入流程:规则顺序的重要性

防火墙规则的意思是:因为iptables是利用封包过滤的机制,所以他会分析封包的表头数据,根据表头数据与定义的规则来决定该封包是否可以进入主机或者是被丢弃

,意思就是说,根据封包的分析资料"比对"你预先定义的规则内容,若封包数据与规则内容相同则进行动作,否则就继续下一条规则的比对,重点在于比对与分析顺序上

举个例子,假设预先定义10条防火墙规则,那么当internet来了一个封包想要进入我的主机,那么防火墙如何分析这个封包呢?

当一个网络封包要进入到主机之前,会先经由 NetFilter 进行检查,那就是iptables 的规则了。检查通过则接受进入本机取得资源,如果不通过,则可能予以丢弃

其实规则是有顺序的,例如当网络封包进入Rule 1的比对时,如果比对结果符合Rule 1,此时这个网络封包就会进行Action 1的动作,而不会理会后续的

Rule2,Rule3等规则的分析了,而如果这个封包不符合Rule 1的比对,那就会进入Rule2的比对了,如此一个一个规则去进行比对就是了,那如果所有的规则都不符合呢?

此时就会透过预设动作(封包政策,Policy)来决定这个封包的去向,所以你的规则顺序排列错误时,就是产生很严重的错误了

例如:假设你的Linux提供WWW的服务,自然要针对port 80来启用通过的封包规则,但是你发现IP来源是192.168.100.100 老是恶意的尝试入侵你的系统,所以将该IP拒绝了

最后,所有的非WWW封包都给他丢弃,就这三个规则来说,如要如何设定防火墙检验顺序呢?

1.Rule 1 先抵挡 192.168.100.100 ;

2.Rule 2 再让要求 WWW 服务的封包通过;

3.Rule 3 将所有的封包丢弃。

这样的排列顺序就能符合你的需求,不过,万一你的顺序排错了,例如1和2的位置调换了,那么就会变成只要是对你的WWW服务送出的封包,都可以使用你的WWW服务,

因为你的规则定义第一条就会让他通过,而不去考虑第二条规则,这就是规则顺序的要求,如果 Rule 1 变成了『将所有的封包丢弃』,Rule 2 才设定『WWW 服务封包通

过』,client怎么都是不可以使用我的WWW服务的,因为第一条规则挡住了WWW服务的封包

iptables 的表格 (table) 与链 (chain)

事实上上面讲的规则仅是iptables众多表格当中的一个链(chain)而已,什么是链?因为防火墙软件里面有多个表格(table),每个表格都定义出自己的默认政策与规则,且每个

表格的用途都不相同,表格包括:

Filter表格(与本机有关) INPUT OUTPUT FORWARD   3个chain

NAT表格(与本机后端有关) PREROUTING OUTPUT POSTROUTING 3个chain

Mangle(与标记有关) PREROUTING OUTPUT 2个chain

自定义(options) Policy 自定义

其实上面讲的仅是其中的某个chain而已,三个表格,包括管理本机进出的Filter ,管理后端主机(防火墙内部的其他计算机)的nat,管理特殊旗标使用的mangle(较少使用)

更有甚者,我们还可以自定义额外的链呢,每个表格与其中链的用途分别是这样的:

filter (过滤器):主要跟进入 Linux 本机的封包有关,这个是预设的  table  

INPUT:主要与想要进入我们 Linux 本机的封包有关;

OUTPUT:主要与我们 Linux 本机所要送出的封包有关;

FORWARD:这个咚咚与 Linux 本机比较没有关系,他可以『转递封包』到后端的计算机中,与下列nat table相关性较高

nat (地址转换): 是 Network Address Translation 的缩写, 这个表格主要在进行来源与目的之 IP 或 port 的转换,与Linux本机较无关,主要与Linux主机后的局域网络内计算机较

有关系

PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)

POSTROUTING:在进行路由判断之后所要进行的规则 (SNAT/MASQUERADE)

OUTPUT:与发送出去的封包有关

mangle (破坏者):这个表格主要是与特殊的封包的路由旗标有关, 早期仅有 PREROUTING 及 OUTPUT 链,不过从 kernel 2.4.18 之后加入了 INPUT 及FORWARD 链。由于这个

表格与特殊旗标相关性较高,所以在单纯的环境中,很少使用mangle这个表格

所以说,如果你的 Linux 是作为 www 服务,那么要开放客户端对你的 www 要求有响应,就得要处理 filter 的 INPUT 链

而如果你的 Linux 是作为局域网络的路由器,那么就要分析nat个各个链以及filter的FORWARD链才行,也就是说,其实各个表格的链接之间是有关系的,



我们的Iptables可以控制三种封包的流向:

1.封包进入Linux主机使用资源(路径A);在路由判断后确定是向Linux主机要求数据的封包,主要是透过fileter的INPUT链来进行控管的

2.封包经由Linux主机的转递,没有使用主机资源,而是向后端主机流动(路径B),在路由判断之前进行封包表头的修订作业后,该封包主要

是透过防火墙而去后端,此时封包就会透过路径B来跑动,也就是说,该封包的目标并非我们的Linux主机,主要经过的链是Filter的Forward

以及nat的POSTROUTING, PREROUTING。这路径B的封包流向使用情况

3.封包由 Linux 本机发送出去 (路径 C):例如响应客户端的要求,或者是Linux主机主动发送的封包,都是通过路径C来跑动的,先是路由判断

决定输出的路径后,再透过filter的OUTPUT链来传送的,当然,最终还是会经过nat的POSTROUTING 链

将mangle拿掉的话:



事实上与本机有关的其实是filter这个表格内的INPUT与OUPUT这两条链,如果你的iptables只是用来保护Linux主机本身的话,那nat的规则根本

就不需要理会,直接设定为开放即可,不过,如果你的防火墙是用来管理LAN内的其他主机的话,那么就必须要再针对filter的FORWARD这条链,还有nat的

PREROUTING, POSTROUTING 以及OUTPUT 进行额外的规则订定才行。 nat 表格的使用需要很清晰的路由概念才能够设定的好

,建议新手先不要碰!最多就是先玩一玩最阳春的 nat 功能『IP 分享器的功能』就好了!

本机的 iptables 语法

因为 iptables 的指令会将网络封包进行过滤及抵挡的动作,所以, 请不要在远程主机上进行防火墙的练习,因为你很有可能一不小心将自己关在家门外,尽量在本机前面登录

tty1-tty6 终端机进行练习,否则常常会发生悲剧啊,当你安装好 Linux 之后,系统应该会主动的帮你启动一个阳春的防火墙规则才是,这个阳春防火墙可能不是我们想要的模式

我们需要额外进行一些修订的行为,刚刚提到咱们的 iptables 至少有三个预设的 table (filter, nat, mangle),较常用的是本机的 filter 表格,这也是默认表格,另一个则是后端的

nat 表格,至于 mangle 较少使用, 所以这个章节我们并不会讨论 mangle。由于不同的table他们的链不一样,导致使用的指令语法或多或少都有点差异,

我们主要将针对 filter 这个默认表格的三条链来做介绍,使用root进行设定

规则的观察与清除:如果你在安装的时候选择没有防火墙的话,那么iptables在一开始的时候应该是没有规则的,不过,可能因为你在安装的时候就有选择系统自动帮你建立

防火墙机制,那么系统就会有默认的防火墙规则了,总之,先来看一下本机目前的防火墙规则

iptables [-t tables] [-L] [-nv]  选项与参数:

-t :后面接 table ,例如 nat 或 filter ,若省略此项目,则使用默认的 filter

-L :列出目前的 table 的规则

-n :不进行 IP 与 HOSTNAME 的反查,显示讯息的速度会快很多!

-v :列出更多的信息,包括通过该规则的封包总位数、相关的网络接口等

范例:列出 filter table 三条链的规则 : iptables -L -n

范例:列出 nat table 三条链的规则 : iptables -t nat -L -n 

从输出中看出每一个Chain就是前面提到的每一个链,Chain那一行里面括号的policy就是预设的政策,那底下target,port代表:

target:代表进行的动作, ACCEPT 是放行,而 REJECT 则是拒绝,此外,此外,尚有 DROP (丢弃) 的项目!

prot:代表使用的封包协议,主要有 tcp, udp 及 icmp 三种封包格式;

opt:额外的选项说明

source :代表此规则是针对哪个『来源 IP』进行限制?

destination :代表此规则是针对哪个『目标 IP』进行限制?

若针对单击来说,INPUT与FORWARD算是比较重要的管制防火墙链,所以可以发现最后一条规则是REJECT,虽然INPUT与FORWARD的政策是放行的,不过最后一条规则

就已经将全部的封包都拒绝了,不过这个指令的观察只是作个格式化的查阅,要详细解释每个规则会比较不容易解析,例如INPUT的5条规则依据输出结果来说明一下

1.只要是封包状态为 RELATED,ESTABLISHED 就予以接受

2.只要封包协议是 icmp 类型的,就予以放行

3.无论任何来源 (0.0.0.0/0) 且要去任何目标的封包,不论任何封包格式(prot 为 all),通通都接受

4.只要是传给 port 22 的主动式联机 tcp 封包就接受

5.全部的封包信息通通拒绝

其中第三条,怎么会所有的封包信息都予以接受,如果这样的话后续的规则根本就可以不用了,其实那条规则是针对本机内的内部循环测试网络(lo)接口,如果没有列出接口

那么我们就很容易搞错,所以可以使用iptables-save这个指令来观察防火墙规则,iptables-save会列出完整的防火墙规则,只是没有格式化输出而已

iptables-save [-t table]  选项与参数:

-t :可以仅针对某些表格来输出,例如仅针对 nat 或 filter 等等

iptables-save ===>星号开头就是表格,冒号开头就是链,从这个命令的输出看,有底线去含有lo的那条规则当中,  -i lo 』指的就是由 lo适配卡进来的封包,因为有写道接口的

关系,不像之前的iptables -L -n,既然这个规则不是我们想要的,如何修改规则,先删除规则再慢慢建立各个需要的规则,

iptables [-t tables] [-FXZ]  选项与参数:

-F :清除所有的已订定的规则;

-X :杀掉所有使用者 "自定义" 的 chain (应该说的是 tables )

-Z :将所有的 chain 的计数与流量统计都归零

由于这三个指令会将本机防火墙的所有规则清除,但却不会改变预设政策(policy),如果你不是在本机下达这三个指令,很可能将自己挡在家门外(若INPUT为DROP时),要小心

由于防火墙的规则顺序是有特殊意义的,所以当然先清除掉规则,然后一条一条来设定会比较容易一点,底下来谈谈定义预设政策吧

定义预设政策 (policy)

清除规则之后,再接下来就是要设定规则的政策,政策指的是当你的封包不在你的设定的规则之内时,该封包的通过与否,是以Policy的设定为准,在本机方面的预设政策中

假设你对于内部的使用者有信心的话,那么filter内的INPUT链方面可以定义的比较严格一点,而FORWARD与OUPUT则可以设定的松一些,通常都是将INPUT的policy定义

为DROP,其他两个则定义为ACCEPT,至于nat table则暂时先不理会他

iptables [-t nat] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]  选项与参数:

-P :定义政策( Policy )。注意,这个 P 为大写啊!

ACCEPT :该封包可接受

DROP :该封包直接丢弃,不会让 client 端知道为何被丢弃。

范例:将本机的 INPUT 设定为 DROP ,其他设定为 ACCEPT

iptables -P INPUT DROP

iptables -P OUTPUT ACCEPT

iptables -P FORWARD ACCEPT

iptables-save,因为INPUT设定为DROP且又未有任何规则,所以上面的输出结果显示:

所有的封包都无法进入你的主机,是不通的防火墙设定(网络联机是双向的)

其他的nat table三条链的预设政策设定也是一样的方式,例如:【iptables -t nat -P PREROUTING ACCEPT 】就设定了nat table的PREROUTING 链为可接受的意思,

预设政策设定完毕后,来谈一谈关于各规则的封包基础比对设定把

1.封包的基础比对:IP, 网域及接口装置:防火墙规则的封包比对设定,既然是因特网,那么我们就由最基础的IP,网域与端口,亦即OSI的第三层

谈起,再来谈谈装置(网络卡)的限制等等

iptables [-AI 链名] [-io 网络接口] [-p 协议]   [-s 来源 IP/网域] [-d 目标 IP/网域] -j [ACCEPT|DROP|REJECT|LOG]  选项与参数:

-AI 链名:针对某的链进行规则的 "插入" 或 "累加"

-A :新增加一条规则,该规则增加在原本规则的最后面。例如原本已经有四条规则, 使用 -A 就可以加上第五条规则!

-I :插入一条规则。如果没有指定此规则的顺序,默认是插入变成第一条规则。例如原本有四条规则,使用 -I 则该规则变成第一条,而原本四条变成 2~5 号

链 :有 INPUT, OUTPUT, FORWARD 等,此链名称又与 -io 有关,请看底下。

-io 网络接口:设定封包进出的接口规范

-i : 封包所进入的那个网络接口,例如 eth0, lo 等接口。需与 INPUT 链配合;

-o :封包所传出的那个网络接口,需与 OUTPUT 链配合;

-p 协定:设定此规则适用于哪种封包格式  主要的封包格式有: tcp, udp, icmp 及 all 。

-s 来源 IP/网域:设定此规则之封包的来源项目,可指定单纯的 IP 或包括网域,例如: IP :192.168.0.100  网域:192.168.0.0/24, 192.168.0.0/255.255.255.0 均可。

若规范为『不许』时,则加上 ! 即可,例如:  -s ! 192.168.100.0/24 表示不许 192.168.100.0/24 之封包来源;

-d 目标 IP/网域:同 -s ,只不过这里指的是目标的 IP 或网域。

-j :后面接动作,主要的动作有接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT)及记录(LOG)

iptables 的基本参数就如同上面所示的,仅只谈到 IP 、网域与装置等等的信息,至于 TCP, UDP 封包特有的埠口 (port number) 与状态 (如 SYN 旗标) 则在下小节才会谈到

 好,先让我们来看看最基础的几个规则,例如开放 lo 这个本机的接口以及某个 IP 来源吧:

设定lo 成为受信任的装置,亦即进出lo封包都予以接受  iptables -A INPUT -i lo -j ACCEPT

仔细看上面并没有列出 -s, -d 等等的规则,这表示不论封包来自何处或去往哪里,只要是来自lo这个接口的,就予以接受,这个观念就是【没有指定的项目,则表示该项目完全

接受】的意思,例如这个案例当中关于 -s 或 -d等等的参数没有规定时,就代表不论什么值都会被接受

这就是所谓的信任装置啦,假设你的主机有两张以太网络卡,一张对内部的网域,假设该网卡的代号为eth1好了,如果内部网域是可信任的,那么该网卡的进出

封包就通通会被接受,那你就能够用:『iptables -A INPUT -i eth1 -j ACCEPT』来将该装置设定为信任装置,不过,下达这个命令前特别注意,因为

这样等于该网卡没有任何防备了

范例:只要是来自内网的 (192.168.100.0/24) 的封包通通接受

iptables -A INPUT -i eth1 -s 192.168.100.0/24 -j ACCEPT  由于是内网就接受,因此也可以称为信任网域

范例:只要是来自 192.168.100.10 就接受,但 192.168.100.230 这个恶意来源就丢弃

iptables -A INPUT -i eth1 -s 192.168.100.10 -j ACCEPT

iptables -A INPUT -i eth1 -s 192.168.100.230 -j DROP

针对单一IP来源,可视为信任主机或者不信任的恶意来源

iptables-save可以查看到之前设定的filter规则了这就是最简单的防火墙规则的设定与观察模式,不过,在上面的案例中,其实你也发现到有两条规则可能有问题

那就是上面的特殊字体圈起来的规则顺序,明明已经放行了 192.168.100.0/24 了,所以那个 192.168.100.230 的规则就不可能会被用到!这就是防火墙设定

那该如何?重新输入规则啊,那如果想要记录某个规则的记录怎么办?可以这样做:

iptables -A INPUT -s 192.168.2.200 -j LOG

接着iptables -L -n 进行查看,看到输出结果的最左边,会出现LOG,只要有封包来自192.168.2.200 这个 IP时, 那么该封包的相关信息就会被写入到核心讯息,亦即是 /var/log

/messages 这个档案当中。 然后该分包会继续进行后续的规则比对,所以说,LOG这个动作仅在进行记录而已,并不会影响到这个封包的其他规则比对的,接下来分别来看看

TCP,UDP以及ICMP封包的其他规则比对

TCP, UDP 的规则比对:针对埠口设定

谈到TCP与UDP时,比较特殊的就是那个端口,在TCP方面则另外有所谓的联机封包状态,包括最常见的SYN主动联机的封包格式,那么如何针对这两种封包格式进行防火墙

规则的设定呢?

iptables [-AI 链] [-io 网络接口] [-p tcp,udp]  [-s 来源 IP/网域] [--sport 埠口范围]  [-d 目标 IP/网域] [--dport 埠口范围] -j [ACCEPT|DROP|REJECT]  选项与参数:

--sport 埠口范围:限制来源的端口口号码,端口口号码可以是连续的,例如 1024:65535

--dport 埠口范围:限制目标的端口口号码

事实上就是多了那个--sport 及 --dport 这两个玩意儿,重点在那个 port 上面,不过要特别注意,因为仅有tcp与udp封包具有端口,因此你要使用--dport,--sport 时,

得要加上 -p tcp 或 -p udp 的参数才会成功,底下来测试:

范例:想要联机进入本机 port 21 的封包都抵挡掉:

iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP

范例:想连到我这部主机的网芳 (upd port 137,138 tcp port 139,445) 就放行

iptables -A INPUT -i eth0 -p udp --dport 137:138 -j ACCEPT

iptables -A INPUT -i eth0 -p tcp --dport 139 -j ACCEPT

iptables -A INPUT -i eth0 -p tcp --dport 445 -j ACCEPT

你可以利用UDP与TCP协议所拥有的端口号来进行某些服务的开放或关闭,你还可以综合处理,例如只要来自192.168.1.0/24 的 1024:65535 埠口的封包, 

且想要联机到本机的 ssh port 就予以抵挡,可以这样做:

iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 --sport 1024:65534 --dport ssh -j DROP

如果忘记加上 -p tcp 就使用了 --dport 时,会发生啥问题呢? 命令行会提示你『 --dport 』是未知的参数 (arg) ,这是因为你没有加上-p tcp 或 -p udp 的缘故

除了埠口之外, TCP 还有特殊的旗标啊! 最常见的就是那个主动联机的SYN旗标了,我们在iptables里面还支持『 --syn 』的处理方式,

范例:将来自任何地方来源 port 1:1023 的主动联机到本机端的 1:1023 联机丢弃

iptables -A INPUT -i eth0 -p tcp --sport 1:1023 --dport 1:1023 --syn -j DROP,一般来说client端启动的port都是大于1024以上的端口,而server端则是启用小于1023以下的

端口在监听的,所以我们可以让来自远程的小于1023以下的端口数据的主动联机给他丢弃,但不适用在FTP的主动联机中

iptables 外挂模块:mac 与 state

因为之前的ipchains没有所谓的封包状态模块,因此我们必须要针对封包的进,出方向进行管控,例如,如果想要联机到远程主机的22号端口,你必须要针对两条规则来设定:

本机端的 1024:65535 到远程的 port 22 必须要放行 (OUTPUT 链);

远程主机 port 22 到本机的 1024:65535 必须放行 (INPUT 链);

这样很麻烦,如果想要联机到10部主机的port 22时,假设OUTPUT为预设开启(ACCEPT),你依旧需要填写十行规则,让那十部远程主机的22号端口可以联机到你的本地主机上

同样,如果你想要让本地端主机可以连到外部的port 80,那就更不得了了,这就是网络联机是双向的一个重要概念,好在我们的 iptables 免除了这个困扰,他可以透过一个

状态模块来分析【这个想要进入的封包是否为刚刚我发送出去的响应】,如果是刚刚我发出去的响应,那么就可以予以接受放行,这样就不用管远程主机是否联机进来的问题了

iptables -A INPUT [-m state] [--state 状态] 选项与参数:

-m :一些 iptables 的外挂模块,主要常见的有:  state :状态模块   mac:网络卡硬件地址 (hardware address)

--state :一些封包的状态,主要有: INVALID:无效的封包,例如数据破损的封包状态   ESTABLISHED:已经联机成功的联机状态;

                                                        NEW:想要新建立联机的封包状态;  RELATED:这个最常用!表示这个封包是与我们主机发送出去的封包有关

范例:只要已建立或相关封包就予以通过,只要是不合法封包就丢弃

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A INPUT -m state --state INVALID -j DROP

如此一来,我们的iptables就会主动分析出该封包是否为响应状态,若是的话,就直接予以接收,这样一来就不需要针对响应的封包来撰写个别的防火墙规则

这真是太棒了!底下我们继续谈一下 iptables 的另一个外挂, 那就是针对网卡来进行放行与防御:

范例:针对局域网络内的 aa:bb:cc:dd:ee:ff 主机开放其联机 iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j ACCEPT

选项与参数:

--mac-source :就是来源主机的 MAC

如果有人老是透过修改IP去尝试透过路由器往外跑,那你该怎么办?并不能让整个区网拒绝,其实也不需要,只要透过之前的ARP相关概念,去捉到那部主机的MAC,

然后透过上面的这个机制,将该主机张个DROP掉即可,除非他知道你是用网卡的MAC来管理,否则他就是出不去啦

ICMP 封包规则的比对:针对是否响应 ping 来设计

ICMP的类型相当的多,而且很多ICMP封包的类型都是为了要用来进行网络监测用的,所以最好不要将所有的ICMP封包都丢弃,如果不是作为路由器的主机时,

通常我们会把ICMP type 8(echo request)拿掉而已,让远程主机不知到我们的存在,也不会接受ping的响应就是了,ICMP封包格式的处理是这样的

iptables -A INPUT [-p icmp] [--icmp-type 类型] -j ACCEPT  选项与参数:

--icmp-type :后面必须要接 ICMP 的封包类型,也可以使用代号,例如 8 代表 echo request 的意思。

范例:让 0,3,4,11,12,14,16,18 的 ICMP type 可以进入本机:

vi somefile

#!/bin/bash

icmp_type="0 3 4 11 12 14 16 18"

for typeicmp in $icmp_type

do

iptables -A INPUT -i eth0 -p icmp --icmp-type $typeicmp -j ACCEPT

done

执行 sh somefile

这样就能够开放部分的ICMP封包格式进入本机进行网络检测的工作了,如果你的主机是作为区网的路由器,那么建议icmp封包还是要通通放行才好,这是因为客户端检测

网络时,常常会用到ping来测试路由器的线路都是否通畅,所以不要将路由器icmp关掉,会有状况的

超阳春客户端防火墙设计与防火墙规则储存

经过上述的本机iptables语法分析后,接下来我想如果站在客户端且不提供网络服务的Linux本机角色时,你应该如何设计你的防火墙,老实说,你只要分析过CentOS默认的

防火墙规则就会知道了,理论上规则如下:

1. 规则归零:清除所有已经存在的规则 (iptables -F...)

2. 预设政策:除了 INPUT 这个自定义链设为 DROP 外,其他为预设 ACCEPT;

3. 信任本机:由于 lo 对本机来说是相当重要的,因此 lo 必须设定为信任装置;

4. 回应封包:让本机主动向外要求而响应的封包可以进入本机(ESTABLISHED,RELATED)

5. 信任用户:这是非必要的,如果你想要让区网的来源可用你的主机资源时

这就是最阳春的防火墙,你可以透过第二步骤抵挡所有远程的来源封包,而通过第四步骤让你的要求的远程主机响应封包可以进入,加上让本机的lo这个内部循环装置

可以放行,一部client专用的防火墙规则就OK了,你可以在某个script上面这样做即可:

vim bin/firewall.sh

#!/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin; export PATH

# 1. 清除规则

iptables -F

iptables -X

iptables -Z

# 2. 设定政策

iptables -P INPUT DROP

iptables -P OUTPUT ACCEPT

iptables -P FORWARD ACCEPT

# 3~5. 制订各项规则

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT

#iptables -A INPUT -i eth0 -s 192.168.1.0/24 -j ACCEPT

# 6. 写入防火墙规则配置文件

/etc/init.d/iptables save

执行 sh bin/firewall.sh

iptables: Saving firewall rules to /etc/sysconfig/iptables:[OK]

其实防火墙也是一个服务,你可以透过『chkconfig --list iptables』去察看就知道了,因此,你这次修改的各种设定要想在下次开机还保存,那就得要进行

『 /etc/init.d/iptables save 』这个指令加参数,因此,现在都是将储存的动作写入这个 firewall.sh 脚本中,现在你的Linux主机已经有相当的保护了,只是如果想要作为服务器

或者作为路由器的话,那就要自行加上某些自定义规则了

运行这个脚本后,开始进行测试

1. 先由主机向外面主动联机试看看;

2. 再由私有网域内的 PC 向外面主动联机试看看;

3.最后,由 Internet 上面的主机,主动联机到你的 Linux 主机试看看;

IPv4 的核心管理功能: /proc/sys/net/ipv4/*

除了iptables这个防火墙软件之外,其实Linux还提供了很多核心预设的攻击抵挡机制,由于是核心的网络功能,所以相关的设定数据都是放置在

/proc/sys/net/ipv4/ 这个目录当中,至于该目录下各个档案的详细资料,可以参考核心的说明文件(你得要先安装 kernel-doc 软件)

vim /usr/share/doc/kernel-doc-2.6.32/Documentation/networking/ip-sysctl.txt查看

底下就拿这个doc中的几个简单的档案来做说明

/proc/sys/net/ipv4/tcp_syncookies: 常常会碰到所谓的阻断式服务 (DoS) 攻击法当中的一种方式,就是利用TCP封包SYN三向交握,这种方式称为SYN Flooding,

如何预防,需要我们启用核心的SYN Cookie 模块啊,这个SYN Cookie模块可以在系统用来启动随机联机的端口即将完成自动启动,当启动SYN Cookie时,主机在

发送SYN/ACK 确认封包前,会要求 Client 端在短时间内回复一个序号,这个序号包含许多原本 SYN 封包内的信息,包括 IP、port 等。 Client 端可以回复正确的序号,若

那么主机就确定该封包为可信的, 因此会发送 SYN/ACK 封包,否则就不理会此一封包。透过此一机制可以大大的降低无效的 SYN 等待埠口

执行echo "1" > /proc/sys/net/ipv4/tcp_syncookies开启

如果是为了系统的 TCP 封包联机优化,则可以参考 tcp_max_syn_backlog,tcp_synack_retries, tcp_abort_on_overflow 这几个设定值的意义

/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts :阻断式服务常见的是 SYN Flooding ,如果有1000台机器ping你的主机,那么ping达数百K bytes时,你的网络宽带会

很惨,主机可能会当机,如何避免可以取消ICMP类型8的ICMP封包回应就是了,这就是通过防火墙来抵挡,比较好,当然也可以取消ping的响应,对于路由器或局域网

中的服务器最好不要取消,核心取消ping回应的设定值有两个分别是:/proc/sys/net/ipv4 内的icmp_echo_ignore_broadcasts(仅有 ping broadcast 地址时才取消 ping 的

回应) 及 icmp_echo_ignore_all (全部的 ping 都不回应),建议设定icmp_echo_ignore_broadcasts 就好了  echo "1" >/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

/proc/sys/net/ipv4/conf/网络接口/*

LInux的核心可以针对不同的网络接口进行不一样的参数设定,网络接口的相关设定放置在 /proc/sys/net/ipv4/conf/ 当中,每个接口都以接口代号作为其代表

例如 eth0 接口的相关设定数据在 /proc/sys/net/ipv4/conf/eth0/ 内。那么网络接口的设定数据有哪些比较需要注意的呢? 大概有底下这几个:

rp_filter: log_martians:accept_source_route:accept_redirects:send_redirects: 建议通过修改/etc/sysctl.conf这个档案,假设我们仅有eth0这个以太接口,而且上述的

功能要通通开启,可以这么做:vim /etc/sysctl.conf

net.ipv4.tcp_syncookies = 1   net.ipv4.icmp_echo_ignore_broadcasts = 1   net.ipv4.conf.all.rp_filter = 1  net.ipv4.conf.default.rp_filter = 1  net.ipv4.conf.eth0.rp_filter = 1

net.ipv4.conf.lo.rp_filter = 1

设定完sysctl.conf文件之后需要执行sysctl -p重新加载

单机防火墙的一个实例

通过脚本撰写防火墙,然后通过最终的/etc/init.d/iptables save 来将结果储存到/etc/sysconfig/iptables去,而且此一特色还可以用在呼叫其他的scripts,可以让

防火墙规则具有较灵活的使用方式:

设定一个作为路由器上的防火墙,也可以用来做为本机的防火墙,Linux主机本身也是内部LAN的路由器,亦即是一个简单的IP分享器的功能,网络接口有底下这些:

外部网络使用 eth0 (如果是拨接,有可能是 ppp0,请针对你的环境来设定);

内部网络使用 eth1 ,且内部使用 192.168.100.0/24 这个 Class ;

主机默认开放的服务有 WWW, SSH, https 等等;

由于希望将信任网域(LAN)与不信任网域(Internet)整个分开的完整一点,所以希望可以在Linux上面安装两块以上的实体网卡,将两块网卡接在不同的网域,这样可以避免

很多问题,至于最重要的防火墙政策是:关闭所有的联机,仅开放特定的服务模式,而且假设内部使用已经接收过良好的训练,因此在filter table的三条链预设政策是:

INPUT 为 DROP

OUTPUT 及 FORWARD 为 ACCEPT

原则上,内部LAN主机与主机本身的开放度很高,因此OUTPUT与FORWARD是完全开放不理的,对于小家庭的主机是可以接受的,因为我们的内部的计算机数量不多,

而且人员熟悉,所以不需要特别控管,但是在大企业环境下连OUTPUT与FORWARD都是需要特别加以管理才行的

实际设定:

防火墙设定通常是利用shell script来帮我们达到这样的功能,你需要将环境改成适合你自己的环境才行,此外,为了未来修改维护的方便,可以将script拆成三个部分

iptables.rule:设定最基本的规则,包括清除防火墙规则、加载模块、设定服务可接受等;

iptables.deny:设定抵挡某些恶意主机的进入;

iptables.allow:设定允许某些自定义的后门来源主机!

将这个脚本放置到 /usr/local/virus/iptables 目录下,你也可以自行放置到自己习惯的位置去

mkdir -p /usr/local/virus/iptables

vim iptables.rule 

# 请先输入您的相关参数,不要输入错误了! 

EXTIF="eth0" # 这个是可以连上 Public IP 的网络接口

INIF="eth1" # 内部 LAN 的连接接口;若无则写成 INIF=""

INNET="192.168.100.0/24" # 若无内部网域接口,请填写成 INNET="" 

export EXTIF INIF INNET

# 第一部份,针对本机的防火墙设定!

# 1. 先设定好核心的网络功能: 

echo "1" > /proc/sys/net/ipv4/tcp_syncookies  

echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts 

for i in /proc/sys/net/ipv4/conf/*/{rp_filter,log_martians}; 

do echo "1" > $i 

done 

for i in /proc/sys/net/ipv4/conf/*/{accept_source_route,accept_redirects,send_redirects}; do

echo "0" > $i

done

# 2. 清除规则、设定默认政策及开放 lo 与相关的设定值 

PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; 

export PATH 

iptables -F 

iptables -X 

iptables -Z 

iptables -P INPUT DROP 

iptables -P OUTPUT ACCEPT 

iptables -P FORWARD ACCEPT 

iptables -A INPUT -i lo -j ACCEPT  

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# 3. 启动额外的防火墙 script 模块 

if [ -f /usr/local/virus/iptables/iptables.deny ]; then 

sh /usr/local/virus/iptables/iptables.deny fi 

if [ -f /usr/local/virus/iptables/iptables.allow ]; then 

sh /usr/local/virus/iptables/iptables.allow fi 

if [ -f /usr/local/virus/httpd-err/iptables.http ]; then 

sh /usr/local/virus/httpd-err/iptables.http fi

# 4. 允许某些类型的 ICMP 封包进入 

AICMP="0 3 3/4 4 11 12 14 16 18" 

for tyicmp in $AICMP 

do iptables -A INPUT -i $EXTIF -p icmp --icmp-type $tyicmp -j ACCEPT 

done 

# 5. 允许某些服务的进入,请依照你自己的环境开启 

# iptables -A INPUT -p TCP -i $EXTIF --dport 21 --sport 1024:65534 -j ACCEPT # FTP 

# iptables -A INPUT -p TCP -i $EXTIF --dport 22 --sport 1024:65534 -j ACCEPT # SSH 

# iptables -A INPUT -p TCP -i $EXTIF --dport 25 --sport 1024:65534 -j ACCEPT # SMTP 

# iptables -A INPUT -p UDP -i $EXTIF --dport 53 --sport 1024:65534 -j ACCEPT # DNS

# iptables -A INPUT -p TCP -i $EXTIF --dport 53 --sport 1024:65534 -j ACCEPT # DNS 

# iptables -A INPUT -p TCP -i $EXTIF --dport 80 --sport 1024:65534 -j ACCEPT # WWW 

# iptables -A INPUT -p TCP -i $EXTIF --dport 110 --sport 1024:65534 -j ACCEPT # POP3 

# iptables -A INPUT -p TCP -i $EXTIF --dport 443 --sport 1024:65534 -j ACCEPT # HTTPS

# 第二部份,针对后端主机的防火墙设定!############################### 

# 1. 先加载一些有用的模块 modules="ip_tables iptable_nat ip_nat_ftp ip_nat_irc ip_conntrack ip_conntrack_ftp ip_conntrack_irc" 

for mod in $modules 

do testmod=`lsmod | grep "^${mod} " | awk '{print $1}'` 

if [ "$testmod" == "" ]; then modprobe $mod 

fi 

done

# 2. 清除 NAT table 的规则吧! 

iptables -F -t nat 

iptables -X -t nat 

iptables -Z -t nat 

iptables -t nat -P PREROUTING ACCEPT 

iptables -t nat -P POSTROUTING ACCEPT 

iptables -t nat -P OUTPUT ACCEPT 

# 3. 若有内部接口的存在 (双网卡) 开放成为路由器,且为 IP 分享器! 

if [ "$INIF" != "" ]; then 

iptables -A INPUT -i $INIF -j ACCEPT 

echo "1" > /proc/sys/net/ipv4/ip_forward 

if [ "$INNET" != "" ]; then 

for innet in $INNET 

do iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE 

done 

fi 

fi 

# 如果你的 MSN 一直无法联机,或者是某些网站 OK 某些网站不 OK,

# 可能是 MTU 的问题,那你可以将底下这一行给他取消批注来启动 MTU 限制范围

# iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu

# 4. NAT 服务器后端的 LAN 内对外之服务器设定 

# iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 80 -j DNAT --to-destination 192.168.1.210:80 # WWW

# 5. 特殊的功能,包括 Windows 远程桌面所产生的规则,假设桌面主机为 1.2.3.4

# iptables -t nat -A PREROUTING -p tcp -s 1.2.3.4 --dport 6000  -j DNAT --to-destination 192.168.100.10 

# iptables -t nat -A PREROUTING -p tcp -s 1.2.3.4 --sport 3389  -j DNAT --to-destination 192.168.100.20

# 6. 最终将这些功能储存下来吧! /etc/init.d/iptables save 接着再来看一下关于iptables.allow的内容如何,假设我要让一个140.116.44.0/24这个网域的所有

主机来源可以进入我的主机的话,那么这个档案的内容可以写成这样:

vim iptables.allow 

#!/bin/bash 

# 底下则填写你允许进入本机的其他网域或主机啊! 

iptables -A INPUT -i $EXTIF -s 140.116.44.0/24 -j ACCEPT 

# 底下则是关于抵挡的档案设定法! 

vim iptables.deny 

#!/bin/bash 

# 底下填写的是『你要抵挡的那个咚咚!』 

iptables -A INPUT -i $EXTIF -s 140.116.44.254 -j DROP 

chmod 700 iptables.* 

将这三个档案的权限设定为700且只属于root的权限后,就能够直接执行iptables.rule,上面的案例中,预设将所有的服务的通道都是关闭的,所以你必须要将本机防火墙的第五

步骤处将一些批注符号(#)解开才行,如果有其他更多的port想要开启时,一样需要增加额外的规则才行

不过,还是如同前面我们所说的,这个 firewall 仅能提供基本的安全防护,其他的相关问题还需要再测试测试

此外,如果你希望一开机就自动执行这个 script 的话,请将这个档案的完整档名写入 /etc/rc.d/rc.local 当中

vim /etc/rc.d/rc.local 

# 1. Firewall 

/usr/local/virus/iptables/iptables.rule 这个脚本最底下加入写入防火墙默认规则文件的功能,所以只要执行rc.local就行了,请不要在Windows上面编辑后再传送到linux上运作

因为windows系统的断行字符问题,将可能导致该档案无法执行,不想写的话,可以去底下的路径进行下载,传送到Linux后可以利用dos2unix指令去转换断行字符
http://linux.vbird.org/download/index.php?action=detail&fileid=43
上面设置的防火墙具有IP分享器的功能,也就是iptables.,rule这个档案中的第二部分了, 

NAT 服务器的设定 

如果要架设一个路由器的延伸服务器,称之为NAT服务器,NAT简单的说就是内部LAN主机的【IP分享器】

NAT 的全名是 Network Address Translation,字面上的意思是『网络地址的转换』

TCP/IP的网络封包有IP地址,那个地址有来源于目的,我们的iptables指令就能够修改IP封包表头数据,连目标与来源的IP地址都可以修改,甚至连TCP封包表头的

port number 也能修改

NAT 服务器的功能可以达到类似IP 分享的功能之外,还可以达到类似DMZ (非军事区) 的功能!这完全取决于我们的 NAT 是修改:(1)来源 IP 还是 (2)目标 IP

什么是 NAT? SNAT? DNAT?

若内部LAN有任何一部主机想要传送封包出去时,那么封包要如何透过Linux主机而传送出去,

1. 先经过 NAT table 的 PREROUTING 链;

2. 经由路由判断确定这个封包是要进入本机与否,若不进入本机,则下一步;

3. 再经过 Filter table 的 FORWARD 链;

4. 通过 NAT table 的 POSTROUTING 链,最后传送出去。

NAT服务器的重点就在于上面流程的1,4步骤,也就是NAT table的两条重要的链:PREROUTING 与 POSTROUTING,这两条链的功能:重点在于修改IP嘛,

但是这两条链修改的IP是不一样的,POSTROUTING 在修改来源 IP ,PREROUTING 则在修改目标 IP 。由于修改的 IP 不一样,所以就称为来源 NAT

(Source NAT, SNAT) 及目标 NAT (Destination NAT, DNAT)。我们先来谈一谈 IP 分享器功能的 SNAT

来源 NAT, SNAT:修改封包表头的『来源』项目

在家中的好几部主机同时透过一条ADSL网络联机到internet上面,那个Linux主机就是IP分享器,那么他是如何达到IP分享器的功能,就是通过NAT 表格的 POSTROUTING

 来处理的,那么NAT服务器是如何处理这个封包的

如上图所示,在客户端 192.168.1.100 这部主机要联机到 http://tw.yahoo.com 去时,他的封包表头会如何变化?

1.客户端所发送的封包表头中,来源是192.168.1.100,然后传送到 NAT 这部主机;

2.NAT这部主机的内部接口(192.168.1.2) 接收到这个封包后,会主动分析表头数据,因为表头数据显示目的并非 Linux 本机,所以开始经过路由, 将此封包转到可以连接到 

Internet 的 Public IP 处; 

3.由于 private IP 与 public IP 不能互通,所以 Linux 主机透过 iptables 的 NAT table 内的 Postrouting 链将封包表头的来源伪装成为 Linux 的 Public IP

,并且将两个不同来源 (192.168.1.100 及 public IP) 的封包对应写入暂存内存当中,然后将此封包传送出去了; 

此时 Internet 上面看到这个封包时,都只会知道这个封包来自那个 Public IP而不知道其实是来自内部啦。 好了,那么如果 Internet 回传封包呢

4.在internet上面的主机接收到这个封包后,会分析该封包的序号,并比对刚刚记录到内存当中的数据,由于发现该封包为后端主机之前发送出去的,因此在NAT

Prerouting链中,会将目标IP修改成为后端主机,亦即那部192.168.1.100,然后发现目标已经不是本机(public IP), 所以开始透过路由分析封包流向;

6. 封包会传送到 192.168.1.2 这个内部接口,然后再传送到最终目标192.168.1.100 机器上去!

经过这个流程,你就可以发现到,所有内部 LAN 的主机都可以透过这部 NAT 服务器联机出去, 而大家在 Internet 上面看到的都是同一个 IP (就是 NAT 那部主机的 public IP 

啦!),所以,如果内部 LAN 主机没有连上不明网站的话,那么内部主机其实是具有一定程度的安全性的啦!因为 Internet 上的其他主机没有办法主动攻击你的 LAN 内的 PC 

嘛!所以我们才会说, NAT 最简单的功能就是类似 IP 分享器啦!那也是 SNAT 的一种

NAT服务器最简单的功能就是类似IP分享器,那么NAT服务器与路由器有啥不同,基本上,NAT服务器一定是路由器,不过,NAT服务器由于会修改IP表头数据,因此与

单纯转递封包的路由器不同,最常见的IP分享器就是路由器,但是这个IP分享器一定会有一个public IP与一个private IP,让LAN内的private可以透过IP分享器的public IP

传送出去,至于路由器两边都是public ip或者都是private ip

目标 NAT, DNAT:修改封包表头的『目标』项目

SNAT主要是应付内部LAN连接到internet,至于DNAT则主要用在内部主机想要架设可以让internet存取的服务器,有点类似于DMZ内的服务器,看看DNAT的运作:

假设我的内部主机192.168.1.210 启动了 WWW 服务,这个服务的 port 开启在 port 80 , 那么 Internet 上面的主机 (61.xx.xx.xx) 要如何连接到我的内部服务器呢

?当然啦, 还是得要透过 Linux NAT 服务器嘛!所以这部 Internet 上面的机器必须要连接到我们的 NAT 的 public IP 才行

4. 外部主机想要连接到目的端的 WWW 服务,则必须要连接到我们的 NAT 服务器上头;

5.我们的 NAT 服务器已经设定好要分析出 port 80 的封包,当NAT服务器接到这个封包后,会将目标IP由public ip 改成192.168.1.210,且将该封包相关信息记录下来,等待

内部服务器的响应; 

6.上述的封包在经过路由后,来到 private 接口处,然后透过内部的 LAN 传送到 192.168.1.210 上头!

7.192.186.1.210 会响应数据给 61.xx.xx.xx ,这个回应当然会传送到 192.168.1.2 上头去;

8.经过路由判断后,来到 NAT Postrouting 的链,然后透过刚刚第二步骤的记录,将来源 IP 由192.168.1.210 改为 public IP 后,就可以传送出去了!

其实整个步骤几乎就等于 SNAT 的反向传送哩!这就是 DNAT 啰!很简单吧!

最阳春 NAT 服务器: IP 分享功能 

在 Linux 的 NAT 服务器服务当中,最常见的就是IP 分享器功能了,这个IP分享器的功能其实就是SNAT!作用就只是在 iptables 内的 NAT 表格当中,那个路由后的

 POSTROUTING 链进行 IP 的伪装就是了。另外, 你也必须要了解,你的 NAT 服务器必须要有一个 public IP 接口,以及一个内部 LAN 连接的 private IP 接口才行。 

假设是这样的:

外部接口使用 eth0 ,这个接口具有 public IP 喔;

内部接口使用 eth1 ,假设这个 IP 为 192.168.100.254

记住!当你利用前面几章谈到的数据来设定你的网络参数后,务必要进行路由的检测,因为在 NAT 服务器的设定方面,最容易出错的地方就是路由了!

尤其是在拨接产生 ppp0 这个对外接口的环境下,这个问题最严重。反正你要记得:『如果你的 public IP 取得的方式是拨接或 cable modem 时,你的配置文件 

 /etc/sysconfig/network,ifcfg-eth0, ifcfg-eth1 等档案,千万不要设定 GATEWAY 啦!』否则就会出现两个default gateway ,反而会造成问题。

那个iptables.rule档案内含有NAT的脚本了,你可以看到该档案的第二部份关于 NAT 服务器的部分,应该有看到底下这几行:

iptables -A INPUT -i $INIF -j ACCEPT # 这一行为非必要的,主要的目的是让内网 LAN 能够完全的使用 NAT 服务器资源。# 其中 $INIF 在本例中为 eth1 接口

echo "1" > /proc/sys/net/ipv4/ip_forward 

上头这一行则是在让你的 Linux 具有 router 的能力

iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE

# 这一行最关键!就是加入 nat table 封包伪装!本例中 $innet 是192.168.100.0/24

# 而 $EXTIF 则是对外界面,本例中为 eth0

重点在那个『 MASQUERADE 』!这个设定值就是『 IP 伪装成为封包出去 (-o) 的那块装置上的 IP 』!以上面的例子来说,就是 $EXTIF,也就是 eth0 啦!

所以封包来源只要来自 $innet (也就是内部 LAN 的其他主机) ,只要该封包可透过 eth0 传送出去, 那就会自动的修改 IP 的来源表头成为 eth0 的 public IP 啦

你只要将 iptables.rule 下载后,并设定好你的内、外网络接口,执行 iptables.rule 后,你的 Linux 就拥有主机防火墙以及 NAT 服务器的功能了!

例题: 如同上面所述的案例,那么你的 LAN 内的其他 PC 应该要如何设定相关的网络参数?

答案其实很简单啊,将 NAT 服务器作为 PC 的 GATEWAY 即可!只要记得底下的参数值:

NETWORK 为 192.168.100.0  NETMASK 为 255.255.255.0  BROADCAST 为 192.168.100.255 

IP 可以设定 192.168.100.1 ~ 192.168.100.254 间,不可重复! 通讯闸 (Gateway) 需要设定为 192.168.100.254 (NAT 服务器的 Private IP)

DNS (/etc/resolv.conf) 需设定为 168.95.1.1 (Hinet) 或 139.175.10.20 (Seed Net),这个请依你的 ISP 而定;

事实上,除了 IP 伪装 (MASQUERADE) 之外,我们还可以直接指定修改 IP 封包表头的来源 IP 呢! 举例来说,如下面这个例子:

假设对外的 IP 固定为 192.168.1.100,若不想使用伪装,该如何处理?

答:iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.1.100 

假设你的 NAT 服务器对外 IP 有好几个,那你想要轮流使用不同的 IP时,又该如何设定?举例来说,你的 IP 范围为192.168.1.210~192.168.1.220

答:iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.1.210-192.168.1.220

这样就可以修改网络封包的来源IP资料了,不过,除非你使用的是固定 IP ,且有多个 IP 可以对外联机,否则一般使用 IP 伪装即可,不需要使用到这个 SNAT 啦

当然,你也可能有自己的独特的环境啦!

iptables 的额外核心模块功能

iptables.rule 内的第二部分有仔细看的话, 那有没有觉得很奇怪,为何我们需要加载一些有用的模块?举例来说, ip_nat_ftp 及 ip_nat_irc ?

这是因为很多通讯协议使用的封包传输比较特殊,尤其是 FTP 文件传输使用到两个 port来处理数据!

我们的 iptables 提供很多好用的模块, 这些模块可以辅助封包的过滤用途,让我们可以节省很多 iptables 的规则拟定

在防火墙后端之网络服务器 DNAT 设定

既然可以做 SNAT 的 IP 分享功能,我们当然可以使用 iptables 做出 DMZ 啦,但是再次重申,不同的服务器封包传输的方式可能有点差异,因此,建议新手不要玩这

个咚咚! 否则很容易导致某些服务无法顺利对 Internet 提供的问题。 

如果我想要处理 DNAT 的功能时, iptables 要如何下达指令? 另外,你必须要知道的是, DNAT 用到的是 nat table 的 Prerouting 链喔

例题:假设内网有部主机 IP 为 192.168.100.10 ,该主机是可对 Internet 开放的 WWW 服务器。你该如何透过 NAT 机制,将 WWW 封包传到该主机上

假设 public IP 所在的接口为 eth0 ,那么你的规则就是:iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.10:80

那个『 -j DNAT --to-destination IP[:port] 』就是精髓啦!代表从 eth0 这个接口传入的,且想要使用 port 80 的服务时,将该封包重新传导到 192.168.100.10:80 的 IP 及 port 上面 

可以同时修改 IP 与 port 呢!真方便。 其他还有一些较进阶的 iptables 使用方式,如下所示

-j REDIRECT --to-ports <port number>

# 这个也挺常见的,基本上,就是进行本机上面 port 的转换就是了!

# 不过,特别留意的是,这个动作仅能够在 nat table 的 PREROUTING 以及  OUTPUT 链上面实行而已喔! 

范例:将要求与 80 联机的封包转递到 8080 这个 port

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

这玩意最容易在你使用了非正规的 port 来进行某些 well known 的协议

例如使用 8080 这个 port 来启动 WWW ,但是别人都以 port 80 来联机

所以,你就可以使用上面的方式来将对方对你主机的联机传递到 8080 啰

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Linux 防火墙 NAT服务