从0到1搭建企业级边界防火墙:OPNsense+DMZ隔离+强制门户+Suricata IPS实战指南

注:1章节截图中,因为环境重置问题,截图中IP跟文中表述IP可能存在出入!

OPNsense 是一款基于 FreeBSD 和 HardenedBSD 构建的开源、企业级防火墙及路由操作系统。它最初于 2015 年从 pfSense 分支出来,核心定位是为中小型企业、数据中心及高级家庭网络提供网络边界安全防护、流量调度与核心路由服务。

本文使用OPNsense作为企业的边界防火墙,使用Linux作为企业DMZ服务区,使用Windows模拟企业内网,构建完整的一个企业网络,网络拓扑如下。

1. opnsense的初始化

1.1 opnsense的网卡的构建

(1)在Vmware创建Vyos-opn的桥接LAN区段用于模拟内网的网段,然后继续创建DMZ2的桥接网卡用于模拟靶场服务器和opnsense连接,最后WAF使用NAT网卡实现互联网的连接。

(2)在创建好的opnsese上将两张网卡绑定,用于模拟opnsense的内外网网段。

1.2 opnsense的安装

创建虚拟机,完成opnsense的安装。

(1)创建完成虚拟机之后,在上面绑定网卡,然后点击启动虚拟机,等待虚拟机进行启动。

(2)第一次启动之后使用installer用户,密码为opnsense进入到安装页面进行安装。首先进入安装模式选择页面在键盘布局中选择默认布局,然后回车继续下一步。

(3)进入到系统的硬盘安装模式的选择中,因为本次环境为测试虚拟机,所以直接选择ZFS,然后进入到下一步。

(4)进入到安装raid的选择中,本文不使用raid进行安装,选择默认选项,然后点击下一步。

(5)进入到磁盘选择选项,使用空格键选择当前磁盘,然后进入下一步开始安装。

(6)进入到确认安装页面,移动选项卡到YES然后开始安装。

(7)进入到安装进度页面,等待安装完成。

(8)安装完成之后,系统进入到密码修改选项,本文不对系统的密码在安装界面进行修改,然后选择第二个选项,完成安装。

(9)在系统的退出选项中选择重新启动系统,然后等待系统的重新启动。

1.3 opnsense的初始化

(1)首次安装等待系统启动成功之后,使用root账户(默认密码为opnsense)登录到系统。

(2)系统默认会有网卡配置选项,首先根据拓扑图对网卡进行LAN和WAN的绑定,在绑定之前规定系统连接靶场区域的接口为LAN接口,连接Vyos上层网络设备的为LAN接口。在选择界面输入1进入到网卡分配选项。然后在LAGGS和VLAN的选择上全部选择NO选项。

(3)进入到设定网卡选项,可以根据MAC地址和网卡连接的不同LAN区段来确定那个网卡属于那个区段,并且输入到对应系统的选项中。然后在确认选项中输入Y等待系统配置。

(4)系统配置网卡完成。

1.4 Opnsense IP地址的配置

接口配置完成之后开始进行IP地址的配置,在菜单选择中输入2开始配置IP地址。

(1)进入到网卡选择选项,首先在配置WAN网卡的IP地址,选择1,然后继续下一步,开始DHCP的配置,本文没有DHCP,所以选择N,然后根据拓扑输入IP地址和掩码。

(2)在网关选项上,选择默认,然后进入下一步,开始IPV6相关的配置,本文环境对IPV6不进行配置,然后选择N,继续下一步,关闭IPV6DHCP的获取,并且在IPV6中输入空地址。

(3)然后在WAN接口上不开启Web,最后完成配置。

(4)使用相同的方法对LAN接口进行配置,其中配置内容为不开启DHCP服务,配置IPV4地址,不配置IPV6的相关配置,并且开启Web页面服务。

(5)此时在LAN区域域的机器可以通过Web去管理opnsense了。

(6)其他Windows主机和Linux主机安装方式不再演示,等待安装完成之后,将Windows主机网卡设置为LAN区段,区段名字为LAN。将Linux主机网卡设置为LAN区段,区段名字为DMZ2。

2. opnsense基础配置

    在基本的配置全部设置完成之后,需要对系统进行基本的配置,配置分为以下几步。

    2.1 opnsense基础系统配置

      (1)在opnsense上进行基础的配置,设置内网和外网的IP地址,之后使用LAN区段的主机登录opnsense进行基础配置。首先在系统里面-常规里面,修改时区为上海,修改主机名字,然后修改语言为中文,然后点击保存。

      (2)配置完成基本设置之后,在防火墙的规则页面中新增一条ICMP协议的浮动规则,设置源地址,目的地址是所有,协议为ICMP协议,动作为Permit。

      (3)然后创建网关,设置WAN接口上游的地址为网关,并且勾选上游网关选项。完成之后将所有的路由指向上层的网关的地址,完成基本路由配置。

      (4)在接口设置中,找到WAN接口,取消勾选拦截私有网络和拦截bogon网络,因为是模拟网络,如果不取消勾选会导致网络故障。

      2.2 opnsense服务配置

      2.2.1 内网DHCP的配置

          正常在企业内网区域,一半都需要接入办公终端,所以在企业的内网的区域需要部署DHCP服务实现终端的自动获取IP地址。在opnsense中有两种配置方式,第一种为Dnsmasq另一种为 Kea DHCP。

          Dnsmasq面向的是轻量级、全能一体化路线,而Kea DHCP是为了取代早期版本的ISC DHCPd,专门面向高可用、高性能与企业级模块化打造的现代DHCP解决方案。本文因为是模拟环境,则只用Dnsmasq作为内网的DHCP服务器,配置步骤如下:

          (1)打开Dnsmasq,在常规选项卡中,勾选启用选项,然后再接口上选择LAN接口,对应拓扑中的内网接口。

          (2)在DHCP范围里面,创建一个地址池,设置开始地址和结束地址,然后点击确定完成创建。

          (3)然后在内网的客户端Windows上打开查看,发现已经自动获取到了地址。

          2.2.2 内网NAT的配置

            当内网需要访问互联网的时候,需要开启默认的NAT选项,其中opnsense默认已经开启了自动NAT让内网的机器可以访问到互联网,但是在实际业务里面一半情况下为了针对DMZ区域的攻击,所以一般不开放DMZ区域的NAT选项,在本文的配置中需要将其关闭。

            (1)找到防火墙,NAT,出站选项,然后查看发现已经自动开启了NAT服务,并且放行了需要的OPT1网络。

            (2)修改NAT网络模式为手动模式,只在WAN接口放行LAN网络和Loopback网络,保证只有内网可以访问互联网。

            (3)此时内网区域不受影响,但是DMZ区域无法上网。

            2.2.3 内网认证配置

              强制门户是一种网络访问控制机制。当未授权的终端连接到网络并尝试上网时,网关防火墙会强行拦截其 HTTP/HTTPS 流量,将其重定向到一个特定的网页,要求用户完成认证、同意使用协议或输入凭据后,才放行互联网访问权限。

              在企业里面,员工或学生使用工号/学号登录,实现认证并且区分权限然后记录记录网络行为。在文本中需要配置内网区域的安全认证,只有通过用户认证的终端才可以访问互联网。

              (1)首先在服务里面,展开强制门户选项,打开管理选项卡,选择右下角下载模板选项,点击下载默认模板。

              (2)然后点击增加模板,将默认模板上传到系统中。

              (3)然后回到强制门户,区域选项卡,勾选启用选项,选择接口为LAN,然后使用认证后端为本地数据库,超时

              (4)设置超时时间和空闲时间为30分钟,其余保持默认即可。

              (5)然后点击保存完成强制门户的配置,其中模板文件为标准的前端文件,所以可以按照需求进行渲染和修改,本文不再进行演示。

              (6)配置完成之后,在系统,访问选项卡中,点击用户,然后点击保存,完成添加。创建一个普通用户用于用户认证。(如果需要使用域服务,或者其他认证服务,需要在认证服务器中进行配置)。

              (8)在内网中打开浏览器,访问互联网的时候,则自动弹出需要认证的页面。

              (9)输入用户名密码,点击登录完成认证,系统可以自动进行跳转。

              3. opnsense安全配置

                OPNsense 的防火墙并非简单的“黑名单/白名单”,而是基于Packet Filter内核组件构建的有状态防火墙。

                在系统内部,当允许一条出向请求通过时,pf 会在状态表中动态记录该 TCP/UDP 会话的元数据,然后外部服务器返回的应答包会被状态表直接命中匹配,无需在 WAN 口单独写一条“允许外部返回流量”的规则。这保证了内网对外的安全性。

                3.1 防火墙的规则执行顺序与匹配逻辑

                  首条命中即终止:在 OPNsense 的 Web 界面中,防火墙规则从上到下按顺序逐行比对。一旦数据包命中某一规则的条件,系统立即执行对应动作(Pass/Block/Reject),不再继续向下扫描。

                  规则层级权:浮动规则优先级大于接口组规则优先级大于单一接口规则。

                  默认终结规则:所有未被任何规则显式命中的入向流量,底层默认统一予以丢弃。

                  3.2 防火的规则配置

                    在本文所描述的网络中,网络被分成了三个区域,外部非信任区域,以及内网信任区域和服务器DMZ区域,其中所以在防火墙的配置中,应该做到内网可以自由的访问互联网区域,但是根据策略去访问DMZ区域。DMZ区域不可以访问内网区域,并且非信任区域根据策略去访问DMZ区域所指定的服务。

                    根据上述的配置,可以描述出来如下的规则。

                    1. 浮动规则,用于测试网络连通性,在全部区域放行icmp协议。

                    创建的时候,设置流量为双向,协议为ICMP,其余全部为Any,然后点击确定,完成创建。

                    1. 在WAN接口上开启WEB和SSH管理策略,用于模拟环境中管理防火墙。(生产环境禁止在wan接口开放)。

                    在WAN口的策略上配置两条策略,第一条源地址和源端口为Any,目标地址为WAN网络,目标端口为http的策略。第二条跟其一条相同,只有目标端口修改为ssh。

                    1. 阻断DMZ去往LAN区域的流量,LAN区域全部放行流量。在配置的时候,在LAN接口的内网IN方向配置一条策略,设置源地址为DMZ区域的网络,目标地址为Any,目标端口也为Any动作为拒绝,然后将这一条策略移动到默认策略的最前面。
                    1. 在DMZ区域上放行来自LAN接口的访问服务的流量(内网需要访问DMZ区域NAS服务器10.2.2.10的SSH服务)。在配置的时候,只需要在DMZ区域的接口OPT1上创建一个防火墙策略,设置方向为in,源地址为LAN地址,设置目标地址为10.2.2.10,目标的端口为22端口,动作为放行。

                    3.3 防火墙排错

                      在配置防火墙规则,尤其拒绝规则的时候,需要给规则设置详细的描述信息,在后期如果设置到排错的时候,可以快速定义,当数据需要经过opnsese,并且网络不可达的时候,可以打开防火墙,日志,实时情况来查看数据是否被策略阻止。

                      也可以在防火墙,诊断,然后状态里面看到当前所有的会话信息,地址信息等,方便进行日常的排错。

                      3.4 入侵检测配置

                        OPNsense的入侵检测模块提供了两种模式,一种是IDS和IPS,其中IDS是监控经过它的所有流量,当匹配到规则的流量的时候,他向系统发出警告但是不会阻断流量的转发。而IPS更近一步,它通过检查经过防火墙的流量,当匹配到它的规则的时候,可以直接将该数据包进行丢弃,从而保护系统的安全。

                        3.4.1 入侵检测的基本配置

                          (1)在配置的时候,进入到服务,入侵检测,管理页面。在常规选项卡中,勾选启用规则。然后在模式里面,有提供了三个选项在部署的时候根据实际的业务进行选择。

                          • PCAP live mode (IDS):纯旁路检测模式,不阻断。基于传统的libpcap库进行抓包监听,网卡接收到数据包后,把报文复制一份送给Suricata引擎分析,原本的数据包继续正常由内核路由转发。一般在初次部署上线、排查误报、或者只需要安全审计/告警而不想冒断网风险的场景。
                          • Netmap (IPS):内核旁路高速内联模式,使用 FreeBSD 专门的高性能网络框架 Netmap。Netmap 直接绕过操作系统的网络协议栈,在网卡硬件环形缓冲区和 Suricata 之间建立高速零拷贝通道。Suricata 串联在数据流正中间,审核通过才放行给系统内核。当数据命中 drop 规则的报文直接在网卡环形队列被丢弃,性能损耗极小、吞吐量极高。
                          • Divert (IPS):基于 PF 防火墙引流模式,基于 FreeBSD 内核的 ipdivert 机制与 OPNsense 的 PF 防火墙协同工作。数据包先进入系统防火墙,防火墙通过 divert-socket 将数据包“转交(Divert)”给用户态的 Suricata 引擎检查,Suricata 判定正常后再注入回系统协议栈继续传输。它具备极高的兼容性,但是会消耗部分性能,因为数据包经过了内核到用户态的转交和重新注入,在高并发万兆大流量下 CPU 占用比 Netmap 略高。

                          因为本文环境使用虚拟化,所以模式选择使用Netmap (IPS)选项。并且设置接口为LAN和OPT1。在检测模式上选择使用默认模式。在日志选择上,本次环境不选择开启,最后点击应用。

                          (2)在下载选项卡中默认有一部分规则集合,是opnsense默认下发的规则。在首次部署入侵检测的时候,点击启用规则之后,进入下载选项卡,可以下载自己需要的规则。

                          (3)OPNsense官方提供的默认规则主要有恶意IP与僵尸网络拦截库,恶意网址与木马 Payload 防护以及漏洞利用与黑客攻击防御这几个大类别。在一般家庭和小企业中主要部署下面这几个。

                          推荐勾选规则保护重点
                          ET open/botcc.portgrouped拦截失陷木马回连 C2
                          ET open/drop & ET open/dshield屏蔽全球公认高危恶意 IP 段
                          abuse.ch/URLhaus拦截恶意下载与木马分发链接
                          abuse.ch/Feodo Tracker深度封禁主流银行木马与僵尸网络
                          ET open/emerging-scan告警/拦截对端口的暴力探测
                          ET open/emerging-exploit拦截常见已知漏洞的利用报文

                          (4)勾选这些推荐策略然后点击启用,等待策略下载完成。然后再规则里面可以看到当前所有策略的规则。

                          (5)因为官方的规则默认是警报操作,这种操作实惠记录但是不会拦截,所以还需要手动编辑操作为阻止。

                          (6)最后点击应用完成基本规则的配置,然后当策略匹配到并且被记录时候,再警报选项卡里面就能正常看到规则了。

                          3.4.2 自定义规则部署

                            当给定的规则不满足用户的实际需求的时候,就需要使用自定义规则来进行自定义。在OPNsense中,入侵检测核心是使用Suricata系统。所以在用户自定义规则的时候,定义的规则和核心的语法全部支持Suricata 规则的标准语法结构。

                            自定义规则能够针对特定的威胁特征进行定向告警或阻断。OPNsense 主要提供了两种配置自定义规则的方式:Web 控制台交互式配置与 底层本地规则文件加载。

                            • Suricata 规则的标准语法结构
                            参考文档:
                            https://docs.suricata.io/en/latest/quickstart.htmlCode language: JavaScript (javascript)

                            无论是通过哪种方式编写,Suricata 规则都遵循统一的标准语法:

                            action protocol source_ip source_port dest_ip dest_port (options)
                            • Action(动作)
                            • Protocol(协议):支持 tcp、udp、icmp、ip、http、tls、dns 等应用层或传输层协议。
                            • IP 与端口:
                              • 支持单个 IP,子网,或者变量。
                              • 端口支持单端口,范围,取反或any。
                            • Direction(方向):通常用 -> 表示单向流量匹配;<> 表示双向流量匹配。
                            • 规则选项(Options):

                            rev:…;:规则版本号(从 rev:1; 起步)。

                            • 添加自定义规则

                            在 OPNsense 的 Web 界面中,规则选项卡中,使用新建自定义规则,只能只用于创建这种“基于 SSL 证书指纹/Hash 拦截”的轻量规则,系统并没有在网页端提供直接输入整行 Suricata 规则语句的输入框,所以只能使用ssh登录到系统中进行添加。

                            (1)登录到ssh,进入 Suricata 的规则存放目录,新建一个名为 custom.rules 的文件。

                            cd /usr/local/etc/suricata/rules
                            vi custom.rules

                            (2)创建一条检测SQLMAP的规则,当匹配到User-Agent中包含sqlmap的时候,弹出警告。

                            alert http $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"CUSTOM SCANNER sqlmap User-Agent Detected"; flow:to_server,established; http.user_agent; content:"sqlmap"; nocase; classtype:attempted-recon; sid:1000011; rev:1;)Code language: PHP (php)

                            (3)最后测试规则语法,确保没有拼写错误导致服务崩溃。

                            suricata -T -c /usr/local/etc/suricata/suricata.yaml

                            (4)回到OPNsense Web管理界面,在入侵检测,管理选项卡中,点击页面底部的 应用,系统会自动扫描并加载 custom.rules。

                            (5)点击进入规则选项卡,在搜索框输入1000011或CUSTOM,能检索到这条规则且状态为激活,即代表加载成功。

                            (6)上述规则只检测不信任地址到内网服务器的,这个变量的核心位置在suricata.yaml中,可以使用以下命令查看。

                            grep -A 25 "vars:" /usr/local/etc/suricata/suricata.yamlCode language: JavaScript (javascript)

                            (7)在本文实验中内网中部署了DMZ网站,但是因为模板问题,不想让所有人范围跟我DMZ区域的robots.txt文件,所以可以定义规则,检测有没有包含robots.txt。如果匹配到就丢弃。然后测试规则语法,确保没有拼写错误导致服务崩溃。

                            drop http any any -> 10.2.2.10 80 (msg:"CUSTOM SCANNER Block robots.txt Access Attempt"; flow:to_server,established; http.uri; content:"/robots.txt"; startswith; endswith; nocase; classtype:attempted-recon; sid:1000031; rev:1;)Code language: JavaScript (javascript)

                            (8)在默认没有加载之前,尝试访问发现网络全部正常,使用浏览器访问DMZ服务器的robots.txt可以正常访问。

                            (9)进入WEB页面,在入侵管理模块管理选项卡中点击应用,重启入侵检测服务,再次访问发现访问已经被阻止。

                            (10)登录OPNsense的入侵检测页面,在警报选项卡中发现被策略阻止的信息。

                            (11)如果上述步骤发现不生效,则可以手动重启入侵防护服务。或者重启系统。

                            #停止服务
                            /usr/local/etc/rc.d/suricata stop
                            # 重新生成并加载配置模板
                            configctl template reload OPNsense/IDS
                            
                            # 正常启动 IDS
                            /usr/local/etc/rc.d/suricata startCode language: PHP (php)
                            暂无评论

                            发送评论 编辑评论

                            
                            				
                            |´・ω・)ノ
                            ヾ(≧∇≦*)ゝ
                            (☆ω☆)
                            (╯‵□′)╯︵┴─┴
                             ̄﹃ ̄
                            (/ω\)
                            ∠( ᐛ 」∠)_
                            (๑•̀ㅁ•́ฅ)
                            →_→
                            ୧(๑•̀⌄•́๑)૭
                            ٩(ˊᗜˋ*)و
                            (ノ°ο°)ノ
                            (´இ皿இ`)
                            ⌇●﹏●⌇
                            (ฅ´ω`ฅ)
                            (╯°A°)╯︵○○○
                            φ( ̄∇ ̄o)
                            ヾ(´・ ・`。)ノ"
                            ( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
                            (ó﹏ò。)
                            Σ(っ °Д °;)っ
                            ( ,,´・ω・)ノ"(´っω・`。)
                            ╮(╯▽╰)╭
                            o(*////▽////*)q
                            >﹏<
                            ( ๑´•ω•) "(ㆆᴗㆆ)
                            😂
                            😀
                            😅
                            😊
                            🙂
                            🙃
                            😌
                            😍
                            😘
                            😜
                            😝
                            😏
                            😒
                            🙄
                            😳
                            😡
                            😔
                            😫
                            😱
                            😭
                            💩
                            👻
                            🙌
                            🖕
                            👍
                            👫
                            👬
                            👭
                            🌚
                            🌝
                            🙈
                            💊
                            😶
                            🙏
                            🍦
                            🍉
                            😣
                            Source: github.com/k4yt3x/flowerhd
                            颜文字
                            Emoji
                            小恐龙
                            花!
                            上一篇