前言
网上的教程参差不齐,有的还挺具有误导性的,于是打算在这里记录一下我的做法。
我的做法能够解决以下这些网上的教程存在的问题:
- 拨号上网的环境,无法使用主机代理。
- 网络环境改变后(比如路由器分配的 ip 改变了),需要重新设置代理。
- 如果主机没有连接网络,那虚拟机和主机没法通过网络通信(虽然此时代理也用不了)
- 终端里敲命令太麻烦了。
这篇文章将会尽可能详细的描述操作过程,同时解释其中的原理以帮助读者理解,一些我认为读者没必要知道的内容将会省略。
预备知识
不需要深入理解,你只需要知道,路由器具有它的功能,你也可以把使用 NAT 的地方看成一个简单的路由器(即使是虚拟的)。
VMware 虚拟网
VMware 具有“虚拟网络”的功能,而我们可以利用此功能虚拟出一个“路由器”,我们只需要将主机和虚拟机连接在同一个“路由器”下,便可以实现双向通信,这就是虚拟机使用主机侧代理软件的核心思路。
虚拟网络编辑器
这一步主要起到验证作用,为的是知道 VMware 自动创建的 NAT 类型虚拟网是否存在,叫什么名字。一般而言只需要检查,并没有什么需要修改的内容。
VMware 自带了一个虚拟网络编辑器,我们可以在这里查看所有 VMware 所创建的虚拟网的信息。
打开之后点击一下“更改设置”来显示全部内容。
在这里我们注意到,VMware 默认已经为我们创建了一个 NAT 类型的虚拟网,其名称为 VMnet8(需要记一下这个名字)。
( VMware 默认都会创建一个 NAT 类型虚拟网,故此处不再赘述如何创建并配置一个 NAT 虚拟网)
我们可以将这个 NAT 类型的虚拟网看成一个虚拟的路由器,于是我们只需要同时将主机和虚拟机连接在这个“路由器”下面,就可以实现双向通信了,接下来我将陈述该怎么做。
(只要“将主机虚拟适配器连接到此网络”保持勾选状态,主机就已经连接到这个“路由器”了)
把虚拟机连接到“路由器”
这一步我们要做的事情是:将虚拟机连接到上述虚拟网。
首先,每台虚拟机都有一个“网络适配器”的选项。
这个选项可以在 顶栏的“虚拟机”/在虚拟机上右键 -> "设置" 找到
在这里,我们可以选择要将虚拟机连接到“虚拟网络编辑器”中的哪个网络。
我们将网络选择为之前记住的:VMnet8。
这样,就相当于把虚拟机连接在虚拟“路由器”的下面了。
配置代理
在这一步之前,我们已经将虚拟机和主机连接在了同一个“虚拟路由器”的下面,现在,我们只需要知道主机在该“虚拟路由器”下的 ip 地址和代理端口,便可以完成代理的设置。
主机的 ip 地址
我们可以打开主机的任务管理器,找到上面记住的 VMnet8 。
这个地址就是主机在这个“虚拟路由器”下的地址,我们需要将其记录下来。
代理端口
以代理软件“v2rayN”为例。
首先,我们需要打开“允许来自局域网的连接”来保证来自虚拟机的连接不会被主机拒绝。
(这里的图是旧版软件,新版的开关在“基础设置”里)
然后,我们可以在软件主界面的底部看到 SOCKS5 和 HTTP 代理端口:
旧版软件:
注意:我们需要的端口号只是后面的 1079 和 1080,前面的 127.0.0.1 是指向本机的网络地址,我们无法在虚拟机中使用它指向主机。我们需要将端口号以及其对应的协议(HTTP/SOCKS5)记录下来。
新版软件:
我们把“局域网”后面对应的协议(socks/http)和端口(1081/1082)记录下来就行啦。
在虚拟机中配置代理
此处以 Ubuntu 为例。
我们已经知道了主机在“虚拟路由器”下的地址以及代理软件的端口,现在我们只需要在虚拟机当中将代理信息设置为上方记录的 ip 地址与端口即可。
打开 Ubuntu 的设置,选择“网络”选择卡。
可以看到其下有一个“网络代理”设置。
点开,将代理模式调成手动,输入上方记录的 主机 ip 地址 和 代理软件端口(把协议也对应上)
(这里的图对应的是上面的旧版软件)
那么虚拟机的代理就配置完成了,我们可以尝试使用一下。
可以看到,主机代理软件的日志中出现了来自虚拟机的访问记录,这说明代理已经配置完成。
杂谈
Ubuntu 设置中的代理设置,其本质是添加环境变量 http_proxy
、https_proxy
、ALL_PROXY
等。只有能够主动检测并读取这些环境变量的软件才能自动使用代理,比如 git
的 http 协议模式、wget
、curl
、pip
等。某些软件包的代理可能需要额外进行手动配置,比如 git
的 ssh 模式和 git 协议模式。
虚拟机“网络适配器”的 NAT模式 默认也是指向 VMnet8 的,不过为了清晰起见,上方依旧使用“自定义”指向 VMnet8 。
v2rayN配置完,主机上确认可以正常使用。按步骤做的,但是curl之后还是说连接超时。。。
git config -- global http.proxy显示已经配置上了,不知道是哪里的问题orz
几个可以检查的点:
1. 在虚拟机内直接 ping 主机的 ip 地址能否 ping 通,如果能通至少说明虚拟网是工作正常的,否则虚拟网可能存在问题(可以尝试关闭系统的“快速启动”并重启电脑,虚拟网在“快速启动”下很有可能抽风),或者是主机的 ip 地址没有配置正确。
2. v2rayN 的日志,假如虚拟机向主机发起了连接,应该可以在 v2rayN 的日志中找到一点线索,如果其中没有任何记录,那很有可能是 1 中的问题又或者端口没有配置正确。
你这个也有问题,你的ip地址会变动你知道吗
在对应的 VMnet 下,主机的地址是固定的,不会发生变动
虚拟机为win10 网络代理填写页面在哪里呢
直接在 win10 设置里搜索“代理”,然后找到“手动设置代理”,把主机的 http 代理地址和端口填进去即可。
如果要主机使用虚拟机的代理呢?
虚拟机安装openwrt做代理.
建议参照旁路由的解决方案
我用V2ray上显示的本地两个端口[socks和http]不行,换成局域网的就行了,LibXZR可以把这个情况加上去_(:D)∠)_
是的,现在 v2rayN 更新了,对本地端口和局域网端口进行了区分 ( ˶ ❛ ꁞ ❛ ˶ )
牛呀牛呀
我在设置代理的时候发现虚拟机没有最上面的有线连接是怎么回事?
这个可能的原因有很多,既可能是虚拟机内部的网络服务故障,也可能是 VMware 的虚拟网络故障了,(甚至可能是 Windows 的“快速启动”造成的问题)。建议在网上搜索相关内容,或者通过比如重装虚拟机之类的方式排查问题。
楼主请教一下,我按照流程配置代理之后,虚拟机(UBUNTU)侧浏览器能上google,但是终端ping不通,可能是什么原因呢?
ping 走的是 ICMP 协议,这个协议是不支持走代理的。故不要用 ping 来判断是否代理成功,可以改用 curl 之类的方案。
我去 牛的楼主,实测确实可以!疯狂点赞!
请问一下如果是命令行的话是一下这样吗
export http_proxy=http://10.0.0.2:10808 \
https_proxy=https://10.0.0.2:10808 \
all_proxy=socks5://10.0.0.2:10809
一般来说,https_proxy 用的也是 http:// 类型的代理。当然,这具体取决于你的代理软件的支持情况。
配置完后虽然可以curl, 然后我我做k8s集群拉images时
kubeadm config images pull --cri-socket unix:///run/cri-dockerd.sock 出不去怎么办
root@ec2-master01:~#kubeadm conkubeadm config images pull --cri-socket unix:///run/cri-dockerd.sock
W0801 01:48:22.616212 8943 version.go:104] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt": Get "https://cdn.dl.k8s.io/release/stable-1.txt": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
W0801 01:48:22.616746 8943 version.go:105] falling back to the local client version: v1.27.4
failed to pull image "registry.k8s.io/kube-apiserver:v1.27.4": output: E0801 01:50:12.111541 9056 remote_image.go:171] "PullImage from image service failed" err="rpc error: code = Unknown desc = Error response from daemon: Head \"https://asia-northeast1-docker.pkg.dev/v2/k8s-artifacts-prod/images/kube-apiserver/manifests/v1.27.4\": dial tcp 142.250.157.82:443: connect: connection refused" image="registry.k8s.io/kube-apiserver:v1.27.4"
time="2023-08-01T01:50:12Z" level=fatal msg="pulling image: rpc error: code = Unknown desc = Error response from daemon: Head \"https://asia-northeast1-docker.pkg.dev/v2/k8s-artifacts-prod/images/kube-apiserver/manifests/v1.27.4\": dial tcp 142.250.157.82:443: connect: connection refused"
, error: exit status 1
To see the stack trace of this error execute with --v=5 or higher
使用环境变量配置代理不一定适用于所有的应用,这个可以具体看看 k8s 的相关文档。
vm虚拟机怎么使用外部sk5代理呢,不是使用主机代理
其实配置 http_proxy=socks5:// 也是合法的,不过并不是所有应用都支持这种操作。建议考虑 tun2socks 。
很有用! 成功了!
嘶clash的tun模式好像搞不了这个
真的好棒,说的很清楚,一次成功,感谢感谢
感谢,目前找到最好的虚拟机代理教程,还可以添加一些内容,比如说这样设置后pip会因为代理报错(刚遇到了
感谢博主,终于可以在Ubuntu里,将项目上传到Github了,还想请教下,如果想更详细了解下虚拟机共享主机代理的原理,可以了解些什么呢,有什么关键词呢,感激不尽
那可就太多了,这里关键的不是“虚拟机共享主机”的原理,而是计算机网络本身的原理,可以掏出《计算机网络》直接学一遍。
网卡 / MAC 层 / IP 协议 / 子网 / 网关 / DHCP / 路由 / NAT
虚拟机只是把上面这些计算机网络世界里本身就有的东西虚拟了一份,建议直接学习它们本身的原理。
& 现在这种简单的 http 代理配置其实已经有点过气了,可以进一步学习了解一下 旁路由 / iptables / tun2socks 之类的技术。
博主牛逼,很实用,感谢分享!!!!!
我的是clash 他是http+socks混合端口7890,我的centos端口可以直接都指定7890吗
可以
请问你成功了嘛,我按博主这个方法还是连不上google,把http_proxy写在~/.bashrc里也不行啊,应该从哪些方面排查问题呢
真的太棒了,最近在学习搭建k8s,真好卡在curl访问不了外网,通过博主的解决方案帮我搞定了curl的代理ovo
博主好强,思路很清晰!
我使用clahs配置好之后,curl的时候会报错curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to 192.168.206.1:7890
用 curl -v 看看有没有更详细的错误信息吧...
谢谢,有用,成功了
感谢
太厉害了!感谢感谢,一次成功。我用的是clash,不过大同小异~