在开发环境中,我们经常遇到这样的情况:内网中的 Linux 服务器(CentOS/RHEL)由于安全策略无法直接访问互联网,导致无法使用 yum 或 dnf 进行软件更新。而我们的日常办公电脑(如 macOS)却拥有正常的网络连接。

本文将介绍如何利用 macOS 作为跳板,通过 lightweight 的 Tinyproxy 服务,让内网服务器“借用”Mac 的网络进行更新。无需复杂的公网 IP 配置,只要 Mac 与服务器在同一局域网即可实现。

适用场景

  • 内网 Linux 服务器无法上网,但能 ping 通办公电脑。
  • 办公电脑为 macOS。
  • 需要临时更新系统或安装软件。

⚠️ 安全警告:此方案仅建议在可信的内网环境中临时使用。操作完成后,建议关闭代理服务或限制访问 IP,避免代理被滥用。

🛠️ 环境准备

设备 角色 IP 地址示例 系统
办公电脑 代理服务器 (Gateway) 10.147.146.15 macOS
内网服务器 客户端 (Client) 10.147.146.20 CentOS 7/8 / RHEL

前提条件:

  • 两台机器在同一局域网内,网络互通(互相能 ping 通)。
  • macOS 上已安装 Homebrew。

🚀 第一步:在 macOS 上安装并配置 Tinyproxy

Tinyproxy 是一个轻量级的 HTTP/HTTPS 代理守护进程,非常适合这种临时转发场景。

1. 安装 Tinyproxy

打开 Mac 的 终端 (Terminal),执行以下命令:

brew install tinyproxy

2. 修改配置文件

默认配置下,Tinyproxy 只允许本地 (127.0.0.1) 访问,我们需要修改它以允许局域网内的其他机器连接。

编辑配置文件:

# Apple Silicon (M1/M2/M3) Mac:
nano /opt/homebrew/etc/tinyproxy/tinyproxy.conf

# Intel Mac:
# nano /usr/local/etc/tinyproxy/tinyproxy.conf

需要修改的关键项如下:

A. 监听端口 (Port)

确认端口号(默认为 8888),也可以改为其他未被占用的端口。

Port 8888

B. 监听接口 (Listen)

确保 Listen 指令被注释掉。如果注释掉,Tinyproxy 会默认监听所有网络接口(0.0.0.0)。

#Listen 192.168.0.1

C. 访问控制 (Allow) [最关键]

找到 Allow 部分。

  • 错误写法Allow 0.0.0.0 (这在 Tinyproxy 中无效,会导致 403 错误)。
  • 正确写法:添加你的局域网网段。

假设你的 Mac IP 是 10.147.146.15,通常掩码是 24 位。你可以添加:

Allow 127.0.0.1
Allow 10.147.146.0/24

如果不确定具体网段,为了测试方便,也可以暂时允许所有 10.x.x.x 的地址:

Allow 10.0.0.0/8

(注意:如果有多个 Allow 行,确保你的新行没有被其他 Deny 规则覆盖)

D. 出站绑定 (Bind)

建议注释掉 Bind 行,让系统自动选择出站网卡,避免路由错误。

#Bind 0.0.0.0

E. 端口连接限制 (ConnectPort)

Tinyproxy 默认可能只允许代理连接特定端口(如 443, 563)。为了兼容各种 yum 源(可能包含 http 80 端口或其他端口),建议注释掉所有 ConnectPort 行。

向下滚动配置文件,找到类似内容并全部注释:

#ConnectPort 443
#ConnectPort 563
#ConnectPort 6665
# ... 以及其他所有 ConnectPort 行

注释掉后,代理将允许连接任何目标端口。

3. 重启 Tinyproxy 服务

保存文件 (Ctrl+O, Enter, Ctrl+X) 后,重启服务使配置生效:

brew services restart tinyproxy

4. 检查 macOS 防火墙

macOS 的防火墙可能会拦截外部传入的连接。

  1. 打开 系统设置 (System Settings) -> 网络 (Network) -> 防火墙 (Firewall)
  2. 点击 选项 (Options…)
  3. 在列表中找到 tinyproxyhomebrew 相关条目。
  4. 确保其状态设置为 “允许传入连接” (Allow incoming connections)。

调试技巧:如果不确定,可以暂时关闭防火墙进行测试,成功后再开启并配置规则。

💻 第二步:在内网服务器上配置 Yum

现在 Mac 已经准备好了,我们需要告诉内网服务器通过 Mac 的代理上网。

1. 测试连通性

在内网服务器上,先测试是否能连通 Mac 的代理服务。
(将 10.147.146.15 替换为你 Mac 的实际 IP)

# 测试 HTTP
curl -x http://10.147.146.15:8888 http://www.baidu.com

# 测试 HTTPS (yum 主要使用这个)
curl -x http://10.147.146.15:8888 https://www.baidu.com
  • 成功:返回百度网页的 HTML 代码。
  • 失败 (403 Forbidden):检查 Mac 上的 Allow 配置是否正确,是否注释了 ConnectPort。
  • 失败 (Connection timed out):检查网络是否互通 (ping 10.147.146.15),以及 Mac 防火墙是否拦截。

2. 配置 Yum/DNF 代理

测试通过后,修改 yum 配置文件。
编辑 /etc/yum.conf (CentOS 7) 或 /etc/dnf/dnf.conf (CentOS 8+/Fedora):

sudo vi /etc/yum.conf

在文件末尾添加一行:

proxy=http://10.147.146.15:8888

(如果 Tinyproxy 配置了用户名密码,还需添加 proxy_usernameproxy_password,本教程未启用认证)

3. 执行更新

现在可以正常执行更新命令了:

# 清理缓存
sudo yum clean all

# 重新生成缓存 (如果这一步成功,说明代理完全正常)
sudo yum makecache

# 执行更新
sudo yum update -y

🧹 第三步:清理与收尾 (重要)

更新完成后,为了安全起见,建议恢复原状。

1. 内网服务器

移除代理配置,防止后续流量误走代理。

sudo vi /etc/yum.conf
# 删除或注释掉 proxy=http://... 这一行

2. macOS

停止 Tinyproxy 服务。

brew services stop tinyproxy

或者,如果你希望保留服务但限制访问,可以将 Allow 改回 Allow 127.0.0.1 并重启服务。

❓ 常见问题排查 (FAQ)

Q1: 报错 curl: (56) Received HTTP code 403 from proxy after CONNECT

原因:Tinyproxy 拒绝了请求。
解决

  • 检查 Allow 配置:确保写的是具体的网段(如 10.147.146.0/24),不要写 0.0.0.0
  • 检查 ConnectPort:确保配置文件中所有的 ConnectPort 行都被注释掉了。
  • 检查日志:在 Mac 上运行 tail -f /opt/homebrew/var/log/tinyproxy/tinyproxy.log 查看拒绝的具体原因。

Q2: 报错 Connection timed out

原因:网络不通或被防火墙拦截。
解决

  • 在内网服务器 ping <Mac_IP> 确认网络层互通。
  • 检查 Mac 的 系统设置 -> 网络 -> 防火墙,确保允许了 Tinyproxy 入站。
  • 确认 Tinyproxy 正在运行:brew services list

Q3: Mac 休眠导致连接断开

原因:macOS 默认会在闲置时休眠,导致网络中断。
解决

  • 更新期间,打开 系统设置 -> 节能/显示器,将“此时间段后关闭显示器”设为“从不”。
  • 或使用命令行防止休眠:caffeinate -d (保持屏幕常亮)。
  • 推荐使用小工具如 Amphetamine (App Store 免费) 来保持 Mac 唤醒。

Q4: 我的 Mac 没有固定内网 IP 怎么办?

如果 Mac 的 IP 是 DHCP 动态分配的,重启路由器后可能会变。
解决:建议在路由器后台为 Mac 的 MAC 地址绑定一个静态内网 IP(DHCP Reservation),这样 IP 就不会变了。

📝 总结

通过利用 macOS 自带的包管理生态和 Tinyproxy 的轻量特性,我们可以在不购买额外云服务器、不配置复杂路由的情况下,快速解决内网服务器的更新问题。

核心步骤回顾:

  1. Mac 安装 Tinyproxy。
  2. 配置 Allow 网段,注释 ConnectPort。
  3. 内网服务器配置 yum.conf 指向 Mac IP。
  4. 用完即停,安全第一。

附录:CentOS 7 针对阿里云源的特别配置

如果您使用的是 CentOS 7,由于其已 EOL(End of Life),可能会遇到源失效的问题。以下是特别针对这种情况的配置步骤。

1. 验证代理连通性

先测试服务器能否通过 Mac 的代理访问外网。

# 替换 <Mac_IP> 为你的 Mac 实际 IP (例如 10.147.146.15)
curl -I --proxy http://<Mac_IP>:8888 https://www.aliyun.com

如果返回 HTTP/1.1 200 OK302,说明代理链路正常。如果报错,请检查 Mac 防火墙和 Tinyproxy 配置。

2. 备份原有 Yum 配置

sudo mkdir -p /etc/yum.repos.d/backup
sudo mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/

3. 下载阿里云 Repo 文件 (通过代理)

利用刚才测试通的代理,直接下载阿里云的 CentOS 7 配置文件。

# 替换 <Mac_IP> 为你的 Mac 实际 IP
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo --proxy http://<Mac_IP>:8888

4. 修正 Repo 指向 Vault 归档源 (关键步骤)

由于 CentOS 7 已 EOL,普通镜像地址可能失效。我们需要将下载的文件中的地址强制指向阿里云的 Vault (归档) 目录。

依次执行以下 sed 命令进行替换(可选):

# 1. 将普通 centos 地址替换为 centos-vault/7.9.2009 (最终版本归档)
sudo sed -i 's/mirrors.aliyun.com\/centos/mirrors.aliyun.com\/centos-vault\/7.9.2009/g' /etc/yum.repos.d/CentOS-Base.repo

# 2. 注释掉所有 mirrorlist 行 (这些地址已彻底失效)
sudo sed -i 's/^mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-Base.repo

# 3. 确保 baseurl 启用 (如果上面替换后前面有 #,去掉它)
# 通常阿里云 repo 文件里 baseurl 默认是注释的,需要取消注释并指向正确地址
# 下面的命令会强制启用 baseurl 并确保指向 vault
sudo sed -i 's/^#baseurl=http/baseurl=http/g' /etc/yum.repos.d/CentOS-Base.repo

5. 配置 Yum 全局代理

为了让 yum 命令自动使用 Mac 代理,编辑 /etc/yum.conf

sudo vi /etc/yum.conf

在文件末尾添加一行:

proxy=http://<Mac_IP>:8888

(替换 <Mac_IP> 为你的 Mac IP)

6. 清理缓存并生成新元数据

# 清理旧缓存
sudo yum clean all

# 生成新缓存 (这一步成功即代表修复完成)
sudo yum makecache

预期输出:应看到 Metadata Cache Created 以及各个仓库的包数量统计,不再报错 Empty reply。

7. 执行系统更新

sudo yum update -y

8. 收尾与清理

更新完成后,为了安全起见,请执行清理操作。

  1. 内网服务器

    • 可选:如果以后不再需要代理,编辑 /etc/yum.conf 注释掉 proxy 行。
    • 保留:阿里云 Vault 源的配置可以保留,以便未来安装软件。
  2. macOS

    • 停止 Tinyproxy 服务,关闭代理端口。
    brew services stop tinyproxy