前言
本文内容较为硬核,读者不应是 Linux 小白且应对 NekoRay ,VMware 以及操作系统代理有基本的了解。
本文探讨的场景是 Linux 图形化操作系统,在命令行系统无法运行 NekoRay(也没有必要)直接运行代理核心即可。
简介
我们曾在 『Blog』VMware 虚拟机流量代理 介绍过一种虚拟机借助宿主机局域网代理实现「间接代理」的方案,it works fine 但不够优雅,代理端口的配置让人摸不着头脑,宿主机内网 IP:PORT 变动后,虚拟机代理设置也需要跟着变动,非常繁琐。
如今,我们可以借助一些优秀的开源项目直接在 Linux 操作系统上管理代理服务器,即,直接在虚拟机上启动客户端代理内核实现流量代理。此时,虚拟机代理和宿主机代理相互独立,虚拟机系统代理无需跟随宿主机网络环境变动。本文以 VMware Ubuntu20.04LTS 为例介绍虚拟机流量代理的最佳实践,这是目前个人使用场景代理效率最高且配置最简单的方案(暴论)。
本文涉及的开源项目如下:
项目名 | 版本号 | 用途 |
---|---|---|
MatsuriDayo/nekoray | v2.2 | 图形化代理客户端 |
HyNetwork/hysteria | v1.2.2 | 代理核心 |
klzgrad/naiveproxy | v106.0.5249.91-1 | 代理核心 |
虚拟机设置
将虚拟机镜像的网络适配器的网络连接模式改成 NAT 模式。
代理设置
从这一步开始均为玄学的操作,因为后文中涉及到的开源项目均部署在 GitHub 上,需要优先使用代理才能下载。
这里有两种解决方法,要么先在宿主机上下载好必要的软件,再把它们「拖入」虚拟机窗口传输文件;要么通过反代服务解决 wget 等命令的路由问题。下文以「命令行」方案为例梳理配置思路。若随时间推移反代接口失效或脚本执行错误,读者可手动分步执行命令或基于第一种方案照葫芦画瓢。
Script: 如果你使用 Ubuntu 20.04 以及 python3 开发环境,可以运行一键安装脚本,直接跳过 NekoRay 下载以及代理核心下载步骤。
|
|
Download NekoRay
行为链:从 GitHub 下载 NekoRay 预编译压缩包,解压到桌面,修改控制权限,启动 NekoRay。
其中 https://dl.capoo.xyz/
为作者开放使用的反代接口,去掉这段内容后剩下的部分为正常的 GitHub 的资源链接。如果你的虚拟机此时不存在路由问题,应该去掉这段内容。
此外,为保证操作的连贯性,这里写死了 NekoRay v2.2 的下载地址,你可以在部署完毕后通过 NekoRay 内置的在线更新功能追平最新特性。
|
|
如果你是第一次使用 NekoRay ,可以在 之前的文章 中了解更多的使用细节,此处不再赘述。
Download Proxy Core
下文以 Hysteria 及 Naiveproxy 作演示,同样,相关文章可在本站历史查找。
行为链:从 GitHub 上游仓库下载预编译代理核心并存放至 NekoRay 的配置路径下,最后赋予 hysteria-core 额外的执行权限。
|
|
下载完后,参照 之前的文章 启用 HTTP 监听端口 并 指定 hysteria-core 以及 naive-core 的绝对路径。
Enable System Proxy
至此, NekoRay 已配置完毕可以直接投入使用。接下来,以你喜欢的方式添加 Hysteria 或 Naiveproxy 的代理服务器,例如从宿主机已配置好的 NekoRay 中导出分享链接并粘贴过来。
选中需要激活的服务器,启动系统代理。你可以访问 Google 或 YouTube 等站点检测系统代理连通性,也可以通过 fast.com 或 speedtest.net 甚至是 YouTube 码流速度估算代理最大下行速度,如图 3,4,5 所示。
之后,你可以通过双击 ~/Desktop/nekoray/launcher
启动软件本体,也可以设置开机自启。
开发中的代理问题
介绍常见的虚拟机代理错误设置并给出相应的解决方法。
浏览器代理
浏览器代理选择系统代理即可。Google,Edge 默认走系统代理(且不可更改),Firefox 则给出眼花缭乱的选项,将「配置访问互联网的代理服务器」手动置为「使用系统代理」即可。
wget | git | pip |curl 等命令的路由通路
这些命令默认走系统代理。如果你配置了优先级更高的回源代理(如 pip 清华镜像源)那么它大概率会和系统代理打架,针对回源代理的说明可看后文小节部分。
apt 等命令的路由通路
建议保持国内镜像源。本地与 Ubuntu 软件源服务器是直连关系,流量不走系统代理,选择国内镜像源直连是不错的选择。当然你也可以修改 Ubuntu 软件源指回主根服务器,并保持 NekoRay VPN 模式为开启状态。
ping 命令的连通性
我想你应该不会惊讶于「为什么我开启了系统代理,能 ping 通 baidu.com 却 ping 不通 google.com」。
JetBrains 家族产品的代理设置
(如:PyCharm,Goland,IDE)
这类软件设置项中的代理仅对软件本身有效,如插件商城,而软件运行代码是通过 shell 脚本命令执行的,即,你的代码中的网络请求是否使用代理与这个库的底层逻辑以及你是否传入代理参数有关,而与软件设置的代理无关。
比如 Python3 的
requests.get()
在你不指定参数proxies
时会检索环境变量*_proxy
自动填充proxies
参数,即,reqeusts 流量默认走系统代理。而aiohttp
中基于ClientSession
对象的网络请求默认直连,即,不指定参数proxy
代理不生效。但无论如何,它们都与软件设置的代理无关。TLS in TLS
陷阱如果你使用 Python3 进行开发,你一定经历过: pip 下载速度慢;换源;镜像源和系统代理打架;自己写的网络请求没法过墙,指定了系统代理却出现了连锁的
SSLError
异常。这是一个史前巨坑,是一个仅会在中国大陆发生的奇妙化学反应,urllib3 的导演组都自愧不如。这一切的一切都指向一个 TLS in TLS 陷阱。你可以在 conda issues 继续吃瓜。解决方法如下,根据你的需求和应用场景择优:
Solution1:调整 urllib3 版本,即,
pip install urllib3==1.25.11
;Solution2:调整代理软件配置
v2rayN v5.36+, 「参数设置 – 系统代理设置 – 高级代理设置」选择
http=http://{ip}:{http_port};https=http://{ip}:{http_port}
。在「例外」中添加pypi.tuna.tsinghua.edu.cn;
绕过 pip 清华源的代理请求,如果你使用其他 pip 源,填写相应的域名即可。Clash(cfw/verge/…)开启 TAP/TUN。
NekoRay 切换至 VPN 模式。
Solution3:以你喜欢的方式调整系统代理的协议格式
核心操作是让 HTTPS 与 HTTP 的代理流量公用一个端口,并且绕过系统代理的 TLS 认证问题。
1 2 3 4
proxies = { "http": "http://127.0.0.1:10809", "https": "http://127.0.0.1:10809" }