iptables [-t TABLE] SUBCOMMAND CHAINCRETERIA -j TARGET
-t TABLE:
默认为filter, 共有filter, nat, mangle, raw四个可用;
SUBCOMMAND:
链:
-F:flush,清空指定表的指定链上所有规则;省略链名时,清空表中的所有链;
示例:
# iptables -t filter -F INPUT #只清空filter表中的INPUT链
# iptables -t nat #清空整个nat表
-N:new, 新建一个用户自定义的链;自定义链只能作为默认链上的跳转对象,即在默认链通过引用来生效自定义链;
示例 : 创建新的链 webfules
[[email protected] ~]# iptables -t filter -N webrules
-X:drop,删除用户自定义的空链;非空自定义链和内置链无法删除;
示例 删除webrules
# iptables -t filter -X webrules
-Z:zero,将规则的计数器置0;
-P:policy,设置链的默认处理机制;当所有都无法匹配或有匹配有无法做出有效处理机制时,默认策略即生效;
示例:设置filter表的forward链的默认策略为DROP
# iptables -t filter -P FORWARD DROP
filter表的可用策略:ACCEPT(接受), DROP(丢弃), REJECT(拒绝)
-E:rename,重命名自定义链;
示例: 讲webrules 修改为httpdrules
# iptables -t filter -E webrules httpdrules
注意:被引用中的链,无法删除和改名
规则管理:
-A:append,在链尾追加一条规则;
-I:insert,在指定位置插入一条规则;默认会在第一条
-D:delete,删除指定的规则;
-R:replace,替换指定的规则;
规则查看:
-L:list,列出指定链上的所有规则;
-n:numeric,以数字格式显示地址和端口号,即不反解;
-v:verbose,详细格式,显示规则的详细信息,包括规则计数器等;
-vv:
-vvv:
--line-numbers:显示规则编号;
-x:exactly,显示计数器的精确值;
# iptables -L -n -v
pkts bytes target prot opt in out source destination
pkts: 被本规则所匹配到的包个数;
bytes:被本规则所匹配到的所包的大小之和;
target: 处理目标 (目标可以为用户自定义的链)
prot: 协议 {tcp,udp, icmp}
opt: 可选项
in: 数据包流入接口
out: 数据包流出接口
source: 源地址
destination: 目标地址;
CRETERIA:匹配条件
通用匹配
-s,--src, --source IP|Network:检查报文中的源IP地址;
[!] -s, --src, --source IP|Network:检查报文中的源IP地址进行取反;
-d,--dst, --destination:检查报文中的目标IP地址;
-p,--protocol:检查报文中的协议,即ip首部中的protocols所标识的协议;tcp、udp或icmp三者之一;
-i,--in-interface:数据报文的流入接口;通常只用于PREROUTING, INPUT, FORWARD链上的规则;
-o,--out-interface:检查报文的流出接口;通常只用于FORWARD, OUTPUT, POSTROUTING链上的规则;
示例:
放行172.16.6.62 对172.16.6.61所有服务的访问
# iptables -t filter -I INPUT-s 172.16.6.62 -d 172.16.6.61 -j ACCEPT
修改上一条规则为: 只允许来自172.16.6.62主机对本级172.16.6.61 tcp的访问请求
# iptables -t filter -R INPUT 1-s 172.16.6.62 -d 172.16.6.61 -p tcp -j ACCEPT
放行172.16.6.62 对172.16.6.61 ping请求
# iptables -t filter -A INPUT-s 172.16.6.62 -d 172.16.6.61 -p icmp -j ACCEPT
限制172.16.6.62对本级172.16.6.61的ping请求只能通过eth0进入
# iptables -t filter -R INPUT 1-s 172.16.6.62 -d 172.16.6.61 -i eth0 -p icmp -j ACCEPT
扩展匹配
扩展匹配:使用iptables的模块实现进一步扩展性检查机制
隐式扩展
对通用匹配中-p中指定的对指定的协议的扩展
-p tcp: TCP协议的扩展
--dport PORT[-PORT] #目标端口
--sport : 源端口
--tcp-flags LIST1 LIST2
LIST1:要检查的标志位;
LIST2:在LIST1中出现过的,且必须为1标记位;而余下的则必须为0;
示例:
# iptables -t filter -I INPUT 1 -s 172.16.6.62 -d 172.16.6.61 -ptcp --tcp-flags syn,ack,fin,rst syn -j ACCEPT
# iptables -t filter -I INPUT 1 -s 172.16.6.62 -d 172.16.6.61 -ptcp --syn -j ACCEPT
-p udp: dup协议的扩展
--sport : 源端口
--dport : 目标端口
-p icmp: icmp协议的扩展--icmp-types
8:echo request # 8 响应请求(ECHO-REQUEST)
0:echo reply #0 响应应答(ECHO-REPLY)
阻止172.16.6.62 对本机172.16.6.1 httpd服务的访问
# iptables -t filter -I INPUT 1-s 172.16.6.62 -d 172.16.6.61 -p tcp -m tcp --dport 80 -j DROP
显式扩展
显式扩展:必须指明使用的扩展机制(模块名字);
-m模块名称 每个模块会引入新的匹配机制;
想知道有哪些模块可用吗?
## rpm -ql iptables| grep so$ #查看已有模块
[[email protected] ~]# rpm -qliptables| grep .so$
/lib64/xtables/libipt_CLUSTERIP.so
/lib64/xtables/libipt_DNAT.so
/lib64/xtables/libipt_ECN.so
/lib64/xtables/libipt_LOG.so
#小写字母,以.so结尾;通常都为扩展模块 如: libipt_CLUSTERIP.so 其中CLUSTERIP为模块名字
-m multiport 扩展:
以离散定义多端口匹配;最多指定15个端口;
multiport专用选项:
--source-ports, --sports PORT[,PORT,...] #源端口
--destination-ports, --dports PORT[,PORT,...] #目标端口
--ports PORT[,PORT,...]
示例: 同时放行 22 80 443
# iptables-I INPUT 1 -d 172.16.100.11 -p tcp -m multiport --dports 22,80,443 -j ACCEPT
-m iprange扩展
指定连续的ip地址范围;在匹配非整个网络地址时使用;
专用选项:
[!]--src-range IP[-IP] #原地址范围
[!]--dst-range IP[-IP] #目标地址范围
示例: 放行本机telnet服务仅允许172.16.6.1-172.16.6.100的主机可以访问
iptables-A INPUT -d 172.16.100.11 -p tcp --dport 23 -m iprange --src-range172.16.100.1-172.16.100.100 -j ACCEPT
iptables-A OUTPUT -s 172.16.100.11 -p tcp --sport 23 -m iprange --dst-range172.16.100.1-172.16.100.100 -j ACCEPT
-m string扩展:
检查报文中出现的字符串,与给定的字符串作匹配;
字符串匹配检查算法:kmp, bm
专用选项:
--algo{kmp|bm}
--algo: 指定算法 常用字符串匹配的算法 kmp | bm
--string"STRING"
--string"要匹配的字符串"
--hex-string"HEX_STRING":HEX_STRING为编码成16进制格式的字串;
示例:
#iptables-I OUTPUT 1 -s 172.16.100.11 -p tcp --sport 80 -m string --string"sex" --algo kmp -j REJECT(丢弃)
-m time扩展:
基于时间区间做访问控制
专用选项:
--datestartYYYY[-MM][-DD][hh[:mm[:ss]]] #从什么日期开始 年-月-日 小时:分:秒
--dattestop#到日期结束
--timestart#从什么时间开始
--timestop#到什么时间结束
--weekdays DAY1[,DAY2,...] #星期几
#iptables -R INPUT 1 -d 172.16.100.11 -p tcp --dport 80 -m time --timestart08:30 --timestop 18:30 --weekdays Mon,Tue,Thu,Fri -j REJECT
-m connlimit扩展:
基于连接数作限制;对每个IP能够发起的并发连接数作限制;
专用选项:
--connlimit-above[n] 不能超过多少
#iptables -I INPUT 2 -d 172.16.100.11 -p tcp --dport 22 -m connlimit--connlimit-above 5 -j REJECT
-m limit扩展:
基于发包速率作限制;
专用选项:令牌桶算法
--limit n[/second|/miniut|/hour|/day]
#n/second 每秒多少个数据包 ;
#n/minit; 每分钟多少个数据包;
#n/hour 每小时多少个数据包;
#n/day 每天多少个数据包;
--limit-burstn #最大突发速率
# iptables-R INPUT 3 -d 172.16.100.11 -p icmp --icmp-type 8 -m limit --limit 10/minute--limit-burst 5 -j ACCEPT