iptables命令主要涉及三张表(常用的是两张表)和五条链。
	
		下图是iptables命令执行流程。这个流程很重要,等看完iptables命令用法后再来回顾这个流程图就会很好地理解iptables这个命令。
	
		
	
		(图片来自网络)
	
		
		表: filter/nat
		链: INPUT/FORWARD/PREROUING/POSTROUTING
	
		iptables [-t 要操作的表] <操作命令> [要操作的链] [规则号码] [匹配条件] [-j 匹配到以后的动作]
	
		操作命令: (-A -I -D -R -P -F)
		查看命令: (-[vnx]L)
	
		-A <链名>
		APPEND,追加一条规则放到最后
		eg. iptables -t filter -A INPUT -j DROP
		
		-I <链名> [规则号码]
		INSERT, 插入一条规则
		eg. iptables -I INPUT -j DROP
		在filter表的INPUT链插入一条规则(第1条)
		eg. iptables -I INPUT 3 -j DROP
		在filter表的INPUT链里插入一条规则(第3条)
		
		iptables默认操作的表是filter表
		规则号码可以不填,默认是1,确保规则号码<= 已有规则数 + 1
	
		-D <链名> <规则号码|具体规则内容>
		DELETE 删除一条规则
		eg. iptables -D INPUT 3
		按号码删除INPUT链中的第三条规则
		eg. iptables -D INPUT -s 192.168.0.1 -j DROP
		按内容删除INPUT链中内容为"-s 192.168.0.1 -j DROP"的规则
	
		-R <链名> <规则号码> <具体规则内容>
		REPLACE,替换一条规则
		eg. iptables -R INPUT 3 -j ACCEPT
		确保规则号码<=已有规则数
	
		-P <链名> <动作>
		POLICY,设置某个链的默认规则
		
		eg. iptables -P INPUT DROP
		设置filter表INPUT链的默认规则是DROP
		
		当数据包没有被规则列表里的任何规则匹配到的时候,按此默认规则处理。动作前面不能加-j,这也是唯一一种匹配动作前面不加-j的情况
	
		-F [链名]
		FLUSH, 清楚规则
		eg. iptables -F INPUT
		清空filter表INPUT链中的所有规则
		
		iptables -t nat -F PREROUTING
		清空nat表PREROUTING链中的所有规则
		
		-F仅仅清空链中的规则,并不影响-P设置的默认规则
		-P设置DROP后,使用-F一定要小心!!!
		如果不写链名,默认清空所有链里的所有规则
		
		-L [链名]
		LIST, 列出规则
		v: 显示详细信息,包括每条规则的匹配报数量和匹配字节数
		x: 在v的基础上,禁止自动换算成(K、M)
		n: 只显示IP地址和端口号码,不显示域名和服务器
		
		eg. iptables -L
		错略列出filter表所有链及所有规则
		eg. iptables -t nat -vnL
		用详细的方式列出nat表所有链的所有规则,只显示IP地址和端口号
		eg. iptables -t nat -vxnL PREROUTING
		用详细方式列出nat表PREROUTING链的所有规则以及详细数字,不自动换算
		
		
		匹配条件
		流入、流出接口(-i -o)
		来源、目的地址(-s -d)
		协议类型 (-p)
		来源、目的端口(--sport --dport)
	
		
		-i <匹配数据进入的网络接口>
		例如: -i eth0
		匹配是否从网络接口eth0进来
		
		-o <匹配数据流出的网络接口>
		-o eth0
		-s <匹配来源地址>
		可以是IP、NET、DOMAIN,可以为空
		eg. -s 192.168.0.1 
		匹配来自192.168.0.1的数据包
		
		eg. -s 192.168.1.0/24
		匹配来自192.168.1.0/24网络的数据包
		
		-d <匹配目的的地址>
		-d 202.106.0.20 匹配去往202.106.0.20的数据包
		-d 202.106.0.0/16 匹配去往202.106.0.0/16的数据包
		-d www.qq.com 匹配去往域名www.qq.com的数据包
		
		
		-p <匹配协议类型>
		可以是TCP、UDP、ICMP等,也可为空
		eg. -p tcp
		匹配tcp数据包
		eg. -p udp
		匹配udp数据包
		eg. -p icmp
		匹配icmp数据包
		
		--sport <匹配源端口>
		eg. --sport 1000
		匹配源端口是1000的数据包
		eg. --sport 1000:3000
		匹配源端口是1000-3000的数据包(包含两端的端口)
		eg. --sport :3000
		匹配3000以下的端口,含3000
		eg. --sport 1000:
		匹配1000以上的数据包
		
		--dport <匹配目的端口>
		用法和--sport相同
	
		注意: --sport和--dport必须配合和-p参数使用
	
		匹配条件的例子:
		iptables -t filter -A INPUT -s 192.168.0.1 -d www.qq.com -p tcp --dport 80
	
		动作处理方式
		ACCEPT
		DROP
		SNAT
		DNAT
		MASQUERADE
	
		
		-j ACCEPT
		通过,允许数据包通过本链而不拦截它
		
		例如:
		iptables -A INPUT -j ACCEPT
		允许所有访问本机IP的数据包通过
	
		-j DROP
		丢弃,阻止数据包通过本链而丢弃它
		
		iptables -A FORWARD -s 192.168.80.39 -j DROP
		阻止来源地址为192.168.80.39的数据包"通过"本机
		
		-j DNAT --to IP[-IP][:端口-端口]
		(nat表的PREROUTING链)
		eg. iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.1
		把从eth0进来要访问TCP/80的数据包目的地址改为192.168.0.1
		
		eg. iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 81 -j DNAT --to 192.168.0.2:80
		将访问本地的eth0数据包路中目的端口是81的数据包路由到192.168.0.2的80端口
		
		eg. iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.1-192.168.0.10
		
		-j SNAT --to IP[-IP] [:端口-端口] 
		(nat表的POSTROUTING)
		源地址转换,SNAT支持转换为单IP,也支持转换到IP地址池(一组连续的IP地址)
		iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1
		将内网192.168.0.0/24的源地址修改为 1.1.1.1,用于NAT
		
		
		-j MASQUERADE
		动态源地址转换(动态IP的情况下使用)
		eg. iptables -t nat -A POSTROTING -s 192.168.0.0/24 -j MASQUERRADE
		将源地址是192.168.0.0/24的数据包进行地址伪装
	
		
		附件模块
		a. 按包状态匹配(state)
		b. 按来源MAC匹配(mac)
		c. 按包速率匹配(limit)
		d. 多端口匹配(multiport)
	
		
		按包状态匹配
		-m state --state <状态>
		状态:NEW、RELATED、ESTABLISHED、INVALID
		NEW: 有别于tcp的syn
		ESTABLISHED:连接态
		RELATED: 衍生态
		INVALID:不能识别属于哪个链接或没有任何状态
	
		eg. iptables -A INPUT -m state --state RELATED, ESTABLISHED -j ACCEPT
		
		按照mac地址匹配
		-m mac --mac-source <MAC>
	
		eg. iptables -A FORWARD -m mac --mac-source 10:89:10:00:ae:90 -j DROP
		
		报文经过路由后,数据包中原有的mac信息被替换,所以在路由后的iptables中中使用mac模块是没有意义的
	
		按照速率匹配数据包
		-m limit --limit 匹配速率 [--burst 缓冲数量]
		用一定的速率去匹配数据包
		eg. iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s -j ACCEPT
	
		按照端口一次匹配多个端口
		-m multiport <--sports|--dports|--ports> 端口[,端口,...,端口n]
		eg. iptables -A INPUT -p tpc -m multiport --dports 21,22,25,80,110 -j ACCEPT
		多端口匹配命令也要和-p一起使用,指定协议
		
		
		
		使用总则
		所有链名必须大写
		INPUT/OUTPUT/FORWARD/PREROUTING/POSTROUTING
		所有表名必须小写
		filter/nat/mangle
		所有动作必须大写
		ACCEPT/DROP/SNAT/DNAT/MASQUERADE
		所有匹配必须小写
		-s/-d/-m <module_name>/-p
	
		表:
		filter:过滤的时候使用
		nat: 用于做NAT的时候使用
	
		链:
		INPUT: 位于filter表,用于匹配目的IP是本机的数据包
		FORWARD: 位于filter表,匹配穿过本机的数据包,与nat表关系很密切
		PREROUTING: 位于nat表,用于修改目的地址(DNAT)
		POSTROUTING:位于nat表,用于修改源地址(SNAT)
		
		iptables在规则链中检查的时候,如果匹配到具体的规则,则执行规则定义的动作,然后就放弃其他的规则检查。如果没有匹配到具体的规则,就会使用默认定义的规则(预设规则)。
	
		规则链是有顺序的!