Iptable

iptables [-t table] [COMMAND] [chain] [CONDITION] [-j ACTION]

iptables [-t 表名] [命令选项][链名条件匹配] [-j 目标动作或跳转]

1
2
3
4
5
6
7
8
9
10
-t table   是指'操作的表',filter、nat、mangle或raw,'默认使用filter'

COMMAND '子命令',定义'对规则的管理',PREROUTING、POSTROUTING、OUTPUT

chain 指明'链路'

CONDITION 匹配的'条件或标准',用于指定对符合什么样 条件的数据包进行处理;

ACTION 匹配后'操作动作',用于指定数据包的处理方式(比如允许通过、拒绝、丢弃、跳转(Jump)给其它链处理。

-t table

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#----------------------------
规则表:
1)filter表——三个链:INPUT、FORWARD、OUTPUT
作用:过滤数据包 内核模块:iptables_filter.
2)Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT
作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat
3)Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle(别看这个表这么麻烦,
咱们设置策略时几乎都不会用到它)
4)Raw表——两个链:OUTPUT、PREROUTING
#-----------------------------
规则链:
1)INPUT——进来的数据包应用此规则链中的策略
2)OUTPUT——外出的数据包应用此规则链中的策略
3)FORWARD——转发数据包时应用此规则链中的策略
4)PREROUTING——对数据包作路由选择前应用此链中的规则
(记住!所有的数据包进来的时侯都先由这个链处理)
5)POSTROUTING——对数据包作路由选择后应用此链中的规则
(所有的数据包出来的时侯都先由这个链处理)

iptables命令的管理控制选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-A 在指定链的末尾添加(append)一条新的规则
-D 删除(delete)指定链中的某一条规则,可以按规则序号和内容删除
-I 在指定链中插入(insert)一条新的规则,默认在第一行添加
-R 修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换
-L 列出(list)指定链中所有的规则进行查看(默认是filter表,如果列出nat表的规则需要添加-t,即iptables -t nat -L)
-E 重命名用户定义的链,不改变链本身
-F 清空(flush)
-N 新建(new-chain)一条用户自己定义的规则链
-X 删除指定表中用户自定义的规则链(delete-chain)
-P 设置指定链的默认策略(policy)
-Z 将所有表的所有链的字节和数据包计数器清零
-n 使用数字形式(numeric)显示输出结果
-v 查看规则表详细信息(verbose)的信息
-V 查看版本(version)
-h 获取帮助(help)

在iptables中,’-j 参数’用来指定要’进行的处理动作’

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
常用的'处理动作'包括:
'ACCEPT'、接受
'REJECT'、明示拒绝
'DROP'、悄悄丢弃
'REDIRECT'、重定向:主要用于实现端口重定向
'MASQUERADE'、源地址伪装
'LOG'
'DNAT'
'SNAT'
'MIRROR'
'QUEUE'
'RETURN'
'MARK'

'一条链上有多个规则' --> '如果先匹配,后面的规则就不再处理' --> '跳转到下一个链条'

用到的命令

iptables [-t 表名] [命令选项] [链名][条件匹配][-j 目标动作或跳转]

iptables [] [-A] [INPUT] [] [-j NFQUEUE –queue-num 1] # -t table 默认为:filter

参数

iptables [-t nat] [-A] [PREROUTING] [-d host -p tcp –dport dport] [-j DNAT –to-destination dest]

iptables [-t nat] [-D] [POSTROUTING] [-d deshost -p tcp –dport desport] [-j SNAT –to host ]

Info

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# 命令选项
-A 在指定链的末尾添加(append)一条新的规则
-D 删除(delete)指定链中的某一条规则,可以按规则序号和内容删除
# 链名
PREROUTING——对数据包作路由选择前应用此链中的规则(记住!所有的数据包进来的时侯都先由这个链处理)
POSTROUTING——对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)
# 条件匹配
1、Match:-d, --dst, --destination
Examp:iptables -A INPUT 【-d 192.168.1.1
Exp:以IP目的地址匹配包。地址的形式和 -- source完全一样。
2、Match:-p, --protocol
Examp:iptables -A INPUT 【-p tcp】
Exp:匹配指定的协议。指定协议的形式有以下几种:
1、名字,不分大小写,但必须是在/etc/protocols中定义的。
2、可以使用它们相应的整数值。例如,ICMP的值是1,TCP是6,UDP是17
3、缺省设置,ALL,相应数值是0,但要注意这只代表匹配TCP、UDP、ICMP,而不是/etc/protocols中定义的所有协议。
4、可以是协议列表,以英文逗号为分隔符,如:udp,tcp
5、可以在协议前加英文的感叹号表示取反,注意有空格,如: --protocol ! tcp 表示非tcp协议,也就是UDP和ICMP。可以看出这个取反的范围只是TCP、UDP和ICMP。
3、Matc:--dport, --destination-port
Examp:iptables -A INPUT -p tcp 【--dport 22
Exp:基于TCP包的目的端口来匹配包,端口的指定形式和--sport完全一样。
# 目标动作
1、Option:--to-destination
Examp: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
Exp:
指定要写入IP头的地址,这也是包要被转发到的地方。上面的例子就是把所有发往地址15.45.23.67的包都转发到一段LAN使用的
私有地址中,即192.168.1.1192.168.1.10。如前所述,在这种情况下,每个流都会被随机分配一个要转发到的地址,但同一
个流总是使用同一个地址。我们也可以只指定一个IP地址作为参数,这样所有的包都被转发到同一台机子。我们还可以在地址后指
定一个或一个范围的端口。比如:--to-destination 192.168.1.1:80或 --to-destination 192.168.1.1:80-100。SNAT的语
法和这个target的一样,只是目的不同罢了。要注意,只有先用--protocol指定了TCP或 UDP协议,才能使用端口。
2、Option:--to-source
Examp:iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT 【--to-source 194.236.50.155-194.236.50.160:1024-32000
Exp:
指定源地址和端口,有以下几种方式:
1、单独的地址。
2、一段连续的地址,用连字符分隔,如194.236.50.155-194.236.50.160,这样可以实现负载平衡。每个流会被随机分配一个IP,但对于同一个流使用的是同一个IP。
3、在指定-p tcp 或 -p udp的前提下,可以指定源端口的范围,如194.236.50.155:1024-32000,这样包的源端口就被限制在1024-32000了。
注意,如果可能,iptables总是想避免任何的端口变更,换句话说,它总是尽力使用建立连接时所用的端口。但是如果两台机子使用
相同的源端口,iptables 将会把他们的其中之一映射到另外的一个端口。如果没有指定端口范围, 所有的在512以内的源端口会被
映射到512以内的另一个端口,5121023之间的将会被映射到 1024内,其他的将会被映射到大于或对于1024的端口,也就是说是同
范围映射。还要注意,这种映射和目的端口无关。因此,如果客户想和防火墙外的HTTP服务器联系,它是不会被映射到FTP control所用
的端口的。
#
1、DNAT target
这个target是用来做目的网络地址转换的,就是重写包的目的IP地址。如果一个包被匹配了,那么和它属于同一个流的所有的包都会被自动转换,
然后就可以被路由到正确的主机或网络。DNAT target是非常有用的。比如,你的Web服务器在LAN内部,而且没有可在Internet上使用的真实IP地址,
那就可以使用这个 target让防火墙把所有到它自己HTTP端口的包转发给LAN内部真正的Web服务器。目的地址也可以是一个范围,这样的话,DNAT会为
每一个流随机分配一个地址。因此,我们可以用这个target做某种类型地负载平衡。
注意,DANT target只能用在nat表的PREROUTING和OUTPUT链中,或者是被这两条链调用的链里。但还要注意的是,包含DANT target的链不能被除此之外的
其他链调用,如POSTROUTING。
2、SNAT target
这个target是用来做源网络地址转换的,就是重写包的源IP地址。当我们有几个机子共享一个Internet 连接时,就能用到它了。先在内核里打开ip转发功能,
然后再写一个SNAT规则,就可以把所有从本地网络出去的包的源地址改为Internet连接的地址了。如果我们不这样做而是直接转发本地网的包的话,Internet上的
机子就不知道往哪儿发送应答了,因为在本地网里我们一般使用的是IANA组织专门指定的一段地址,它们是不能在Internet上使用的。SNAT target的作用就是让所
有从本地网出发的包看起来都是从一台机子发出的,这台机子一般就是防火墙。
SNAT只能用在nat表的POSTROUTING链里。只要连接的第一个符合条件的包被SNAT了,那么这个连接的其他所有的包都会自动地被SNAT,而且这个规则还会应用于这个连
接所在流的所有数据包。

1
2
3
4
5
6
7
8
9
10
#、NFQUEUE
iptables除了可以把包转发给特定地址特定端口的监听服务外, 还可以转发到一个叫做NFQUEUE的目标上,
NFQUEUE是
iptables的一种规则目标, 它用于将网络数据包从内核传给用户态进程, 由用户态进程来裁决如何处理该数据包,并将裁决结果返回内核。传输通道为以数字标识的队列。队列由固定长度的链表实现,链表元素为数据包及元数据(kernel skb结构)。
在内核中,Netfilter框架尝试将符合规则的数据包放入队列中。若队列已满,则丢弃该数据包。因此,若用户态进程处理过慢,则会严重影响网络性能。内核与用户态进程之间基于
NFNETLINK通信,数据包需要在内核态与用户态之间进行拷贝,因而这种机制的性能比较差。
iptables -A INPUT -j NFQUEUE --queue-num 0
在包被转发到queue num=0 NFQUEUE队列之后, 某个使用libnetfilter_queue 连接队列0的进程从内核态获取到包的信息,
对包的去向进行裁决. NFQUEUE之后的工作是在用户态完成的, 所以这里也有相应的性能损耗. fqting使用了NFQUEUE对包的内容进行
了混淆, 混淆后的包的参数使之在IDS上重组时产生错位, 重组流不为中间路由所知, 在proxy ip不被封禁的情况下可以绕过封禁内容的防火墙.

清除规则

1
2
3
4
5
# 清除规则
iptables [-t tables] [-F/X/Z]
-F:清除所有已制定的规则
-X:删除所有使用者自定义的 chain(其是 tables)
-Z:将所有的 chain 的计数与流量统计都清零