将虚拟机网络完全接入代理-远离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

操作步骤:

  1. 下载代理工具 Clahs Verge

  2. 随便整一个什么机场,这里放一个我用的机场 , 仅推荐其中的2元包月套餐,100GB流量,这种便宜机场随时会跑路,买多了得不偿失。

  3. 在机场的教程中找到导入订阅链接的办法,不出意外显示如下:

  4. 正常在当前节点组中延迟显示数字正常且为绿色代表网络良好,我们需要用到的网络设置组中的虚拟网卡模式选项卡。(建议先关闭软件然后右击用管理员模式启动)

  5. 从管理员启动后打开图片中的虚拟网卡模式,这里可能会卡住无响应,最好等待他自己恢复,因为此时是正在建立一张虚拟网卡。

  6. 打开控制面板中的网络连接显示如下:

    我们可以注意到其中的 Mihomo 是 Clash Verge 新建的虚拟网卡。

  7. 在 virtualbox 管理器的工具选项卡中存在网络子选项卡:

    如果你没有建立仅主机网络网卡,就在这里建立一块,同样会显示在之前的控制面板中的网络连接图片中,显示为以太网3(也可能是其他名字,注意其下面的小字区分)。

  8. 右击之前的控制面板中的网络连接图片中的 Mihomo 网卡选择属性中的共享选项卡,启用允许其他网络用户通过此计算机的 Internet 连接来连接,然后家庭网络连接选择我们创建的虚拟网卡:

  9. 弹出警告:

  10. 记得在之前 virtualbox 管理器的工具选项卡中存在网络子选项卡设置成警告中的静态 ip 并禁用 DHCP 服务器。

  11. 设置完成后 Mihomo 应该变成共享的:

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

  13. 检查 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
  14. 因为我们有时还有在完全代理和无代理切换网络的需求,我用的时候发现了一个小 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 终端也可以直接拉取到油管的网络页面。

至此再也不需要配置各种各样的源了,代理万岁!


将虚拟机网络完全接入代理-远离timeout
https://zlsf-zl.github.io/2025/10/23/将虚拟机网络完全接入代理-远离timeout/
作者
ZLSF
发布于
2025年10月23日
许可协议