本文不是专门讨论IPCHAINS的工作原理,也不是讨论IPCHAINS有关的参数和命令的用法。我只不过是想
说明一下IPCHAINS到底是怎样工作的,重在流程。并结合一个IP包在到达防火墙后是经过怎样的步骤最
后从防火墙出来。
(想要了解IPCHAINS的参数和命令的用法请看http://www.ibase.com/book/showQueryL.asp?libID=284)
大家知道,REDHAT 6.2内自带ipchains防火墙。系统有三个标准的防火墙链和用户自定义的防火墙链。
还有它的规则和目标。首先要弄清这些概念:
其实画个图就清楚了,如下
`input' `Test'
---------------------------- ----------------------------
| Rule1: -p ICMP -j REJECT | | Rule1: -s 192.168.1.1 |
|--------------------------| |--------------------------|
| Rule2: -p TCP -j Test | | Rule2: -d 192.168.1.1 |
|--------------------------| ----------------------------
| Rule3: -p UDP -j DENY |
----------------------------
上图就表示两条链:系统的标准链INPUT链和用户自定义链Test。
RuleX就是规则
-j 后面的就是目标或又是一个防火链。
当然,系统还有forward链,output链,你还可以定义自己的链(ipchains -N newname)
上图说明input链中第一条规则是定义进来的协议为icmp的IP包就跳到REJECT目标,由于REJECT是系统自
定义
的,表示拒绝,所以符合-p icmp的包就被丢弃。
input第二条规则说明协议为tcp的包跳到test,由于test是用户自定义的链,所以进来的包被送到test
链中去
决定它的命运。
现在弄清楚了基本的概念后我们再来看一看一个从192.168.1.1进来的tcp包要到1.2.3.4去,它是怎样走
的?
(还是上面的图):
当包进来后,它先被送到input链与第一条规则匹配。第一条规则不符合(不是icmp包),则此包进入第
二条规则。第二条规则符合(是tcp包),则按照-j(jump)后面定义的目标跳到相应的地方。因目标又
是一条链(用户自定义的),所以包被送到test链继续匹配test链中的规则。test链中第一条规则符合
(因原地址是192.168.1.1),但没有指定其要去的地方,所以继续匹配第二条规则。第二条规则不符合
(目的不是192.168.1.1,而是1.2.3.4)所以包又被送到input链继续匹配下面的规则(因test链没有指明
此包的命运,而input链又没有执行完),input链中的第三条规则也不匹配,则决定此包最终命运的是
ipchains -P input 后面所定义的目标。如有ipchains -P input DENY 则此包被拒绝。如是ipchains
-P input ACCEPT则此包被接受
。等等。因为一个包从进入一条链到出来中间若没有任何规则指明它的命运的话,此包要走完整个链,
象上面的列子一样,若test链中有Rule3: -p tcp -j DENY则此包被丢弃。但如没有,则最终是由
ipchains -P input决定此包的命运。
上面的文字说明用下图来表示:
v __________________________
`input' | / `Test' v
------------------------|--/ -----------------------|----
| Rule1 | /| | Rule1 | |
|-----------------------|/-| |----------------------|---|
| Rule2 / | | Rule2 | |
|--------------------------| -----------------------v----
| Rule3 /--+___________________________/
------------------------|---
v
上面只是讨论了一个包在一条链中所经历的过程,下面我们来看看在整个ipchains过程中一个包是怎样
进入防火墙,又是怎样出来的。
注意:一个包进入防火墙先一定是进入input链,如有可能最终从output链出去。而且当链中第一条规则
没指明包的去向,它就被送到第二条规则去匹配,第二条规则没指明,则继续送到第三条规则,如有可
能(都没指明包的去向),最终走完此链(ipchains -P)。
看下图:
----------------------------------------------------------------
| ACCEPT/ lo interface |
v REDIRECT _______ |
--> C --> S --> ______ --> D --> ~~~~~~~~ -->|forward|----> _______ -->
h a |input | e {Routing } |Chain | |output |ACCEPT
e n |Chain | m {Decision} |_______| --->|Chain |
c i |______| a ~~~~~~~~ | | ->|_______|
k t | s | | | | |
s y | q | v | | |
u | v e v DENY/ | | v
m | DENY/ r Local Process REJECT | | DENY/
| v REJECT a | | | REJECT
| DENY d --------------------- |
v e -----------------------------
DENY
1:checksum:当一个包进来时,内核首先检查它是不是被篡改。主要是检查效验码。(checksum)如果效
验码不对,则此包被拒绝。
2:sanity:写在每条防火链的前面,特别是input链。主要是检验那些不规范的包。如果包被sanity拒绝
则在syslog文件中有记载。
3:input:包进入input链,按照上面所说的一条链中的包的流程来走。是被拒绝,否定还是被接受,重
定向等。
4:Demasqerade:包被接受。如果此包是由原来的包经过伪装后的包则直接跳到output链。为什么说是经
过原来的包伪装的包呢?因为后面我们将看到一个包到了output出口后有可能又会重新被送到input链再
进行匹配的。
5:Routing Decision:如果包不是以前伪装过的包则通过路由机制判断包的目的地址是本机器的还是需
要转发给其他远程机器的。
6:Local Process:如果包的目的地是本机器。则直接送到output链。
7:Lo interface:如果包是从local process传来的,则它从output链中出来后interface被改为"lo",然
后再从新被送到input链,以接口是"lo"的身份再一次通过各个防火链。(这里可看到Demasqerade)
8:forward:如果是需要转发的包则进入forward链。forward链对那些需要转发的包进行详细的检查,通
过了再进行转发。
9:output:此链核对出去的包的详细信息,符合则让它通过。
至此,我相信不要举列大家对一个包通过ipchains防火墙的整个过程也就一清二楚了。
顺便说一下:
1:只容许TCP SYN连接
如果你想连接外面的web server但又不想web server连接你,又不能切断web server对你提供的正常的
服务的话,你可以阻止那些从web server上请求对你进行连接的包拒绝。
ipchains -p tcp -s 192.168.1.1 -y(可自己定义,但-y不能少)
2:禁止IP Spoof
把/proc/sys/net/ipv4/conf/*/rp_filter 致为"1"
中国Linux论坛