一、痛点与核心原则
异地办公想用公司的打印机,传统方案要么端口映射(高危),把打印机直接暴露在公网任人扫描;要么全员VPN(笨重),外勤人员连VPN只为打个文件,体验极差。
我们的目标是:员工掏出手机扫码 → 云端校验身份 → 加密隧道穿透内网 → 指定打印机出纸。全程外网零入站端口,杜绝黑客扫描。
二、整体架构(一张图看懂)
文字版架构说明(四层):
- 云端调度层:接收扫码回调,对接企微/钉钉OAuth,临时缓存任务元数据。
- 内网穿透网关层:内网客户端主动向云端建立TLS加密隧道(仅出站,防火墙不放行入站端口)。
- 本地文印管控层:部署在内网的打印管理服务(类似AWMS),承接任务、校验权限、调度队列。
- 终端与设备层:手机/PC提交任务,多功能一体机刷卡输出。

核心安全原则:外网只能下发任务指令,文档数据走加密隧道传输,全程禁止明文,且打印完成后云端临时文件立即销毁。
三、扫码鉴权底层逻辑(核心干货)
很多文章只讲“扫码登录”,这里直接上底层交互逻辑和权限数据结构。
1. OAuth2.0 授权码交互(简化版)
手机端点击打印,跳转企微/钉钉授权页,后端拿到 code 后换取 access_token:
# 伪代码:后端通过 code 换取用户身份
def get_user_by_code(code):
# 1. 用 code + client_secret 换 access_token
token_res = requests.post("https://qyapi.weixin.qq.com/cgi-bin/gettoken", ...)
# 2. 用 access_token 获取员工 UserID 和部门 ID
user_info = requests.get(f"https://qyapi.weixin.qq.com/cgi-bin/user/get?userid={userid}")
return user_info["userid"], user_info["department"]
2. 云端与内网用户映射(解决“谁是谁”的问题)
云端拿到的是企微 UserID,内网文印服务认的是 AD域账号 或 工号。中间有一个映射转换表(存于内网数据库):
{
"wechat_userid": "ZhangSan_001",
"inner_employee_id": "10086",
"dept": "销售部",
"permission_level": 2
}
3. 精细化权限校验(这才是“鉴权”的精髓)
内网服务收到身份后,不是直接放行,而是查策略库。这是权限策略的数据结构示例:
{
"user_id": "10086",
"policy": {
"allowed_devices": ["办公室_彩色机", "分公司_黑白机"], // 只能在指定设备打
"max_pages": 50, // 单次限制页数,防止恶意打印
"color_allowed": false, // 外网禁止打彩色(成本控制)
"forbid_keywords": ["绝密", "研发图纸"] // 文档名带这些词直接拦截
}
}
技术点: 如果校验不通过,除了拒绝任务,还会触发越权告警,写入审计日志,用于后续追溯。
四、内网穿透的“硬核”避坑指南
直接端口映射是找死,我们的方案是内网客户端主动向云端建连(出站)。
隧道配置示例(以 frp 类工具为例)
内网服务器运行客户端,配置如下(仅开启出站443端口):
# frpc.ini (内网客户端)
[common]
server_addr = 你的云端公网IP
server_port = 443 # 伪装成HTTPS流量,穿透性强
[print_tunnel]
type = stcp # 秘密TCP模式,外部无法直接扫到
local_ip = 127.0.0.1
local_port = 8080 # 内网打印服务端口
防火墙死守底线
在边界防火墙上,只放行内网向外访问的流量,杜绝外部主动进来的连接:
# 仅允许内网设备访问外网,禁止外网主动连入
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -j DROP
这样,黑客即使扫描到你的公网IP,也无法建立TCP三次握手,彻底堵死攻击路径。
五、“快递柜”式打印任务流转(Pull Printing)
这是小白最容易误解的地方:外网提交的任务不是直接飞到打印机,而是先暂存在内网队列里。
我们把打印任务比作“快递”,打印机比作“快递柜”:
- 存件:扫码鉴权通过后,文档加密传至内网服务器,任务进入队列(等待取件)。
- 取件(刷卡/二次扫码):你走到任意一台授权打印机前,刷工卡或扫动态码。
- 出库:机器读取卡号,匹配你的身份,此时才从队列拉取你的任务并打印。
为什么要多此一举?
防止你打完文件人没到,文件被人偷看(解决了泄密风险)。同时,如果A机器繁忙,你可以去B机器刷卡取件,实现了漫游打印。
任务队列状态机
| 状态 | 含义 |
|---|---|
| PENDING | 已鉴权,等待用户刷卡 |
| READY | 刷卡成功,正在渲染打印 |
| COMPLETED | 打印完成,云端临时文件立即销毁 |
| EXPIRED | 超时未取(如30分钟),自动删除任务 |
六、审计与信创适配
审计字段:除了常规时间、人名,重点记录外网IP、隧道会话ID、设备编号,支持按员工检索,日志保留≥90天。
信创补充:如果国企或涉密单位使用,该架构完全兼容统信UOS、银河麒麟操作系统及鲲鹏/飞腾CPU,用户在不同系统上打印体验一致(统一驱动一键安装)。
七、总结
这套方案没有采用花哨的“黑科技”,核心就三板斧:
- 端口不出门(隧道代替映射)。
- 身份三校验(OAuth扫码 + 内网权限策略 + 刷卡取件)。
- 数据不落地(打印完云端自动删文件)。
写给小白的话:如果你正在设计外网打印,千万别嫌“隧道+刷卡”麻烦。合规和安全,永远是运维的第一道红线。
你在公司搭建过外网打印吗?踩过“端口映射被扫”的坑吗?欢迎评论区交流!
原创内容,同步发布于 CSDN 与掘金,分享企业 IT 运维实战落地经验,纯技术交流。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/heidi8828/article/details/163661714




