在开发环境中,我们经常遇到这样的情况:内网中的 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 的防火墙可能会拦截外部传入的连接。
- 打开 系统设置 (System Settings) -> 网络 (Network) -> 防火墙 (Firewall)。
- 点击 选项 (Options…)。
- 在列表中找到
tinyproxy或homebrew相关条目。 - 确保其状态设置为 “允许传入连接” (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_username 和 proxy_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 的轻量特性,我们可以在不购买额外云服务器、不配置复杂路由的情况下,快速解决内网服务器的更新问题。
核心步骤回顾:
- Mac 安装 Tinyproxy。
- 配置 Allow 网段,注释 ConnectPort。
- 内网服务器配置
yum.conf指向 Mac IP。 - 用完即停,安全第一。
附录: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 OK 或 302,说明代理链路正常。如果报错,请检查 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. 收尾与清理
更新完成后,为了安全起见,请执行清理操作。
-
内网服务器
- 可选:如果以后不再需要代理,编辑
/etc/yum.conf注释掉proxy行。 - 保留:阿里云 Vault 源的配置可以保留,以便未来安装软件。
- 可选:如果以后不再需要代理,编辑
-
macOS
- 停止 Tinyproxy 服务,关闭代理端口。
brew services stop tinyproxy
评论交流
欢迎留下你的想法