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