精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>电脑技术>>● Linux>>有待整理文章>>ipchains参数介绍

主题:ipchains参数介绍
发信人: r_hayes(Hayes)
整理人: qiaoqian(2002-05-13 06:53:33), 站内信件
Ipchains 被用来安装、维护、检查Linux内核的防火墙规则。规则可以分成四类:IP input链、IP output链、IP forward链、user defined 链。 

  一个防火墙规则指定包的格式和目标。当一个包进来时, 核心使用input链来决定它的命运。 如果它通过了, 那么核心将决定包下一步该发往何处(这一步叫路由)。假如它是送往另一台机器的, 核心就运用forward链。如果不匹配,进入目标值所指定的下一条链,那有可能是一条user defined链,或者是一个特定值: ACCEPT,DENY,REJECT,MASQ,REDIRECT,RETURN。 
  ACCEPT意味着允许包通过,DENY 扔掉包就象没有受到过一样,REJECT也把包扔掉,但(假如它不是 ICMP 包)产生一个 ICMP 回复来告诉发包者,目的地址无法到达(请注意DENY和REJECT对于ICMP包是一样的)。 
  MASQ 告诉核心伪装此包,它只对forward 链和user defined链起作用,想让它起作用, 编译核心时必需让 IP Masquerading 起作用。 
  REDIRECT只对input链和user defined链起作用。它告诉核心把无论应送到何处的包改送到一个本地端口. 只有 TCP 和 UDP 协议可以使用此指定. 任意用 '-j REDIRECT' 指定一个端口(名字或编号)可以使送往此的包被重定向到某个特殊的端口, 即使它被标记为送到其它端口。想让它起作用,编译内核时,必须让CONFIG_IP_TRANSPARENT_PROXY起作用。 
  最后的一个目标指定是 RETURN, 它跳过它下面的所有规则, 直到链的末尾。 
  任何其它的目标指定表示一个用户自定义的链。包将在那个链中通过. 假如那个链没有决定此包的命运, 那么在那个链中的传输就完成了,包将通过当前链的下一个规则。 


参数说明: 

-A :--append 
在所选链的链尾加入一个或多个规则。有时一个单命令行能影响多个规则. 有两种做法. 第一, 假如你设置一个能解析为多个 IP 地址(使用 DNS)的主机名, ipchains 将如同你对多个地址都设置了命令一样发生作用。假如主机名'www.foo.com'解析为三个 IP 地址, 主机名'www.bar.com'解析为两个 IP 地址, 那么命令 'ipchains -A input -j reject -s www.bar.com -d www.foo.com' 将在 input 链中追加6条规则。-D (-I, -R) 的语法与 -A 完全相同. 当在一个链中有多个相同的规则时, 只有第一个被删除。 

-D,--delete 
从所选链中删除一或多条规则。我们可以用两钟方法中的任何一钟删除此规则. 首先如果我们知道它是链中的唯一规则, 我们可以使用编号删除, 输入: 

# ipchains -D input 1 

来删除进入链的编号1规则。第二条路是 -A 命令的镜象, 但是用 -D 代替 -A. 当你不愿意去数繁多的规则时, 这是一个有用的方法. 这种情况下, 我们使用: 
# ipchains -D input -s 127.0.0.1 -p icmp -j DENY 

-R, --replace 
在所选链中替换一条规则,如果源和目标目标名解析到多个地址,命令将失败。 

-I, --insert 
以给出的规则号在所选链中插入一条或多条规则。如果规则号是1,插入的规则在链的头部。 

-L, --list 
列出指定链的所有规则。如果没有指定链,将列出所有链的规则。-L有三个可选项. '-n'(数值)项非常有用, 它阻止 ipchains 去查找 IP 地址, 假如你的DNS没有正确设置, 或你已经过滤掉了 DNS 请求, 这将造成很大延时。 它还会导致端口用数字而不是名字被显示出来。’-v’选项显示规则的所有详细信息,如包和字节计数器,TOS 掩码, 接口, 和包标记. 用其它的方法这些项都会被忽略。 

-F, --flush 
使用'-F'命令可以清除一个链中的所有规则。 
# ipchains -F forward 
假如你不指定链, 那么所有链都将被清空。 

-Z, --zero 
重置计数器。但有时你想在重置计数器前知道它们的值。你可以同时使用 '-L' 和 '-Z' 命令, 读计数器的同时重置它们。不幸的是, 假如你这样做, 你不能只操作一个链, 你不得不列表和清零所有的链。 

-N, --new-chain 
以给定的名字创建一条新的user defined链。不能与已有链同名。 

-X, --delete-chain 
删除链必须满足两个条件: 它们是空的,并且不是任何规则的目标. 但你不能删除3个内置链中的任何一个。 

-P, --policy 
改变内置链政策。 

-M, --masquerading 
允许观察当前IP伪装的连接(与-L一起)。或者设置内核IP 伪装的参数(与 –S 一起)。 

-S, --set tcp tcpfin udp 
设置伪装的超时值,'-S' 后跟三个以秒表示的超时值: TCP sessions, FIN 包到后的 TCP sessions, 和对于 UDP 包的。假如你不想改变这些值, 给个 '0' 值即可。 
默认值在 '/usr/include/net/ip_masp.h' 文件中, 目前分别是 15分, 2分和 5分。仅允许和 -M 一起使用。 

-C, -- check 
有时你想知道一个确定的包进入机器后会发生什么事情, 比如调试防火链时。ipchains 的 '-C' 命令提供与核心检查真实包完全相同的程序来让你做这件事。 
你可以指定让哪个链来检测包, 把链的名字放在 '-C' 参数后即可。鉴于核心总是从 input, output 或 forward 链开始, 特许你从需要测试的链开始。 
包的细节用与设置防火墙规则相同的语法设定。 在个别时, 包的协议('-p'), 源地址('-s'), 目的地址('-d'), 和接口('-i') 必须有。假如协议是 TCP 或 UDP, 那么必须指定一个源地址和一个目的端口, 对于 ICMP 协议必须指定类型和代码。(除非使用了 '-f' 标志指定了一个片段规则, 在那种情况下这些选项是不合法的). 
假如协议是 TCP (并且没有 '-f' 标志), 可以使用 '-y' 标志设置包的 SYN 位。 
这有一个例子, 测试一个 TCP SYN 包, 它从 192.168.1.1 端口 60000 到 192.168.1.2 www 端口, 进入 eth0 接口, 进入 'input' 链. (这是一个与 WWW 建立连接的典型例子) 
# ipchains -C input -p tcp -y -i eth0 -s 192.168.1.1 60000 -d 192.168.1.2 www 
packet accepted 


-h, --help 
帮助。 

-p, --protocol[!] protocol 
用 '-p' 来指定协议。协议可以用编号(假如你知道 IP 的数字化协议值)或名字'TCP', 'UDP', 'ICMP',’ALL’(0等价与ALL),大小写无关, 'tcp' 与 'TCP' 一样。协议名前面可以加前缀 '!',来否定它,比如: ' -p ! TCP'。 

-s, --source [!] address[/mask] [!][port[:port]] 
有四种方法指定源头(-s)和目的(-d) IP 地址。最常用的方法是使用全称,比如 'localhost' 或 'www.linuxhq.com'。第二种方法是指定 IP 地址,如 '127.0.0.1'。第三种和第四种方法是指定 IP 地址集, 比如 '199.95.207.0/24' '199.95.207.0/255.255.255.0'。这两种方式都指定了从 192.95.207.0 到 192.95.207.255 的所有 IP 地址;'/'后的数字表示 IP 地址的哪部分(或'位')被指定。默认是 '/32' 或 '255.255.255.255' (与所有 IP 地址匹配)。完全指定所有 IP 地址用'/0'。对于特殊的 TCP 和 UDP 协议, 还有额外的参数可以指定,即它们的端口号或端口的范围。范围用 ':' 表示,比如 '6000:6010',它包含从6000到6010的11个端口,如果没有下限,默认是0。如果没有上限,默认是 65535。 所以指定1024以下端口来的 TCP 连接,表示为 '-p TCP -s 0.0.0.0/0 :1023'。 端口号也可以用名字指定,如 'WWW'。端口指定也可以用'!'参数来否定它。ICMP 也可以有参数,但是它没有端口(ICMP 有类型和代码),它们有不同的含义。可以在'-s'参数后放它们的 ICMP 名字来指定(使用 ipchains -h icmp 来列出这些名字)。或使用 ICMP 类型和代码的数字编号。类型跟在 '-s' 后。代码跟在 '-d' 后。ICMP 名相当长: 你只需输入足够长的字母能区分它们即可。 
注意:目前, ICMP 名的前面不能用'!'。等价于--src。 

--source-port [!] [port[:port]] 
用来分开源端口范围,等价与—sport。 

-d,--destination [!] address[/mask] [!] [port[:port]] 
指定目标,用法与-s相同。等价于—dst。 

--destination-port [!] [port[:port]] 
指定目标端口范围,等价于—dport。 

--icmp-type [!] typename 
允许指定icmp类型(使用 –h icmp 看有效的icmp类型名)。可以方便的在指定目标的后面使用。 

-j, --jump target 
指向规则的目标,例如,包匹配规则后怎么办。目标可以是一个user defined 链(非本规则所在链),也可以是一个可以立即决定包命运的特定的目标。最简单的情况是不指定目标。这种类型的规则(通常叫记数规则)常用来做某种类型包的简单记数。无论规则匹配与否, 核心将继续检查此链中的下一个的规则。但规则计数器将增加。 

-i, --interface [!] name 
用 '-i' 参数指定接口名字。接口是包进进出出的物理设备。用于包进入(包通过进入链 )的接口被认为是进入接口, 同样地, 用于包外出(包通过外出链)的接口被认为是外出接口. 用于包中转的接口也被认为是外出接口。 
指定一个目前不存在的接口是完全合法的。规则直到此接口工作时才起作用,这种指定是非常有用,对于 PPP 及其类似的连接。作为一个特例, 一个结尾是'+'的接口将适合所有此类接口(无论它们是否工作)。例如:设定一个规则适合所有的 PPP 连接, 可以用 -i ppp+ 来指定接口。此参数忽略时,默认符合所有接口。接口可以使用否定符'!'来匹配不是指定接口来的包。 

[!] -f, --fragment 
此规则指定fragmented packets的第二个和以后的分块。因为这样的分块没有源和目标端口信息(或 ICMP 类型),所以它不匹配一些指定它的规则。 
可以在它前面使用'!',来指定一个不适用于第二个及其后续的片段包的规则。 

-b, --bidirectional 
双向模式。这个标志使 ipchains 象你输入命令两次一样工作,第二次是把 '-s' 和 '-d' 参数颠倒。 

-v, --verbose 
详细输出。它显示出对于你的命令, ipchains 是如何响应的. 假如你使用的命令可以影响多个规则, 它是很有用的。 

-n, --numeric 
数字化输出。IP地址和端口号将以数字格式显示。缺省显示主机名和网络名,和服务名。当DNS不起作用时,此参数及其有用。 

-l, --log 
对匹配包实行内核纪录,当设置此参数时,Linux内核将通过printk()对于所有匹配包打印一些信息。 

-o, --output [maxsize] 
拷贝匹配的包到用户空间设备。主要由开发者使用。要使用此参数,编译内核时必须设置 CONFIG_IP_FIREWALL_NETLINK Set。 

-m, --mark markvalue 
标志匹配的包。包被一个32位的无符号整数标志。如果你不是一个内核黑客,你不必关心这些。如果标志值以 ‘+’ 或 ‘-‘开头,那么这个值将会从当前包的标志值加或减(初始值为0)。 

-t, --TOS and xormask 
用于改变IP头的TOS域。当包匹配规则,它的TOS域首先与第一个掩码逐位相与,结果再与第二个掩码逐位异或,掩码将会被指定为8位16进制数。TOS的最低有效位必须没有被改变。TOS域的四个位是最小延时"Minimum Delay", 最大吞吐量"Maximum Throughput", 最大可靠程度"Maximum Reliability"和最小费用"Minimum Cost"。最常用的是把 telnet 和 ftp 的控制连接设为最小延时和把 FTP 数据设为最大吞吐量. 这样做: 

ipchains -A output -p tcp -d 0.0.0.0/0 telnet -t 0x01 0x10 
ipchains -A output -p tcp -d 0.0.0.0/0 ftp -t 0x01 0x10 
ipchains -A output -p tcp -s 0.0.0.0/0 ftp-data -t 0x01 0x08 

如果这些太难理解, 使用下表: 

TOS Name Value Typical Uses 

Minimum Delay 0x01 0x10 ftp, telnet 
Maximum Throughput 0x01 0x08 ftp-data 
Maximum Reliability 0x01 0x04 snmp 
Minimum Cost 0x01 0x02 nntp 

-x, --exact 
展开数字,包和字节计数器显示时使用后缀 'K', 'M', 'G' 来表示1000 1,000,000 和 1,000,000,000。不管数值多大, 使用 '-x' 标志可以完全显示它们。这个参数只可以在 –L 后使用。 

[!] –y, --syn 
仅仅匹配设置了SYN位,清除了ACK、FIN位的的TCP包。这些包被用来请求初始化的TCP连接,阻止从接口来的这样的包将会阻止外来的TCP连接请求。但输出的TCP连接请求将不受影响。这个参数仅仅当协议类型设置为TCP时才能使用。此参数前可以使用!标志匹配所有的非请求连接的包。 

--line-numbers 
在使用列表规则时,在每行开头加行号,表示规则在链中的位置。 
--no-warnings 
去掉所有的警告信息。 



----

                    灌灌 
                    灌灌 
                    灌灌 
                    灌灌          灌灌 
                    灌灌      灌灌灌 
    灌灌灌灌灌灌灌  灌灌  灌灌灌 
      灌灌灌灌灌灌灌灌灌灌灌灌 
                灌灌灌灌灌灌 
               灌灌灌灌灌灌灌  
              灌灌  灌灌  灌灌 
             灌灌   灌灌    灌灌 
            灌灌    灌灌      灌灌 
          灌灌      灌灌      灌灌灌 
          灌灌      灌灌        灌灌灌灌 
        灌灌        灌灌        灌灌灌灌灌 
      灌灌          灌灌          灌灌灌灌灌  
    灌灌            灌灌            灌灌 
                灌灌灌灌 
                  灌灌灌 
                    灌    

[关闭][返回]