iptables有多牛?

http://dallascao.com/cn/iptables-tutorial-for-newbies/

对于斗胆开始玩vps的文科生来讲,iptables简直是地狱中的地狱。有几家vps供应商系统默认是带着些iptables规则的,以前我一向是难言之隐,一清了之。
我很早就知道这东西重要,但看着太难了,后来看到log里越来越多的攻击记录,心想这东西得必须学了,说不定哪天哪个龟孙子就攻进来了。网上及电子书中的 教程一般对于文科生来讲比较难看懂,有的还画着图,号称a picture can tell a thousand words. 但有图也看不懂,你说画个桌子,我知道英语是table、日语称鸡鸡。但这个根本不存在的table,你画出来,对于连看懂火车时刻表都表示有困难的我, 我会更糊涂的。

说闲话少说的时候,实际上是说了很多闲话….咬咬牙开始吧,我还是要不怕困难,写一个连文科生都能看懂的iptables心得!

如其名称所示,iptables,就是里面有好几个table,大约有过滤桌、nat桌、mangle桌啥的。后两个你先别管,等我搞明白了再来教 你,第一个桌子从名称上一看就明白了,过滤数据用的,它也正是我们用来防止攻击用的——把坏人过滤掉,不让他进来!那我们就讲这个过滤桌吧。

这个桌子上放有一条一条的chain,就是链子。每个链子由尺子(rules)组成…严肃点,我不开玩笑了,这么说吧,table(表)由chain(链)组成,Chain又有规则组成(rules)。

既然我们只讲 filter table(过滤表),那么table这个概念就跟我们无关了,重点要理解“链”和组成“链”的“rule (规则)”。

链(chain)与规则 (rules)

filter table里面有三个默认的链,INPUT,OUTPUT 和 FORWARD。FORWARD呢对于做站基本用不上,我们就讲INPUT 和 OUTPUT。因为是别人要攻击我们,对于我们的服务器来讲,攻击是要进来的,即INPUT,诶?那么说把 INPUT这个链搞明白,就可以防守了?差不多吧。那我们就只讲 INPUT好了,越简单越好,关键是把概念理清楚,别的细节,都可以查到的的亲。另外,INPUT, OUTPUT, FORWARD都是由规则组成的链,INPUT搞懂了,其他的也就不难了。

平常我们看到iptables,就是一条条的规则,例如:

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

看到INPUT这个词了吧?这说明这条规则属于INPUT这个链的,tcp是协议,网站都是用tcp的, –dport 80,就是80这个端口,也就是别人打开你的网站的时候需要与你的服务器的80端口连起来,就像一条打印机线把电脑的打印机口与打印机连起来一样,不过网 络上端口是虚拟的,但实际工作的时候是一回事,就是通信。对于INPUT(发进来)的数据包,80是目标端口,即destination port, 简称 dport。

因为你的服务器上放了你的网站,你需要允许别人向80端口发连接请求,ACCEPT,即接受请求和连接。现在你明白了吧?有了这句,别人就可以连接你的服务器,打开上面的网页了。

前面那个“-A”的意思append,与后面的INPUT连用的,就是把这条规则加到INPUT这个链的最后面。当然现我们INPUT这个链上啥都没有,加到最后面,也就是第一条了。

命令行的规则你大概明白了吧,“-”符号,后面直接跟的是参数名,参数名后跟空格,空格后跟这个参数的值(姑且这么理解吧)。例如 -p tcp ,这里的‘-p’是不能随便写的,是iptables程序定义的,你写个“-p”,程序就知道后面跟的是协议名称。你写个“-A”,iptables程序 就知道后面跟的是链的名称。那么“–dport”里的两个减号“–”是啥意思呢?它的功能跟一个减号是一样的,都表示后面是参数名,不过两个减号后面跟的 参数名的全称,一个减号跟的是简称,全称容易看懂,减称写起来省劲。例如上面这句规则也可以写成:

iptables -append INPUT --proto tcp --dport 80 --jump ACCEPT

当然,爱装逼的理科生一般是不会写全称的,大都用一个减号,一个字母的简称。
亲爱的windows用户,注意这里的参数名和参数值都是大小写敏感的,把“-p”写成“-P”,程序是不工作的。另外英语很好的你可以注意到了,即使是 加了两个减号的“全称”,也不全,proto明明不对,该是protocol才对。你知道他们理科生语文不好,原谅他们吧。

光有这条还不够,因为你的vps上还有别的服务,例如你上传文件需要ftp或sftp,进入后台需要ssh,ftp的默认端口是21,ssh是22,我们把它们也加上。

iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

好了,你准备就开放这么多服务,最后在加一句

iptables -A INPUT -j DROP

它的意思是拒绝所有连接…这怎么行?不是说要允许80,21,和22吗?这是因为INPUT是个链子,有头有尾,按顺序来的。如果有人连接你的80口,第一句规则说ACCEPT,进来吧。那么他发来的一梭子弹弹就不再经过后面的规则了,当然也就不会被放在最后面的DROP这句拒绝了。
现在我们的全部规则是:

iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j DROP

翻译成文科生的语言就是发到80(嘴巴),21(菊花),22(猫猫)三个口的数据将接受,想往别的地方塞数据,一律拒绝。复习一下开始说的,这些 东东的意思是在INPUT这个链子上有四条规则,规则是按顺序一个一个来的,发来的数据被匹配后,就跳出链子,后面的规则就不再执行了。如果你把 iptables -A INPUT -j DROP这条放在链头,你的vps就变成了石女,唯有通过服务商的面板重启了!

REJECT 和 DROP

刚才-j 后面的拒绝操作是DROP,正确的英语译文该是”REJECT”才对。是的,写成”-j REJECT”也是可以的。不同之处是REJECT比较客气,等于告诉想搞你的人“对不起,人家这两天不方便。”而DROP就是一声不坑地拒绝。对于入侵 者,不用那么客气,用DROP好了。因为如果你回应了,等于告诉想搞你的人你是在线的,只是拒绝了,反而会引起他继续努力的斗志。

状态 (state)匹配

如果你喜颠颠地拿着上面几条去试验了,估计你的vps上的一些网站可能就竿屁了,iptables这个妹妹很难对付的。要想让你的服务器正常工作,还需要添加这一句在DROP那一句之前。

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

“-m”是“匹配”的意思,-m state的意思是匹配数据包状态,用户发来的数据包分别带有不同的状态,即 NEW, ESTABLISHED, 和 RELATED。NEW 就是开头搭讪,ESTABLISHED,就是搭讪完了之后后续的数据包,RELATED就是与已经存在的连接相关的数据包。总之这句话的意思是,接受已经 建立了连接的数据包,即搭讪之后的数据包。现在我们的INPUT链是这个样子的:

iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -j DROP

意思是外面接受发往本机80,21,22的tcp数据包,还接受发往任何端口的已建立(established)和相关(related)的数据包(第四句),剩下的INPUT数据包一律抛弃。

为毛要允许状态ESTABLISHED 和 RELATED的入站数据呢?因为你的服务器同时也是台电脑,还要从别的服务器下载东西。下载时,你的服务器先向别的服务器发出连接请求(new),别的 服务器允许你连接,连接建立(ESTABLISHED)之后,就需要接受别的服务器发来的数据,对于你的服务器来讲属于INPUT。也就是说,如果没有 iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT这句,wget curl啥的就都不工作了。有了这句,加上前三句,即允许别的电脑连接(new)你的80,21和22端口,同时允许别的服务器在你的服务器先向它发请求 的条件下向你发送数据。另外这些状态都是基于tcp协议来讲的(谢谢BOYPT)。

-A(–append)和-I (–insert)

刚才说了,-A INPUT的意思是把一条规则加在现有INPUT这个链子的最后面,那么写成-I INPUT,就是把一条规则强行插入到最前面。如果你比较变态,刚才的INPUT链倒着写也是可以的:

iptables -I INPUT -j DROP
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -p tcp --dport 21 -j ACCEPT
iptables -I INPUT -p tcp --dport 80 -j ACCEPT

即后面一条总会插到现有INPUT链的最前面,最终形成的INPUT链跟前面是一样的。
不过,不要试!因为你通常是远程操作你的vps的,你在命令行输入第一句,立马掉线!后面就全输不进去了!
–insert也是有用的,例如前面这个INPUT链已经起了作用,你想在不清空现有INPUT链的基础上再开放一个端口,例如443。那么就必须写成

iptables -I INPUT -p tcp --dport 443 -j ACCEPT

如果你写成 -A,那么这条规则就被跟在DROP那句后面,发到443的数据在来到新加的这句之前,就被干掉了。

如果你不想加到最前面,也可以在INPUT后面写个数字,表示添加的位置,如果把一条规则看成一行,也就是指定所谓的行号了。把上面添加443端口的规则写成:

iptables -I INPUT 3 -p tcp --dport 443 -j ACCEPT

那么就把它放在了第三条规则(即第三行)的位置了。在命令行里输入 iptables -nvx -L INPUT (查看现在生效的INPUT链),你会发现新增加的这条规则在21端口那句的后面。

把上面的规则保存到文件里,运行一下,你的服务器就安全多了。

iptables --flush
iptables --delete-chain
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -j DROP

关于iptables的其他内容,如记录日志、屏蔽IP、建立自定义链……,日后再说吧!无论如何,搞懂今天讲的概念是最重要的,其他的细节都可以查到的,总是粘贴别人写好的规则,但一直啥也不懂,不是我们的文科生应该做的。

思考题:应用以上规则之后,服务器运行正常,但你无法在家ping你的服务器了!这是什么呢?

 

=======================================

http://www.zhihu.com/question/23063802

iptables虽然真的很强大,虽然经常被叫做「防火墙」,但这个取决于iptables的核心作用,一般都仅用于端口流量的常规匹配,简单的字符串模式匹配,然后配合一些动作:屏蔽,转发等。

你说你的服务器仅开放了80与22,那你倒是可以用iptables来明确禁用其他端口的任何流量,只允许80与22的进出流量。这样可以防止其他人不小心开放了其他端口,比如调试目的,比如不小心来了个后门病毒。

但是高级的后门肯定是复用你开放的80与22。比如,你用Apache的话,有专门的Apache mod病毒,利用80端口开个反弹式后门,非常隐蔽。

这个时候你用iptables所谓的防火墙就显得鸡肋了,配置很麻烦,而且很可能滞后。肿么办?

一般会在这台服务器之前架一台专业的防火墙,这种才是真正意义上的防火墙,可以对80,22等各类端口的异常流量进行监测,发现异常要么告警,要么屏蔽。

当然你不架个这样的防火墙也行,你这台服务器配置个类似OSSEC这样的入侵检测,也是可以做到事后应急的,可惜只是事后应急(比如调查异常源头,然后禁止)。

为了防止一些暴力破解,比如针对你的80,22上的服务。可以安装个fail2ban,配合iptables是很不错的。

结论是:当然建议开启iptables,配个低成本的规则。但仅依赖于iptables是不足的,且大多数人并没能真的发挥好iptables的强大能力。   

http://blog.csdn.net/reyleon/article/details/12976341

Iptabels是与 Linux内核集成的包过滤防火墙系统,几乎所有的linux发行版本都会包含Iptables的功能。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则Iptables有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。

netfilter/iptables 过滤防火墙系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信 息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。

虽然netfilter/iptables包过滤系统被称为单个实体,但它实际上由两个组件netfilter 和 iptables 组成。

netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。

iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。

优点

netfilter/iptables 的最大优点是它可以配置有状态的防火墙。有状态的防火墙能够指定并记住为发送或接收信息包所建立的连接的状态。防火墙可以从信息包的连接跟踪状态获得该信 息。在决定新的信息包过滤时,防火墙所使用的这些状态信息可以增加其效率和速度。这里有四种有效状态,名称分别为 ESTABLISHED 、 INVALID 、 NEW 和 RELATED 。

状态 ESTABLISHED指出该信息包属于已建立的连接,该连接一直用于发送和接收信息包并且完全有效。 INVALID 状态指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数据或头。状态 NEW 意味着该信息包已经或将启动新的连接,或者它与尚未用于发送和接收信息包的连接相关联。最后, RELATED 表示该信息包正在启动新连接,以及它与已建立的连接相关联。

netfilter/iptables的另一个重要优点是,它使用户可以完全控制防火墙配置和信息包过滤。您可以定制自己的规则来满足您的特定需求,从而只允许您想要的网络流量进入系统。

另外,netfilter/iptables是免费的,这对于那些想要节省费用的人来说十分理想,它可以代替昂贵的防火墙解决方案。

原理

iptables的原理主要是对数据包的控制,看下图:



(1) 一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转发出去。

(2) 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经 过OUTPUT链,然后到达POSTROUTING链输出。

(3)如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过 FORWARD链,然后到达POSTROUTING链输出。

规则、表和链

1.规则(rules)

规则(rules)其 实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则 分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配 时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工 作就是添加、修改和删除这些规则。

2.链(chains)

链(chains)是 数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中 第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下 一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。

3.表(tables)
表(tables)提供特定的功能,iptables内置了4个表,即raw表、filter表、nat表和mangle表,分别用于实现包过滤,网络地址转换和包重构的功能。


(1)RAW表

只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在 某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了.

(2)filter表

主要用于过滤数据包, 该表根据系统管理员预定义的一组规则过滤符合条件的数据包。对于防火墙而言,主要利用在filter表中指定的规则来实现对数据包的过滤。Filter表 是默认的表,如果没有指定哪个表,iptables 就默认使用filter表来执行所有命令,filter表包含了INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT 链(处理本地生成的数据包)在filter表中只能允许对数据包进行接受,丢弃的操作,而无法对数据包进行更改

(3)nat表

主要用于网络地址转换 NAT,该表可以实现一对一,一对多,多对多等NAT 工作,iptables就是使用该表实现共享上网的,NAT表包含了PREROUTING链(修改即将到来的数据包),POSTROUTING链(修改即 将出去的数据包),OUTPUT链(修改路由之前本地生成的数据包)

(4)mangle表

主要用于对指定数据包 进行更改,在内核版本2.4.18 后的linux版本中该表包含的链为:INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据 包)POSTROUTING链(修改即将出去的数据包),PREROUTING链(修改即将到来的数据包)

3、规则表之间的优先顺序:

Raw——mangle——nat——filter

规则链之间的优先顺序(分三种情况):

第一种情况:入站数据流向

从外界到达防火墙的数 据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包 的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通 过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。

第二冲情况:转发数据流向

来自外界的数据包到达 防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网 关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地 址等)进行处理。

第三种情况:出站数据流向

防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。


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)。ACCEPT 将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链(nat:postrouting)。

那么如何使用iptables在以上流程中控制对数据包的处理行为呢?当然是使用iptables与其相关的参数了。

1、iptables命令格式

iptables的命令格式较为复杂,一般的格式如下:

iptables [-t 表] -命令 匹配   操作

说明

(1) -t 表

表选项用于指定命令应用于哪个iptables内置表。

(2)命令

命令选项用于指定iptables的执行方式,包括插入规则,删除规则和添加规则,如下表所示

命令                                        说明

-P  --policy        <链名>  定义默认策略
-L  --list          <链名>  查看iptables规则列表
-A  --append        <链名>  在规则列表的最后增加1条规则
-I  --insert        <链名>  在指定的位置插入1条规则
-D  --delete        <链名>  从规则列表中删除1条规则
-R  --replace       <链名>  替换规则列表中的某条规则
-F  --flush         <链名>  删除表中所有规则
-Z  --zero          <链名>  将表中数据包计数器和流量计数器归零
-X  --delete-chain  <链名>  删除自定义链
-v  --verbose       <链名>  与-L他命令一起使用显示更多更详细的信息

(3) 匹配规则

匹配选项指定数据包与规则匹配所具有的特征,包括源地址,目的地址,传输协议和端口号,如下表所示

匹配                                                               说明

-i --in-interface    网络接口名>     指定数据包从哪个网络接口进入,
-o --out-interface   网络接口名>     指定数据包从哪个网络接口输出
-p ---proto          协议类型        指定数据包匹配的协议,如TCP、UDP和ICMP等
-s --source          源地址或子网>   指定数据包匹配的源地址
   --sport           源端口号>       指定数据包匹配的源端口号
   --dport           目的端口号>     指定数据包匹配的目的端口号
-m --match           匹配的模块      指定数据包规则所使用的过滤模块

iptables执行 规则时,是从规则表中从上至下顺序执行的,如果没遇到匹配的规则,就一条一条往下执行,如果遇到匹配的规则后,那么就执行本规则,执行后根据本规则的动作 (accept,reject,log,drop等),决定下一步执行的情况,后续执行一般有三种情况。

  • 一种是继续执行当前规则队列内的下一条规则。比如执行过Filter队列内的LOG后,还会执行Filter队列内的下一条规则。
  • 一种是中止当前规则队列的执行,转到下一条规则队列。比如从执行过accept后就中断Filter队列内其它规则,跳到nat队列规则去执行
  • 一种是中止所有规则队列的执行。

2、iptables规则的动作

前面我们说过 iptables处理动作除了 ACCEPT、REJECT、DROP、REDIRECT 、MASQUERADE 以外,还多出 LOG、ULOG、DNAT、RETURN、TOS、SNAT、MIRROR、QUEUE、TTL、MARK等。我们只说明其中最常用的动作:

REJECT    拦阻该数据包,并返回数据包通知对方,可以返回的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。 范例如下:

iptables -A  INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply

DROP  丢弃数据包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。

REDIRECT   将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。这个功能可以用来实作透明代理 或用来保护web 服务器。例如:

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

MASQUERADE 改写封包来源IP为防火墙的IP,可以指定port 对应的范围,进行完此处理动作后,直接跳往下一个规则链(mangle:postrouting)。这个功能与 SNAT 略有不同,当进行IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP服务器指派的,这个时候 MASQUERADE 特别有用。范例如下:

iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 21000-31000

LOG   将数据包相关信息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 配置文件,进行完此处理动作后,将会继续比对其它规则。例如:

iptables -A INPUT -p tcp -j LOG --log-prefix "input packet"

SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则炼(mangle:postrouting)。范例如下:

iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 192.168.10.15-192.168.10.160:2100-3200

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.10.1-192.168.10.10:80-100

MIRROR  镜像数据包,也就是将来源 IP与目的地IP对调后,将数据包返回,进行完此处理动作后,将会中断过滤程序。

QUEUE   中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费用.......等。

RETURN  结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。

MARK 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。范例如下:

iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 22

看了本文是不是对iptables参数有所了解了,下文我会使用实例来更详细的说明iptables的参数的用法。

 

保存规则

使用iptables程序建立的规则只会保存在内存中,通常我们在修改了iptables的规则重启 iptables 后,之前修改的规则又消失了。那么如何保存新建立的规则呢?

方法1、对于RHEL和ceontos系统可以使用service iptables save将当前内存中的规则保存到/etc/sysconfig/iptables文件中

[root@lampbo ~]# service iptables save

方法2、修改/etc/sysconfig/iptables-config 将里面的IPTABLES_SAVE_ON_STOP="no", 这一句的"no"改为"yes"这样每次服务在停止之前会自动将现有的规则保存在 /etc/sysconfig/iptables 这个文件中去。

规则示例

先回顾下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表主要用于对指定数据包进行更改,在内核版 本2.4.18 后的linux版本中该表包含的链为:INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据 包)POSTROUTING链(修改即将出去的数据包),PREROUTING链(修改即将到来的数据包)LINUX教程  centos教程

filter 这个规则表是预设规则表,拥有 INPUT、FORWARD 和 OUTPUT 三个规则链,这个规则表顾名思义是用来进行封包过滤的动作(例如:DROP、 LOG、 ACCEPT 或 REJECT),我们会将基本规则都建立在此规则表中。

(一)、常用命令示例:

1、命令 -A, --append

范例:iptables -A INPUT -p tcp --dport 80 -j ACCEPT

说明 :新增规则到INPUT规则链中,规则时接到所有目的端口为80的数据包的流入连接,该规则将会成为规则链中的最后一条规则。

2、命令 -D, --delete

范例:iptables -D INPUT -p tcp --dport 80 -j ACCEPT

或    : iptables -D INPUT 1

说明: 从INPUT规则链中删除上面建立的规则,可输入完整规则,或直接指定规则编号加以删除。

3、命令 -R, --replace

范例: iptables -R INPUT 1 -s 192.168.0.1 -j DROP

说明 取代现行第一条规则,规则被取代后并不会改变顺序。

4、命令 -I, --insert

范例:iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT

说明: 在第一条规则前插入一条规则,原本该位置上的规则将会往后移动一个顺位。

5、命令 -L, --list

范例: iptables -L INPUT

说明:列出INPUT规则链中的所有规则。

6、命令 -F, --flush

范例: iptables -F INPUT

说明: 删除INPUT规则链中的所有规则。

7、命令 -Z, --zeroLINUX教程  centos教程

范例:iptables -Z INPUT

说明 将INPUT链中的数据包计数器归零。它是计算同一数据包出现次数,过滤阻断式攻击不可少的工具。

8、命令 -N, --new-chain

范例: iptables -N denied

说明: 定义新的规则链。

9、命令 -X, --delete-chain

范例: iptables -X denied

说明: 删除某个规则链。

10、命令 -P, --policy

范例 :iptables -P INPUT DROP

说明 :定义默认的过滤策略。 数据包没有找到符合的策略,则根据此预设方式处理。

11、命令 -E, --rename-chain

范例: iptables -E denied disallowed

说明: 修改某自订规则链的名称。

(二)常用封包比对参数:

1、参数 -p, --protocol

范例:iptables -A INPUT -p tcpLINUX教程  centos教程

说明:比对通讯协议类型是否相符,可以使用 ! 运算子进行反向比对,例如:-p ! tcp ,意思是指除 tcp 以外的其它类型,包含udp、icmp ...等。如果要比对所有类型,则可以使用 all 关键词,例如:-p all。

2、参数 -s, --src, --source

范例: iptables -A INPUT -s 192.168.1.100

说明:用来比对数据包的来源IP,可以比对单机或网络,比对网络时请用数字来表示屏蔽,例如:-s 192.168.0.0/24,比对 IP 时可以使用!运算子进行反向比对,例如:-s ! 192.168.0.0/24。

3、参数 -d, --dst, --destination

范例: iptables -A INPUT -d 192.168.1.100

说明:用来比对封包的目的地 IP,设定方式同上。

4、参数 -i, --in-interface

范例 iptables -A INPUT -i  lo

说明:用来比对数据包是从哪个网卡进入,可以使用通配字符 + 来做大范围比对,如:-i eth+ 表示所有的 ethernet 网卡,也可以使用 ! 运算子进行反向比对,如:-i ! eth0。这里lo指本地换回接口。

5、参数 -o, --out-interface

范例:iptables -A FORWARD -o eth0

说明:用来比对数据包要从哪个网卡流出,设定方式同上。

6、参数 --sport, --source-port

范例:iptables -A INPUT -p tcp --sport 22

说明:用来比对数据的包的来源端口号,可以比对单一端口,或是一个范围,例 如:--sport 22:80,表示从 22 到 80 端口之间都算是符合件,如果要比对不连续的多个端口,则必须使用 --multiport 参数,详见后文。比对端口号时,可以使用 ! 运算子进行反向比对。

7、参数 --dport, --destination-port

范例 iptables -A INPUT -p tcp --dport 22
说明 用来比对封包的目的地端口号,设定方式同上。

8、参数 --tcp-flags

范例:iptables -p tcp --tcp-flags SYN,FIN,ACK SYN

说明:比对 TCP 封包的状态标志号,参数分为两个部分,第一个部分列举出想比对的标志号,第二部分则列举前述标志号中哪些有被设,未被列举的标志号必须是空的。TCP 状态标志号包括:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)PSH(强迫推送) 等均可使用于参数中,除此之外还可以使用关键词 ALL 和 NONE 进行比对。比对标志号时,可以使用 ! 运算子行反向比对。

9、参数 --syn

范例:iptables -p tcp --syn

说明:用来比对是否为要求联机之TCP 封包,与 iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 的作用完全相同,如果使用 !运算子,可用来比对非要求联机封包。

10、参数 -m multiport --source-port

范例: iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110 -j ACCEPT

说明 用来比对不连续的多个来源端口号,一次最多可以比对 15 个端口,可以使用 ! 运算子进行反向比对。

11、参数 -m multiport --destination-port

范例 :iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110 -j ACCEPT

说明:用来比对不连续的多个目的地端口号,设定方式同上。

12、参数 -m multiport --port

范例:iptables -A INPUT -p tcp -m multiport --port 22,53,80,110 -j ACCEPT

说明:这个参数比较特殊,用来比对来源端口号和目的端口号相同的数据包,设定方式同上。注意:在本范例中,如果来源端口号为 80,目的地端口号为 110,这种数据包并不算符合条件。

13、参数 --icmp-type

范例:iptables -A INPUT -p icmp --icmp-type 8 -j DROP

说明:用来比对 ICMP 的类型编号,可以使用代码或数字编号来进行比对。请打 iptables -p icmp --help 来查看有哪些代码可用。这里是指禁止ping如,但是可以从该主机ping出。

14、参数 -m limit --limit

范例:iptables -A INPUT -m limit --limit 3/hour

说明:用来比对某段时间内数据包的平均流量,上面的例子是用来比对:每小时平均流量是否超过 一次3个数据包。 除了每小时平均次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后: /second、 /minute、/day。 除了进行数据包数量的比对外,设定这个参数也会在条件达成时,暂停数据包的比对动作,以避免因洪水攻击法,导致服务被阻断。

15、参数 --limit-burst

范例:iptables -A INPUT -m limit --limit-burst 5

说明:用来比对瞬间大量封包的数量,上面的例子是用来比对一次同时涌入的封包是否超过 5 个(这是默认值),超过此上限的封将被直接丢弃。使用效果同上。

16、参数 -m mac --mac-source

范例:iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01 -j ACCEPT

说明:用来比对数据包来源网络接口的硬件地址,这个参数不能用在 OUTPUT 和 Postrouting 规则链上,这是因为封包要送出到网后,才能由网卡驱动程序透过 ARP 通讯协议查出目的地的 MAC 地址,所以 iptables 在进行封包比对时,并不知道封包会送到个网络接口去。linux基础

17、参数 --mark

范例:iptables -t mangle -A INPUT -m mark --mark 1

说明:用来比对封包是否被表示某个号码,当封包被比对成功时,我们可以透过 MARK 处理动作,将该封包标示一个号码,号码最不可以超过 4294967296。linux基础

18、参数 -m owner --uid-owner

范例:iptables -A OUTPUT -m owner --uid-owner 500

说明:用来比对来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使用 root 或其它身分将敏感数据传送出,可以降低系统被骇的损失。可惜这个功能无法比对出来自其它主机的封包。

19、参数 -m owner --gid-owner

范例:iptables -A OUTPUT -m owner --gid-owner 0

说明:用来比对来自本机的数据包,是否为某特定使用者群组所产生的,使用时机同上。

20、参数 -m owner --pid-owner

范例:iptables -A OUTPUT -m owner --pid-owner 78

说明:用来比对来自本机的数据包,是否为某特定行程所产生的,使用时机同上。

21、参数 -m owner --sid-owner

范例: iptables -A OUTPUT -m owner --sid-owner 100

说明: 用来比对来自本机的数据包,是否为某特定联机(Session ID)的响应封包,使用时机同上。

22、参数 -m state --state

范例: iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

说明 用来比对联机状态,联机状态共有四种:INVALID、ESTABLISHED、NEW 和 RELATED。

23、iptables -L -n -v  可以查看计数器

INVALID 表示该数据包的联机编号(Session ID)无法辨识或编号不正确。ESTABLISHED 表示该数据包属于某个已经建立的联机。NEW 表示该数据包想要起始一个联机(重设联机或将联机重导向)。RELATED 表示该数据包是属于某个已经建立的联机,所建立的新联机。例如:FTP-DATA 联机必定是源自某个 FTP 联机。

(三)、常用的处理动作:

-j 参数用来指定要进行的处理动作,常用的处理动作包括:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK

分别说明如下:

ACCEPT 将数据包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链(natostrouting)。

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 对应的范围,进行完此处理动作后,直接跳往下一个规则(mangleostrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨号连接时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。范例如下:linux基础

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 对应的范围,进行完此处理动作后,将直接跳往下一个规则(mangleostrouting)。范例如下:

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

以上用来大量的实例来说明iptables的参数和命令的用法,如果有朋友有配置iptables的需求可以QQ联系我:1600490666,或者将需求发给我,为您配置相应的策略。

文章来源:

http://www.lampbo.org/linux-xuexi/linux-advance/iptables-jiaocheng-principle-introduce.html

http://www.lampbo.org/linux-xuexi/linux-advance/iptables-options.html

http://www.lampbo.org/linux-xuexi/linux-advance/iptables-config-rules-demo.html

 
 
http://www.2cto.com/os/201402/279577.html
一、iptables简介
Linux的2.4版内核引入了一种全新的包过滤引擎,称为Netfilter。
控制Netfilter的工具iptables是Linux 2.2版内核中比较老的命令ipchains的兄弟。
iptables把有次序的规则"链(chains)"应用到网络包上。
链的集合就构成了"表(tables)",用于处理特殊类型的流量。

例如,默认的iptables表名叫"filter(过滤器)"。网络数据包都使用这个表里的规则链来过滤。
过滤器表包含3个默认链。
对于每个包来说,内核都会选择三个链中适合的一个进行处理:
. FORWARD链规则, 用于从一个网络接口输入,再转发到另一个网络接口输出的包;
. INPUT链规则, 用于以本机为目的地的包;
. OUTPUT链规则, 用于从本地主机发出的包;

这3个标准链通常能够满足两个网络接口之间防火墙的全部需要。
如果必要,您还可以定义一个定制的配置,支持更复杂的记账或者路由场合。

除了filter表之外,iptables还包含"NAT"和"mangle"表。
. NAT表包含的规则链控制着NAT(Network Address Translation,网络地址转换,这里的“nat”就是iptables表名,
"NAT"是一般地址转换机制的叫法)。
12.4.6节讨论了NAT,本节给出一个正在起作用的nat表的例子。
在本节后面的内容里,我们会使用nat表的PREROUTING链来做反IP欺骗的包过滤。
. mangle表包含了链可以修改或者改变在NAT和包过滤之外的网络包的内容。
虽然mangle表对于做包的特殊处理很方便,比如重新设定IP包的ttl值,但是在大多数工作环境中一般不会用到它。
我们在这一节里只讨论filter和nat表,而把mangle表留给读者自己去探索。

图1比较完整地展示了一个数据包是如何经过防火墙的,考虑到节省空间,该图实际上包了三种情况:
. 来自外部,以防火墙(本机)为目的地的包,走图1中 "自上至下左边" 路径;
. 由防火墙(本机)生成并输出的包, 走图1中从"本地进程"开始,自上至下左边的路径;
. 来自外部,目的地是其它主机的包, 走图1中"自上至下走右边"的路径;
图1:
vc/J2dPDtcRtYW5nbGUgse21xM28yr4svs3T0M28Msv5z9TKvrXEuPzOqsflzvq1xMK3vrbNvC48YnI+Cs28Mjo8YnI+CjxpbWcgc3JjPQ=="http://www.2cto.com/uploadfile/Collfiles/20140219/2014021909250011.jpg" width="700" height="855.339805825" alt="\">
构成一条链的每条规则都有一个"target(目标)"子句,它决定了如何处理匹配的包。
一旦某个包匹配了一个规则,那么它的结局就确定了,不再用其他规则来检查它。
虽然iptables内部定义了许多target,但是还可以指定另一条链作为规则的target。


在filter表中的规则可以使用的target子句有
ACCEPT、DROP、REJECT、LOG、MIRROR、QUEUE、REDIRECT、RETURN和ULOG。
. 当一条规则落在了ACCEPT上的时候,匹配这条规则的包就可以继续通过。
. DROP和REJECT都会把它们的包丢弃。DROP是默默地丢弃,而REJECT会返回一则ICMP错误消息。
. LOG提供跟踪包匹配规则情况的简单办法,ULOG提供了范围更广的日志记录信息。
. REDIRECT把包分流到一个代理,而不是直接让它们通过。
您可能会用这个功能来迫使站点上的所有Web流量都通过一个Web高速缓存,比如Squid。
. RETURN终结用户定义的链,类似于子例程调用中的return语句。
. MIRROR目标在发送包之前交换IP源和目的地址。
. QUEUE通过一个内核模块把包交给本地用户程序。

Linux防火墙通常是由rc启动脚本中的一系列iptables命令来实现的。
各个iptables命令通常采取下列形式之一:
iptables -F chain-name
iptables -P chain-name target
iptables -A chain-name -i interface -j target
. 第一种形式(-F)把之前所有的规则都从链中清除掉。
. 第二种形式(-P)给链设置一条默认策略(也就是target)。我们建议您使用DROP作为链默认的目标(target)。
. 第三种形式(-A)把当前的说明追加到链上。
除非使用-t参数指定了表(table)名,否则命令被默认应用到filter表上。
-i参数将规则应用到有名字的接口上,-j则标识出目标(target)。

iptables还接受许多别的子句,表1给出了其中的一部分。
表1
系统被骇的损失。
可惜这个功能无法匹配出来自其它主机的封包。

参数: -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 连接。

4. [-j target/jump] 常用的处理动作
-j 参数用来指定要进行的处理动作,常用的处理动作包括:
ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,

分别说明如下:
动作: ACCEPT
说明: 将封包放行,
进行完此处理动作后,将不再匹配其它规则,直接跳往下一个规则链(natostrouting)。

动作: 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),进行完此处理动作后,将会继续匹配其它规则。
这个功能可以用来实现透明代理或用来保护web 服务器。
范例: iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

动作: MASQUERADE
说明: 改写封包来源IP 为防火墙NIC IP,可以指定port 对应的范围,
进行完此处理动作后,直接跳往下一个规则链(manglepostrouting)。
这个功能与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 对应的范围,
进行完此处理动作后,将直接跳往下一个规则(mangleostrouting)。
范例: 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
 
 
#######################################
 
http://my.oschina.net/itblog/blog/204401
 

一:前言

 

    防火墙,其实说 白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我 们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略,规则,以达到让它对出入网络的IP、数据进行检测。

目前市面上比较常见的有3、4层的防火墙,叫网络层的防火墙,还有7层的防火墙,其实是代理层的网关。

    对于TCP/IP的七层模型来讲,我们知道第三层是网络层,三层的防火墙会在这层对源地址和目标地址进行检测。但是对于七层的防火墙,不管你源端口或者目标端口,源地址或者目标地址是什么,都将对你所有的东西进行检查。 所以,对于设计原理来讲,七层防火墙更加安全,但是这却带来了效率更低。所以市面上通常的防火墙方案,都是两者结合的。而又由于我们都需要从防火墙所控制 的这个口来访问,所以防火墙的工作效率就成了用户能够访问数据多少的一个最重要的控制,配置的不好甚至有可能成为流量的瓶颈。

 

二:iptables 的历史以及工作原理

 

1.iptables的发展:

    iptables 的前身叫ipfirewall (内核1.x时代),这是一个作者从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是 ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发 展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。

    他们都是工作在用户空间中,定义规则的工具,本身并不算是防火墙。它们定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter.(网络过滤器)

    作者一共在内核空间中选择了5个位置,

    1.内核空间中:从一个网络接口进来,到另一个网络接口去的

    2.数据包从内核流入用户空间的

    3.数据包从用户空间流出的

    4.进入/离开本机的外网接口

    5.进入/离开本机的内网接口    

 

2.iptables的工作机制

    从上面的发展我 们知道了作者选择了5个位置,来作为控制的地方,但是你有没有发现,其实前三个位置已经基本上能将路径彻底封锁了,但是为什么已经在进出的口设置了关卡之 后还要在内部卡呢? 由于数据包尚未进行路由决策,还不知道数据要走向哪里,所以在进出口是没办法实现数据过滤的。所以要在内核空间里设置转发的关卡,进入用户空间的关卡,从 用户空间出去的关卡。那么,既然他们没什么用,那我们为什么还要放置他们呢?因为我们在做NAT和DNAT的时候,目标地址转换必须在路由之前转换。所以我们必须在外网而后内网的接口处进行设置关卡。        

 这五个位置也被称为五个钩子函数(hook functions),也叫五个规则链。

  1.PREROUTING (路由前)

  2.INPUT (数据包流入口)

  3.FORWARD (转发管卡)

  4.OUTPUT(数据包出口)

  5.POSTROUTING(路由后)

        这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。       

 

3.防火墙的策略

    防火墙策略一般分为两种,一种叫“通”策略,一种叫“堵”策略,通策略,默认门是关着的,必须要定义谁能进。堵策略则是,大门是洞开的,但是你必须有身份认证,否则不能进。所以我们要定义,让进来的进来,让出去的出去,所以通,是要全通,而堵,则是要选择。当我们定义的策略的时候,要分别定义多条功能,其中:定义数据包中允许或者不允许的策略,filter过滤的功能,而定义地址转换的功能的则是nat选项。为了让这些功能交替工作,我们制定出了“表”这个定义,来定义、区分各种不同的工作功能和处理方式。

我们现在用的比较多个功能有3个:

1.filter 定义允许或者不允许的

2.nat 定义地址转换的 

3.mangle功能:修改报文原数据

我们修改报文原数据就是来修改TTL的。能够实现将数据包的元数据拆开,在里面做标记/修改内容的。而防火墙标记,其实就是靠mangle来实现的。

 

小扩展:

    对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT

    对于nat来讲一般也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING

    而mangle则是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

    iptables/netfilter(这款软件)是工作在用户空间的,它可以让规则进行生效的,本身不是一种服务,而且规则是立即生效的。而我们iptables现在被做成了一个服务,可以进行启动,停止的。启动,则将规则直接生效,停止,则将规则撤销。 

    iptables还支持自己定义链。但是自己定义的链,必须是跟某种特定的链关联起来的。在一个关卡设定,指定当有数据的时候专门去找某个特定的链来处理,当那个链处理完之后,再返回。接着在特定的链中继续检查。

注意:规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。

 

三.规则的写法:

 

 iptables定义规则的方式比较复杂:

 格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION

   -t table :3个filter nat mangle

   COMMAND:定义如何对规则进行管理

   chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的

   CRETIRIA:指定匹配标准

   -j ACTION :指定如何进行处理

 

 比如:不允许172.16.0.0/24的进行访问。

   iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP

 当然你如果想拒绝的更彻底:

   iptables -t filter -R INPUT 1 -s 172.16.0.0/16 -p udp --dport 53 -j REJECT

 iptables -L -n -v#查看定义规则的详细信息

 

四:详解COMMAND:

 

1.链管理命令(这都是立即生效的)

-P :设置默认策略的(设定默认门是关着的还是开着的)

默认策略一般只有两种

iptables -P INPUT (DROP|ACCEPT)  默认是关的/默认是开的

比如:

iptables -P INPUT DROP 这就把默认规则给拒绝了。并且没有定义哪个动作,所以关于外界连接的所有规则包括Xshell连接之类的,远程连接都被拒绝了。

        -F: FLASH,清空规则链的(注意每个链的管理权限)

    iptables -t nat -F PREROUTING

    iptables -t nat -F 清空nat表的所有链

        -N:NEW 支持用户新建一个链

            iptables -N inbound_tcp_web 表示附在tcp表上用于检查web的。

        -X: 用于删除用户自定义的空链

            使用方法跟-N相同,但是在删除之前必须要将里面的链给清空昂了

        -E:用来Rename chain主要是用来给用户自定义的链重命名

            -E oldname newname

        -Z:清空链,及链中默认规则的计数器的(有两个计数器,被匹配到多少个数据包,多少个字节)

            iptables -Z :清空

 

2.规则管理命令

         -A:追加,在当前链的最后新增一个规则

         -I num : 插入,把当前规则插入为第几条。

            -I 3 :插入为第三条

         -R num:Replays替换/修改第几条规则

            格式:iptables -R 3 …………

         -D num:删除,明确指定删除第几条规则

        

3.查看管理命令 “-L”

 附加子命令

   -n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名。

   -v:显示详细信息

   -vv

   -vvv :越多越详细

   -x:在计数器上显示精确值,不做单位换算

   --line-numbers : 显示规则的行号

   -t nat:显示所有的关卡的信息

 

五:详解匹配标准

 

1.通用匹配:源地址目标地址的匹配

     -s:指定作为源地址匹配,这里不能指定主机名称,必须是IP

        IP | IP/MASK | 0.0.0.0/0.0.0.0

        而且地址可以取反,加一个“!”表示除了哪个IP之外

     -d:表示匹配目标地址

     -p:用于匹配协议的(这里的协议通常有3种,TCP/UDP/ICMP)

     -i eth0:从这块网卡流入的数据

        流入一般用在INPUT和PREROUTING上

     -o eth0:从这块网卡流出的数据

        流出一般在OUTPUT和POSTROUTING上

        

2.扩展匹配

2.1隐含扩展:对协议的扩展

    -p tcp :TCP协议的扩展。一般有三种扩展

  --dport XX-XX:指定目标端口,不能指定多个非连续端口,只能指定单个端口,比如

  --dport 21  或者 --dport 21-23 (此时表示21,22,23)

  --sport:指定源端口

  --tcp-fiags:TCP的标志位(SYN,ACK,FIN,PSH,RST,URG)

    对于它,一般要跟两个参数:

  1.检查的标志位

  2.必须为1的标志位

--tcpflags syn,ack,fin,rst syn   =    --syn

表示检查这4个位,这4个位中syn必须为1,其他的必须为0。所以这个意思就是用于检测三次握手的第一次包的。对于这种专门匹配第一包的SYN为1的包,还有一种简写方式,叫做--syn

    -p udp:UDP协议的扩展

        --dport

        --sport

    -p icmp:icmp数据报文的扩展

        --icmp-type:

echo-request(请求回显),一般用8 来表示

所以 --icmp-type 8 匹配请求回显数据包

echo-reply (响应的数据包)一般用0来表示

                  

2.2显式扩展(-m)

     扩展各种模块

      -m multiport:表示启用多端口扩展

      之后我们就可以启用比如 --dports 21,23,80

                         

六:详解-j ACTION

 

 常用的ACTION:

 DROP:悄悄丢弃

一般我们多用DROP来隐藏我们的身份,以及隐藏我们的链表

 REJECT:明示拒绝

 ACCEPT:接受

custom_chain:转向一个自定义的链

 DNAT

 SNAT

 MASQUERADE:源地址伪装

 REDIRECT:重定向:主要用于实现端口重定向

 MARK:打防火墙标记的

 RETURN:返回

在自定义链执行完毕后使用返回,来返回原规则链。

 

练习题1:

     只要是来自于172.16.0.0/16网段的都允许访问我本机的172.16.100.1的SSHD服务

     分析:首先肯定是在允许表中定义的。因为不需要做NAT地址转换之类的,然后查看我们SSHD服务,在22号端口上,处理机制是接受,对于这个表,需要 有一来一回两个规则,如果我们允许也好,拒绝也好,对于访问本机服务,我们最好是定义在INPUT链上,而OUTPUT再予以定义就好。(会话的初始端先 定义),所以加规则就是:

     定义进来的: iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -j ACCEPT

     定义出去的: iptables -t filter -A OUTPUT -s 172.16.100.1 -d 172.16.0.0/16 -p tcp --dport 22 -j ACCEPT

     将默认策略改成DROP:

    iptables -P INPUT DROP

    iptables -P OUTPUT DROP

    iptables -P FORWARD DROP

        

七:状态检测:

 

是一种显式扩展,用于检测会话之间的连接关系的,有了检测我们可以实现会话间功能的扩展

        什么是状态检测?对于整个TCP协议来讲,它是一个有连接的协议,三次握手中,第一次握手,我们就叫NEW连接,而从第二次握手以后的,ack都为1,这 是正常的数据传输,和tcp的第二次第三次握手,叫做已建立的连接(ESTABLISHED),还有一种状态,比较诡异的,比如:SYN=1 ACK=1 RST=1,对于这种我们无法识别的,我们都称之为INVALID无法识别的。还有第四种,FTP这种古老的拥有的特征,每个端口都是独立的,21号和 20号端口都是一去一回,他们之间是有关系的,这种关系我们称之为RELATED。

所以我们的状态一共有四种:

        NEW

        ESTABLISHED

        RELATED

        INVALID

所以我们对于刚才的练习题,可以增加状态检测。比如进来的只允许状态为NEW和ESTABLISHED的进来,出去只允许ESTABLISHED的状态出去,这就可以将比较常见的反弹式木马有很好的控制机制。

        

对于练习题的扩展:

进来的拒绝出去的允许,进来的只允许ESTABLISHED进来,出去只允许ESTABLISHED出去。默认规则都使用拒绝

iptables -L -n --line-number  :查看之前的规则位于第几行

    改写INPUT

        iptables -R INPUT 2 -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

        iptables -R OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT

 

    此时如果想再放行一个80端口如何放行呢?

        iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

        iptables -R INPUT 1 -d 172.16.100.1 -p udp --dport 53 -j ACCEPT

 

练习题2:

假如我们允许自己ping别人,但是别人ping自己ping不通如何实现呢?

分析:对于ping这个协议,进来的为8(ping),出去的为0(响应).我们为了达到目的,需要8出去,允许0进来

 

在出去的端口上:iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT

在进来的端口上:iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT

 

小扩展:对于127.0.0.1比较特殊,我们需要明确定义它

iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

 

八:SNAT和DNAT的实现

 

由于我们现在IP地址十分紧俏,已经分配完了,这就导致我们必须要进行地址转换,来节约我们仅剩的一点IP资源。那么通过iptables如何实现NAT的地址转换呢?

 

1.SNAT基于原地址的转换

基于原地址的转换一般用在我们的许多内网用户通过一个外网的口上网的时候,这时我们将我们内网的地址转换为一个外网的IP,我们就可以实现连接其他外网IP的功能。

所以我们在iptables中就要定义到底如何转换:

定义的样式:

比如我们现在要将所有192.168.10.0网段的IP在经过的时候全都转换成172.16.100.1这个假设出来的外网地址:

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1

这样,只要是来自本地网络的试图通过网卡访问网络的,都会被统统转换成172.16.100.1这个IP.

那么,如果172.16.100.1不是固定的怎么办?

我们都知道当我们使用联 通或者电信上网的时候,一般它都会在每次你开机的时候随机生成一个外网的IP,意思就是外网地址是动态变换的。这时我们就要将外网地址换成 MASQUERADE(动态伪装):它可以实现自动寻找到外网地址,而自动将其改为正确的外网地址。所以,我们就需要这样设置:

         iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE

         这里要注意:地址伪装并不适用于所有的地方。

 

2.DNAT目标地址转换

对于目标地址转换,数据流向是从外向内的,外面的是客户端,里面的是服务器端通过目标地址转换,我们可以让外面的ip通过我们对外的外网ip来访问我们服务器不同的服务器,而我们的服务却放在内网服务器的不同的服务器上。

 

    如何做目标地址转换呢?:

iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --todestination 172.16.100.2

    目标地址转换要做在到达网卡之前进行转换,所以要做在PREROUTING这个位置上

 

九:控制规则的存放以及开启

 

注意:你所定义的所有内容,当你重启的时候都会失效,要想我们能够生效,需要使用一个命令将它保存起来

    1.service iptables save 命令

它会保存在/etc/sysconfig/iptables这个文件中

    2.iptables-save 命令

iptables-save > /etc/sysconfig/iptables

    3.iptables-restore 命令

开机的时候,它会自动加载/etc/sysconfig/iptabels

如果开机不能加载或者没有加载,而你想让一个自己写的配置文件(假设为iptables.2)手动生效的话:

    iptables-restore < /etc/sysconfig/iptables.2

则完成了将iptables中定义的规则手动生效

 

十:总结

         Iptables是一个非常重要的工具,它是每一个防火墙上几乎必备的设置,也是我们在做大型网络的时候,为了很多原因而必须要设置的。学好 Iptables,可以让我们对整个网络的结构有一个比较深刻的了解,同时,我们还能够将内核空间中数据的走向以及linux的安全给掌握的非常透彻。我 们在学习的时候,尽量能结合着各种各样的项目,实验来完成,这样对你加深iptables的配置,以及各种技巧有非常大的帮助。

 

 ===============

http://linux.ccidnet.com/art/737/20060705/596613_1.html

iptables 中的指令,均需区分大小写。

 

 

 

ipchains 和 iptables 在语法上的主要的差异,注意如下∶

1. 在 ipchains 中,诸如 input 链,是使用小写的 chains 名,在 iptables 中,要改用大写 INPUT。

2. 在 iptables 中,要指定规则是欲作用在那一个规则表上(使用 -t 来指定,如 -t nat),若不指定,则预设是作用在 filter 这个表。

3. 在 ipchains 中, -i 是指介面(interface),但在 iptables 中,-i 则是指进入的方向,且多了 -o,代表出去的方向。

4. 在 iptables 中,来源 port 要使用关键字 --sport 或 --source-port

5. 在 iptables 中,目的 port 要使用关键字 --dport 或 --destination-port

6. 在 iptables 中,"丢弃" 的处置动作,不再使用 DENY 这个 target,改用 DROP。

7. 在 ipchains 的记录档功能 -l,已改为目标 -j LOG,并可指定记录档的标题。

8. 在 ipchains 中的旗标 -y,在 iptables 中可用 --syn 或 --tcp-flag SYN,ACK,FIN SYN

9. 在 iptables 中,imcp messages 型态,要加上关键字 --icmp-type,如∶

iptables -A OUTPUT -o eth0 -p icmp -s $FW_IP --icmp-type 8 -d any/0 -j ACCEPT

 

 

 

 

 

iptables 使用时的样板

在设定 iptables 的封包过滤规则时,有几个样板的动作,若先熟に牵缶涂勺孕刑子茫来死嗤疲芸斓兀涂梢越胝飧鎏斓刂小?/P>

 

 

观察目前的设定

作法如下∶

 

 

 

iptables -L -n

iptablse -t nat -L -n

 

 

 

 

 

定义变数

FW_IP="163.26.197.8"

 

 

 

 

打开核心 forward 功能

作法如下∶

 

 

 

###-----------------------------------------------------###

# 打开 forward 功能

###-----------------------------------------------------###

 

 

 

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

 

 

 

 

 

清除所有的规则

一开始要先清除所有的规则,重新开始,以免旧有的规则影响新的设定。作法如下∶

 

 

 

###-----------------------------------------------------###

# 清除先前的设定

###-----------------------------------------------------###

# 清除预设表 filter 中,所有规则链中的规则

iptables -F

# 清除预设表 filter 中,使用者自订链中的规则

iptables -X

 

 

 

# 清除mangle表中,所有规则链中的规则

iptables -F -t mangle

# 清除mangle表中,使用者自订链中的规则

iptables -t mangle -X

 

 

 

# 清除nat表中,所有规则链中的规则

iptables -F -t nat

# 清除nat表中,使用者自订链中的规则

iptables -t nat -X

 

 

 

 

 

选定预设的政策

接着,要选定各个不同的规则链,预设的政策为何。作法如下∶

 

 

 

预设全部丢弃∶

 

 

 

###-----------------------------------------------------###

# 设定 filter table 的预设政策

###-----------------------------------------------------###

iptables -P INPUT DROP

iptables -P OUTPUT DROP

iptables -P FORWARD DROP

 

 

 

 

 

或者预设全部接受∶

 

 

 

###-----------------------------------------------------###

# 设定 filter table 的预设政策

###-----------------------------------------------------###

iptables -P INPUT ACCEPT

iptables -P OUTPUT ACCEPT

iptables -P FORWARD ACCEPT

 

 

 

 

 

各个规则链的预设政策可独立自主的设定,不必受其它链的影响。

 

 

 

以下练习,若目标为 DROP,则 policy 请设为 ACCEPT;若目标为 ACCEPT,则 policy 请设为 DROP,如此方可看出效果。

 

 

 

开放某一个介面

作法如下∶

 

 

 

iptables -A INPUT -i lo -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT

 

 

 

注∶IPFW 或 Netfilter 的封包流向,local process 不会经过 FORWARD Chain,

因此 lo 只在 INPUT 及 OUTPUT 二个 chain 作用。

 

 

 

iptables -A INPUT -i eth1 -j ACCEPT

iptables -A OUTPUT -o eth1 -j ACCEPT

iptables -A FORWARD -i eth1 -j ACCEPT

iptables -A FORWARD -o eth1 -j ACCEPT

 

 

 

 

 

IP 伪装

使内部网路的封包经过伪装之后,使用对外的 eth0 网卡当作代表号,对外连线。作法如下∶

 

 

 

###-----------------------------------------------------###

# 启动内部对外转址

###-----------------------------------------------------###

 

 

 

iptables -t nat -A POSTROUTING -o eth0 -s 172.16.0.0/16 -j SNAT --to-source $FW_IP

 

 

 

 

 

上述指令意指∶把 172.16.0.0/16 这个网段,伪装成 $FW_IP 出去。

 

 

 

虚拟主机

利用转址、转 port 的方式,使外部网路的封包,可以到达内部网路中的伺服主机,俗称虚拟主机。这种方式可保护伺服主机大部份的 port 不被外界存取,只开放公开服务的通道(如 Web Server port 80),因此安全性甚高。

 

 

 

作法如下∶

 

 

 

###-----------------------------------------------------###

# 启动外部对内部转址

###-----------------------------------------------------###

# 凡对 $FW_IP:80 连线者, 则转址至 172.16.255.2:80

iptables -t nat -A PREROUTING -i eth0 -p tcp -d $FW_IP --dport 80 -j DNAT --to-destination 172.16.255.2:80

 

 

 

 

 

开放内部主机可以 telnet 至外部的主机

开放内部网路,可以 telnet 至外部主机。

 

 

 

作法如下∶(预设 policy 为 DROP)

 

 

 

###-----------------------------------------------------###

# open 外部主机 telnet port 23

###-----------------------------------------------------###

 

 

 

iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 23 -j ACCEPT

iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 23 -d $FW_IP --dport 1024:65535 -j ACCEPT

 

 

 

 

 

开放邮包转递通道

开放任意的邮件主机送信包给你的 Mail Server,而你的 Mail Server 也可以送信包过去。

 

 

 

作法如下∶(预设 policy 为 DROP)

 

 

 

###-----------------------------------------------------###

# open SMTP port 25

###-----------------------------------------------------###

 

 

 

# 以下是∶别人可以送信给你

iptables -A INPUT -i eth0 -p tcp -s any/0 --sport 1024:65535 -d $FW_IP --dport 25 -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp ! --syn -s $FW_IP --sport 25 -d any/0 --dport 1024:65535 -j ACCEPT

 

 

 

# 以下是∶你可以送信给别人

iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 25 -j ACCEPT

iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 25 -d $FW_IP --dport 1024:65525 -j ACCEPT

 

 

 

 

 

开放对外离线下载信件的通道

开放内部网路可以对外部网路的 POP3 server 取信件。

 

 

 

作法如下∶(预设 policy 为 DROP)

 

 

 

###-----------------------------------------------------###

# open 对外部主机的 POP3 port 110

###-----------------------------------------------------###

 

 

 

iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 110 -j ACCEPT

iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 110 -d $FW_IP --dport 1024:65535 -j ACCEPT

 

 

 

 

 

开放观看网页的通道

开放内部网路可以观看外部网路的网站。

 

 

 

作法如下∶(预设 policy 为 DROP)

 

 

 

###-----------------------------------------------------###

# open 对外部主机的 HTTP port 80

###-----------------------------------------------------###

 

 

 

iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 80 -j ACCEPT

iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 80 -d $FW_IP --dport 1024:65535 -j ACCEPT

 

 

 

 

 

开放查询外部网路的 DNS 主机

开放内部网路,可以查询外部网路任何一台 DNS 主机。

 

 

 

作法如下∶(预设 policy 为 DROP)

 

 

 

###-----------------------------------------------------###

# open DNS port 53

###-----------------------------------------------------###

 

 

 

# 第一次会用 udp 封包来查询

iptables -A OUTPUT -o eth0 -p udp -s $FW_IP --sport 1024:65535 -d any/0 --dport 53 -j ACCEPT

iptables -A INPUT -i eth0 -p udp -s any/0 --sport 53 -d $FW_IP --dport 1024:65535 -j ACCEPT

 

 

 

# 若有错误,会改用 tcp 封包来查询

iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 53 -j ACCEPT

iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 53 -d $FW_IP --dport 1024:65535 -j ACCEPT

 

 

 

# 开放这台主机上的 DNS 和外部的 DNS 主机互动查询∶使用 udp

iptables -A OUTPUT -o eth0 -p udp -s $FW_IP --sport 53 -d any/0 --dport 53 -j ACCEPT

iptables -A INPUT -i eth0 -p udp -s any/0 --sport 53 -d $FW_IP --dport 53 -j ACCEPT

# 开放这台主机上的 DNS 和外部的 DNS 主机互动查询∶使用 tcp

iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 53 -d any/0 --dport 53 -j ACCEPT

iptables -A INPUT -i eth0 -p tcp ! -y -s any/0 --sport 53 -d $FW_IP --dport 53 -j ACCEPT

 

 

 

 

 

开放内部主机可以 ssh 至外部的主机

开放内部网路,可以 ssh 至外部主机。

 

 

 

作法如下∶(预设 policy 为 DROP)

 

 

 

###-----------------------------------------------------###

# open 外部主机 ssh port 22

###-----------------------------------------------------###

 

 

 

iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 22 -j ACCEPT

iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 22 -d $FW_IP --dport 1024:65535 -j ACCEPT

 

 

 

# 以下是 ssh protocol 比较不同的地方

iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1020:1023 -d any/0 --dport 22 -j ACCEPT

iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 22 -d $FW_IP --dport 1020:1023 -j ACCEPT

 

 

 

 

 

开放内部主机可以 ftp 至外部的主机

开放内部网路,可以 ftp 至外部主机。

 

 

 

作法如下∶(预设 policy 为 DROP)

 

 

 

###-----------------------------------------------------###

# open 对外部主机 ftp port 21

###-----------------------------------------------------###

 

 

 

# 以下是打开命令 channel 21

iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 21 -j ACCEPT

iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 21 -d $FW_IP --dport 1024:65535 -j ACCEPT

 

 

 

# 以下是打开资料 channel 20

iptables -A INPUT -i eth0 -p tcp -s any/0 --sport 20 -d $FW_IP --dport 1024:65535 -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp ! --syn -s $FW_IP --sport 1024:65535 -d any/0 --dport 20 -j ACCEPT

 

 

 

# 以下是打开 passive mode FTP 资料通道

iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 1024:65535 -j ACCEPT

iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 1024:65535 -d $FW_IP --dport 1024:65535 -j ACCEPT

 

 

 

开放 ping

可以对外 ping 任何一台主机。

 

 

 

作法如下∶(预设 policy 为 DROP)

 

 

 

iptables -A OUTPUT -o eth0 -p icmp -s $FW_IP --icmp-type 8 -d any/0 -j ACCEPT

iptables -A INPUT -i eth0 -p icm -s any/0 --icmp-type 0 -d $FW_IP -j ACCEPT      

 

 

----------------

 http://www.zhihu.com/question/20660163

某个web服务器,使用8080端口,要求对于10.10.1.0/24段全开,限制ping的频度
打开SSH,同时允许服务器从外面下载用于升级什么的
按照网上的各种前辈指教,默认进入的数据包一定要DROP,于是:

#允许回环
iptables -A INPUT -j ACCEPT -i lo

#信任网段全开
iptables -A INPUT -j ACCEPT -s 10.10.1.0/24

#限制ping的速率不超过3次/秒,同时不超过15台主机ping服务器
iptables -A INPUT -j ACCEPT -p icmp -m limit --limit 3/s --limit-burst 15

#开SSH,资料说SSH同时用到TCP和UDP
iptables -A INPUT -j ACCEPT -p tcp --dport 22
iptables -A INPUT -j ACCEPT -p udp --dport 22

#开web,端口8080
iptables -A INPUT -j ACCEPT -p tcp --dport 8080

#默认关闭进来的包,不符合以上的全部丢弃
iptables -P INPUT DROP

可是因为默认策略是丢弃,导致服务器不能从外网下载任何数据了,怎么办啊?本机用HTTP或者FTP下载的时候,或者用其它连出去的协议如SMTP,DNS,本机端口是随机开的呀!

添加命令:iptables -I INPUT 1 -p all -m state --state ESTABLISHED,RELATED -j ACCEPT 就好了。

 

 

 
 
 
posted @ 2014-10-14 09:17  陳聽溪  阅读(444)  评论(0编辑  收藏  举报