iptables - IPV4数据包过滤与NAT管理工具
iptables [-t table] -[AD] chain rule-specificat [options]
iptables [-t table] -I chain [rulenum] rule-specification [options]
iptables [-t table] -R chain rulenum rule-specification [options]
iptables [-t table] -D chain rulenum [options]
iptables [-t table] -[LFZ] [chain] [options]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target [options]
iptables [-t table] -E old-chain-name new-chain-name
iptables命令用来设置、管理、查看Linux内核中的IP包过滤规则表。可以定义几个不同的包,每个表包含一定数量的内置chain,也可以包含用户自定义chain。
每条chain包含多条rule,rule中包含与packet的匹配规则,以及如何处理匹配的包。后者称为target,可以是jump到同一个table中的另一条用户自定义的chain。
Target有几个系统内置的特殊值:ACCEPT、DROP、QUEUE、RETURN。
ACCEPT表示让packet通过,继续配置chain中的下一条rule。DROP表示丢弃,QUEUE表示将packet内核空间直接发送到到用户空间。RETURN表示从当前chain返回,从调用当前chain的下一条rule开始继续处理。如果包通过了内置chian的所有rule,或者是在内置chain的某条rule中RETURN,则由这条内置chian中设置的默认规则决定如何处理这个packet。
系统一般有三个独立的table,系统呈现那些表可由内核配置确实。
Tag | Description | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
-t, --table table | |||||||||||||||||||
指定命令操作的table名。
|
iptables从支持的选项可以划分成几个不同的组。
下边的这些选项用于指明iptables命令需要执行的动作。除非特别说明,一条iptables命令中只能包含下述动作中的一个。
Tag | Description | ||
---|---|---|---|
-A, --append chain rule-specification | |||
向chain追加一条或者多条rule。如果rule中的source或者destination代表多个地址时,一条rule会自动展开,每为一个可能的地址都追加一条rule。 |
|||
-D, --delete chain rule-specification -D, --delete chain rulenum |
|||
删除chain中的一条或者多条rule。后边的rule可以通过rule在chain中的编号指定,也可以指定rule的特征值,由系统匹配。 |
|||
-I, --insert chain [rulenum] rule-specification | |||
在chain的指定位置插入一条或者多条rule。如果rulenum没有指定,则将新rule插入到chain的最前头。 |
|||
-R, --replace chain rulenum rule-specification | |||
替换rule。新的rule定义必需明确,它的SOURCE或者destination不可以展开,否则命令会报错。 |
|||
-L, --list [chain] | |||
列出chain内容,如果没有指定具体的chain,则列出table中的所有chain。 例如,列出nat表中的所有chain:
iptables默认会试图将IP地址解析成主机名之类,-n选项的意思是取消DNS的lookups过程,直接显示数字。 另一个常用用的显示命令:
用于显示详细内容,包含rule的统计信息。 |
|||
-F, --flush [chain] | |||
刷新chain,相当于逐个删除chain中的rule。 |
|||
-Z, --zero [chain] | |||
Zero the packet and byte counters in all chains. It is legal to specify the -L, --list (list) option as well, to see the counters immediately before they are cleared. (See above.) 将rule的统计信息归零,可与-L选项同时使用。 |
|||
-N, --new-chain chain | |||
创建用户自定义chain。 | |||
-X, --delete-chain [chain] | |||
删除用户自定义chain。有前提条,首先没有其它chain引用当前要删除的chain,如果有则先解除引用。第二,当前chain中不能包含任何rule,如果有需要先删除。 |
|||
-P, --policy chain target | |||
为chain设置默认target,当chain不知道如何处理某个包时,默认target就会生效。但是默认target不可以是内置的chain,也不可以是用户自定义的chain,只能是系统内置的那几个动作,如ACCEPT、DROP等。 |
|||
-E, --rename-chain old-chain new-chain | |||
重名列chain。 | |||
-h | 帮助。 |
以下参数指定chain中rule的具体内容。
Tag | Description |
---|---|
-p, --protocol [!] protocol | |
设定包有关protocol的匹配规则。可以是tcp、udp、icmap或者全部。可以是protocol的名称,也可以是数字。名称与数字之间的对应关系可以在/etc/protocals文件中查找。"!"表示取反,数字0表示全部协议,是默认值。 |
|
-s, --source [!] address[/mask] | |
数据包源地址匹配规则。可以是一个IP地址,一个网段、主机名,也可以是网络名。注意如果是主机名的话,iptable会通过DNS解析。如果是网段或者网络名,则source会被展开成多个IP地址。 |
|
-d, --destination [!] address[/mask] | |
数据包目标地址,与数据包源地址规则相同。 | |
-j, --jump target | |
如果数据包匹配的话,此选项用于指出如何处理。可以是系统内置的动作,也可以是用户自定义的chain。如果此选项没有指定,则匹配的rule不对数据包做任何处理,但rule的统计信息会更新,如匹配的数据包的个数,字节数等。 |
|
-g, --goto chain | |
此选项表示将匹配的数据包转移到用户自定义chain。jump选项中指定的chain如果发生return,则返回到调用者中继续,此选项则不会。 |
|
-i, --in-interface [!] name | |
interface名称,表示数据包进入本机的设备。可以取反,可以只指定设备名称中的前几个字符,后边追加+号,实现通配。 | |
-o, --out-interface [!] name | |
数据包离开本机的设备,规则与-i选项相同。 | |
[!] -f, --fragment | |
如果数据包很大将会被分片。此选项指出匹配除第一个分片以外的其它分片。如果前边加上“!”号,则只匹配第一个分片。 |
|
-c, --set-counters PKTS BYTES | |
初始化rule关于数据包、字节数统计结果。 |
其它可以使用的额外选项:
Tag | Description |
---|---|
-v, --verbose | |
当调用显示命令时,加上这个选项可显示更加详细的结果。 |
|
-n, --numeric | |
iptables默认会试图将IP地址通过DNS映射成主机名、网络名、服务名等,加上此选项则直接显地址,避免解析过程。 |
|
-x, --exact | |
显示更加精确的统计信息。比如关于字节的统计,会显示多少个字节,而不是M什么的系统自动选报的单位。 | |
--line-numbers | |
显示chain中的rule时添加上行号,这个行号就是rule在chain中的位置。 | |
--modprobe=command | |
当向某个chain添加rule时,可能需要载入特定的模块来支持,此选项用来指定模块名称。 |
iptables能够扩展包的匹配、处理模块,有两种载入这些模块的方法。一个是隐式载入,比如指定了-p选项,后边加上了协议名称,则如果相应的匹配模块还没有载入会自动载入。另一种显式的,通过-m、--match选项后边直接加匹配模块的名称。
不同模块,支持的可用选项不同。可通过-h选项外加模块名称,查看其支持的选项,或者查看官方文档。
以下是基本模块,应该是系统默认就使用的,可通过包名前加"!"禁止掉。
对指定的network/netmask进行流量计数、统计。
本模块根据地址类型匹配数据包,如单播、广播等地址类型。
此模块用于匹配IPsec包中认证头的SPIs。
childlevel
试验型模块。匹配一个包是否属于某个connection或者这个connection的子connection。
comment
给rule添加注释,注释长度有限制。
用于匹配特定文件名中的值是 ’0’ 或者 ’1’.
connbytes
与某个connetcion(单向、双向)已经传输的数据包、字节等统计信息匹配,包括总数,平均等。
主要用来发现那些时间长,传输数据量大的连接,进而可将这些连接禁止或者调整到低优先级。
connlimit
设置单个IP或者地址块对某个服务器IP可同时发起的connection的个数。
connmark
匹配connection包中的netfilter mark字段。
connrate
基于connection的传输速率匹配包,注意connbytes模块是基于历史统计数据,与这个不同。
conntrack
更加详细的连接状态跟踪。
dstlimit
基于目的地址或者目的端口号,限制其传输速率。
esp
匹配IPsec包的ESP头中的SPIs。
匹配某个范围内的IP地址。
ipv4options
匹配IP数据包中Header内的各种字段。
匹配数据包长度。
mac
匹配源、目的端口号,端口号可以是集合。
multiport
匹配源、目的端口号,端口号可以是范围。
匹配网桥设置的出、入端口号。
pkttype
This module matches the link-layer packet type.
匹配链路层包类型。
连接状态跟踪,没有conntrack详细。
tcp
当设置-p tcp时,此模块载入,它是用来匹配tcp数据包头的。
以上是对匹配规则的扩展,下边是对target的扩展。
This allows you to DNAT connections in a round-robin way over a given range of destination addresses.
DNAT中,大多个目的地址之间实现round-robin轮转。
Tag | Description |
---|---|
--to-destination ipaddr-ipaddr | |
Address range to round-robin over. |
实现DNAT的模块,对出包进行转换。此扩展target只能在nat表中使用,并且只能出现在PREROUTING与OUTPUT链中。或者用户自定义链中,并且这种用户自定义链只能由PREROUTING与OUTPUT链引用。
Tag | Description |
---|---|
--to-destination ipaddr[-ipaddr][:port-port] | |
which can specify a single new destination IP address, an inclusive range of IP addresses, and optionally, a port range (which is only valid if the rule also specifies -p tcp or -p udp). If no port range is specified, then the destination port will never be modified. In Kernels up to 2.6.10 you can add several --to-destination options. For those kernels, if you specify more than one destination address, either via an address range or multiple --to-destination options, a simple round-robin (one after another in cycle) load balancing takes place between these addresses. Later Kernels (>= 2.6.11-rc1) don’t have the ability to NAT to multiple ranges anymore.
|
只能在nat表中的POSTROUTING链中使用。如果需要变换的内部地址是静态不变的,则应用使用SNAT。如果需要转换的内部地址是动态的,则使用当前模块。因为设备上的地址是会变化的,本质上实现设备与地址的转换。
Tag | Description |
---|---|
--to-ports port[-port] | |
This specifies a range of source ports to use, overriding the default SNAT source port-selection heuristics (see above). This is only valid if the rule also specifies -p tcp or -p udp. |
对DROP动作的扩展,除了丢弃匹配的包,还向发送者回送一个包以便通知对方。
Tag | Description | |
---|---|---|
--reject-with type | ||
The type given can be
|
||
(*) Using icmp-admin-prohibited with kernels that do not support it will result in a plain DROP instead of REJECT | ||
实现SNAT,只能在nat表中的PSTROUTING链中使用。
Tag | Description |
---|---|
--to-source ipaddr[-ipaddr][:port-port] | |
which can specify a single new source IP address, an inclusive range of IP addresses, and optionally, a port range (which is only valid if the rule also specifies -p tcp or -p udp). If no port range is specified, then source ports below 512 will be mapped to other ports below 512: those between 512 and 1023 inclusive will be mapped to ports below 1024, and other ports will be mapped to 1024 or above. Where possible, no port alteration will occur. In Kernels up to 2.6.10, you can add several --to-source options. For those kernels, if you specify more than one source address, either via an address range or multiple --to-source options, a simple round-robin (one after another in cycle) takes place between these addresses. Later Kernels (>= 2.6.11-rc1) don’t have the ability to NAT to multiple ranges anymore. |