Linux系统命令行终端使用V2Ray翻墙(代理)的方法

我使用VirtualBox安装了Ubuntu 24虚拟机,执行一些需要访问外网的命令时,经常由于网络问题导致执行失败。那么Ubuntu命令行终端是否可以走V2Ray代理呢?答案是可以的,以下是具体步骤。

V2Ray服务器

外网VPS怎么购买,V2Ray服务器端怎么搭建,我暂时不介绍,网上有很多免费的V2Ray节点,你自己去找找。

先使用Windows的v2rayN、Android的v2rayNG App或者苹果系统的小火箭,测试一下你的V2Ray节点是否能连接成功,是否能访问google.com网站。

本教程的V2Ray服务器端使用v2ray+ws+tls+nginx搭建,使用VMess协议和V2Ray客户端通信。

安装V2Ray客户端

先更新一下系统依赖包的最新信息:

sudo apt update

安装要用到的一些命令:

sudo apt install curl unzip

下载V2Ray安装脚本,如果由于网络问题下载不下来的话,也可以去github上手动下载:

curl -O https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh

运行这个安装脚本安装V2Ray:

sudo bash install-release.sh

然后作为客户端的V2Ray就安装成功了。使用systemctl工具管理v2ray服务:

systemctl enable v2ray      #设置开机自启动
systemctl status v2ray      #查看服务状态
systemctl start v2ray       #开启服务
systemctl stop v2ray        #停止服务
systemctl restart v2ray     #重启服务

注意,V2Ray的客户端版本和服务端版本最好一样,至少大版本必须一样,否则使用的网络协议的版本可能不一致,造成客户端和服务端沟通失败。

配置V2Ray客户端

Ubuntu系统使用安装脚本安装的V2Ray,配置文件位置在/usr/local/etc/v2ray/config.json。

可以手动编辑这个配置文件,但是更推荐的方法是从v2rayN、v2rayNG或者小火箭导出正常连通的节点的V2Ray客户端配置。

以v2rayN为例,在正常连通的节点上鼠标右键,然后选择导出所选服务器为客户端配置,就能够导出我们需要的V2Ray客户端配置文件config.json了。

将导出的V2Ray客户端配置文件config.json的内容写进Ubuntu系统的/usr/local/etc/v2ray/config.json文件里。

注意,客户端和服务器配置中的alterId的值都必须是0,这是V2Ray 5版本推荐的设置,否则客户端连不上服务器。

测试一下配置文件语法是否有错:

/usr/local/bin/v2ray test -config=/usr/local/etc/v2ray/config.json

如果配置文件没有语法错误,就重启v2ray服务以使配置生效:

systemctl restart v2ray

在命令行终端使用V2Ray代理网络访问

可以使用proxychains4工具代理大多数命令的网络访问走V2Ray,用法是:

proxychains4 <你要执行的命令>

我们先下载安装proxychains4工具:

sudo apt update
sudo apt install proxychains4 -y

注意,不要安装Ubuntu 24.04 软件源中默认的 proxychains,因为proxychains是旧版 3.1,使用它执行命令会报以下错误:

ERROR: ld.so: object 'libproxychains.so.3' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.

编辑proxychains4的配置文件/etc/proxychains4.conf,启用以下配置项:

dynamic_chain
proxy_dns
quiet_mode

在ProxyList配置节添加如下配置:

[ProxyList]
socks5 127.0.0.1 10808

注意,proxychains-ng 只支持 socks4、socks5、http 三种协议类型,不存在 https 类型。

这样proxychains4就配置完成了,我们访问以下Google看看:

$ proxychains4 curl -I https://www.google.com
[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.17
HTTP/2 200
…

在输出中看到HTTP/2 200,就表示我们成功访问到了Google。

让当前命令行终端的网络操作都走V2Ray代理

既然我们已经配置好 proxychains4 并且能正常访问 Google,最简单、最可靠的方式就是继续用它,直接在当前终端的命令加上proxychains4前缀使用,适用于任何命令。例如:

proxychains4 curl https://ipinfo.io/ip
proxychains4 wget -O- https://ipinfo.io/ip
proxychains4 git clone https://github.com/xxx/yyy.git
proxychains4 apt update   # 注意,apt 部分命令可能不完全兼容,慎用

每次在执行命令时加都上proxychains4前缀,太麻烦了,如何在执行命令时不用加上proxychains4前缀就能走代理?

方案一、使用proxychains4前缀起一个新的shell

如果想让当前 shell 的所有后续命令都自动走代理(不推荐频繁用),可以使用proxychains4前缀起一个新的 shell:

proxychains4 bash

现在在这个子 shell 里,任何命令都走V2Ray代理,退出子 shell 用 exit 即可回到原 shell,原 shell 不受代理影响。

优点:

  • 支持几乎所有 TCP 程序(包括不支持代理的环境变量的程序,如 ping、nslookup、部分 git 操作等)
  • UDP 支持好(V2Ray socks5 开启了 udp:true)

方案二、设置环境变量(适用于支持http_proxy/https_proxy 的程序)

很多命令行工具(curl、wget、git、python requests、apt 等)会读取这些变量:

# 在当前终端执行(只影响当前会话)
export ALL_PROXY="socks5://127.0.0.1:10808"
export all_proxy="socks5://127.0.0.1:10808"   # 小写版,有些程序认这个

# 或者分开设置(更常见)
export http_proxy="socks5://127.0.0.1:10808"
export https_proxy="socks5://127.0.0.1:10808"
export ftp_proxy="socks5://127.0.0.1:10808"    # 可选

# 排除本地地址(防止循环)
export no_proxy="localhost,127.0.0.1,::1"

测试一下:

curl -I https://www.google.com

退出当前终端后这些环境变量会失效(只影响当前会话),要想每次登陆终端都生效,可以把这些环境变量写入~/.bashrc文件里。

常见问题及解决方法

若遇到问题,先查看v2ray服务(客户端)的日志:

journalctl -u v2ray -f -o cat

当proxychains4执行命令时,以上命令会输出v2ray服务(客户端)的日志,可以在配置文件中把日志级别改为debug,以查看更加详细的日志数据:

"log": {
    "access": "",
    "error": "",
    "loglevel": "debug"
  },

查看代理服务器的公网IP地址:

curl --socks5 127.0.0.1:10808 --connect-timeout 20 https://ipinfo.io/ip

或者用proxychains4:

proxychains4 curl https://ipinfo.io/ip

proxychains4对PHP(例如wp命令)程序支持得不好的解决方法

proxychains4 对原生 C 程序(如 curl、wget、ping)支持很好,但对 PHP 脚本(如 wp-cli)支持不稳定,经常出现超时、连接重置或下载中断。

为什么 proxychains4 + wp-cli 经常出问题?

wp-cli 内部大量使用 PHP 的 cURL 扩展来下载包、更新、安装插件/主题等,而 proxychains-ng(proxychains4)通过 LD_PRELOAD 方式劫持系统级的 socket 调用,主要针对 C/C++ 程序或直接使用系统 socket 的程序。

PHP 的 cURL 扩展有几种常见实现方式:

  • 使用系统 libcurl(大多数情况)
  • 但在很多 Linux 发行版(包括 Ubuntu)的 PHP 包里,cURL 是通过 PHP 自己的网络栈 或 线程模型 来处理的

这会导致下面几种常见冲突:

  • LD_PRELOAD 被 PHP 内部忽略或不完全生效(PHP 用了自己的 resolver 或多线程 cURL handle)。
  • DNS 解析被 proxychains 接管了,但后续的 TCP 连接超时(因为 PHP cURL 的超时、重试机制和 proxychains 的链路不完全兼容)。
  • wp-cli 下载 Git 仓库时会多次发起请求(clone + fetch),proxychains 的 dynamic_chain 在某些情况下会造成连接不稳定或被上游服务器限速/封禁。
  • GitHub 对代理 IP(尤其是 Cloudflare 出口)有时有严格的 rate limit 或连接超时检测。

推荐的解决/绕过方式(按优先级排序)

一、直接用环境变量代替 proxychains4(最推荐,成功率最高)

wp-cli 支持标准的代理环境变量,而且 PHP cURL 能很好识别它们。在当前终端执行:

export ALL_PROXY="socks5://127.0.0.1:10808"
export all_proxy="socks5://127.0.0.1:10808"

# 或者分开写(有时更稳)
export http_proxy="socks5://127.0.0.1:10808"
export https_proxy="socks5://127.0.0.1:10808"

# 建议加上这个,避免本地循环
export no_proxy="localhost,127.0.0.1,::1"

# 然后运行 wp 命令试试
wp package install schlessera/wp-cli-psysh

用完后可以unset这些环境变量:

unset ALL_PROXY all_proxy http_proxy https_proxy no_proxy

这个方法在大多数情况下都能让 wp-cli 正常走代理,且不会出现超时。

二、如果环境变量无效,强制指定代理给 wp-cli

wp-cli 本身支持 –http-proxy 参数(但只支持 http/https 代理,不直接支持 socks5)。 所以可以先把 socks5 转成 http 代理(用 v2ray 自带的 http 入站 10809):

wp --http-proxy=http://127.0.0.1:10809 package install schlessera/wp-cli-psysh

如果你没开 http 入站,就在 v2ray config.json 的 inbounds 里确认有 10809 的 http。

proxychains4无法用于Ping命令

注意,几乎所有基于 ICMP 协议的工具(如 ping、traceroute)都无法通过 SOCKS5 或 HTTP 代理正常工作,是协议本身的限制。

proxychains4(proxychains-ng)只能劫持和转发 TCP 和 UDP 流量。ICMP 不属于 TCP/UDP 范畴,所以 proxychains4 无法干预 ping 的数据包。这些包会直接从你的本地网络发出,走的是你的真实公网 IP,而不是代理服务器。

PHP Warning: Module ‘curl‘ already loaded in Unknown on line 0警告的解决方法

我的软件环境是:Ubuntu 22操作系统,使用apt安装的PHP 8.2。

如果在执行PHP相关命令时,看到一条警告消息:

PHP Warning: Module ‘curl‘ already loaded in Unknown on line 0

那是由于curl模块被重复启用。如果在/etc/php/8.2/fpm/php.ini和/etc/php/8.2/fpm/conf.d/20-curl.ini两处配置文件里都启用了curl扩展,就会报这个警告。

解决方法是在/etc/php/8.2/fpm/conf.d/20-curl.ini配置文件中启用curl扩展即可,而在其他配置文件中都不启用curl扩展。

/etc/php/8.2/fpm/conf.d/里的配置文件其实都是/etc/php/8.2/mods-available/里的配置文件的符号链接,这些配置文件中的扩展是被PHP默认启用的。

修改了配置文件记得重启php-fpm服务。最后只要在php -m命令的输出中或者通过浏览器访问phpinfo函数的PHP脚本的输出中看到curl了,就说明已启用curl扩展。