跳到主要内容

linux下为程序配置网络代理

开眼看世界的第一步:环境变量配置代理

注意

个人经验:用个稳定+高速+低延迟的机场(VPN)足够绕开很多麻烦,然而机场行业从来没有过任何一个标准,因此只能推荐一个机场作为本站某些教程的基础以解决在我的教程里依靠连到国外服务器的指令几乎无法使用的问题,例如在tailscale derp 节点的搭建教程中的镜像脚本实际上是被严重阉割过的版本

背景与原理

在shell里可以通过配置环境变量来让程序自动使用代理,当在shell里启动一个程序时,内核会调用fork函数创建一个子进程,在子进程中通过execve函数启动新的程序,而execve这个函数执行时会帮将环境变量传入子进程,从而使程序通过代理链接网络

使用man命令查看execve函数原型:

查看 execve 函数原型
等待输入...
进度
0/12
键盘输入
$
  • pathname: 指向可执行文件的路径,也就是要执行的程序
  • argv: 指向参数数组
  • envp: 指向环境变量数组

在execve函数的envp参数,解释了程序是从哪拿到了设置的环境变量。

计算机是最讲逻辑的,任何自动实现的功能的背后都不是魔法,这也意味着总能在linux系统里看到想看的数据,比如可以用这段代码检查当前命令行的环境变量的物理存储位置。

创建一个 C 程序 print_env.c

#include <stdio.h>
extern char **environ;
int main() {
printf("Environ pointer: %p\n", (void*)environ);
return 0; //return 0 是一个好习惯
}

然后编译并运行,这样就能看到环境变量存放的位置——0x7ffd3a2c8e58

编译运行环境变量检查程序
等待输入...
进度
0/5
键盘输入
$

提供代理的程序

代理,俗称中间人,正常情况下,一个程序发起网络请求会由操作系统内核网络栈发出到目标服务器并返回,而在配置代理的情况下,程序发出的流量请求将通过代理--操作系统网络栈-代理服务器,再由代理服务器转发到目标服务器,本教程统一使用Xray作为代理程序。

登神之路的第一个台阶,获取代理软件

备注

V2rayN有MAC和Windows版本,如果已经在本机上运行了代理软件则直接跳过这些直接去看如何使用裸内核启动代理的步骤即可

学了一下CFR2数据库的用法做了一个下载站,可以点下方链接去下载站 download.fnnas.wiki 看看,之后会补上一些个人在windows上常用的效率软件。

V2rayn软件下载windows版:v2rayN-windows-64.zip

下载后解压到一个非C盘的路径下,V2rayN.exe即为主程序,双击打开,放在一边备用。

解压列表

第二个台阶,获取代理信息

备注

示例机场仅做示例并非代表推荐,不过这家确实不错,如果已经有自己买过的订阅用自己的就行。

机场链接:咖啡云

机场首页

这里仅做演示使用,实际上这些机场套用的前端大差不差,可以视为一个模板改造后的。选择10元/月套餐点击立即订阅,

订阅套餐分类 付款周期选择

注意

尽量选择支付宝支付,微信支付对接体验堪称一坨垃圾,如果出现支付到一半需要退出支付的时候记得回到机场首页删除已下单的订单重新开一个订单,本条适用于任何机场。

支付方式选择

购买成功后回到机场首页,点击一键订阅获取订阅地址,复制订阅地址到剪贴板

备注

如果是windows用户不妨按下 Win+V 打开剪贴板历史记录这个功能,也许会在某些时候派上用场

复制订阅信息

拉取代理配置

继续,现在完成了第二步,剪贴板里存放着热乎的刚刚复制的代理订阅链接,回到V2RayN主程序界面,按顺序点击导入订阅地址

导入订阅地址 拉取订阅信息

拉取完代理配置之后就能看到代理服务器的信息了,常见的有HK,TW,SG,US,UK等等地区,选择一个节点, 1770564505403 1770564705135 此时在剪贴板里就有的节点详细配置信息了,目前为止进度已完成40%。

第三个台阶:在NAS机器上获取Xray-core裸内核

备注

因为某个香港网友煞笔网友在微信公众号里发了sing-box内核的代理教程,Xray-core项目管理者已宣布Xray-core项目仅针对俄罗斯与伊朗用户开发避雷这都什么人才

备注

在web界面看到的存储空间实际上对应的是根目录下的vol1/vol2开头的目录,ls / 之后就能看到,vol1对应存储空间1,vol2对应存储空间2,依此类推。为了方便起见就用vol1/1000/来作为路径演示。

使用ssh登录进入nas终端,用sudo -i 指令提权到root权限,cd到vol1/1000/路径下,创建proxy文件夹,cd进去,拉取Xray内核软件由于本站部署在CF可能会拉的满一点,可以提前把dns改成223.5.5.5等绕开运营商DNS污染

wget https://download.fnnas.wiki/assents/xray/Xray-linux-64.zip
下载并解压 Xray 内核
等待输入...
进度
0/39
键盘输入
$

这里的xray文件就是核心要使用的代理程序,xray通过读取一个json格式的配置文件来运行,单个json配置内分别为log日志,dns,router,inbound入站,outbound出站。

第四个台阶:走了么?如走!

./xray -c config.json  // -c 参数后跟随需要使用的配置文件

用这行命令启动Xray代理程序,但是当xray启动之后会劫持终端让无法输入其他命令:

Xray 启动后的终端状态
等待输入...
进度
0/7
键盘输入
$

这时候就要请出 tmux 了。tmux 是一个终端复用软件,可以让在一个终端会话中运行多个程序,并且随时将它们切换到“后台挂起”状态。使用下方命令安装 tmux:

sudo apt update
sudo apt install tmux

安装好之后,按照以下流程来后台运行 Xray:

使用 tmux 将代理挂载到后台
等待输入...
进度
0/8
键盘输入
$

此时代表又回到了普通的终端界面,而 Xray 已经在底层默默挂机为服务了。

第五个台阶:修改环境变量,爬死我了

现在后台有个跑着的代理进程通常它本地监听的 HTTP 请求端口是 10809,SOCKS 端口是 10808,具体以拉取并编辑保存的 config.json 文件内 inbounds 字段为准,只需要把程序的流量重定向给它即可。

在 Linux 终端里,绝大多数正经的程序和下载工具比如 wgetcurlgit 等都会读几个名叫 http_proxyhttps_proxyall_proxy 的环境变量。只要这几个变量存在,它们就会自动走代理。

可以将这些设置直接写到用户的环境配置文件里,还可以利用 alias 给它起个缩写别名,实现敲一个单词开关代理:

使用编辑器打开的命令环境变量文件,飞牛使用 debian,默认是bash,则对应 .bashrc

vim ~/.bashrc

打开之后:

  1. 按下 Shift + G大写的 G直接跳到文件的最后一行。
  2. 敲击一下键盘上的字母 o小写的 o,此时 Vim 会在最末尾新起一行并进入插入模式Insert 模式
  3. 将以下两段代码粘贴进去:
# 验证并开启终端代理的函数
function setproxy() {
echo "正在测试代理连通性..."
# 尝试使用 curl 通过 SOCKS5 代理请求 Google 头信息,超时时间 2 秒
if curl -I -s --socks5 127.0.0.1:10808 --connect-timeout 2 https://www.google.com > /dev/null; then
export http_proxy=http://127.0.0.1:10809
export https_proxy=http://127.0.0.1:10809
export all_proxy=socks5://127.0.0.1:10808
echo "Proxy is ON 代理已成功开启"
else
echo "代理连接失败!环境变量未重写。请检查后台 Xray 是否正在运行且节点有效。"
fi
}

# 关闭终端代理的函数
function unsetproxy() {
unset http_proxy https_proxy all_proxy
echo " Proxy is OFF"
}

(上面的 1080910808 是举例 V2rayN/Xray 默认端口,请确保和节点配置文件里的入站端口一致)

粘贴好之后:

  1. 先按下键盘左上角的 Esc 键退出插入模式。
  2. 连续输入 :wq 冒号、w、q,意思是写入并退出。
  3. 按下 Enter回车键即可保存并返回终端。

然后执行这句命令,让刚刚修改的文件立刻在当前终端生效:

source ~/.bashrc

见证魔法时刻

一切大功告成,以后无论想要在哪一个终端通过代理拉取 github 代码或者下载脚本,只需要敲一个简单的词测试:

验证代理连通性
等待输入...
进度
0/13
键盘输入
$

如果屏幕瞬间返回了一堆形如 HTTP/2 200 或者 HTTP/1.1 200 OK 的数据头,恭喜,已经迈过了这道高墙。当用完代理不想要被中间人干扰,又或者想直接访问国内局域网设施时,同样只需一句:

unsetproxy