将虚拟机网络完全接入代理-远离timeout
当你使用虚拟机中的 linux 系统时你能很轻易发现其 terminal 终端相当难以走代理,所以你可能会遇到以下情况:
- pip3 install 出现 timeout
- 安装 pwndbg 时总是被莫名奇妙打断和乱七八糟的报错
- docker 出现 Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)



一般来说解决办法都是需要换各种源啦,利用 proxychains 配置上宿主机的代理啦。
Nein!
设置网卡系统级代理才是你该做的事。
让整台虚拟机所有流量才是最正确的。
而且一次设置可以提供给多台实例使用,几乎完全不需要修改!
示例环境:
宿主机:Windows 11 + Clash Verge v2.4.2
虚拟机:virtualbox 7.1.10 r169112 + Ubuntu 24.04
操作步骤:
下载代理工具 Clahs Verge
随便整一个什么机场,这里放一个我用的机场 , 仅推荐其中的2元包月套餐,100GB流量,这种便宜机场随时会跑路,买多了得不偿失。
在机场的教程中找到导入订阅链接的办法,不出意外显示如下:

正常在当前节点组中延迟显示数字正常且为绿色代表网络良好,我们需要用到的网络设置组中的虚拟网卡模式选项卡。(建议先关闭软件然后右击用管理员模式启动)
从管理员启动后打开图片中的虚拟网卡模式,这里可能会卡住无响应,最好等待他自己恢复,因为此时是正在建立一张虚拟网卡。
打开控制面板中的网络连接显示如下:

我们可以注意到其中的 Mihomo 是 Clash Verge 新建的虚拟网卡。
在 virtualbox 管理器的工具选项卡中存在网络子选项卡:

如果你没有建立仅主机网络网卡,就在这里建立一块,同样会显示在之前的控制面板中的网络连接图片中,显示为以太网3(也可能是其他名字,注意其下面的小字区分)。
右击之前的控制面板中的网络连接图片中的 Mihomo 网卡选择属性中的共享选项卡,启用允许其他网络用户通过此计算机的 Internet 连接来连接,然后家庭网络连接选择我们创建的虚拟网卡:

弹出警告:

记得在之前 virtualbox 管理器的工具选项卡中存在网络子选项卡设置成警告中的静态 ip 并禁用 DHCP 服务器。
设置完成后 Mihomo 应该变成共享的:

在 virtualbox 管理器中选择你想要的实例的设置按钮,选择其中的网络选项卡,修改其连接方式为仅主机网络,名称选择你刚刚创建的那张虚拟网卡:

检查 ip 是否正确,比如我刚刚警告弹窗显示的是 192.168.137.0 网段的,我的网卡也应该拿到了相应的地址:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17╰─ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:cc:70:77 brd ff:ff:ff:ff:ff:ff
inet 192.168.137.45/24 brd 192.168.137.255 scope global dynamic noprefixroute enp0s3
valid_lft 604770sec preferred_lft 604770sec
inet6 fe80::a00:27ff:fecc:7077/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:8f:8e:50:97 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever因为我们有时还有在完全代理和无代理切换网络的需求,我用的时候发现了一个小 bug,网卡会因为地址来不及释放且又马上会接收一个新 ip 地址,最后导致 ip 网段不匹配导致无法联网,用 chatgpt 写了个刷新脚本,每次切换完后刷新一下就行:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40#!/bin/bash
# =============================================
# refresh-net.sh
# 自动清理并重新申请 enp0s3 的 IP 地址
# 兼容 NetworkManager / systemd-networkd / dhclient
# =============================================
IFACE=${1:-enp0s3} # 默认网卡名称,可通过参数指定
echo "[*] 正在刷新网卡: $IFACE"
# 检查网卡是否存在
if ! ip link show "$IFACE" &>/dev/null; then
echo "[!] 找不到网卡 $IFACE"
exit 1
fi
echo "[1/4] 关闭网卡..."
sudo ip link set "$IFACE" down
echo "[2/4] 清除旧的 IP 地址..."
sudo ip addr flush dev "$IFACE"
echo "[3/4] 启用网卡..."
sudo ip link set "$IFACE" up
# 检查使用的网络管理器类型
if systemctl is-active --quiet NetworkManager; then
echo "[4/4] NetworkManager 管理环境,重新请求 DHCP..."
sudo nmcli device reapply "$IFACE" || sudo nmcli device connect "$IFACE"
elif systemctl is-active --quiet systemd-networkd; then
echo "[4/4] systemd-networkd 管理环境,重启网络服务..."
sudo systemctl restart systemd-networkd
else
echo "[4/4] 无显式网络管理器,使用 dhclient 手动获取 IP..."
sudo dhclient -r "$IFACE" 2>/dev/null
sudo dhclient "$IFACE"
fi
echo "[✓] 已完成刷新。当前 IP:"
ip -4 addr show "$IFACE" | grep inet || echo "未获取到 IPv4 地址,请检查 DHCP 服务。"另外 DHCP 服务器反应需要时间,切换网卡时有时不能马上联网,所以切换后需要稍微缓一下。
效果:

浏览器未特殊设置可以直接访问油管。

terminal 终端也可以直接拉取到油管的网络页面。
至此再也不需要配置各种各样的源了,代理万岁!