在macos上搭建多协议隧道服务需组合ssh隧道、frp/ngrok等工具并利用pfctl等系统能力:frp统一管理http/tcp/vnc等协议转发;ssh提供-l/-r/-d轻量备用通道;pfctl实现策略路由与流量导向。
在 macos 上搭建支持多协议转发的系统级隧道服务,核心是组合使用 ssh 隧道、frp/ngrok 等代理工具,并辅以系统网络层控制(如 pfctl、路由策略),而非依赖单一软件。macos 本身不提供“开箱即用”的多协议隧道服务,但其内置的 openssh、防火墙框架(pf)、路由表与网络服务管理能力,足以构建稳定、可扩展的转发环境。
明确协议需求与转发类型
先区分你要转发的协议类型,决定对应技术路径:
-
TCP 服务直连(如数据库、Web 后台、MQTT):优先用 SSH 本地/远程端口转发(
-L/-R),简单安全,无需额外部署 -
动态流量代理(浏览器、CLI 工具走代理):用 SSH 动态端口转发(
-D)+ SOCKS5 客户端,或搭配proxychains-ng实现命令行全局代理 - 内网服务对外暴露(含 HTTP/HTTPS/VNC/RDP):frp 是首选——它原生支持 TCP/UDP/HTTP/HTTPS/KCP 多协议,还能做域名路由、TLS 终止、连接池优化
- 临时调试或无公网服务器场景:ngrok 提供云中继,支持 TCP 和 HTTP 隧道,免费版虽限速限域名,但免运维,适合快速验证
部署 frp 实现多协议统一入口
frp 是 macOS 做多协议隧道服务最实用的中枢组件。它把不同协议的服务映射到同一个公网入口,再由 frps(服务端)按规则分发。
- 在 macOS 上下载对应架构的 frp(如
frp_0.55.0_darwin_arm64.tar.gz),解压后编辑frpc.ini - 配置多个代理段落,例如:
[web] type = http custom_domains = app.example.com locations = /api,/static <p>[vnc] type = tcp local_port = 5900 remote_port = 6001</p><p>[redis] type = tcp local_port = 6379 remote_port = 6002</p>
- 启动客户端:
sudo ./frpc -c ./frpc.ini,确保日志显示各 proxy 启动成功 - 服务端需开放
remote_port及 frp 控制端口(默认 7000),并配置对应协议监听(如启用subdomain_host支持泛域名)
补充 SSH 隧道作弹性通道
SSH 不仅用于登录,更是轻量、加密、免配置的备用隧道。适合临时打通某项服务,或作为 frp 的 fallback 路径。
- 本地转发访问内网数据库:
ssh -L 3307:10.0.1.5:3306 user@jump-host - 远程转发让外网访问本机服务:
ssh -R 2222:localhost:22 user@vps(需服务端GatewayPorts yes) - 动态 SOCKS5 供 Chrome/Firefox 使用:
ssh -D 10808 -C -N -f user@vps,注意加-N(不执行命令)和-f(后台运行) - 若需 DNS 远程解析(防 CDN 地域限制),浏览器要启用 remote DNS;Chrome 可用启动参数:
--proxy-server="socks5://127.0.0.1:10808" --host-resolver-rules="MAP * ~NOTFOUND"
用 pfctl 做底层流量导向与策略控制
当需要精细控制某类流量走特定隧道(比如 Docker 容器出口强制经 frp 中转,或某子网走 SSH 隧道),就得绕过系统默认路由,用 macOS 内置的 pf 防火墙做策略路由。
- 启用 IP 转发:
sudo sysctl -w net.inet.ip.forwarding=1 - 写规则文件
/etc/pf.tunnel.conf,例如:pass out on en2 route-to (utun2 10.10.0.1) from 192.168.3.0/24 to any pass out on utun2 from any to any
- 加载规则:
sudo pfctl -f /etc/pf.tunnel.conf,并用sudo pfctl -s rules确认生效 - 注意:utun2 是 frp 或 ngrok 创建的虚拟接口名,需先查
ifconfig | grep utun确认实际名称











