IPTABLES
基于内核的防火墙,里面有raw,mangle,net,filter四个表,它们的优先级依次降低,也就是raw最高,匹配的时候是从raw开始的。
1, iptables有四张表
raw,mangle,net,filter
2,规则链-chain
存放防火墙规则的地方
默认有五种规则链:
→ PREROUTING:路由选择之前处理
→ FORWARD:处理转发的数据包
→ INPUT:处理入站的数据包
→ OUTPUT:处理出站的数据包
→ POSTROUTING:路由选择之后处理
3,表和规则链对应的关系:
filter :INPUT,FORWARD, OUTPUT
nat : PREROUTING(DNAT), POSTROUTING(SNAT),OUTPUT
mangle : PREROUTING, POSTROUTING, FORWARD, INPUT,OUTPUT
raw : PREROUTING, OUTPUT
4,数据报文流程:
跟本机内部进程通信:
进入:PREROUTING,INPUT
出去:OUTPUT, POSTROUTING
5,基本语法:
iptables [-t TABLE] COMMANDCHAIN CRETIRIA -j TARGET
iptables [ -t 表名 ] 选项 [ 链名 ] [ 条件 ] [ -j 目标操作 ]
链:
-F:flush, 清空规则链;
-N:new, 自建一条链
-X: delete, 删除一条自定义的空链
-Z:zero,计数器归零
-P:policy,设置默认策略,对filter表来讲,默认规则为ACCEPT或DROP
-E:重命名自定义链
表:-t TABLE:
nat, mangle, raw, filter
不指定表的时候默认为filter
不指定链,默认为对应表的所有链
除非设置默认策略,否则必须指定匹配条件
选项/链名/目标操作用大写字母,其余都小写
链中的规则:
-A 在链尾增加一条规则
-I 在链头增加一条规则,或者指定序号增加
-D 删除链内指定序号(或内容)的一条规则
-R 替换一条规则
查询:
-L
-n:数字格式显示主机地址和端口;
-v:详细格式,-vv,-vvv
--line-numbers:显示规则编号
pkts bytes target prot opt in out source destination
包数 字节数 目标 协议 流入的接口 流出的接口 源地址 目标地址
-x: exactly,不要对计数器的计数结果做单位换算,而显示其精确值
匹配条件:
通用匹配
-s 地址:指定报文源IP地址匹配的范围;可以是IP,也可以是网络地址;可使用!取反;--src, --source
-d 地址:指定报文目标IP地址匹配的范围;--dst,--destination
-p 协议:指定匹配报文的协议类型,一般有三种tcp, udp和icmp;
-iINTERFACE: 数据报文流入的接口;PREROUTING,INPUT, FORWARD
-o INTERFACE: 数据报文流出的接口;OUTPUT,FORWARD, POSTROUITING
扩展匹配
隐式扩展:当使用-p{tcp|udp|icmp}中的一种时,可以直接使用扩展专用选项;
-ptcp:
--sport PORT[-PORT]: 指定源端口
--dport PORT[-PORT]: 指定目标端口
--tcp-flags
-pudp:
--sport
--dport
-p icmp [-m icmp]
--icmp-type
0:echo-reply, ping响应
8:echo-request, ping请求
显式扩展:必须明确说明使用哪个模块进行扩展,而后才能使用其扩展专用选项;
-mstate �Cstate
multiport: 多端口匹配
可用于匹配非连续或连续端口;最多指定15个端口;
--source-ports, --sportsport[,port,port:port]
--destination-ports,--dports
--ports
例:
# iptables -I INPUT -d 172.16.31.30 -p tcp -m multiport--dports 22,80 -j ACCEPT
# iptables -IOUTPUT -s 172.16.31.30 -p tcp -m multiport --sports 22,80 -j ACCEPT
iprange: 匹配指定范围内的地址;匹配一段连续的地址而非整个网络时有用;
取反([!]) --src-ragneIP[-IP]
取反([!]) --dst-range
例:# iptables -A INPUT -d 172.16.31.30 -p tcp --dport 23-m iprange --src-range 172.16.31.30-172.16.31.100 -j ACCEPT
# iptables -AOUTPUT -s 172.16.31.30 -p tcp --sport 23 -m iprange --dst-range 172.16.31.1-172.16.31.100-j ACCEPT
string:字符串匹配,能够检测报文应用层中的字符串
--algo {kmp|bm}
--string"STRING"
--hex-string"HEX_STRING": HEX_STRING为编码成16进制格式的字串;
例:# iptables -I OUTPUT -m string --algo kmp --string"hello" -j DROP
time: 基于时间做访问控制
--datestartYYYY[-MM][-DD[Thh[:mm[:ss]]]]
--datestop
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--weekdays day[,day]
Mon, Tue,
例:# iptables -I INPUT -d 172.16.31.30 -p tcp --dport 80-m time --timestart 08:00 --timestop 18:00 --weekdays Mon,Tue,Thu,Fri -j REJECT
connlimit: 连接数限制,对每IP所能够发起并发连接数做限制
[!] --connlimit-above [n]
例:iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -mconnlimit --connlimit-above 2 -j DROP
limit: 速率限制
--limitn[/second|/minute|/hour|/day]
--limit-burst n
例:# iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT
state: 状态检查
--state
例:iptables -A INPUT -m state--state NEW -p tcp ! --syn -j DROP
iptables状态跟踪
NEW,请求建立连接的包、完全陌生的包
ESTABLISHED,将要或已经建立连接的包
RELATED,与已知某个连接相关联的包
INVALID,无对应连接,以及连接无效的包
UNTRACKED,未跟踪状态的包
SNAT源地址转换
做完路由选择后,针对来自局域网、即将从外网接口发出去的数据包,将其源IP地址修改为公网地址
例:# iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o eth1 -j SNAT --to-source 1.1.1.1
MASQUERADE --- 地址伪装
外网接口的IP地址不固定的情况
将SNAT规则改为MASQUERADE
对于ADSL拨号连接
例:iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -o eth1 -jMASQUERADE
DNAT目标地址转换
例:宣布WEB
# iptables-t nat -A PREROUTING -i eth1 -d 1.1.1.1 -p tcp --dport 80 -j DNAT--to-destination 172.16.31.30
开机后自动加载已保存的规则
# iptables-save > /etc/sysconfig/iptables