CentOS Linux iptables命令整理

iptables是Linux上常用的防火墙软件,命令较复杂,功能也十分强大。用于转发过滤数据包。

1、防火墙的作用:
A.分割信任区域 or 不信任区域
B.限定可以提供外网访问的服务
C.分析可以接受 or 拒绝接受的封包
D.NAT功能-地址转换与端口重定向

2、组成部分:
2.1 三个表:
filter 与本机相关,用来过滤数据包
nat 仅用于NAT,转换数据包的源或目标地址
mangle 与特殊的封包的路由旗标相关

2.2 五个链:
PREROUTING 路由前判断
POSTROUTING 路由后判断
FORWARD 穿越防火墙时的包过滤判断
INPUT 进入本机时判断
OUTPUT 从本机出去时判断

2.3 包含关系:
filter–INPUT + OUTPUT + FORWARD
nat–PREROUTING + POSTROUTING + OUTPUT
mangle–所有的链

3、语法:
iptables [-t tables] command [match] [target]
-t tables:指定 iptables 表,若不指定,默认为filter表。
command:命令选项。
match:规则选项。
target:动作选项。

4、命令

命令 说明
-A,–append 在所选择的链末添加规则。
-D,–delete 从链中删除规则。
-I,–insert 根据给出的序号插入规则,默认向顶部插入规则。
-R,–replace 在所选中的链里指定的行上替换规则。
-L,–list 显示所选链的所有规则。如果没有指定链,则显示指定表中的所有链。
-F,–flush 清空所选的链。如果没有指定链,则清空指定表中的所有链。
-Z,–zero 把指定链(如未指定,则认为是所有链)的所有计数器归零。
-N,–new 创建一个新的用户自定义链。
-X,–delete-chain 删除一个用户自定义链。
-P,–policy 定义链的默target,这里的target只能是DROP和ACCEPT。
-E,–rename-chain 对自定义的链进行重命名。

5、规则
把它们归为五类。第一类是generic matches(通用的匹配),适用于所有的规则;第二类是TCP matches,顾名思义,这只能用于TCP包;第三类是UDP matches,当然它只能用在UDP包上了;第四类是ICMP matches ,针对ICMP包的;第五类比较特殊,针对的是状态(state),所有者(owner)和访问的频率限制(limit)等,它们已经被分到更多的小类当中,尽管它们并不是完全不同的。

通用规则

命令 说明
-p,–protocol 匹配协义类型。可以是协义名称(不分大小写),也可以是相应整数值,必需在/etc/protocols中定义,缺省设置为ALL。可以在协义前加英文感叹号取反。
-s,,–src,–source 匹配源地址。单个地址:192.168.1.1 192.168.1.1/24;多个地址:192.168.1.0/24 192.168.1.0/255.255.255.0;在地址前加英文感叹号表示取反,注意空格:-s ! 192.168.1.0/24; 缺省是匹配所有地址。
-d,–dst,–destination 匹配目标地址。语法和-s完全一样。
-i,–in-interface 以包进入本地所使用的网络接口匹配包。要注意这个匹配操作只能用于INPUT,FORWARD,PREROUTING这三个链。感叹号表示取反,-i ! eth0。
-o,–out-interface 以包离开本地所使用的网络接口来匹配包。语法和-i完全一样。
-f,–fragment 用来匹配一个被分片的包的第二个片或及以后的部分。因为它们不包含源或目的地址,或ICMP类型等信息,因此其它规则无法匹配到它,所以才有这个匹配操作。要注意碎片攻击哦。这个操作也可以加英文感叹号表示取反,但要注意位置,如 ! -f。取反时,表示只能匹配到没有分片的包或者是被分片的包的第一个碎片,其后的片都不行。现在内核有完善碎片功能,可以防止碎片攻击,所以不必使用取反的功能来防止碎片通过。如果你使用连接跟踪,是不会看到任何碎片的,因为在它们到达任何链之前就被处理过了。

TCP规则
用于匹配TCP数据包,必需有-p tcp作为前提条件

命令 说明
–sport,–source-port 基于TCP包的源端口来匹配包,不指定端口认为是全部端口。可以使用端口号或者服务名匹配,使用服务名时必需在/etc/servers中定义。可以使用连续的端口-sport 22:80,表示从22到80所有端口。使用连续端口时省略首位端口号时默认是0,如:-sport :80表示从0到80的所有端口,使用连续端口时省略末位端口时,默认是65535,如-sport 22:表示从22到65535的所有端口。在端口号前面加英文感叹号表示取反。
–dport,–destination-port 基于TCP包的目的端口来匹配包。语法和-sport完全一样。
–tcp-flags 匹配指定的TCP标记。有两个参数,它们都是列表,列表内部用英文逗号隔开,这两个列表之间用空格分开。第一个参数指定我们要检查的标记,第二个参数指定在第一个参数中设为1的标记(即状态是打开的标记),且其它标记值为0。这个匹配操作可以识别以下标记:SYN、ACK、FIN、RST、URG、PSH,另外还有两个词也可以使用就是ALL和NONE。ALL是指选定所有标记,NONE是不选定任何标记。-tcp-flags也可以使用英文感叹号取反值,如:-tcp-flags ! SYN,FIN,ACK SYN表示匹配FIN和ACK标记被设置而SYN标记没有设置的TCP包。
–syn 这是ipchains时代的遗留物,和–tcp-flags SYN,RST,ACK SYN的作用完作一样。也可以使用英文感叹号,如:! -syn用来匹配状态为已建立的连接包。
–tcp-option 根据匹配包。TCP选项是TCP头中的特殊部分,有三个不同的部分。第一个8位组表示选项的类型,第二个8位组表示选项的长度(这个长度是整个选项的长度,但不包含填充部分所占的字节,而且要注意不是每个TCP选项都有这一部分的),第三部分当然就是选项的内容了。和TCP数据包格式有关。

UDP规则
用于匹配UDP数据包,必需有-p udp作为前提条件

命令 说明
–sport,–source-port 基于UDP的源端口匹配包,语法同-p tcp -sport完全一样。
–dport,–destination-port 基于UDP的目的端口匹配包,语法同上。

ICMP规则
用于匹配ICMP数据包,必需有-p icmp作为前提条件

–icmp-type 根据ICMP类型匹配包,类型的指定可以使用十进制数值和相应的名字。数值在RFC792中有定义,名字可以用iptables -p ICMP –help查看。这个选项也可以用英文感叹号取反。

高级规则
高级规则,要用-m装载扩展模块,平时用的不多。就不说了额。

动作规则
决定符合条件的包到何处去,语法是–jump target或-j target

-j ACCEPT 对符合规则的包允许通过。
-j DROP 对符合规则的包丢弃动作。
-j REJECT 拒绝数据包,并返回错误信息。只能用于INPUT、FORWARD、OUTPUT链中。
-reject-with告诉REJECT target应向发送者反回什么样的信息。可用的信息类型可以man一下。
-j DNAT 目的地址转换。DNAT只能应用于nat表的PREROUTING和OUTPUT中。
-to-destination 指定要写入的IP头的地址。可以使用这几种方式:1、单个IP;2、连续地址192.168.1.1-192.168.1.10,这种情况下每个流就会被随机分配一个要转发的地址,但同一个流总是使用同一个地址。3、我们还可以在地址后面指定端口或端口范围,如:192.168.1.1:80或192.168.1.1:80-100,要注意只有选用-p指定协议后,才能使用。
-j SNAT 源地址转换。只能应用于nat表的POSTROUTING中。-to-source 指定要转换的源地址和端口。
-j MASQUERADE 这个动作和SNAT的作用是一样的,区别就是它不需要指定源地址。MASQUERADE被设计用于那些动态获取IP地址的连接的,比如拨号上网。MASQUERADE和SNAT一样,只能应用于nat表的POSTROUTING中。
-to-ports 在指定协义的前提下,设置外出包能使用的端口。例:-to-ports 1025或–to-ports 1024-1050。
-j LOG 记录包的有关信息,这个功能是通过内核的日志工具完成的,需要开启syslogd服务。
-log-level 记录等级设置,记录等级详细信息可以查看文件/etc/syslog.conf。
-log-prefix 在记录信息之前加上指定的前缀。如:–log-prefix “INPUT packets”
-log-tcp-sequence 把包的TCP序列号和其它日志信息一起记录下来。
-log-tcp-options 记录TCP包头中的字段大小不变的选项。
-log-ip-options 记录IP包头中的字段大小不变的选项。
-j MARK 用来设置mark值,这个值只能在本地的mangle表里使用,不能用在其它任何地方。
-set-mark 设置mark值,这个值是一个无符号的整数。
-j MIRROR 颠倒IP头中的源地址和目的地址,然后转发包。这个动作只能应就于INPUT、FORWARD、PREROUTING链和被它们调用的自定义链中,如果外出的包是因MIRROR target发出的,则它们是不会被filter、net、mangle表内的链处理的。
-j QUEUE 这个target为用户空间的程序或应用软件管理包队列。它是和iptables之外的程序或工具协同使用的,包括网络计数工具,高级的数据包代理或过滤应用,等等。
-j REDIRECT 在防火墙所在的机子内部转发包或流到另一端口。换包话说,这个target把要转发的包的目的地址改写为我们自已机子的IP。我们在做透明代理时,这个target可是起了很大作用的。
-to-ports 在指定协义前提下,定义目的端口。不使用这个选项,目的端口不会被改变。指定一个端口,如-to-ports 8080。指定端口范围,如-to-ports 8080-8090。
-j RETURN 若包在子链中遇到了RETURN target,则返回父链的下一条继续进行条件的比较。
-j TOS TOS是用来设置IP头中的Type of Service字段的。这个target只能应用于mangle表内使用。
-set-tos设置TOS的值。
-j TTL 修改IP头中的Time To Live字段的值。只能用于mangle表中。
-ttl-set设置TTL值。
-ttl-dec设定TTL要被减掉的值。
-ttl-inc设定TTL要被增加的值。
-ULOG 可以在用户空间记录被匹配的包信息,这些信息和整个包都会通过netlink socket被多播。然后一个或多个用户空间的进程就会接受它们。我们可以在ULOGD project page里面找ULOGD用户空间的软件。
-ulog-nlgroup指定向哪个netlink组发送包。
-ulog-prefix指定记录信息的前缀。
-ulog-cprange指定每个包要向“ULOG在用户空间的代理”发送的字节数。
-ulog-qthreshold表示先在内核里积聚多个少包,再把它们发送到用户空间里。

这么多规则看的人都晕了。。。

看几个例子:
1)iptables -A INPUT -p tcp –dport 80 -j ACCEPT
允许访问80端口

2)iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT –to-source 184.22.201.112
将本地源地址是192.168.0网段的数据包经过路由之后(知道目的地是哪里了),离开本地之前做源地址转换,转换成184.22.201.112,用于PPTP VPN。

3)iptables –table nat –append POSTROUTING –jump MASQUERADE
将本地发出的数据包经过路由之后(知道目的地是哪里了),离开本地之前做源地址转换,和SNAT的区别是MASQUERADE(伪装)是自动获得要转换的地址,不用–to-source指定,用于L2TP VPN。好奇为什么PPTP VPN用MASQUERADE不行呢?可能是因为PPTP传输层上使用的是TCP协议,L2TP用的是UDP协议?不清楚啊= =。

4)iptables -A INPUT -p icmp –icmp-type 8 -s 0/0 -j DROP
将进入的所有ICMP数据包丢弃。禁止ping。

参考资料:
http://linux.gov.cn/netweb/iptables_guide.htm
http://blog.sina.com.cn/s/blog_62769ecf0100fto2.html
http://www.itwhy.org/linux/network/864.html