防火墙
安全技术
入侵检测与管理系统(instruction detection system):特点是不阻断任何网络访问,量化、定位来自内外网络的威胁情况,主要是以提供报告和时候监督为主,提供有针对性的知道措施和安全决策依据。一般采用旁路部署方式
入侵防御系统(intrusion prevention system):以透明模式工作,分析数据包的内容如:溢出攻击。拒绝服务攻击、木马、蠕虫、系统漏洞等进行准确的分析判断,在判定为攻击行为后立即予以阻断,主动而有效的保护网络的安全,一般采用在线部署方式
防火墙(firewall):隔离功能,工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本上的实现都是默认情况下关闭所有的通过型访问,值开放允许访问的策略
防火墙的分类
主机防火墙:服务范围为当前主机
网络防火墙:服务范围为防火墙一侧的局域网
硬件防火墙:在专用硬件级别实现部分功能的防火钱;另一部分功能基于软件实现,
软件防火墙:运行于通用平台之上的防火墙的应用软件
网络层防火墙:osi下面三层
应用层防火墙/代理服务器:代理网关,osi七层
网络层防火墙
包过滤防火墙
网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每一个数据的源地址,目的地址,所用端口号和协议状态等因素,或他们的组合来确定是否允许该数据包通过
优点:对用户来说透明,处理速度快且易于维护
缺点:无法检查应用层数据,如病毒等
应用层防火墙
应用层防火墙/代理服务型防火墙(proxy service)
将所有跨越防火墙的网络通信链路分为两段
内外网用户的访问都是通过代理服务器上的链接来实现
优点:在应用层对数据进行检查,比较安全
缺点:增加防火墙的负载
现实生产环境中所使用的防火墙一般都是二者结合体
即先检查网络数据,通过之后再送到应用层去检查
iptables的基本认识
Netfilter组件
内核空间,集成在linux内核中
扩展各种网络服务的结构化底层框架
内核中选取五个位置放了五个hook(勾子) function(INPUT OUTPUT FORWARD PREROUTING POSTROUTINNG ),而这五个hook function 向用户开放,用户可以通过一个命令工具(iptables)向其写入规则
由信息过滤表(table)组成,包括控制ip包处理的规则集(rules),规则被分组放在链上
三种报文流向:
流入本机:PREROUTING –> INPUT–>用户空间
流出本机:用户空间进程–>OUTPUT–>POSTROUTING
转发:PREROUTING–> FORWARD–>POSTROUTING
防火墙工具
Iptables
命令行工具,工作在用户空间
用来编写规则,写好的给规则被送往netfilter,告诉内核如何去处理信息包
Firewalld
Centos 7 引入了新的前端管理工具
管理工具:
Firewall-cmd
Firewall-config
Iptables由四个表和五个链以及一些规则组成
四个表table:filter nat mangle raw
Filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包
Nat表:network address transaction 地址转换规则表
Mangle表:修改数据标记位规则表
Raw表:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度
优先级由高到低的顺序为:raw –>mangle–> nat—> filter
五个内置链chain
INPUT
OUTPUT
PREROUTING
FORWARD
POSTROUTING
Netfilter表和链对应关系
Filter INPUT FORWARD OUTPUT
数据包过滤匹配流程
IPTABLES和路由
路由功能发生的时间点
报文进入本机后
判断目标主机是否为本机
是:INPUT
否:FORWORD
报文离开本机之前
判断由哪个接口送往下一跳
内核中数据包的传输过程
当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的ip判断是否需要转送出去
如果数据包就是进入本机的,数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROUTING链输出
如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出
Iptables规则
规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作做出处理
匹配条件:默认为与条件,同时满足
基本匹配:IP,端口,TCP的flags(SyN,ACK等)
扩展匹配:通过复杂高级功能匹配
处理动作:称为target,跳转目标
内建处理动作:ACCEPT DROP REJECT SNAT DNAT MASQUERADE MARK LOG
自定义处理动作:自定义chain,利用分类管理复杂情形
规则要添加在链上,才生效;添加在自定义上不会自动生效
链chain:
内置链:每个内置链对应于一个勾子函数
自定义链:用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制;只有hook勾子调用自定义链时,才生效
Iptables添加要点:
要实现哪种功能:判断添加在哪张表上
报文流经的路径:判断添加在那个链上
报文的流向:判断源和目的
匹配规则:业务需要
链上规则的次序,即为检查的次序,因此隐含一定的法则
同类规则(访问同一应用),匹配范围小的放上面
不同类规则(访问不同应用),匹配到报文频率较大的放上面
将哪些可由一条规则描述的多个规则合并为一个
设置默认策略
实验环境准备
Ü Centos7: systemctl stop firewalld.service
systemctl disable firewalld. service
Ü Centos6:service iptables stop; chkconfig iptables off
Iptables命令
规则格式:
Iptables [ -t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targername [per-targer-options]
-t table:
Raw mangle nat [filter]默认
SUBCOMMAND:
1链管理:
-N:new,自定义一条新的规则链
-X:delete,删除自定义的空的规则链
-P:policy,设置默认策略;对filter表中的链而言,其默认策略有;
ACCEPT:接受
DROP:丢弃
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能够被删除
2查看:
-L:list,列出指定链上的所有规则,本选项须置后
-n: numberric ,以数字格式显示地址的端口号
-v: verbose 详细信息
-vv 更详细的信息
-x:exactly 显示计数器结果的精确值,而非单位转换后的易读值
–line–numbers:显示规则的序号
常用组合:
–vnL
–vvnL
-S selected,以iptables-save 命令格式显示链上规则
3规则管理
-A: append,追加
-I: insert 插入,要指明插入至的规则编号,默认为第一条
-D: delete 删除
(1)指明规则序号
(2)指明规则本身
-R:replace 替换指定链上的指定规则编号
-F:flush 清空指定的规则链
-Z:zero 置零
Iptables的每条规则都有两个计数器
(1)匹配到的报文的个数
(2)匹配到的所有报文的大小之和
Chain:PREROUTING INPUT FORWARD OUTPUT POSTROUTING
匹配条件
基本:通用的,PARAMETERS
扩展:需加载模块,MATCH EXTENTIONS
1基本匹配条件:无需加载模块,由iptables/netfilter自行提供
-s:–source address 源IP 或范围
-d: –destination address:目标地址或范围
-p:–protocol protocol:指定协议,可使用数字如0(all)
Protocol: tcp udp ICMP icmpv6
-i: –in-interface name :报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT/FORWARD/PREROUTING链
-o: –out-interface name :报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD/OUTPUT/POSTROUTING链
扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so)方可生效
查看帮助 man iptables-extensions
- 隐式扩展:在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块
Tcp协议的扩展选项
–source-Port,–sport Port[:port] :匹配报文端口,可为端口范围
–destination-Port, –dport Port[:port]匹配报文目标端口,可为范围
–tcp-flags mask comp
Mask 需检查的标志位列表,用,分隔 例如 SYN ACK FIN RST
Comp 在mask列表中必须为1的标志位列表,无指定则为0,用,分隔
示例:
–tcp-flags SYN,ACK,FIN,RST SYN 表示要检查
的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0
–tcp-flags SYN,ACK,FIN,RST SYN,ACK
–tcp-flags ALL ALL
–tcp_flags ALL NONE
–syn:用于匹配第一次握手
相当于:–tcp-flags SYN,ACK,FIN,RST SYN
udp
–source-port, –sport port[:port]:匹配报文的源端口;可以是端口范围
–destination-port,–dport port[:port]:匹配报文的目标端口;可以是端口范围
Ü
icmp
[!] –icmp-type {type[/code]|typename}
type/code
0/0 echo-reply icmp应答
8/0 echo-request icmp请求
(2)显示扩展:必须使用-m选项指明要调用的扩展模块的扩展机制,要手动加载扩展模块
[-m matchname [per-match-options]]
处理动作:
-j targetname [per-target-options]
简单:ACCPET,DROP
扩展:REJECT:–reject-with:icmp-port-unreachable 默认
RETURN :返回调用链
REDIRECT:端口重定向
LOG:记录日志,dmesg
MARK:做防火墙标记
DNAT:目标地址转换
SNAT:源地址转换
MASUERADE:地址伪装
。。。
自定义链
显示扩展:必须显示地指明使用的扩展模块进行的扩展
使用帮助
Centos6:man iptables
Centos 7 :man iptables-extensions
1,multiPort扩展
以离散方式定义多端口匹配,最多指定15个端口
–source-ports,–sports port[,port|,port:port]…
指定多个源端口
–destination-ports,–dports port[,port|,port:port]…
指定多个目标端口
–ports port[,port|,port:port]…多个源或目标端口
示例:
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p
tcp -m multiport –dports 20:22,80 -j ACCEPT
2,iprange扩展
指明连续的(但一般不是整个网络)ip地址范围
–src-range from [-to] 源IP地址范围
–dst-range from [-to] 目标IP地址范围
示例:
iptables -A INPUT -d 172.16.1.100 -p tcp –dport
80 -m iprange –src-range 172.16.1.5-172.16.1.10
-j DROP
3,mac扩展
指明源MAC地址
适用于:PREROUTING,FORWARD,INPUT chains
–mac-source XX:XX:XX:XX:XX:XX
示例:
iptables -A INPUT -s 172.16.0.100 -m mac –macsource 00:50:56:12:34:56 -j ACCEPT
4,string扩展
对报文中的应用层数据做字符串模式匹配检测
–algo{bm|kmp}:字符串匹配检测算法
Bm:Boyer-Moore
Kmp:Knuth-Pratt-Morris
–from offset 开始偏移
–to offset 结束偏移
–string pattern 要检测的字符串模式
–hex-string pattern 要检测字符串模式 16进制格式
示例
iptables -A OUTPUT -s 172.16.100.10 -d 0/0 -p tcp –sport 80 -m string –algo bm –string “google” -j REJECT
5,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…] 星期几
–kerneltz:内核时区,不建议使用,CentOS7系统默认为UTC
注意: centos6 不支持kerneltz ,–localtz指定本地时区(默认)
示例:
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp –dport 80 -m time –timestart 14:30 –timestop 18:30 –weekdays Sat,Sun –kerneltz -j DROP
6,connlimit扩展
根据每客户端IP 做并发连接数数量匹配
可防止cc(challenge collapsar 挑战黑洞)攻击
–connlimit-upto n:连接的数量小于等于n时匹配
–connlimit-above n“连接的数量大于n时匹配
通常分别与默认的拒绝或允许策略配合使用
示例
iptables -A INPUT -d 172.16.100.10 -p tcp –dport 22 -m connlimit –connlimit-above 2 -j REJECT
7,limit扩展
基于收发报文的速率做匹配
令牌桶过滤器
–limit rate[/second|/minute|/hour|/day]
–limit-burst number
示例:
iptables -I INPUT -d 172.16.100.10 -p icmp –icmptype 8 -m limit –limit 3/minute –limit-burst 5 -j ACCEPT
前5个不限制,以后每分钟走3个
iptables -I INPUT 2 -p icmp -j REJECT
8,state 扩展
根据“连接追踪机制”去检查连接的状态,较耗资源
Conntrack机制:追踪本机上的请求和响应之间的关系
状态有如下几种
NEW: 新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
RELATED:新发起的但与已有连接相关联的连接,如ftp协议中的数据连接与命令连接之间的关系
INVALID:无效的连接,如flag标记不正确
UNTRACKED:未进行追踪的连接,如raw表中关闭追踪
示例:
iptables -A INPUT -d 172.16.1.10 -p tcp -m multiport –-dports 22,80 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.1.10 -p tcp -m multiport –sports 22,80 -m state –state ESTABLISHED -j ACCEPT
已经追踪到的并记录下来的连接信息库
/proc/net/nf_conntrack
调整连接追踪功能所能够容纳的最大连接数量
/proc/sys/net/nf_conntrack_max
不同协议的连接追踪时长
/proc/sys/net/netfilter
注意:centos 7 需要加载模块:modprobe nf_conntrack
Iptables 的连接跟踪表最大容量为/proc/sys/net/nf_conntrack_max,各种状态的超时连接会从表中删除;当模板满载时,后续连接可能会超时
解决方法两个:
(1) 加大nf_conntrack_max 值
vi /etc/sysctl.conf
net.nf_conntrack_max = 393216
net.netfilter.nf_conntrack_max = 393216
(2) 降低 nf_conntrack timeout时间
vi /etc/sysctl.conf
net.netfilter.nf_conntrack_tcp_timeout_established = 300
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
iptables -t nat -L -n
- 装载ftp连接追踪的专用模块:
跟踪模块路径:/lib/modules/kernelversion/kernel/net/netfilter
vim /etc/sysconfig/iptables-config 配置文件
IPTABLES_MODULES=” nf_conntrack_ftp ”
modproble nf_conntrack_ftp
v
(2) 放行请求报文:
命令连接:NEW, ESTABLISHED
数据连接:RELATED, ESTABLISHED
iptables –I INPUT -d LocalIP -p tcp -m state –state
ESTABLISH,EDRELATED -j ACCEPT iptables -A INPUT -d LocalIP -p tcp –dport 21 -m state –state NEW -j ACCEPT
v
(3) 放行响应报文:
iptables -I OUTPUT -s LocalIP -p tcp -m state –state ESTABLISHED -j ACCEPT
开放被动模式的ftp服务示例
yum install vsftpd
v systemctl start vsftpd
v modprobe nf_conntrack_ftp
iptables -F
v iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
v iptables -A INPUT -p tcp –dport 21 -m state –state NEW -j ACCEPT
v iptables -A OUTPUT -m state –state ESTABLISHED -j ACCEPT
v iptables -P INPUT DROP
v iptables -P OUTPUT DROP
v iptables -vnL
Iptables命令
v Target:
Ü ACCEPT, DROP, REJECT, RETURN,LOG, SNAT, DNAT, REDIRECT, MASQUERADE,..
Ü LOG: 非中断target,本身不拒绝和允许,放在拒绝和允许规则前
并将日志记录在/var/log/messages系统日志中
–log-level level 级别: emerg, alert, crit, error,warning, notice, info or debug
–log-prefix prefix 日志前缀,用于区别不同的日志,最多29个字符
Ü 示例:
iptables -I INPUT -s 10.0.1.0/24 -p tcp -m multiport –dports 80,21,22,23 -m state –state NEW -j LOG –logprefix “new connections: ” 日志前缀
任何不允许的访问,应该在请求到达时给予拒绝规则在链接上的次序即为其检查时的生效次序
v 基于上述,规则优化
Ü 1 安全放行所有入站和出站的状态为ESTABLISH
Ü 2 谨慎放行入站的新请求
Ü 3 有特殊目的限制访问功能,要在放行规则之前加
Ü 4 同类规则(访问同一应用),匹配范围小的放在特殊处理
Ü 5 不同类的规则(访问不同应用),匹配范围大的
Ü 6 应该将那些可由一条规则能够描述的多个规则合
Ü 7 设置默认策略,建议白名单(只放行特定连接)
1) iptables -P,不建议
2) 建议在规则的最后定义规则做为默认策略
规则有效期:
使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限
保存规则:
Centos6
Service iptables save
将规则覆盖保存至/etc/sysconfig/iptables文件中
Service iptables restart 会自动从/etc/sysconfig/iptales 重新载入
Centos7
CentOS 7 可用下面方法保存规则
iptables -S > /PATH/TO/SOME_RULES_FILE(保存成;重新载入有点问题)
iptables-save > /PATH/TO/SOME_RULES_FILE
CentOS 7 重新载入预存规则文件中规则:
iptables-restore < /PATH/FROM/SOME_RULES_FILE
-n, –noflush:不清除原有规则
-t, –test:仅分析生成规则集,但不提交
v 开机自动重载规则文件中的规则:
v (1) 用脚本保存各iptables命令;让此脚本开机后自动运行
/etc/rc.d/rc.local文件中添加脚本路径/PATH/TO/SOME_SCRIPT_FILE
v (2) 用规则文件保存各规则,开机时自动载入此规则文件中的规则
/etc/rc.d/rc.local文件添加iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
v (3)自定义Unit File,进行iptables-restore
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/91935