|
防火墙及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:拒绝
自定义连接
|