虚拟机上网加速:通过宿主机代理让 Ubuntu Server 用上梯子
最近在 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 | export http_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 | git config --global http.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 | Host github.com |
这里 -X 5 表示使用 SOCKS5 代理,如果你的代理只提供 HTTP,请改成 -X connect。如果你的系统没有 nc,可能需要安装 netcat-openbsd。
验证代理是否生效
几个常用的自查手段:
1 | # 查看经过代理后的公网 IP(应为代理节点 IP) |
如果速度大幅提升且 IP 变化,说明一切顺利。
不想用代理了,怎么还原?
用完想直连,执行以下命令取消代理:
1 | unset http_proxy |
常见坑及解决
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 容器等场景,希望对你有所帮助。
如果还有更好的技巧或踩坑经验,欢迎在评论区交流。