最近在 VMware 里装了个 Ubuntu Server 虚拟机跑开发环境,结果发现从 GitHub 拉代码简直龟速——git clone 只有 22 KiB/s,还时不时 Connection refused。但宿主机的 Windows 上开着梯子,浏览器访问 GitHub 秒开。于是研究了一下怎么让虚拟机共享宿主机的”加速通道”,过程比想象中简单,记录一下供大家参考。


为什么要这样折腾?

虚拟机网络通常通过 NAT 或桥接模式上网。如果宿主机直连 GitHub 本身很快,那虚拟机也不会有问题;但实际情况往往是宿主机也要依赖代理才能流畅访问外网,而虚拟机默认并不会自动继承这个代理。

核心思路:在宿主机上把代理共享出来,让虚拟机里的流量指向宿主机 IP 的代理端口。所有请求先走到宿主机,再由宿主机的梯子转发出去,从而绕过虚拟机的网络限制。


准备工作:让宿主机代理”对外营业”

无论你用 Clash、v2rayN、Shadowsocks 还是其他工具,都需要打开 Allow LAN(允许局域网连接) 功能,并记下代理端口。

  • Clash:默认 HTTP/SOCKS5 端口通常为 7890,在 General 里打开 “Allow LAN”。
  • v2rayN:默认 SOCKS5 端口 10808,HTTP 端口 10809,需要在”参数设置”里勾选”允许来自局域网的连接”。
  • Shadowsocks:默认端口 1080,勾选”允许其他设备连入”。

我的环境是 Clash,HTTP 代理地址在宿主机本机上是 127.0.0.1:7890,开启 LAN 后,其他设备就可以通过宿主机 IP 加这个端口来使用代理。


找到宿主机在虚拟机眼里的 IP

这一步取决于你的虚拟机网络模式,也是最容易搞错的地方。

方式一:NAT 模式(最常用)
在 NAT 网络中,宿主机充当网关。虚拟机里运行:

1
ip route | grep default | awk '{print $3}'

一般会输出 192.168.xxx.1 或 10.0.2.2(VirtualBox),这就是我们要用到的 IP。

方式二:桥接模式
虚拟机和宿主机在同一局域网,宿主机的 IP 就是它从路由器拿到的那个(比如 192.168.1.100)。可以直接在 Windows 里用 ipconfig 查看。

记下这个 IP,假设我们拿到的就是 192.168.137.1。


在 Ubuntu Server 虚拟机里配置代理

有了 IP 和端口(比如 192.168.137.1:7890),就可以开始了。

1. 让终端命令行(curl/wget 等)走代理

临时设置环境变量:

1
2
export http_proxy=http://192.168.137.1:7890
export https_proxy=http://192.168.137.1:7890

如果代理需要认证(一般没有),格式为 http://用户名:密码@IP:端口。

测试一下:

1
curl -I https://github.com

正常的话会马上返回 HTTP 200 或 301,不再卡住或报错。可以用 curl https://httpbin.org/ip 验证出口 IP 是否变成了代理节点的地址。

2. 让 Git 走代理(这才是克隆加速的关键)

1
2
git config --global http.proxy http://192.168.137.1:7890
git config --global https.proxy http://192.168.137.1:7890

现在再试 git clone https://github.com/...,速度应该能回到正常水平,几十 KiB/s 飙升到几 MiB/s。

3. (可选)让 SSH 方式克隆也走代理

如果你习惯用 git@github.com:... 的 SSH 地址,或者 22 端口也被干扰,可以配置 SSH 通过代理连接。编辑 ~/.ssh/config:

1
nano ~/.ssh/config

添加:

1
2
3
Host github.com
ProxyCommand nc -X 5 -x 192.168.137.1:7890 %h %p
Compression yes

这里 -X 5 表示使用 SOCKS5 代理,如果你的代理只提供 HTTP,请改成 -X connect。如果你的系统没有 nc,可能需要安装 netcat-openbsd。


验证代理是否生效

几个常用的自查手段:

1
2
3
4
5
6
7
8
# 查看经过代理后的公网 IP(应为代理节点 IP)
curl -s https://httpbin.org/ip

# 检查 Git 代理配置
git config --global --list | grep proxy

# 实际克隆一个小仓库测试速度
git clone https://github.com/torvalds/linux.git --depth 1

如果速度大幅提升且 IP 变化,说明一切顺利。


不想用代理了,怎么还原?

用完想直连,执行以下命令取消代理:

1
2
3
4
5
unset http_proxy
unset https_proxy
git config --global --unset http.proxy
git config --global --unset https.proxy
# 注释掉 ~/.ssh/config 里的 ProxyCommand 行

常见坑及解决

1. 虚拟机 ping 不通宿主机 IP
通常是 Windows 防火墙拦截了。可以暂时关闭防火墙测试,或者为代理端口添加入站规则(允许来自 192.168.xxx.0/24 的访问)。

2. 确认代理端口正确,但 curl 报 Connection refused
检查宿主机代理软件是否确实打开了 Allow LAN;有些梯子开启 LAN 后还需要重启软件。或者端口号写错了,HTTP 代理端口和 SOCKS5 端口可能不同。

3. 速度没提升,甚至打不开网页
可能是代理节点本身较慢,换一个节点试试;或者代理协议不匹配(比如配置里写了 HTTP 但实际只支持 SOCKS5)。用 curl -v https://github.com 能看到详细的代理交互过程,便于诊断。

4. 环境变量只对当前终端有效
如果你希望长期生效,可以把 export 命令写入 ~/.bashrc 或 ~/.zshrc,但要注意这会让终端下所有工具都走代理,可能访问局域网服务时会变慢。更推荐的方式是单独配置 Git 的代理,或者写个函数来开关代理。


最后

整个方案的核心其实就是 “宿主机开共享 + 虚拟机填地址” 两步。虽然每次开机代理 IP 可能变化(特别是 DHCP 环境),但 NAT 模式下网关 IP 相对固定,用起来很稳定。这套方法也适用于 WSL2、Docker 容器等场景,希望对你有所帮助。

如果还有更好的技巧或踩坑经验,欢迎在评论区交流。