防火墙及netfilter基础
firewall
工作于主机或网络的边缘,对于进出的报文根据事先定义的规则作检查,对能够被规则匹配的报文作出相应处理的组件。
可分为主机防火墙和网络防火墙
可以是软件,也可以是硬件,专业的硬件防火墙:checkpoint, netscreen
iptables:规则管理工具,是工作于用户空间的程序,可自动检查语法错误;
netfilter: 网络过滤器, 是工作于内核空间TCP/IP网络协议栈上的框架;
IDS:Intrusion Detecting System,即入侵检测系统
NIDS:网络入侵检测系统
HIDS:主机入侵检测系统
IPS: Intrusion Protec System,即入侵防御系统
HoneyPot: 蜜罐
Iptables
发展历程
ipfw --> ipchains--> iptables/netfilter
Linux本无防火墙系统,参考OpenBSD移植而来,取名ipfw;后发现firewall的防护功能依赖于众多串在一起的规则链来实现,故改名ipchains;再后来规则被规划的越来越详细,防护功能依赖于多条链结合来实现,最终定名iptables/netfilter
路由发生的时刻:
报文进入本机后:
判断目标地址
报文离开本机之前:
判断经由哪个接口发出;
报文流向经由的位置:
到本内部:prerouting, input
由本机发出:output, postrouting
由本机转发:prerouting, forward, postrouing
规则的组成部分:
报文的匹配条件, 匹配之后如何处理
匹配条件:基本匹配条件、扩展匹配条件
如何处理:内建处理机制、自定义处理机制(自定义的链)
注意:报文不可能经由自定义链,自定义链只有在内置链上被引用才能生效(即做为自定义目标)
netfilter规则的功能:
filter:过滤
NAT Server(Network Address Translation):地址转换
mangle:修改报文首部中的某些信息
raw:关闭nat表上启用的连接追踪功能
以上即iptables的四表
hooks function(钩子函数)
prerouting:
进入本机后路由功能发生前
①:raw,mangle,nat
input:
到达本机内部
②:mangle,filter
output:
由本机发出
③:raw,mangle,nat,filter
forward:
由本机转发
④:mangle,filter
postrouting:
路由功能发生后,即将离开本机前
⑤:mangle,nat
以上即iptables的五链(CHAIN),组合起来即构成内核中专门用于实现报文检查功能的框架--netfilter
各钩子存有众多规则,按功能存放,具有相同功能的规则集中存放,而不同功能的规则单独存放,报文到达后会按照功能的优先级按次序依次检查,由此组成iptables的表。
各功能实现位置:
filter:input, forward, output
nat:prerouting(修改目标主机地址), output, postrouting(修改源主机地址)
mangle:prerouting, input, forward, output, postrouting
raw:prerouting, output,nat的补充功能,只能发生在nat的前半段
功能的优先级:
由高而低:raw --> mangle --> nat --> filter
数据包过滤匹配流程示意图
添加规则时的考量点:
(1) 要实现的功能:判断添加在哪个表上;
(2) 报文流向及经由路径:判断添加在哪个链上;
链上的规则次序即为检查次序,因此有一定的法则
(1) 同类规则,匹配范围小的放上面;
(2) 不同类规则,匹配报文几率较大的放上面;
(3) 应该设置默认策略;
iptables基本用法
iptables命令
生成规则,送往netfilter;
规则通过内核接口直接送至内核;立即生效,但不会永久有效;
要想永久有效需保存至配置文件,且此配置文件需开机自动加载或由用户手动加载
语法格式
iptables[-t TABLE] SUBCOMMAND CHAIN CRETERIA -j TARGET
常用选项
-t TABLE:指明要操作的表,省略时默认为filter, 共有filter, nat, mangle, raw四个表可用;
SUBCOMMAND:子命令
CHAIN:指明要操作的链
CRETERIA:指明匹配条件
-j TARGET:指明处理动作
SUBCOMMAND(子命令)
对链的操作
-F:flush,清空指定表的指定链上所有规则,省略链名时,清空默认表中所有链的所有规则;
-N:new, 新建一个用户自定义的链,自定义链只能作为默认链上的跳转对象,即在默认链上通过引用来生效自定义链;
-X:drop,删除用户自定义的空链,内置链无法删除;
-Z:zero,将规则的计数器置0;每个链上的每条规则都有两个计数器,一个记录被当前规则所匹配到的报文个数,另一个记录被当前规则所匹配到的报文大小之和;
-P:policy,设置链的默认处理机制,当所有链都无法匹配,或能匹配到但无法做出有效处理机制时,默认处理机制即生效;
filter表的可用策略:ACCEPT、DROP、REJECT
-E:rename,重命名自定义链;
注意:被引用中的链,无法删除和改名
对链上规则的操作
-A:append,在链尾追加一条规则;
-I:insert,在指定位置插入一条规则;
-D:delete,删除指定的规则;
-R:replace,替换指定的规则;
查看操作
-L:list,列出指定链上的所有规则;
-n:numeric,以数字格式显示地址和端口号,即不反解;
-v:verbose,详细格式,显示规则的详细信息,包括规则计数器等;
--line-numbers:显示规则编号;
-x:exactly,显示计数器的精确值,即不做单位换算;
pktsbytes target prot opt in out source destination
pkts:被本规则所匹配到的报文个数;
bytes:被本规则所匹配到的所有报文的大小之和;
target: 处理目标 (目标可以为用户自定义的链);
prot: 协议 {tcp, udp, icmp};
opt:可选项;
in:数据包流入接口;
out:数据包流出接口;
source:源地址;
destination:目标地址;
CRETERIA(匹配条件)
检查IP首部,检查TCP、UDP或ICMP首部;
基于扩展机制,也可以进行额外的检查,如做连接追踪等;
可同时指定多个匹配条件,此时指定的所有条件要都满足才能被匹配到;
通用匹配
-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链上的规则;
注意:可以取反,在选项前加“!”
扩展匹配
使用iptables的模块实现扩展性检查机制
隐式扩展
如果在通用匹配上使用-p选项指明了协议的话,[-m 模块名称]可省略
tcp
--dport:目标端口
--sport:源端口
--tcp-flags LIST1 LIST2
LIST1:要检查的标识位
LIST2:在LIST1中出现过的,且必须为1标记位,而余下的则必须为0
示例:“--tcp-flags syn,ack,fin,rst syn”:表示只检查4个标识位syn,ack,fin,rst,且syn必须=0,而ack,fin,rst必须=1
--syn:用于匹配tcp会话三次握手的第一次
udp
--dport
--sport
icmp
--icmp-type
8:echo request(ping请求)
0:echo reply(ping响应)
示例:配置本机的dns服务,并放行之;默认策略为drop
注意:规则1和2只能放行外机指向本机做解析,若无规则3和4,本机自己请求的解析将无法被放行
显式扩展
必须指明使用的扩展机制
格式:-m模块名称,每个模块会引入新的匹配机制
查询可用的模块命令
rpm -ql iptables
小写字母,以“.so”结尾
multiport扩展:
以离散定义多端口匹配;最多指定15个端口;
专用选项:
--source-ports,--sports PORT[,PORT,...]
--destination-ports,--dports PORT[,PORT,...]
--portsPORT[,PORT,...]
示例:
# iptables -I INPUT 1 -d 172.16.100.11 -ptcp -m multiport --dports 22,80,443 -j ACCEPT
# iptables -I OUTPUT 1 -s 172.16.100.11 -ptcp -m multiport --sports 22,80,443 -j ACCEPT
iprange扩展:
指定连续的ip地址范围;在匹配非整个网络地址时使用;
专用选项:
[!]--src-range IP[-IP]
[!]--dst-range IP[-IP]
示例:
# iptables -A INPUT -d 172.16.100.11 -p tcp--dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT
# iptables -A OUTPUT -s 172.16.100.11 -p tcp--sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT
string扩展:
检查报文中出现的字符串,与给定的字符串作匹配;
字符串匹配检查算法:
kmp,bm
专用选项:
--algo{kmp|bm}
--string"STRING"
--hex-string "HEX_STRING":HEX_STRING为编码成16进制格式的字串;
示例:
# iptables -I OUTPUT 1 -s 172.16.100.11 -ptcp --sport 80 -m string --string "sex" --algo kmp -j REJECT
time扩展:
基于时间区间做访问控制
专用选项:
--datestartYYYY[-MM][-DD][hh[:mm[:ss]]]
--dattestop
--timestart
--timestop
--weekdaysDAY1[,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
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
limit扩展:
基于发包速率作限制;
专用选项:令牌桶算法
--limit n[/second|/minute|/hour|/day]
--limit-burstn
示例:
# iptables -R INPUT 3 -d 172.16.100.11 -picmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
state扩展:
-j TARGET
-j(jump),跳转目标
内置目标
ACCEPT:接受
DROP:丢弃
REJECT:拒绝
自定义连接