注: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区域所指定的服务。

根据上述的配置,可以描述出来如下的规则。
- 浮动规则,用于测试网络连通性,在全部区域放行icmp协议。
创建的时候,设置流量为双向,协议为ICMP,其余全部为Any,然后点击确定,完成创建。

- 在WAN接口上开启WEB和SSH管理策略,用于模拟环境中管理防火墙。(生产环境禁止在wan接口开放)。
在WAN口的策略上配置两条策略,第一条源地址和源端口为Any,目标地址为WAN网络,目标端口为http的策略。第二条跟其一条相同,只有目标端口修改为ssh。

- 阻断DMZ去往LAN区域的流量,LAN区域全部放行流量。在配置的时候,在LAN接口的内网IN方向配置一条策略,设置源地址为DMZ区域的网络,目标地址为Any,目标端口也为Any动作为拒绝,然后将这一条策略移动到默认策略的最前面。

- 在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)