Mac设置Parallels Desktop中的虚拟机使用宿主机代理
Table of Contents
需求
前提:你的mac本身已经安装ss,并且可以通过ss科学上网(或者win也一样)
想要实现:Parallels Desktop里的虚拟机也想科学上网(或者win里安装vmware也一样,或者是另一台物理机也是一样的)
方法一:虚拟机也安装一个ss客户端
对于有窗口的系统,比如你虚拟机里安装的是win、或者ubuntu等,那么再安装一个客户端是很方便的,这就相当于在另一台电脑里使用ss客户端,既然mac上你会用了,那在其他电脑上也是一样的。
但是如果你虚拟机里是最小化安装的纯命令行的centos,那么使用客户端可能有一定的麻烦,yum无法安装,pip安装的感觉也是ssserver,并没有客户端,所以客户端还得编译,编译还有很多依赖,编译好还得写对配置文件,很多人都不太清楚这个,所以还是挺麻烦的。
方法二:虚拟机设置代理到宿主机
即虚拟机里设置代理到mac(这里mac就是虚拟机的宿主机),让虚拟机通过mac的ss科学上网,这里如果宿主机换成win,虚拟机软件换成vmware或virtualbox,它的原理也都是一样的。
设置方法:
1、首先把宿主机(我这里是mac)的ss设置里的Local Socks5 Listen Address由原来的127.0.0.1
设置为0.0.0.0
,如果你需要通过HTTP代理,那么也要把ss里的HTTP选项打开,并把HTTP proxy Listen Address地址由原来的127.0.0.1
设置为0.0.0.0
,这样做表示代理所有ip,而不只是本机的127.0.0.1
。或者如果你用的是其他科学上网工具,也有些写成“share over LAN(通过局域网共享)”,如果有这个选项,选上了就表示监听0.0.0.0
。
2、搞清楚你的虚拟机是通过什么方式联网的,虚拟机连网无非有两种方式:
- 桥接
- NAT
如果你是桥接连网,那么你只要找出你的宿主机的联网ip即可(mac的话,一般都是wifi,或者你通过转接头插网线的话,那就是转接头对应的ip)
如果你是NAT连网的,那么你要找出你的宿主机中NAT网卡的ip(在mac里使用parallels desktop虚拟机的话,NAT网卡一般是parallels Shared开头的)
3、在虚拟机里的~/.bashrc
或~/.zshrc
里,添加以下两句的其中一句:
export ALL_PROXY=SOCKS5://10.211.55.2:1080
export ALL_PROXY=HTTP://10.211.55.2:1087
第一句表示使用SOCKS5代理,第二句表示使用HTTP代理,注意ip和端口不要照抄我的,填你自己的,ip就是第2步中找到的ip,端口就是你的ss对应的端口,打开ss的设置里就有,一般ss有两个端口,一个socks5端口,一个http端口,找到对应端口填进去即可。
最后source一下配置文件:
source ~/.bashrc
或者你用zsh shell的话就是:
source ~/.zshrc
测试你的ip是哪里的:
curl https://ip.cn
如果显示的是你当前城市的ip或者附近城市的ip,说明代理无效,检查一下哪里搞错了。
如果显示的是你的代理服务器所在地址(比如美国)和ip,那说明代理设置成功。
然后试试能否访问google:
curl https://www.google.com
如果报以下错误,那就是不能访问
curl: (7) Failed connect to www.google.com:443; Connection timed out
如果返回一大片内容,那就是能访问,那一大片内容就是google首页的html源码。
如果是Windows,可以直接在cmd里设用set http_proxy=http://127.0.0.1:1087
,set https_proxy=http://127.0.0.1:1087
,set all_proxy=http://127.0.0.1:1087
其实更好的方式是这样,为什么这样写请参考Mac让Mail(自带邮箱客户端)的gmail走代理及终端走代理:
# 设置使用代理
alias setproxy="export https_proxy=http://127.0.0.1:1087; export http_proxy=http://127.0.0.1:1087; export all_proxy=socks5://127.0.0.1:1080; echo 'Set proxy successfully'"
# 设置取消使用代理
alias unsetproxy="unset http_proxy; unset https_proxy; unset all_proxy; echo 'Unset proxy successfully'"


Thanks a lot, it works!
You are welcome!