当前位置: > Linux服务器 > iptables >

iptables命令

时间:2014-11-20 13:17来源:linux.it.net.cn 作者:IT

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在规则链中检查的时候,如果匹配到具体的规则,则执行规则定义的动作,然后就放弃其他的规则检查。如果没有匹配到具体的规则,就会使用默认定义的规则(预设规则)。

规则链是有顺序的!

 
 
 

(责任编辑:IT)
------分隔线----------------------------