当前位置:Linux教程 - Linux - Ipchains应用详解

Ipchains应用详解



        

    前言

    对一个系统管理员来说,在网络环境里,保护系统与用户免受入侵者的破坏是一件非常重要的事,轻忽的系统管理会给这些入侵者许多攻击的目标。
    网络上的防火墙能够将你的私有区域网络隔离,并保护你的系统免受外界网络世界的干扰。Ipchains是Linux系统中比较出名的防火墙,它属于一种数据包过滤防火墙。使用Ipchains能够达到较好的保护你的系统免受外界网络世界的干扰的效果。

    Ipchains的基本设定

    首先,要使用Ipchains,你必须先将你的Linux系统核心更改为可支持数据包过滤的版本。你可以检查系统里的/proc/net/ip_fwchains这个文件是否存在,若是有的话,你的系统核心已经支持数据包过滤的功能了。若是没有,请在核心配置文件内加上:
    CONFIG_FIREWALL=y
    CONFIG_IP_FIREWALL=y
    两个选项后重新编译你的系统核心。
    有关Ipchains的详细使用设定请参阅后面。这里先说明基本的操作。在刚开始系统缺省的情况下会有三个内建的chains:input、output、forward分别处理出入及传送的规则。
    Ipchains的基本操作如下:
    1.建立新的chain:ipchains -N chain
    2.删除不要的chain:ipchains -X chain
    3.改变chain的polich:ipchains -P chain policy
    4.列出所有chain的rule:ipchains -L [chain]
    5.删除chain的所有rule:ipchains -F [chain]
    6.将chain的计数器归零:ipchains -Z [chain]
    以上[chain]若未指定的话就表示所有的chains
    更改chains的规则:
    1.增加一条新规则:ipchains -A chain
    2.删除第一个比对符合的规则:ipchians -D chain
    3.删除某个位置号码的规则:ipchains -D chain rulenum
    4.在某个位置号码插入一条新的规则:ipchains -I chain [rulenum]
    5.更改某个位置号码的规则:ipchains -R chain [rulenum]
    以上的位置号码是规则比对的顺序(优先序),通常不加代表1(最优先)

    Ipchains的详细使用说明

    下列是ipchains用来新增及处理数据包比对规则的用法:
    ipchains - [ADC] chain rule-specification [options]
    ipchains - [RI] chain rulenum rule-specification [options]
    -A,--append
    增加一条或数条规则在指定的chain最后面。当来源或目的名称对应至数个地址时,这规则也会加上每个可能地址。
    -D,--delete
    从指定的chain开始删除一条或数条规则。可以是规则在chain中的位置号码或者是一条用来比对的规则。
    -C,--check
    用来测试符合指定规则类型的数据包是否通过系统现在的规则。
    下列是关于设定一条规则可用的参数:
    -P,protocol [!] protocol
    这条规则要检查的协议,可以是tcp,udp,icmp或是all,也可以代表某个协议的数字或是名称。在协议前加上“!”符号就是做否定的检查。数字0是代表all。
    -s,--source [!] address[/mask] [!] [port[:port]]
    这个参数用来指定数据包的来源,Address可以是网络上的名称或是IP地址。mask就是来源网络的掩码。后面可以加上来源的端口号码(IP数据包)或是ICMP的种类(ICMP数据包)。可以用数字或服务名称表示port或者可以用ipchains -h icmp来察看可以表示的ICMP种类。
    --source-port[!][port[:port]]
    用来单独指定来源port
    -d,destination[!]address[/mask][!][port[:port]]
    目的的地址(设定类似来源)
    --destination-port[!][port[:port]]
    用来单独指定目的port
    --icmp-type[!]typename
    用来单独表示ICMP的种类
    -j,--jump target
    用来指定这条规则的目标。也就是比对符合这条规则后要做的事。目标可以是另一个chain(再比对一次),或一个特别的目标chain。
    -i,interface[!]name
    用来指出用来接收或送出数据包的网络界面名称。如果不设定本项时,是表示所有的网络界面。如果界面名称后面加上一个“+”号,则代表所有由这个名称开头的网络界面。
    [!]-f,--fragment
    这代表这条规则只会参考到数据包的第二或是更后面的部分,如果该数据包是分割成好几部分时。由于这就无法分辨出数据包的来源或目的端口,因此只要是规则中有包含指定端口或类型的,这个数据包都会比对失败。
    -b,--bidirectional
    双向模式,这个规则会对IP数据包做双向的比对。这就跟直接设两条只有来源和目的的互相对调其余都相同的规则是一样的效果。
    -v,--verbose
    详细的输出。设定这个参数可让list命令显示网络界面地址,规则选项,选项以及TOS遮码。数据包及大小计数器的内容也会显示,数字后面加“K”、“M”、“G”分别代表1000,1000000及1000000000。其他象新增
    ,插入,或删除等命令也会有比较详细的数据显示出来。
    -n,--numeric
    数字化输出。象是IP地址或是端口号码都会以数字显示。预设系统会尽量用相关联的名称表示。
    -l,--log
    打开核心的数据包记录功能。若是某条规则加上这个选项,只要有比对成功的数据包,核心会用printk()这个函数列出数据包的信息。
    -o,--output[maxsize]
    拷贝比对成功的数据包到userspace装置。这是用来在userspace中使用防火墙。
    -m,mark markvalue
    这是用来比对成功的数据包上表示一个32位长的正整数。通常只有要修改核心内部的高手才有可能去用这个选项。
    -t,--TOS andmask xormask
    这里设定的遮码值是用来修改IP数据包文件头的TOS栏位用的。当一个数据包比对成功这条规则后,数据包的TOS栏位会跟andmask的值做and运算,然后跟xormask的值做xor运算。TOS会影响系统对数据包的处理状况(象数据包传送的优先顺序等)。
    -x,exact
    延展数字。使用这个参数时-L命令列出的计数器数字会以正确数字表示(不会用K,M,G等缩写)
    [!]-y,--syn
    只有带有SYN位设定及ACK和FIN位是清除TCP数据包比对规则成功。这类数据包通常是用来启动一个TCP连线用的。例如若是文件往这类数据包如让网络界面接受,则无法由外部对本机打开一个连线,但是本机可以打开一个对外的连线。
    --line-numbers
    用来指定这条规则在chain中位置(优先序)
    --no-warnings
    关闭所有警告信息
    下列是ipchains用来处理规则与chain关心的一些功能:
    ipchains -D chain rulenum [options]
    ipchains -[LFZNX][chain][options]
    -D,--delete
    从选择的chain中删除一条或多条的规则。这里的rulenum可以是规则的号码或是一条要比对的规则。
    -L,--list
    列出所选择的chain中的所有规则,如果没有指定chain,则会列出所有chain中的规则。
    -F,--flush
    清除所选择的chain。这跟一条一条删除所有的规则是同样的作用。
    -Z,--zero
    将数据包书及数据包大小计数器归零。
    -N,--newchain
    新增一个用户定义的chain。
    -X,--delete-chain
    删除指定的用户定义的chain。未指定的话,则删除所有用户定义的chain。
    以下是ipchains用来设定比较成功后的处理动作的用法:
    ipchains -P chain target [options]
    -P,--policy
    设定chain中比对成功的接着要做的处理。这些处理可以是ACCEPT,DENY,REJECT,MASQ,REDIRECT或RETURN这几个特殊的值或是另外一个用户定义的chain。ACCEPT指的是让数据包通过。DENY是丢弃数据包。REJECT跟DENY一样会把数据包丢弃。但是会送一个ICMP信息给来源告知数据包已被丢弃。MASQ是只对传送这个动作和用户定义的chain有效的处理,必须在内核加上CONFIG_IP_MASQUERADE的选项后再编译才能使用这个选项。使用这个处理,数据包就会被伪装成为由本机所送出的数据包,而且送出以后对方回复的数据包也会被自动反向处理送回本来的机器。REDIRECT只能用在输入及用户定义的chain中,要使用这个选项,必须先在内核中加上CONFIG_IP_TRANSPARENT_PROXY这个选项再编译后才能使用。使用这个处理法则,数据包会被转向到本地端的socket,即使这些数据包是要被送到远端去。如果指定要转向的端口是0(预设值),代表数据包的目的端口就是要转向的端口。如果一个用户定义的chain的检查到了尾端了或是得到的处理是RETURN,则会返回到呼叫这个chain的前一个chain的下一条规则继续比对。如果比对到了内建的chain的尾端或是在内建的chain中得到的是RETURN的处理,则会执行这个预设chain的处理方式。
    以下ipchains的用法是跟IP Maspuerade有关的:
    ipchains -M [-L|-S][options]
    -M,--masquerading
    这个参数加上-L可以用来查看目前使用masquerading方式的连线。加-S参数可用来调整核心masquerading的参数。
    -S,-set tcp tcpfin udp
    改变masquerading使用的timeout值。

    使用Ipchains架设防火墙的范例及注意事项

    在ipchains中,每条规则代表的是数据包所要符合的一组条件,以及当符合这组条件时要做的处理。因此,举个简单的例子,如果说你想拒绝所有从网络地址127.0.0.1(即本机地址)传过来的属于ICMP这种类型的数据包时,你可以这样做:
    $ipchains -A input -s 127.0.0.1 -p icmp -j DENY
    在这条规则里,数据包要符合的条件就是⑴它要是属于ICMP类型的数据包;⑵它要来自127.0.0.1。而符合条件后要做的事就是拒绝(DENY)。
    在设定ipchains防火墙时通常只会用到像上面例子的ipchains -A这样的加入规则的动作,以为一般是在开机时设定好了规则就不会再变动了。如果在使用过程中为了测试或是其他原因,你可能会用到删除规则这个动作。删除规则一般有两种方式,第一种是指定规则号码,像下例:
    $ipchains -D input 1
    会从input这组chains中删除编号为1的规则。要查看规则的号码,可以用ipchains -L来查看。
    而另一种删除规则的方法,就是键入完整的规则,像下例:
    $ipchains -D input -s 127.0.0.1 -p icmp -j DENY
    这样就可以删掉上面我们加入的规则。
    在TCP类型的连线上我们可能会常常想要限制只让单一方向的连线,比如说想要让自己的机器可以连线到其他的WWW服务器,但不让其他机器连过来。这时就要限制对方的SYN数据包(这种数据包是用来要求打开连线的),像下例:
    $ipchains -A input -p TCP -s 200.200.200.200 -y -j DENY
    就会拒绝从200.200.200.200这台机器过来要求作TCP连线的动作。
    底下是更多的例子:
    $ipchains -A output -d 200.200.207.0 / 24 -j REJECT
    $ipchains -A output -d 200.200.208.0 / 24 -j REJECT
    不让我的机器连到200.200.207.*和200.200.208.*这两个网络。
    $ipchains -N ppp-out
    $ipchains -A output -i ppp0 -j ppp-out
    建立一组新的chains,把所有使用ppp0传出的数据包都要比对这组ppp-out里的规则。
    $ipchains -A ppp-out -p TCP -d proxy.virtual.net 80 -t 0x01 0x10
    $ipchains -A ppp-out -p TCP -d 0.0.0.0 telnet -t 0x01 0x10
    这可以设定连线到proxy.virtual.net的WWW及telnet有最小的延迟。
    $ipchains -N ppp-in
    $ipchains -A input -i ppp0 -j ppp-in
    再建立一组新的chains,把所有使用ppp0传进的数据包都要比对这组ppp-in里的规则。
    $ipchains -A ppp-in -s 200.200.200.0 / 24 -l -j DENY
    所有从200.200.200.0过来的数据包都拒绝并做记录。
    $ipchains -A input -i lo -j ACCEPT
    允许所有从自己机器连到自己机器的连线。
    $ipchains -P input DENY
    最后拒绝所有从外面来的连线。
    需要注意的是规则的顺序很重要,因为数据包是从第一个开始比对起,所以通常我们会先设定准许的连线,然后在最后一个规则设定拒绝所有其他的连线。
    发布人:netbull 来自:奥索网