frp 实现内网穿透:随时随地远程控制你的 Mac

家里 Mac 性能爆表,公司电脑想随时连,怎么办?

一、为啥需要 frp?

  • 家里 Mac 没有公网 IP,外网无法直接访问。
  • Cloudflare Tunnel 只能转发 HTTP/HTTPS,不能转发 SSH、Flink RPC、Spark Master 等 TCP 端口。
  • 我有一台腾讯云 2核4G 小服务器,虽然装不了大数据组件,但做内网穿透绰绰有余。

frp 是一个高性能的反向代理,她让公网 IP 的云服务器变成"接线员",所有从外网来的请求,都通过它转发到你的 Mac 上。

二、整体架构

  1. 腾讯云上运行 frp 服务端(frps),监听特定端口(如 7000)。
  2. 家里 Mac 运行 frp 客户端(frpc),主动连接到云服务器的 7000 端口,建立持久隧道。
  3. 公司电脑上,通过访问云服务器的某个端口(如 云服务器IP:2222),流量就会被转发到 Mac 的 22 端口,实现远程 SSH。

三、腾讯云服务端配置(腾讯云 2核4G)

1. 下载并安装 frp

登录腾讯云服务器,安装frp:

Bash 复制代码
cd /opt
wget https://github.com/fatedier/frp/releases/download/v0.69.1/frp_0.69.1_linux_amd64.tar.gz
tar -xzf frp_0.69.1_linux_amd64.tar.gz
mv frp_0.69.1_linux_amd64 frp
cd frp

2. 编辑 frps.toml

创建配置文件 frps.toml(使用新版本的 TOML 格式):

TOML 复制代码
bindPort = 7000
auth.token = "在这里生成一个32位强密码"
  • bindPort:服务端监听端口,客户端会连接这个端口。
  • auth.token:认证令牌,必须一致才能连接,防止被扫。

3. 启动服务端

测试运行:

Bash 复制代码
./frps -c frps.toml

看到 frps started successfully 就说明启动成功

配置为系统服务(可选,推荐使用 systemd):

Bash 复制代码
sudo tee /etc/systemd/system/frps.service << 'EOF'
[Unit]
Description=frp server
After=network.target

[Service]
Type=simple
ExecStart=/opt/frp/frps -c /opt/frp/frps.toml
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable frps
sudo systemctl start frps

查看状态:

Bash 复制代码
sudo systemctl status frps

4. 开放安全组端口

在腾讯云控制台安全组中,添加入站规则:

端口 7000 :来源为 0.0.0.0/0(允许所有 IP 连接 frp 服务端),建议加白名单(只放你公司出口 IP 或你自己家的 IP)。

四、客户端配置(你家里的 Mac)

1. 下载 frp(arm64 版本)

Bash 复制代码
cd ~/Downloads
curl -LO https://github.com/fatedier/frp/releases/download/v0.69.1/frp_0.69.1_darwin_arm64.tar.gz
tar -xzf frp_0.69.1_darwin_arm64.tar.gz
mv frp_0.69.1_darwin_arm64 ~/frp
cd ~/frp

2. 编辑 frpc.toml

TOML 复制代码
serverAddr = "你的腾讯云公网IP"
serverPort = 7000
auth.token = "和frps.toml里完全一样的密码"

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 2222

3. 启动客户端

测试:

Bash 复制代码
./frpc -c frpc.toml

看到 start proxy success 等日志就表示隧道建立。

测试后可以配置开机自启(在 Mac 上使用 launchd)。

创建一个 plist 文件 ~/Library/LaunchAgents/com.frpc.plist

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.frpc</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/你的用户名/frp/frpc</string>
        <string>-c</string>
        <string>/Users/你的用户名/frp/frpc.toml</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
</dict>
</plist>

加载服务:

Bash 复制代码
launchctl load ~/Library/LaunchAgents/com.frpc.plist

五、从公司电脑远程操作 Mac

在公司电脑上执行:

Bash 复制代码
ssh -p 2222 your_mac_username@腾讯云IP

输入你的 Mac 登录密码,就像坐在 Mac 面前一样。你可以运行命令、编辑文件、启动/停止 Docker 容器。

六、安全加固(千万别跳过)

由于你的 Mac 现在暴露到了公网,必须做好防护:

  1. 安全组白名单

  2. 在腾讯云安全组中,将 222288888081 等 frp 映射端口,来源 IP 限制为你公司的公网 IP(或你常用的几个 IP),不要设为 0.0.0.0/0

  3. Mac 端防火墙

  4. 系统偏好设置 → 安全性与隐私 → 防火墙,确保开启,并阻止未授权的传入连接(通常默认开启)。

  5. frp 强密码

  6. auth.token 一定要用复杂随机字符串,不要用默认值。

  7. SSH 禁密码登录(可选)

  8. 如果你想让 SSH 更安全,可以在 Mac 上禁用密码登录,只用密钥,避免暴力破解。

  9. 定期更新 frp

  10. frp 偶尔有安全更新,保持版本较新。

七、常见问题

Q:连接 SSH 时提示 Connection refused

A:检查 Mac 上的 frpc 是否在运行(ps aux | grep frpc),确认云服务器安全组端口已放行,确认本地 SSH 服务已开启(系统偏好设置 → 共享 → 远程登录)。

Q:frpc 连接上了,但端口映射无效

A:检查 remotePort 是否已被占用(在云服务器上 netstat -tlnp | grep 端口),尝试修改一个未使用的端口。

Q:Mac 休眠后隧道断开

A:在节能设置里勾选"防止自动休眠 ",或使用 caffeinate 命令保持 Mac 唤醒。也可在 frpc 客户端配置中添加 autoReconnect=true(但新版本默认自动重连)。

Q:公司网络封锁了非标准端口(如 2222)

A:可以尝试使用 remotePort = 44380(需要这些端口未被云服务器占用),因为 443 端口通常不会被防火墙封锁。

Q:frpc 连接服务i/o timeout

A:腾讯云安全组放开不行,要关闭防火墙,或者添加端口

YAML 复制代码
sudo ufw allow 7000/tcp
sudo ufw reload

Q:ssh 连接 mac 报connection refused

A:开启 Mac 远程登录

  • 打开 系统设置通用共享
  • 找到 远程登录 这一项,把它打开。