标签:framework 网络安全 应用软件 防火墙 过滤器
防火墙可分为主机防火墙和网络防火墙,主机防火墙主要通过在主机之上安装一些防火墙软件来保护系统的网络安全.
iptables:(包过滤器)Packets Filter Firewall;
Firewall:隔离工具;工作于主机或网络的边缘,对经由的报文根据预先定义的规则(识别条件)进行检测,对于能够被规则匹配到的报文实行某预定义的处理机制的一套组件;
iptables/netfilter:包过滤型防火墙;带状态检测的包过滤型防火墙;连接追踪(connection tracking);
硬件防火墙:在硬件级别能部分防火墙,另一部分功能基于软件实现:
软件防火墙:应用软件处理逻辑运行通用硬件实现的防火墙;
主机防火墙:服务范围为当前主机;
网络防火墙:服务范围为局域网;
iptables/netfilter:软件实现的主机或网络防火墙;
iptables:规则编写工具;
netfilter:防火墙框架;framework;
假设一台主机有两块网卡,A和B.A对应私网地址.B对应公网地址,则防火墙的位置可以分为:
路由判断前报文 :报文刚刚到达A网卡,还未做路由选择
入栈报文 :报文通过A网卡进入用户空间的时候
转发报文 :报文从A网卡直接到B网卡(主机充当网关时),报文未经过用户控件
出栈报文 :报文从用户空间传出时
路由判断后报文 :报文已传出已经过路由转发后
hook function:(钩子函数) (链)
prerouting (路由发生之前)
input (入栈)
forward (转发)
output (出栈)
postrouting (路由发生之后)
以上说明只真对报文从A到B,进出观念相对于A到B而言进行说明(具体情况要配合目标地址和原地址才能判断报文的确切方向)
任何报文通从目标地址或路径上分可分为: 路由判断前报文 入栈报文 转发报文 出栈报文 路由判断后报文
chain:(链=钩子)
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
一个钩子可以有多个链(iptables可以完成nat地址转换,是另一种链上的规则),一个链上可定义多条规则.链和规则存在优先级概念
tables:(表的概念是相对于功能来说的,而非钩子或者链而言 )
filter:过滤,防火墙;
nat:network address translation;用于修改报文的源地址或目标地址,甚至是端口;
mangle(损坏):拆解报文,做出修改(地址和端口之外),并重新封装起来;
raw:关闭nat表上启用的连接追踪机制;
优先级次序(由高而低):
raw --> mangle --> nat --> filter
功能<-->钩子:
raw:PREROUTING,OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,INPUT,OUTPUT,POSTRUTING
filter:INPUT,FORWARD,OUTPUT
报文流向:
到本机某进程的报文:PREROUTING --> INPUT
由本转发的报文:PREROUTING --> FORWARD --> POSTROUTING
由本某进程发出的:OUTPUT --> POSTROUTING
规则的组成的部分:
匹配条件:
网络层首部属性值;
传输层首部属性值;
附加的条件;
处理动作:
TCP/IP协议栈:
数据链接层:物理到物理设备之间的通信;(MAC,Media Access Control)
网络层:源主机到目标主机之间的通信;
传输层:进程到进程之间的通信;
netfilter:位于内核中的tcp/ip协议栈的报文处理框架;
iptables:用户空间的命令行程序;
CentOS 5/6:iptables命令编写规则;
CentOS 7:firewalld;firewalld是iptables的二次封装程序,用来自动生成iptables规则,所以要单独使用iptables需要关闭firewall
systemctl disable firewalld.service
iptables命令:
规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,就由规则后面指明的处理动作进行处理;
匹配条件:
基本匹配条件:简单检查IP、TCP、UDP等报文的某属性进行匹配的机制;
扩展匹配条件:需要借助于扩展模块进行的匹配条件指定即为扩展匹配;
处理动作:
基本动作:ACCEPT,DROP, ...
扩展动作:需要借助扩展模块进行的动作;(大写是处理动作,小写是匹配规则)
添加规则之时需要考量的问题:
(1) 报文的流经路径,判断添加规则至哪个链上;
(2) 确定要实现的功能,判断添加规则至哪个表上;
(3) 要指定的匹配条件,以用于匹配目标报文;
规则的编写格式:iptables [-t table] COMMAND chain [-m matchname [per-match-options]] [-j targetname [per-target-options]];
rule-specification = [matches...] [target] (规则= 匹配条件 + 目标(处理动作))
match = -m matchname [per-match-options] -m 指明加载的拓展模块 模块专用的选项
target = -j targetname [per-target-options] -j 指明动作名称 和动作的专用选项
iptables [-t table] {-A|-C|-D} chain rule-specification (-t 指明在哪张表上写规则)
ip6tables [-t table] {-A|-C|-D} chain rule-specification (-A|-C|-D对链上的规则操作)
iptables [-t table] -I chain [rulenum] rule-specification (chamin:链的名称)
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
-t table:
默认为filter;其它可用的有raw, mangle, nat;
COMMAND:
链:
-P:policy,策略,定义默认策略; 一般有两种选择,ACCEPT和DROP;
-N:new,新建一条自定义的规则链;被内建链上的规则调用才能生效;[-j chain_name];
-X:drop,删除自定义的引用计数为0的空链;
-F:flush,清空指定的链;
-E:重命名自定义的引用计数和为0的链;
规则:
-A:append,追加,在指定链的尾部追加一条规则;
-I:insert,插入,在指定的位置(省略位置时表示链首)插入一条规则;
-D:delelte,删除,删除指定的规则;
-R:replace,替换,将指定的规则替换为新规则;不能仅修改规则中的部分,而是整条规则完全替换;
查看:
-L:list,列出表中的链上的规则;
-n:numeric,以数值格式显示;
-v:verbose,显示详细格式信息;
-vv, -vvv
-x:exactly,计数器的精确结果;
--line-numbers:显示链中的规则编号;
计数器:
规则,以及默认策略有专用的计数器;
记录被当前规则所匹配到的:
(1) 报文个数;
(2) 字节总数;
-Z:zero,置0;重置规则计数器:
chain:
(1) 内建链;
(2) 自定义链;
匹配条件:多重条件:逻辑关系为“与”;
基本匹配条件:
[!] -s, --source address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或范围;(源地址)
[!] -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或范围;(目标地址)
[!] -p, --protocol protocol:指明协议类型
protocol:{tcp|udp|icmp}
[!] -i, --in-interface name:数据报文的流入接口;INPUT, FORWARD and PREROUTING
[!] -o, --out-interface name:数据报文的流出接口; FORWARD, OUTPUT and POSTROUTING
~]# iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.79.73 - j ACCEPT (允许172.16地址段的主机访问73主机 入口规则) ~]# iptables -t filter -A OUTPUT -d 172.16.0.0/16 -s 172.16.79.73 -j ACCEPT (允许从73主机出来的报文访问 172.16地址段 出口规则)
扩展匹配条件
隐式扩展:不用-m选项指出matchname即可使用此match的专用选项进行匹配;
-p tcp:隐含了-m tcp;
[!] --source-port,--sport port[:port]:匹配报文中传输层的源端口;
[!] --destination-port,--dport port[:port]:匹配报文中传输层的目标端口;
[!] --tcp-flags mask comp
SYN,ACK,FIN,RST,URG,PSH;
mask:要检查的标志位列表,以逗号分隔;
comp:必须为1的标志位,余下的出现在mask列表中的标志位则必须为0;
--tcp-flags SYN,ACK,FIN,RST SYN (三次握手的第一次)
--tcp-flags SYN,ACK,FIN,RST SYN,ACK (三次握手第二次)
--tcp-flags SYN,ACK,FIN,RST ACK (正常通信或第三次握手)
[!] --syn:相当于--tcp-flags SYN,ACK,FIN,RST SYN
-p udp:隐含了-m udp:
[!] --source-port,--sport port[:port]:匹配报文中传输层的源端口;
[!] --destination-port,--dport port[:port]:匹配报文中传输层的目标端口;
-p icmp:隐含了-m icmp:
[!] --icmp-type {type[/code]|typename}
8:echo-request 回显请求
0:echo-reply 回显应答
显示拓展:必须使用-m选项指出matchname,有的match可能存在专用的选项;
获取帮助:
CentOS 7:man iptables-extensions
CentOS 6:man iptables
1、multiport 扩展:以离散或连续的方式定义多端口匹配条件;
[!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
[!] --ports port[,port|,port:port]...:指定多个端口;
iptables -A INPUT -d 172.16.79.73 -p tcp -m multiport --dports 22,33,80,1024:65535 -j ACCEPT iptables -A OUTPUT -s 172.16.79.73 -p tcp -m multiport --sports 22,33,80,1024:65535 -j ACCEPT
2、iprange扩展:以连续的ip地址范围指明连续的多地址匹配条件;
[!] --src-range from[-to]:源IP地址;
[!] --dst-range from[-to]:目标IP地址;
iptables -I INPUT 2 -d 172.16.100.1 -p tcp --dport 3306 -m iprange --src--range 172.16.100.1-172.16.100.255 -j ACCEPT iptables -I OUTPUT 2 -s 172.16.100.1 --p tcp --sport 3306 -m iprange --dst-range 172.16.100.1-172.16.100.255 -j ACCEPT
3、string扩展:对报文中的应用层数据做字符串匹配检测;
[!] --string pattern:要检测字符串模式;
[!] --hex-string pattern:要检测的字符串模式,16进制编码;
--algo {bm|kmp} (两种匹配算法)
iptables -I OUTPUT -s 172.16.100.l -p tcp --sport 80 -m iprange ! --dst-range 172.16.100.61-172.16.100.70 -m string --string "admin" --algo kmp -j DROP
4、time扩展:根据报文到达的时间与指定的时间范围进行匹配度检测;
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期时间;
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:结束日期时间;
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --monthdays day[,day...]
[!] --weekdays day[,day...]
~]# iptables -I INPUT -d 172.16.100.67 -p tcp --dport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays Tue,Thu,Sat -j ACCEPT
5、connlimit扩展:根据每客户端IP做并发连接数匹配;
--connlimit-upto n:连接数数量小于等于n,此时应该允许;
--connlimit-above n:连接数数量大于n,此时应该拒绝;
~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT
6、limit扩展:基于收发报文的速率进行匹配;
--limit rate[/second|/minute|/hour|/day]:平均速率
--limit-burst number:峰值速率
7、state扩展:状态检测;连接追踪机制(conntrack);iptables在内核中会启用链接追踪机制, 会在内存中记录链接过的主机的信息,
开启追踪会大量消耗内存空间,并且当达到最大值时,新访问将拒绝服务.
INVALID:无法识别的状态;
ESTABLISHED:已建立的连接;
NEW:新连接;
RELATED:相关联的连接;(比如ftp端口是21,但数据传送石随机端口 21和随机端口之间就是种相关联的链接)
UNTRACKED:未追踪的连接;
nf_conntrack内核模块;(支持状态追踪的模块)
追踪到的连接:/proc/net/nf_conntrack文件中;
能追踪的最大连接数量定义在:/proc/sys/net/nf_conntrack_max
此值可自行定义,建议必要时调整到足够大;
不同的协议的连接追踪的时长:
/proc/sys/net/netfilter/
[!] --state STATE
如何开放被模式的ftp服务:
(1) 装载追踪ftp协议的模块;# modprobe nf_conntrack_ftp
2) 放行命令连接
~] # iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state ESTABLISHED -j ACCEPT ~] # iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m state --state NEW -j ACCEPT
(3) 放行数据连接
~] iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state RELATED -j ACCEPT
iptables/netfilter网络防火墙:
在FORWARD链上定义规则,注意以下几个问题:
(1) 请求-响应均经由FORWARD链,要注意规则的方向性;
(2) 如果可以启用conntrack机制,建议将双方向的状态为ESTABLISHED的报文直接放行;
(3) 通常用linux充当网络防火墙\网关.FORWARD链和INPUT和OUTPUT没关系,但作为linux主机来说,主机也要保证安全
略
iptables/netfilter中还有很多模块,再次不一一申明,还有第三方模块可以使用,要通过向内核打补丁来实现
略
处理动作(目标):-j targetname [per-target-options]
targetname:
ACCEPT:接受;
DROP:丢弃; (丢弃不会有响应报文,在请求方只会显示未回应,请求方并不知道此处有主机)
REJECT:拒绝; (拒绝有回应报文,在请求方显示拒绝信息,通常不这么做,请求方可以得知此ip地址是有主机对应的)
自定义链;(默认情况下他不对应钩子函数,虽然可以在其中添加规则,但无法直接生效,必须调用系统链才可以)
1.如果自定义链上没有规则,则自动跳转到系统链上,继续被其他规则匹配.
iptables -N chain_name 添加自定义链
iptables -X chian_name
iptables -E old_name new_name
-j chain_name
RETURN (结束当前链,并返回调用当前链的上一级链上的吓一跳规则,继续向下处理)
例:自定义一条链,允许主机被外网用户执行ping请求,
iptables -N icmp_rules #(添加自定义链icmp_rules) 此时执行iptables -vnL 可以看到此链 iptables -I 2 FORWARD -p icmp -j icmp_rules #(在FORWARD链上定义,是icmp的报文跳转到icmp_rules链上) icmp_rules计数为1 iptabels -A icmp_rulse -p icmp --icmp-type -8 -m state --state NEW -j ACCRPT (允许ping)
如果icmp_rulse上没有匹配到的规则,但主链上有定义icmp的规则,则:
iptable -A icmp_rules -j RETURN (返回主链)
REDIRECT:端口重定向;(这个规则之定义在nat表上的PROROUTING和OUTPUT链上,和用户自定义的链上)
--to-ports port[-port]:映射至哪个目标端口;
~]# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 80 -j REDIRECT --to-port 8088 #从本主机8088端口发出的规则转换到 80端口上
SNAT:源地址转换;(这个功能只能定义在nat表上的POSTROUTING和INPUT链上,或自定义链上) 经过地址转换抓包是看不到内网主机的,可以达到隐藏主机的目的
--to-source [ipaddr[-ipaddr]][:port[-port]]
iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -j SNAT --to-source 172.16.100.6 #内网地址通过100.6网关转换源地址
MASQUERADE:地址伪装;仅用于nat表的POSTROUTING表上,只有外网地址是动态获取的时候,(不能指定源地址时)会自动获取源地址做规则中的--to-source用,不是动态获取也可用,但是更消耗资源.
DNAT:目标地址转换;用于公开本是隐藏在网关之后的某些主机的服务;只用在nat表上的PREROUTING和OUTPUT链上
--to-destination [ipaddr[-ipaddr]][:port[-port]]
iptables -t nat -A PREROUTING -d 172.16.100.7 -p tcp --dport 80 -j DNAT --to-destnation 192.168.11.2:9090 把来自100.7的80报文转发给11.2内网主机的9090端口
如果网关把一个外网请求转发给多个内网主机(外网访问请求分发给多台内网主机),这就叫做负载均衡,有专门的实现工具.
负载均衡就是DNAT的一种特殊形式.
LOG:用来记录iptables的日志,是处理动作的一种,报文被匹配后执行动作,并继续被链上的后续规则做匹配,要先记录日志,后定义规则来实行处理动作
--log-prefix:日志前缀
--log-ip-options:
iptables -A INPUT -d 172.16.100.67 -p tcp --dport 8088 -j LOG --log-prefix "iptables" --log-ip-options
日志位置:/var/log/messages
保存和重载规则:
CentOS7:
保存规则:
iptables-save > /PATH/TO/SOME_RULE_FILE
重载规则:
iptables-restore < /PATH/FROM/SOME_RULE_FILE
CentOS 6:
保存规则:
service iptables save:自动保存规则至/etc/sysconfig/iptables文件中;
重载规则:
server iptables restore:从/etc/sysconfig/iptables文件中重载规则;
规则优化:
(1) 可安全放行所有入站及出站,且状态为ESTABLISHED的连接;
(2) 服务于同一类功能的规则,匹配条件严格的放前面,宽松放后面;
(3) 服务于不同类功能的规则,匹配报文可能性较大扩前面,较小放后面;
(4) 设置默认策略;
(a) 最后一条规则设定;
(b) 默认策略设定;
本文出自 “11323677” 博客,请务必保留此出处http://zx337954373.blog.51cto.com/11323677/1829433
标签:framework 网络安全 应用软件 防火墙 过滤器
原文地址:http://zx337954373.blog.51cto.com/11323677/1829433