之前我使用的无线路由器是 RT1900ac,其内置了 QoS 和 IDS/IPS 功能,但由于 CPU 性能有限,在百兆宽带的情况下,两者均会对网络性能造成一定的影响。
前段时间,群晖在 DSM 中推出了 Virtual Machine Manager 工具,可以在 NAS 中运行虚拟机。由于我的 NAS 中恰好有两个以太网接口,就准备在 NAS 中,通过虚拟机实现软路由,并体验一下这两项功能。
简单了解和试用 RouterOS, OpenWrt x86, VyOS, pfSense 等软路由系统后,考虑到功能丰富程度和易用性,最终选择了 pfSense.
本文主要记录我的 pfSense 关键配置。由于大多数配置在网上都能找到完整的配置步骤,文章中将不会过于详细地介绍配置步骤。
注意:
由于 NAS 的操作系统会经常进行更新和重启,一部分设置也需要重启设备才能生效,采用本文的方法将 pfSense 运行在虚拟机里,NAS 重启会导致整个网络故障;且 NAS 进行文件索引、视频转码等操作的过程中需要消耗大量 CPU 资源,一定程度上会影响网络性能。建议还是使用独立的设备来运行 pfSense。
QoS
家中的 NAS 上经常进行 PT 下载,另外还有一台迅雷的玩客云,两个设备经常占满上传带宽。使用 RT1900ac 路由器的时候,想开 QoS,降低 BT/PT 协议、以及玩客云设备的优先级,但发现打开 QoS 之后,CPU 负载过高,甚至影响到了整体网速。
对于软路由来说,性能就不会是大问题了。在 pfSense 上,我首先尝试了使用 FAIRQ + CoDel 的方式,来模拟 fq_codel 实现流量整形,而不需要手动配置复杂的规则。如果体验一段时间后,发现效果不太理想,再尝试手动配置规则。
参考资料:
- HOW I MAXIMIZED THE SPEED OF MY NON-GIGABIT INTERNET CONNECTION (我的配置主要参考本文)
- 可能是家庭路由里最好的QoS——在线游戏者的福音
- Playing with fq_codel in 2.4 (pfSense 采用的 FreeBSD 内核已支持 fq_codel,但 UI 上暂时无法设置。考虑到稳定性等因素,我这次暂不手动设置)
- Traffic shaping/prioritization in PfSense
- Topic: Traffic shaper question
- QoS – Hack Sphere Labs Wiki
- CODELQ: PFSENSE
- Bufferbloat.net
- QUEUEING IN THE LINUX NETWORK STACK
- Controlling Queue Delay
Suricata IDS
Suricata 基础设置
Suricata 是一款 IDS/IPS 工具,能够检测网络中可疑的流量,例如下载恶意软件、端口扫描等。在 RT1900ac 上,Intrusion Prevention 工具也是基于 Suricata 的,但由于这款路由器内存太小,运行后占用资源过多,影响网速。
由于 pfSense 相对于 RouterOS 等操作系统,更侧重于防火墙,所以已经有功能较为全面的 Suricata 软件包,除了命令行工具外,还能在网页上方便地进行配置、更新规则、查看告警等。安装后即可使用。
参考资料:
使用 Kibana 可视化 Suricata 日志
RT1900ac 上的 Intrusion Prevention,拥有比较漂亮的 GUI 界面,能够将 Suricata 状态信息、攻击来源等以直观的形式显示出来。对于 pfSense,想要这样的功能,就需要其他工具了。
经过查找,我发现了 kibana 工具,能够分析 Suricata 的日志信息,并对日志信息进行可视化。初步看来,其可视化的界面效果比 Intrusion Prevention 还要好。
由于 kibana 及相关的工具安装较为复杂,暂时没有可以一键使用的 Docker 镜像,所以暂时还没有配置安装完毕。准备在 NAS 上再开一台 Ubuntu Server 虚拟机,运行 kibana,并尝试在后面有时间的时候,制作一个整合了 Syslog Server、ELK Stack 的 Docker 镜像,使 kibana 直接在 Docker 容器中运行。
Update(2018-06-15):
已制作了一个 Docker 镜像,能够直接收集 pfSense 和 Suricata 的日志信息,并可视化。具体请参考:https://github.com/blanboom/docker-elk-suricata
参考资料:
- pf (Firewall logs w/Suricata) + Elasticsearch + Logstash + Kibana
- Pfsense, Suricata and Kibana
- PFSense Snort Logstash
- StamusNetworks/Amsterdam: Docker based Suricata, Elasticsearch, Logstash, Kibana, Scirius aka SELKS
- Containerizing my NSM stack — Docker, Suricata and ELK
- Elasticstack (ELK), Suricata and pfSense Firewall – Part 2: Elasticstack Installation and Config
- pf (Firewall logs w/Suricata) + Elasticsearch + Logstash + Kibana
- sebp/elk – Docker Hub (适用于 Synology NAS 的版本:andig/syno-elk-docker)
流量监控
在我的 pfSense 中,安装有 ntopng 和 bandwidthd,用于监控网络中各个设备的流量。其中,bandwidthd 用于快速查看各设备的流量使用情况,ntopng 则提供了更为详细的流量使用信息。
NAT 设置
对于部分需要在内外网使用同一个 IP 访问的服务,需要在内网 LAN 口,通过 WAN 口 IP 地址,访问已经映射到公网的服务。对于之前的路由器,默认就可以在 LAN 口直接访问 WAN 口 IP,但在 pfSense 中,需要做一下特殊的设置,具体见这篇文章:
留言
您好,请问使用 pfSenese 的软路由系统如何实现科学上网?
这个我没有尝试过……
求问您的elk镜像需要多少M内存?毕竟实用的elasticsearch 都要起码好几个G甚至几十个G内存
我的 NAS 加内存到了 12G,我自己用的时候,大概占用 2G 内存。不过这个镜像只是我自己随便用用的,没有做过特殊优化,而且没有一直维护下去。目前我已经不再用这种方式监控家庭网络了。