2017 10-17 防火墙设置

一.防火墙概念

(一)安全技术介绍

(1) 入侵检测与管理系统(Intrusion Detection Systems)

  • 特点:是不阻断任何网络访问,量化、定位来自内外网络的威胁情 况,主要以提供报告和事后监督为主,提供有针对性的指导措 施和安全决策依据。一般采用旁路部署方式,主要起到监视的作用。

(2)入侵防御与管理系统(Intrusion Prevention System)

  • 特点:以透明模 式工作,分析数据包的内容如:溢出攻击、拒绝服务攻击、木 马、蠕虫、系统漏洞等进行准确的分析判断,在判定为攻击行 为后立即予以阻断,主动而有效的保护网络的安全,一般采用 在线部署方式,所谓的透明的工作模式就是不阻止正常网络的访问,只是针对有攻击特性的网络访问进行防御

(3)防火墙( FireWall ):

  • 特点:隔离功能,工作在网络或主机边缘, 对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本上 的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略

(二)防火墙的分类

  • 主机防火墙:服务范围为当前主机
    网络防火墙:服务范围为防火墙一侧的局域网 
    硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一 个部分功能基于软件实现,Checkpoint,NetScreen 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件 
    网络层防火墙:OSI下面第三层
    应用层防火墙/代理服务器:代理网关,OSI七层

(三)网络型的防火墙

网络层防火墙

  • 包过滤防火墙 
  • 网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑 ,被称为访问控制列表(ACL),通过检查数据流中每个数据的 源地址,目的地址,所用端口号和协议状态等因素,或他们的组 合来确定是否允许该数据包通过 
    优点:对用户来说透明,处理速度快且易于维护 
    缺点:无法检查应用层数据,如病毒等 例如应用层发来一个50k的病毒数据包,但是网络层的mtu的分片大小只有1500个字节,将病毒数据包分割成很多片,所以无法整合辨析该数据包的类型,也就无法分析是否为病毒数据包

(四)应用层的防火墙

  • 应用层防火墙/代理服务型防火墙(Proxy Service) 
    将所有跨越防火墙的网络通信链路分为两段 
    内外网用户的访问都是通过代理服务器上的“链接”来实现 
    优点:在应用层对数据进行检查,比较安全 
    缺点:增加防火墙的负载
    注意:所谓代理服务防火墙就是防火墙本身会起到代理作用,也就是说当企业内部要访问外部浏览器时,是通过代理服务器防火墙来实现,代理服务器代替用户去访问外部浏览器,而不是转发,这是和路由器工作机制的区别
  • 在实际应用中,应用层防火墙和网络层防火墙是相结合的,既先在网络层中检查网络数据,然后送到应用层去检查数据包的安全性

二.iptables的基本认识

  • 在内核空间,集成在linux内核中,属于netfilter组件
  • 扩展各种网络服务的结构化底层框架 
  • 内核中选取五个位置放了五个hook(勾子) function(INPUT、 OUTPUT、FORWARD、PREROUTING、POSTROUTING), 而这五个hook function向用户开放,用户可以通过一个命令工 具(iptables)向其写入规则 
  • 由信息过滤表(table)组成,包含控制IP包处理的规则集( rules),规则被分组放在链(chain)上 
  • 三种报文流向: 
    流入本机:PREROUTING –> INPUT–>用户空间进程 
    流出本机:用户空间进程 –>OUTPUT–> POSTROUTING 
    转发:PREROUTING –> FORWARD –> POSTROUTING
  • 防火墙工具,iptables本身并不是防火墙,而是一种防火墙工具软件 
    iptables 
    命令行工具,工作在用户空间 
    用来编写规则,写好的规则被送往netfilter,告诉内核如何去处 理信息包

(二)iptables的组成

  • iptables由四个表和五个链以及一些规则组成 
    四个表table:filter、nat、mangle、raw
    filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包
    nat表:network address translation 地址转换规则表
    mangle:修改数据标记位规则表
    Raw:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度
    优先级由高到低的顺序为:raw–>mangle–>nat–>filter 
    五个内置链chain
    INPUT OUTPUT FORWARD PREROUTING POSTROUTING

(1)Netfilter表和链对应关系

《2017 10-17 防火墙设置》 image.png

数据包过滤匹配流程

《2017 10-17 防火墙设置》 image.png

(2)IPTABLES和路由

  • 路由功能发生的时间点 
    报文进入本机后
    判断目标主机是否为本机
    是:INPUT
    否:FORWARD 
    报文离开本机之前
    判断由哪个接口送往下一跳
    《2017 10-17 防火墙设置》 image.png
    内核数据包的传输过程
    当数据包进入网卡时,首先进入prerouting进行检测,来判断该数据包的目的Ip是否发送本机的,如果是发往本机的,就会进入input链,本机进程处理数据后,就会通过output链将数据发送出去,最后经过postrouting发送出去
    如果经过判断数据包的目的ip不是发送本机的,而是转发到别的主机时,则会将数据包送到forward链中,经过内核同意后,流入到postrouting后转发出去

(3)iptables规则

  • 规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文 根据规则定义的处理动作作出处理 
    匹配条件:默认为与条件,同时满足
    基本匹配:IP,端口,TCP的Flags(SYN,ACK等)
    扩展匹配:通过复杂高级功能匹配 
    处理动作:称为target,跳转目标
    内建处理动作:ACCEPT,DROP,REJECT,SNAT,DNAT MASQUERADE,MARK,LOG…
    自定义处理动作:自定义chain,利用分类管理复杂情形 
    规则要添加在链上,才生效;添加在自定义上不会自动生效 
    链chain: 内置链:每个内置链对应于一个钩子函数
    自定义链:用于对内置链进行扩展或补充,可实现更灵活的规 则组织管理机制;
    只有Hook钩子调用自定义链时,才生效

(4)iptables添加要点

  • iptables规则添加时考量点 
    要实现哪种功能:判断添加在哪张表上 
    报文流经的路径:判断添加在哪个链上 
    报文的流向:判断源和目的 
    匹配规则:业务需要 
    链上规则的次序,即为检查的次序,因此隐含一定的法则 
    同类规则(访问同一应用),匹配范围小的放上面 
    不同类规则(访问不同应用),匹配到报文频率较大的放上面 
    将那些可由一条规则描述的多个规则合并为一个 
    设置默认策略 
    实验环境准备: 
    Centos7: systemctl stop firewalld.service systemctl disable firewalld. service 
    Centos6:service iptables stop; chkconfig iptables off

三.iptables命令的应用

首先通过 man 8 iptables去了解一些相关命令的应用
扩展应用 man 8 iptables-extensions来了解

《2017 10-17 防火墙设置》 image.png

iptables -vnL和iptables -vnL -t 指定表来查看

《2017 10-17 防火墙设置》 image.png

(1)filter表中规则的使用

例: iptables -t filter -A INPUT -s 192.168.136.134 -j DROP

解释说明—:-t指定表(不写默认为使用filter表),-A代表增加规则,增加input链,-s代表源地址,-j跳转,将源地址丢弃,就是禁止源地址的访问

《2017 10-17 防火墙设置》 image.png

《2017 10-17 防火墙设置》 image.png

《2017 10-17 防火墙设置》 image.png

当清除策略后,会再次ping通 iptables -F清除策略
ping 成功

《2017 10-17 防火墙设置》

同样用ssh和curl也可以进行测试,其中-j DROP 也可以改为REJECT,拒绝的更直接

iptables -vnL –line-numbers 显示规则序号

《2017 10-17 防火墙设置》 image.png

iptables -I INPUT -s 192.168.136.133 -j ACCEPT——I代表插入的意思,直接加到iptbales表中的第一行,A代表追加,加到最后一行

《2017 10-17 防火墙设置》 image.png

《2017 10-17 防火墙设置》 image.png

指定加到第几行:iptables -I INPUT 2 -s 192.168.136.111 -j ACCEPT——将规则放到第二行

《2017 10-17 防火墙设置》 image.png

删除命令: iptables -D INPUT 6——指定删除第五行命令

《2017 10-17 防火墙设置》 image.png

iptables 匹配条件分类

(1)基本匹配条件:通用条件,不要额外加载模块,在iptables/netfilter中提供
1.-s –source address指定源地址:iptables -A INPUT -s 192.168.136.0/24 -j REJECT,整个网段都拒绝,但是注意设置策略的时候不要将自己也拒绝掉,所以要注意设置的策略
也可以一次写两个地址: iptables -A INPUT -s 192.168.136.170,192.168.136.180 -j REJECT
iptables -A INPUT !-s 192.168.136.180 -j REJECT——加入叹号代表除了180的地址都被拒绝
! -s 192.168.136.0/24 ——除了这个网段都被拒绝

《2017 10-17 防火墙设置》 image.png

2.-d –destination address 指定目标地址: iptables -A INPUT -s 172.18.254.242 -d 172.18.0.107 -j REJECT——指定目标地址
3.-p –protocol protocol 指定规定协议:protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp 参看:/etc/protocols
例: iptables -A INPUT -p icmp -j REJECT——规定icmp协议被拒绝,无法使用Ping命令测试网络连通性

《2017 10-17 防火墙设置》 image.png

但是并不影响别的协议的应用

《2017 10-17 防火墙设置》 image.png

注意:一般情况下很少拒绝tcp协议,因为tcp协议对应的端口和包含的命令很复杂

4.-i –in-interface name 报文流入的接口;只能应用于数据 报文流入环节,只应用于INPUT、FORWARD、PREROUTING链

例: iptables -A INPUT -i eth0 -p icmp -j REJECT:拒绝从eth0这个网卡的ip的icmp协议,如果有两个网卡的话,另一个网卡的icmp协议不被禁止

《2017 10-17 防火墙设置》 image.png

《2017 10-17 防火墙设置》 image.png

5.-o –out-interface name:报文流出的接口;只能应用于数 据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链
例: iptables -A OUTPUT -i eth0 -p icmp -j REJECT:拒绝output链的输出
(2)扩展匹配条件:需要加载模块来实现,MATCH EXTENTIONS

  • 扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so) ,方可生效  查看帮助 man iptables-extensions
    1.隐式扩展方式:在使用-p选项指明了特定的协议时,无需再用-m选项 指明扩展模块的扩展机制,不需要手动加载扩展模块
    《2017 10-17 防火墙设置》 image.png
    (1)tcp协议的扩展选项
    [!] –source-port, –sport port[:port]:匹配报文源端口, 可为端口范围
    [!] –destination-port,–dport port[:port]:匹配报文目标 端口,可为范围
    [!] –tcp-flags mask comp mask 需检查的标志位列表,用,分隔
    例如 SYN,ACK,FIN,RST
    comp 在mask列表中必须为1的标志位列表,无指定则必须 为0,用,分隔
    例: iptables -A INPUT -p tcp –dport 80 -j REJECT
    《2017 10-17 防火墙设置》 image.png
    示例:
    –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
    例:iptables -A INPUT -p tcp –syn -j REJECT——第一次握手被拒绝,拒绝新的连接,但是旧的连接不会断开
    《2017 10-17 防火墙设置》 image.png 无法连接
    (2)udp
    [!] –source-port, –sport port[:port]:匹配报文的 源端口;可以是端口范围
    [!] –destination-port,–dport port[:port]:匹配报 文的目标端口;可以是端口范围
    应用协议:dns和DHCP使用udp协议
    (3) icmp
    [!] –icmp-type {type[/code]|typename}
    type/code
    0/0 echo-reply icmp应答
    8/0 echo-request icmp请求
    例:iptables -A INPUT -p icmp –icmp-type 8 -j REJECT——拒绝请求包,也就说明回应包也被拒绝
    2.显式扩展:必须使用-m选项指明要调用的扩展模块的扩展 机制,要手动加载扩展模块 [-m matchname [per-match-options]]
    (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 192.168.136.134 -p tcp –mutiport –dports 22,80 -j REJECT
    (2)iprange扩展 指明连续的(但一般不是整个网络)ip地址范围
    [!] –src-range from[-to] 源IP地址范围
    [!] –dst-range from[-to] 目标IP地址范围
    iptables -A INPUT -m iprange –src-range 192.168.136.134-192.168.136.180 -p tcp -m –mutiport –dports 22,80 -j REJECT
    (3)mac扩展 指明源MAC地址
    适用于:PREROUTING, FORWARD,INPUT chains
    [!] –mac-source XX:XX:XX:XX:XX:XX
    例:iptables -A INPUT -m mac –mac-source 00:0c:29:67:c2:8b -p tcp-m –mutiport –dports 22,80 -j REJECT
    (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 -m string –algo bm –string “magedu” -j REJECT
    《2017 10-17 防火墙设置》 image.png
    (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指定本地时区(默认)
    《2017 10-17 防火墙设置》 image.png
    例:iptables -A OUTPUT -m time –timestart 01:00 –timestop 09:30 string –algo bm –string “magedu” -j REJECT——在这个时间段无法访问magedu.com,超过这个时间后就可以访问
    《2017 10-17 防火墙设置》 image.png
    更加完全的设置:
    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
    (6)connlimit扩展
    根据每客户端IP做并发连接数数量匹配
    可防止CC(Challenge Collapsar挑战黑洞)攻击
    –connlimit-upto n:连接的数量小于等于n时匹配
    –connlimit-above n:连接的数量大于n时匹配 通常分别与默认的拒绝或允许策略配合使用
    示例:iptables -A INPUT -p tcp –dport 22 -m connlimit –connlimit-above 1 -j REJECT
    解释:阻止并发连接的次数,不论是哪个源地址并发连接的次数都不能超过一次,超过一次以上就被拒绝,拒绝的是tcp端口的22端口,拒绝ssh的连接
    《2017 10-17 防火墙设置》 image.png
    第二次连接就会被拒绝
    (7)limit扩展
    基于收发报文的速率做匹配
    令牌桶过滤器
    –limit rate[/second|/minute|/hour|/day]
    –limit-burst number
    例:
    iptables -I INPUT -p icmp –icmp-type 8 -m limit –limit 10/minute –limit-burst 10 -j ACCEPT
    iptables -I INPUT 2 -p icmp -j REJECT——配合上述命令使用,代表含义是不符合上述条件的都被拒绝,而且该规则的位置应该在上述规则的下面,否则全都被拒绝,一定要注意顺序问题
    《2017 10-17 防火墙设置》 image.png
    《2017 10-17 防火墙设置》 image.png
    (8)state扩展
    根据”连接追踪机制“去检查连接的状态,较耗资源 
    conntrack机制:追踪本机上的请求和响应之间的关系 
    状态有如下几种:
    NEW:新发出请求;连接追踪信息库中不存在此连接的 相关信息条目,因此,将其识别为第一次发出的请求 ESTABLISHED:NEW状态之后,连接追踪信息库中为 其建立的条目失效之前期间内所进行的通信状态 RELATED:新发起的但与已有连接相关联的连接,如: ftp协议中的数据连接与命令连接之间的关系 INVALID:无效的连接,如flag标记不正确 UNTRACKED:未进行追踪的连接,如raw表中关闭追踪
    例:
    iptables -A INPUT -p tcp –dport 22 -m state –state ESTABLISHED -j ACCEPT:此规则的定义代表原来的连接保持
    iptables -A INPUT -p tcp –dport 22 -m state –state NEW -j REJECT:新建立的SSH连接就拒绝
    两个规则的定义一般配合使用,并且最好是旧连接的规则定义写在前面,新新建立的连接协议写在后面,这样节省资源
    《2017 10-17 防火墙设置》 image.png
    已经追踪到的并记录下来的连接信息库 /proc/net/nf_conntrack
    《2017 10-17 防火墙设置》 image.png
    调整连接追踪功能所能够容纳的最大连接数量 /proc/sys/net/nf_conntrack_max 
    《2017 10-17 防火墙设置》 image.png
    调整最大连接数量:
    vim /etc/sysctl.conf
    net.nf_conntrack_max = 393216
    net.netfilter.nf_conntrack_max = 393216
    调整连接超时时间:
    net.netfilter.nf_conntrack_tcp_timeout_established = 300 ——建立连接时间最大为300s
    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 ——通知对方等待关闭连接的时间
    不同的协议的连接追踪时长 /proc/sys/net/netfilter/
    《2017 10-17 防火墙设置》 image.png
    注意:CentOS7 需要加载模块: modprobe nf_conntrack
    lsmod |grep nf_conf——查看加载的模块
    《2017 10-17 防火墙设置》 image.png

开放被动模式的ftp服务

(1) 装载ftp连接追踪的专用模块:
跟踪模块路径:/lib/modules/kernelversion/kernel/net/netfilter
vim /etc/sysconfig/iptables-config
配置文件 IPTABLES_MODULES=” nf_conntrack_ftp “
加载 modproble nf_conntrack_ftp模块 

《2017 10-17 防火墙设置》

(2) 放行请求报文:
命令连接:NEW, ESTABLISHED
数据连接:RELATED, ESTABLISHED
设置规则:
iptables -A INPUT -s 192.168.136.1 -j ACCEPT——先保证windows的连接
ipatbles -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT——接受已经建立的连接和相关联的连接
iptables -A INPUT -p tcp –dport 21 -m state –state NEW -j ACCEPT——新建立的连接,并走21目标端口的tcp协议接受连接
iptables -A INPUT -j REJECT——其他连接全部拒绝
设置完成后,进行测试
在另一台主机上:ftp 192.168.136.170

《2017 10-17 防火墙设置》 image.png

其他协议无法访问:curl 192.168.136.170

《2017 10-17 防火墙设置》 image.png

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 192.168.136.134 -p tcp -m multiport –dports 80,21,22,23 -m state –state NEW -j LOG –log-prefix “new connections:”
在客户端用curl命令测试一下

《2017 10-17 防火墙设置》 image.png

《2017 10-17 防火墙设置》 image.png

补:相关链管理的应用:
-N:new, 自定义一条新的规则链
iptables -N deny_invalid_packect

《2017 10-17 防火墙设置》 image.png

iptables -A deny_invalid_packect -p tcp –tcp-flags ALL ALL -j REJECT——将标记位都是1的连接跳转到deny链中,进行匹配检查

iptables -A deny_invalid_packect -p tcp –tcp-flags ALL NONE -j REJECT——将标记位都是0的连接跳转到deny链中,进行匹配检查

iptables -A INPUT -s 192.168.136.0/24 -j deny_invalid_packect——将INPUT链与自定义的链相关联,只要下次有源地址来访问,就跳转到自定义规则中进行检查匹配

-X:delete,删除自定义的空的规则链

删除不能直接ipatbles -X deny_invalid_packect

《2017 10-17 防火墙设置》 image.png

iptables -F deny_invalid_packect

iptables -F INPUT

iptables -X deny_invalid_packect

《2017 10-17 防火墙设置》 image.png

练习:

iptables -N deny_icmp_ssh——建立新的规则链
iptables -A deny_icmp_ssh -s 192.168.136.134 -p tcp –dport 22 -j REJECT——设定规则,只要是192.168.136.134这个主机的tcp协议来访问本机的22端口就拒绝
ipatbles -A deny-icmp_ssh -s 192.168.136.180 -p icmp -j REJECT——只要是192.168.136.180这个主机来访问就禁止Ping命令
ipatbles -A INPUT -s 192.168.136.134,192.168.136.180 -j deny_icmp_ssh——input与自定义链相关联,只要是这两个ip来访问就跳转到自定义的链上,并分析后拒绝对应的ssh连接和ping
-P:Policy,设置默认策略;
对filter表中的链而言,其默认策略有:
ACCEPT:接受
DROP:丢弃
如果将默认策略改为DROP
iptables -P INPUT DROP
此时无法用ipatbles -F来进行清空,因为设置的是新的默认链且为drop,如果想要修改就要通过iptables -P INPUT ACCEPT来修改回来
如果一定要设置一个默认的拒绝规则可以通过 iptables -A INPUT -j REJECT来实现,并且该规则也可以通过ipatbles -F来清空
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名, 也不能被删除

    原文作者:楠人帮
    原文地址: https://www.jianshu.com/p/cf6341e15958
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞