Pritunl+反向代理打造安全远程接入网关:从端口暴露到统一入口
刚开始接手这家公司的远程接入需求时情况其实挺狼狈的。财务系统、内部文档、代码仓库各开了一堆公网端口运维同学为了省事甚至把远程桌面端口直接暴露在公网安全组里结果就是三天两头被扫描、被爆破。我当时的任务很简单把远程办公这件事变得安全、统一、可管理。最终落地的一套框架可以概括为“Pritunl 远程办公安全接入网关 前置流量网关”也就是现在很多人常说的反向接入层。这篇文章是我完整搭建过程的实践记录包含服务器规划、初始化、用户与访问策略、前置网关配置、日常安全加固以及几个真实踩过的坑。适合正在做企业远程接入改造的运维、网管以及希望自己掌控远程接入基础设施的中小型团队。1. 为什么我会把“远程接入”单独拆成一个项目来做1.1 暴露公网端口的日子我实在过够了最早那家公司并不是没有远程办公能力恰恰相反能远程的方式太多了有人直接开远程桌面有人把数据库管理工具映射到公网还有人为了访问内网 Git 仓库干脆把整个内网段做了路由打通。听起来很方便实际上就是一个千疮百孔的门。我记得有一次安全扫描报告出来后发现办公网里有十几台机器的远程桌面端口是对全互联网开放的。没过多久其中一台就被暴力破解成功随后被装上了挖矿程序CPU 直接跑满。那次事件之后公司才意识到一个问题远程办公最大的难点不是“能不能连上”而是“怎么只让该连的人连上并且整个过程可审计、可追溯”。传统方案里每个内网系统都各自处理外部接入等于把安全责任分散到了每个业务系统身上只要有一个系统配置不严谨整个内网就存在突破口。而我想要的是先把所有远程接入请求集中到一个统一的门口让这个门口负责身份认证、加密传输、访问控制再由它决定用户能不能进入内网、能进到什么范围。这个思想说白了就是“统一接入网关”。1.2 三个选型约束安全、易维护、员工体验选型之前我先给自己定了几条硬约束避免被各种花哨功能带偏。第一安全层面必须做到多因素认证。员工账号加密码远远不够还要有动态口令。谁什么时候在什么设备上接入过系统必须能留下日志。第二维护成本不能太高。作为一个小团队的运维我不可能每天去手改隧道配置、手工管理证书。我需要一个集中管理面板能创建用户、分配权限、查看在线状态最好还能导出审计日志。第三员工体验不能太差。如果接入流程复杂到要让员工看三页说明书方案就很难推行。客户端要尽量轻量登录后能自动连接断线能自动重连。带着这三条约束我最后选了 Pritunl 作为核心接入服务。它把复杂的隧道协商、证书管理、用户认证、路由下发这些能力都集成到了一个 Web 管理界面里而不是散落在各种命令行和配置文件里。对中小型团队来说这大大降低了日常运维的上手门槛。1.3 最终方案加密隧道 统一入口整体架构看起来很简单但每一层的职责都很明确。用户终端先装上接入客户端连接到一个统一域名。这个域名背后是一台前置流量网关负责完成 TLS 证书校验、接入请求的初步检查和流量转发。前置网关再把合法请求转交给真正负责身份认证的 Pritunl 服务。Pritunl 确认用户身份、验证动态口令、下发内网地址和允许访问的路由规则用户这时才算真正进入办公网。有人可能会问Pritunl 本身不是已经有加密隧道能力了吗为什么前面还要再加一层前置流量网关这个我在第 4 部分会详细展开。简单说前置这一层承担了对外暴露面的收敛、证书的统一终结、后续扩容时的灵活性也让员工只需要记住一个域名而不是一长串 IP 和端口。2. Pritunl 部署前的规划和参数选择2.1 服务器与网络拓扑以及我踩过的端口规划坑Pritunl 对硬件要求其实不高。我最初用一台 2 核 4GB 的云主机跑十几个人同时在线完全没压力。如果公司规模到几百人建议至少 4 核 8GB。系统我选了 Ubuntu 22.04 LTS用起来比较顺手遇到问题也容易搜到社区经验。这里我要特别强调一下网络规划。Pritunl 服务端会监听几个端口一个是 Web 管理面板一个是接入服务端口还有一个是数据库相关服务。很多人在初期容易犯一个错误就是安装完成后为了图省事把所有端口都加到云安全组的放行规则里对外全部开放。这样做非常危险。我当时给那家公司规划的放行策略是这样的用途端口是否对外开放前置流量网关443对外开放这是员工接入的唯一入口Pritunl 管理面板默认高位端口不对公网开放只允许管理网段访问Pritunl 接入服务端口自定义高位端口不对公网直接开放经由前置网关转发SSH 远程维护22不对公网开放或至少在安全组里限制来源 IP端口收敛这个事我在第 5 部分还会再强调。现在先记住一个原则员工只需要访问 443 端口除此之外公网上不应该再看到任何和这套系统相关的端口。2.2 域名、证书与解析先准备好这些才能少返工部署前最好先把域名规划好。我习惯分配一个独立的子域名给远程接入网关使用比如接入域名和内部服务域名分开。不建议直接用裸域名或者和公司官网混用一个域名后续证书管理和日志区分都会麻烦。证书这一块我强烈建议别用自签名证书。自签名证书会导致员工访问时出现安全告警还得让人手动信任证书体验极差。如果公司暂时没有企业级证书可以先使用自动签发的免费证书配合自动续期任务来解决有效期问题。域名解析建议指向前置流量网关的公网 IP这样后续如果 Pritunl 迁移到了别的服务器只要前置网关的转发目标调整一下员工端配置就不需要变动。2.3 安装与初始化的完整过程只讲关键步骤Pritunl 的安装比较标准化。以下是我实际操作时用到的核心步骤仅供参考具体版本请以官方文档为准。# 添加 Pritunl 软件源之前先更新系统并安装基础依赖 apt update apt upgrade -y apt install -y gnupg wget # 导入 Pritunl 官方仓库密钥并添加软件源具体地址以官网为准 # 然后安装 Pritunl apt install -y pritunl # 启动服务并设置开机自启 systemctl start pritunl systemctl enable pritunlPritunl 依赖 MongoDB 保存配置和审计数据所以还需要确认数据库服务处于运行状态。安装完成后本机浏览器打开管理面板地址首次访问会看到一个初始化页面要求在页面上输入系统生成的一个密钥然后设置管理员账号和密码。初始化完成之后第一件事就是进去修改默认配置包括管理面板监听端口、是否允许实操环境使用公共端口等等。这一步看着不复杂但恰恰是很多人容易跳过后续步骤的地方。安装成功只是开始如果没有对管理面板做访问限制后面就可能被人扫到管理入口。3. 组织、用户与访问策略安全不是在端口上而是在策略上3.1 先建组织再建服务器最后绑定用户Pritunl 管理面板里的逻辑层次是“组织-服务器-用户”。我一般会先创建一个组织比如用公司英文名命名然后把需要远程接入的服务器关联到这个组织最后在组织里创建用户账号。组织的作用主要是做隔离。如果公司有多个部门或者有外部合作方需要接入我会建议按团队或项目创建不同的组织然后给每个组织分配不同的服务器或网段。这样可以避免所有用户都在一个大池子里权限边界不清晰。服务器创建的时候需要重点配置两个东西虚拟网段和 DNS。虚拟网段是用户连进来后分配到的内网地址范围我习惯用 10.240.0.0/24 这种专门给远程接入用的段避免和办公网真实网段冲突。DNS 建议填公司内网 DNS 地址这样用户接入后能直接解析内部系统的主机名而不是每个人都去记一堆 IP。3.2 用户账号、动态口令以及离职账号处理账号管理这条我走过弯路以前图方便给整个部门建了一个共享账号结果出了问题根本定位不到人。后来强行推了“一人一号”每个员工有独立的接入账号并强制开启动态口令。Pritunl 的动态口令做得还算省心支持标准的多因素认证应用。在用户详情里生成一次性的绑定二维码员工用自己的认证应用扫码即可。这里有一个细节一定要提醒员工保存好恢复码否则不小心删了认证应用再登录就会非常麻烦。离职账号建议“禁用”而不是“删除”。删除账号虽然干净但历史日志里对应的用户记录会变得不完整审计时说不清楚。禁用之后这个账号无法再接入但它的历史操作记录还能完整保留。3.3 按角色分配访问网段而不是一人通到底远程接入最容易犯的另一个错误是把整个办公网段都推送给所有用户。员工在家里打开客户端能访问的范围和坐在办公室一模一样。如果员工的私人设备被木马控制那就相当于打开了整个内网的门。更合理的做法是按角色配置路由网段。普通员工只需要访问 OA、邮箱、文件服务器那就只推送对应网段。技术人员需要访问代码仓库和测试环境再加对应网段。财务、人事这类敏感系统甚至可以单独划分一个网段只允许指定用户访问。角色可访问网段是否启用动态口令普通员工OA、文件服务网段是研发人员OA、文件服务、代码仓库、测试环境网段是财务人员仅财务系统网段是且建议单独设备外部合作方仅指定项目网段是并设置每周到期Pritunl 的服务器配置页里有路由设置把这些网段填进去后用户连接时才会自动下发对应的路由规则。这个步骤不要省它直接决定了接入后的最小权限边界。4. 前置流量网关的搭建与 TLS 接入配置4.1 为什么不让员工直接连服务器 IP标题里提到的“反向代理”拆开来看就是我这一章要做的核心在 Pritunl 前面放一个统一的前置流量网关。很多初学者不理解为什么要多这一层觉得多一层多一个故障点。实际上这一层带来的收益远大于额外维护成本。第一暴露面收敛。员工访问的始终是同一个域名、同一个 443 端口。即使后端 Pritunl 的接入服务端口被扫描到了因为前置网关不会把无关端口的流量转交给后端外部也基本无法直接触达接入服务。第二灵活扩展。域名解析指向前置网关后端 Pritunl 换一台机器或者以后加一台做负载均衡员工端完全无感。第三证书管理集中化。TLS 证书只需要在前置流量网关上统一处理不需要把证书下发到每台客户端也不需要让 Pritunl 直接对外暴露证书信息。用一个不太严谨但好理解的类比Pritunl 是办公楼里负责登记访客的前台但它如果直接把门口保安的位置也占了那所有来访者都能看到保安室的门牌号。前置流量网关就是把“对外大门”和“内部前台”分开让外部只知道大门在哪不知道里面门牌号。4.2 配置前置入口证书、域名与转发规则我在这套方案里用的是 Nginx 作为前置流量网关。核心思路是让 Nginx 监听 443 端口完成 TLS 握手后把请求转交给本机高位端口上运行着的 Pritunl 接入服务。具体配置涉及几个关键字段我建议对照 Nginx 官方文档确认最新写法配置项作用listen 443 ssl让 Nginx 对外提供 TLS 接入服务server_name填写员工访问用的接入域名ssl_certificate / ssl_certificate_key指定证书文件和私钥文件路径location /将转发目标指向本机 Pritunl 接入服务端口keepalive_timeout / 长连接相关配置保证接入隧道建立后连接不被中途切断转发目标这里尤其要注意如果 Pritunl 接入服务用的是 9700 这样的高位端口那 Nginx 就是要把 443 收到的流量转交到 127.0.0.1:9700。由于是给远程接入用的连接建立后会保持很长一段时间所以要显式调高超时时间避免空闲连接被过早清理。证书这一块我用的方案是自动续期。第一次手动申请并配置到 Nginx 里然后加入定时任务让证书在到期前自动续期。证书续期成功后记得重载 Nginx 配置这一步容易漏漏了客户端第二天就全掉线了。4.3 处理长连接和流量的细节远程接入服务对前置流量网关的另一个要求是连接持续时长可能很长。普通网页请求几秒就结束了但接入隧道一旦建立可能一整天下班都不断开。Nginx 作为前置流量网关时默认的参数往往针对短连接优化所以需要调整。我给自己画过一个排查清单连接建立后查看 Nginx 访问日志看是否有大量超时断开记录如果有优先检查长连接超时时间设置。再有如果 Pritunl 接入使用 UDP 模式传输前置流量网关还需要考虑对 UDP 流量的支持。因此在实际部署中我倾向于让 Pritunl 服务端强制使用 TCP 模式前端的 Nginx 转发配置会更简单兼容性也更好。另外日志格式里加上了客户端真实来源 IP 的字段。因为经过 Nginx 后Pritunl 默认看到的是 Nginx 所在服务器的 IP如果不在转发配置里把原始客户端 IP 传过去审计日志就失去了意义。这个细节对安全审计非常重要。5. 安全加固与日常运维5.1 端口收敛从“开放一片”到“只留一个”安全加固最重要的一件事就是把对外端口收敛到一个。我在那家公司的云安全组里做了很严格的规则规则如下来源目标端口用途0.0.0.0/0443员工远程接入统一入口内网管理网段高位管理端口管理员访问 Pritunl 面板办公网固定出口 IP22SSH 运维其他全部全部拒绝这里有一个容易被忽略的点Pritunl 管理面板默认端口是随机高位端口。只要不对公网开放它就相当于只在内网可见。但如果运维人员自己在家里想管理面板建议通过前置流量网关再套一层访问控制或者配合动态口令不要直接给管理面板开公网访问。5.2 日志、监控与告警远程接入的日志价值比很多人想象中更大。Pritunl 自带审计日志记录了用户登录、动态口令验证、连接建立与断开时间。这能回答“谁在什么时间从什么 IP 接入了内网”这样的问题。配合前置流量网关的访问日志还能看到每个外部来源 IP 的访问频率和路径。监控方面我最看重的几个指标包括当前在线人数、当天主动断开次数、认证失败次数、前置网关的 443 端口状态。在线人数突然激增可能是异常事件认证失败次数连续上涨大概率有人在尝试爆破。即便有动态口令保护这类告警也不能省。简单一点的方式是写一个定时检查脚本把认证失败次数超过阈值的事件通过邮件或即时消息发出来。只要阈值设置合理这种基础告警基本够用。5.3 备份和升级的固定节奏很多运维部署完就忘了 Pritunl 的数据其实都存在 MongoDB 里一旦数据库损坏所有用户、组织、路由策略都会丢失。我把备份分成三部分MongoDB 数据、Pritunl 配置文件、证书和相关密钥。# 备份 MongoDB 中的 Pritunl 数据库 mongodump --db pritunl --out /backup/pritunl-$(date %F) # 备份 Pritunl 主配置 cp /etc/pritunl.json /backup/pritunl-$(date %F)/ # 压缩整个备份目录 tar -czf /backup/pritunl-$(date %F).tar.gz /backup/pritunl-$(date %F)备份文件我记得会同步到另一个存储位置最好别和前一台服务器放一起。升级的时间基本固定在一个月一次选在低峰时段升级前先看官方更新公告确认有没有破坏性变更升级后立刻验证一次动态口令登录和路由访问是否正常。6. 实战中真实踩过的坑以及团队变大后的演进思路6.1 六个值得记录的坑按照“症状、原因、解法”的方式整理一下这些坑大多是我在两个不同环境里踩过的。症状根因解决方式首次初始化时页面提示数据库异常MongoDB 服务未正常启动检查数据库服务运行状态按顺序先启动数据库再启动 Pritunl客户端能连上但内网页面打不开服务器路由设置里没添加办公网段在 Pritunl 服务器配置里把内网路由网段补上管理面板频繁被外部扫描安全组把高位端口全放开了修改安全组只保留 443 对外开放管理面板仅内网访问凌晨员工全部掉线第二天连不上证书到期且未自动续期配置自动续期任务续期成功后重载前置网关配置某个员工换了新手机后无法登录动态口令绑定信息存储在旧设备上在用户管理里重置该用户动态口令重新扫码绑定升级后路由表丢失升级脚本和备份恢复顺序不对升级前完整备份数据库升级后若异常先停服再恢复6.2 如果团队更大这套架构怎么演进上面这套方案最多能支撑几百人左右的规模。如果公司继续变大我不会直接在现有机器上硬撑而是会考虑把前置流量网关和 Pritunl 服务都做成多节点。前置流量网关可以放两台前面做 DNS 轮询或负载均衡任何一台故障时连接能自动迁移。Pritunl 服务端本身也支持多节点部署多台服务器组成一个集群共用一个 MongoDB 数据库用户和配置数据是统一的。这样即使某台 Pritunl 节点中断其他节点也能接管接入请求。还有一个方向是结合终端安全状态检查。现在很多远程接入场景不仅要验证“你是谁”还要验证“你的设备是否符合公司安全标准”。如果接入网关能识别出设备缺少补丁、没有开启磁盘加密就暂时不允许接入这个安全水位会比单纯依靠账号和口令高很多。最后说一次我自己的习惯。我从来不会把整套系统完全丢给一段文档就撒手不管每隔一段时间会做一次“模拟事故演练”故意停掉数据库按备份恢复流程把整套服务拉起来。这样做虽然麻烦但真到了出事故那天团队不会手足无措。对于远程办公接入这类基础设施最大的安全感不是部署完成那一刻而是半年后证书自动续期了、离职员工账号第一时间被停用了、日志审计说得清楚的时候。希望这份实践记录能帮你少走一点弯路。