Linux下V2Ray安装配置指南

Linux下V2Ray安装配置完全指南

本文档提供了在Linux系统上安装、配置和使用V2Ray的完整流程,包括从订阅链接自动生成配置文件、设置代理环境变量以及常见问题的解决方案。

目录

  1. 安装V2Ray
  2. 订阅转配置
  3. 配置V2Ray
  4. 启动V2Ray服务
  5. 设置代理环境变量
  6. 验证代理连接
  7. 常见问题排查
  8. 高级配置

1. 安装V2Ray

1.1 使用官方安装脚本(推荐)

bash 复制代码
# 安装V2Ray
bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)

这个脚本会:

  • 下载最新版V2Ray
  • 安装到 /usr/local/bin/v2ray
  • 创建配置目录 /usr/local/etc/v2ray
  • 自动配置systemd服务

1.2 手动安装

如果脚本无法运行,可以手动安装:

bash 复制代码
# 下载V2Ray
wget https://github.com/v2fly/v2ray-core/releases/download/v4.45.2/v2ray-linux-64.zip

# 解压文件
mkdir -p v2ray
unzip v2ray-linux-64.zip -d v2ray

# 移动到系统目录
sudo mv v2ray /usr/local/

# 创建软链接
sudo ln -s /usr/local/v2ray/v2ray /usr/local/bin/v2ray
sudo ln -s /usr/local/v2ray/v2ctl /usr/local/bin/v2ctl

# 创建配置目录
sudo mkdir -p /usr/local/etc/v2ray

1.3 创建systemd服务(手动安装时需要)

bash 复制代码
sudo nano /etc/systemd/system/v2ray.service

添加以下内容:

复制代码
[Unit]
Description=V2Ray Service
After=network.target

[Service]
ExecStart=/usr/local/bin/v2ray -config /usr/local/etc/v2ray/config.json
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

2. 订阅转配置

2.1 创建订阅转换脚本

创建一个名为v2ray_sub.sh的脚本文件:

bash 复制代码
nano v2ray_sub.sh

将以下内容粘贴到文件中:

bash 复制代码
#!/bin/bash

# 参数检查
if [ $# -ne 2 ]; then
  echo "用法: $0 订阅链接 输出配置文件"
  echo "例如: $0 https://example.com/sub 配置文件.json"
  exit 1
fi

SUB_URL="$1"
OUTPUT_FILE="$2"

echo "=== V2Ray订阅转换脚本 ==="
echo "订阅链接: ${SUB_URL:0:30}..."
echo "输出文件: $OUTPUT_FILE"
echo

# 下载并解码订阅内容
echo "[1/5] 下载订阅内容..."
curl -sL "$SUB_URL" > sub_encoded.txt

# 检查是否下载成功
if grep -q "<html>" sub_encoded.txt; then
  echo "错误: 订阅下载失败,服务器返回HTML内容:"
  cat sub_encoded.txt | head -5
  exit 1
fi

echo "[2/5] 解码订阅内容..."
base64 -d sub_encoded.txt > sub_decoded.txt 2>/dev/null
if [ $? -ne 0 ]; then
  echo "错误: base64解码失败,可能不是标准的base64编码"
  exit 1
fi

# 检查解码后的内容
echo "[3/5] 检查节点类型..."
NODE_COUNT=$(wc -l < sub_decoded.txt)
echo "找到 $NODE_COUNT 个节点"

# 优先选择vmess节点
if grep -q "^vmess://" sub_decoded.txt; then
  echo "找到vmess节点,优先使用"
  VMESS_LINK=$(grep "^vmess://" sub_decoded.txt | head -1)
  PROTOCOL="vmess"
elif grep -q "^trojan://" sub_decoded.txt; then
  echo "找到trojan节点,将使用trojan协议"
  TROJAN_LINK=$(grep "^trojan://" sub_decoded.txt | head -1)
  PROTOCOL="trojan"
elif grep -q "^ss://" sub_decoded.txt; then
  echo "找到ss节点,将使用shadowsocks协议"
  SS_LINK=$(grep "^ss://" sub_decoded.txt | head -1)
  PROTOCOL="ss"
else
  echo "错误: 未找到支持的节点类型(vmess/trojan/ss)"
  exit 1
fi

# 处理不同类型的节点
echo "[4/5] 解析节点信息..."

if [ "$PROTOCOL" = "vmess" ]; then
  # 解析vmess链接
  VMESS_DATA=$(echo "${VMESS_LINK#vmess://}" | base64 -d 2>/dev/null)
  if [ $? -ne 0 ]; then
    echo "错误: vmess链接解码失败"
    exit 1
  fi
  
  # 提取vmess配置
  SERVER_ADDRESS=$(echo "$VMESS_DATA" | grep -o '"add":"[^"]*"' | cut -d'"' -f4)
  SERVER_PORT=$(echo "$VMESS_DATA" | grep -o '"port":[0-9]*' | cut -d':' -f2)
  USER_ID=$(echo "$VMESS_DATA" | grep -o '"id":"[^"]*"' | cut -d'"' -f4)
  ALTER_ID=$(echo "$VMESS_DATA" | grep -o '"aid":[0-9]*' | cut -d':' -f2 || echo "0")
  NETWORK=$(echo "$VMESS_DATA" | grep -o '"net":"[^"]*"' | cut -d'"' -f4 || echo "tcp")
  PATH=$(echo "$VMESS_DATA" | grep -o '"path":"[^"]*"' | cut -d'"' -f4 || echo "")
  TLS=$(echo "$VMESS_DATA" | grep -o '"tls":"[^"]*"' | cut -d'"' -f4 || echo "none")
  HOST=$(echo "$VMESS_DATA" | grep -o '"host":"[^"]*"' | cut -d'"' -f4 || echo "")
  
  echo "节点信息:"
  echo "  协议: vmess"
  echo "  地址: $SERVER_ADDRESS"
  echo "  端口: $SERVER_PORT"
  echo "  用户ID: ${USER_ID:0:8}..."
  echo "  alterID: $ALTER_ID"
  echo "  传输协议: $NETWORK"
  echo "  TLS: $TLS"
  
  # 生成vmess配置
  echo "[5/5] 生成V2Ray配置文件..."
  cat > "$OUTPUT_FILE" << EOF
{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "port": 10808,
      "protocol": "socks",
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      },
      "settings": {
        "auth": "noauth"
      }
    },
    {
      "port": 10809,
      "protocol": "http",
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "vmess",
      "settings": {
        "vnext": [
          {
            "address": "$SERVER_ADDRESS",
            "port": $SERVER_PORT,
            "users": [
              {
                "id": "$USER_ID",
                "alterId": $ALTER_ID,
                "security": "auto"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "$NETWORK",
EOF

  # 根据TLS设置添加相应配置
  if [ "$TLS" != "none" ] && [ -n "$TLS" ]; then
    cat >> "$OUTPUT_FILE" << EOF
        "security": "$TLS",
        "tlsSettings": {
          "serverName": "$HOST"
        },
EOF
  else
    cat >> "$OUTPUT_FILE" << EOF
        "security": "none",
EOF
  fi

  # 根据网络类型添加相应配置
  if [ "$NETWORK" = "ws" ]; then
    cat >> "$OUTPUT_FILE" << EOF
        "wsSettings": {
          "path": "$PATH",
          "headers": {
            "Host": "$HOST"
          }
        }
EOF
  elif [ "$NETWORK" = "tcp" ]; then
    cat >> "$OUTPUT_FILE" << EOF
        "tcpSettings": {}
EOF
  fi

  cat >> "$OUTPUT_FILE" << EOF
      }
    },
    {
      "protocol": "freedom",
      "tag": "direct"
    }
  ],
  "routing": {
    "domainStrategy": "IPOnDemand",
    "rules": [
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      }
    ]
  }
}
EOF

elif [ "$PROTOCOL" = "trojan" ]; then
  # 解析trojan链接
  # trojan://password@server:port?allowInsecure=1#remarks
  TROJAN_PASSWORD=$(echo "$TROJAN_LINK" | sed 's/trojan:\/\///' | cut -d '@' -f1)
  SERVER_INFO=$(echo "$TROJAN_LINK" | sed 's/trojan:\/\///' | cut -d '@' -f2)
  SERVER_ADDRESS=$(echo "$SERVER_INFO" | cut -d ':' -f1)
  SERVER_PORT=$(echo "$SERVER_INFO" | cut -d ':' -f2 | cut -d '?' -f1)
  ALLOW_INSECURE=$(echo "$TROJAN_LINK" | grep -o "allowInsecure=1" || echo "")
  
  echo "节点信息:"
  echo "  协议: trojan"
  echo "  地址: $SERVER_ADDRESS"
  echo "  端口: $SERVER_PORT"
  
  # 生成trojan配置
  echo "[5/5] 生成V2Ray配置文件..."
  cat > "$OUTPUT_FILE" << EOF
{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "port": 10808,
      "protocol": "socks",
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      },
      "settings": {
        "auth": "noauth"
      }
    },
    {
      "port": 10809,
      "protocol": "http",
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "trojan",
      "settings": {
        "servers": [
          {
            "address": "$SERVER_ADDRESS",
            "port": $SERVER_PORT,
            "password": "$TROJAN_PASSWORD"
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "tls",
        "tlsSettings": {
          "serverName": "$SERVER_ADDRESS",
          "allowInsecure": $([ -n "$ALLOW_INSECURE" ] && echo "true" || echo "false")
        }
      }
    },
    {
      "protocol": "freedom",
      "tag": "direct"
    }
  ],
  "routing": {
    "domainStrategy": "IPOnDemand",
    "rules": [
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      }
    ]
  }
}
EOF

elif [ "$PROTOCOL" = "ss" ]; then
  echo "SS协议支持正在开发中..."
  echo "请手动配置SS协议"
  exit 1
fi

echo "配置已保存到 $OUTPUT_FILE"
echo "使用以下命令启动V2Ray:"
echo "v2ray -c $OUTPUT_FILE"
echo
echo "使用以下命令设置代理环境变量:"
echo "export http_proxy=http://127.0.0.1:10809"
echo "export https_proxy=http://127.0.0.1:10809"
echo
echo "或使用SOCKS5代理:"
echo "export http_proxy=socks5://127.0.0.1:10808"
echo "export https_proxy=socks5://127.0.0.1:10808"

# 清理临时文件
rm -f sub_encoded.txt sub_decoded.txt

2.2 添加执行权限

bash 复制代码
chmod +x v2ray_sub.sh

2.3 使用脚本生成配置

bash 复制代码
# 语法: ./v2ray_sub.sh 订阅链接 输出配置文件
./v2ray_sub.sh "https://your-subscription-link" config.json

如果你想将配置直接生成到V2Ray的配置目录:

bash 复制代码
sudo ./v2ray_sub.sh "https://your-subscription-link" /usr/local/etc/v2ray/config.json

3. 配置V2Ray

如果你不使用订阅转换脚本,也可以手动编辑配置文件:

bash 复制代码
sudo nano /usr/local/etc/v2ray/config.json

基本的V2Ray配置示例:

3.1 VMess协议配置示例

json 复制代码
{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "port": 10808,
      "protocol": "socks",
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      },
      "settings": {
        "auth": "noauth"
      }
    },
    {
      "port": 10809,
      "protocol": "http",
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "vmess",
      "settings": {
        "vnext": [
          {
            "address": "服务器地址",
            "port": 443,
            "users": [
              {
                "id": "用户UUID",
                "alterId": 0,
                "security": "auto"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "ws",
        "security": "tls",
        "tlsSettings": {
          "serverName": "服务器域名"
        },
        "wsSettings": {
          "path": "/path"
        }
      }
    }
  ]
}

3.2 Trojan协议配置示例

json 复制代码
{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "port": 10808,
      "protocol": "socks",
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      },
      "settings": {
        "auth": "noauth"
      }
    },
    {
      "port": 10809,
      "protocol": "http",
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "trojan",
      "settings": {
        "servers": [
          {
            "address": "服务器地址",
            "port": 443,
            "password": "密码"
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "tls",
        "tlsSettings": {
          "serverName": "服务器域名",
          "allowInsecure": false
        }
      }
    }
  ]
}

4. 启动V2Ray服务

4.1 使用systemd管理(推荐)

bash 复制代码
# 启动V2Ray
sudo systemctl start v2ray

# 设置开机自启
sudo systemctl enable v2ray

# 查看状态
sudo systemctl status v2ray

# 重启服务
sudo systemctl restart v2ray

# 停止服务
sudo systemctl stop v2ray

# 查看日志
sudo journalctl -u v2ray

4.2 直接运行V2Ray

bash 复制代码
# 前台运行
v2ray -c /usr/local/etc/v2ray/config.json

# 后台运行
nohup v2ray -c /usr/local/etc/v2ray/config.json > /dev/null 2>&1 &

5. 设置代理环境变量

5.1 临时设置代理

bash 复制代码
# HTTP代理
export http_proxy=http://127.0.0.1:10809
export https_proxy=http://127.0.0.1:10809

# 或SOCKS5代理
export http_proxy=socks5://127.0.0.1:10808
export https_proxy=socks5://127.0.0.1:10808

5.2 永久设置代理

编辑~/.bashrc~/.profile文件:

bash 复制代码
echo 'export http_proxy=http://127.0.0.1:10809' >> ~/.bashrc
echo 'export https_proxy=http://127.0.0.1:10809' >> ~/.bashrc
source ~/.bashrc

5.3 创建代理开关快捷命令

bash 复制代码
echo 'alias proxy-on="export http_proxy=http://127.0.0.1:10809; export https_proxy=http://127.0.0.1:10809; echo 代理已开启"' >> ~/.bashrc
echo 'alias proxy-off="unset http_proxy; unset https_proxy; echo 代理已关闭"' >> ~/.bashrc
source ~/.bashrc

使用时只需输入proxy-on开启代理,proxy-off关闭代理。


6. 验证代理连接

6.1 检查代理状态

bash 复制代码
# 查看当前IP,应该显示代理服务器的IP
curl https://api.ipify.org

# 测试Google连接
curl -v https://www.google.com

6.2 检查本地监听端口

bash 复制代码
# 检查V2Ray是否正常监听端口
netstat -tuln | grep -E '10808|10809'

应该看到类似以下输出:

复制代码
tcp        0      0 127.0.0.1:10808         0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:10809         0.0.0.0:*               LISTEN

7. 常见问题排查

7.1 V2Ray无法启动

bash 复制代码
# 检查V2Ray进程
ps aux | grep v2ray

# 检查V2Ray日志
sudo journalctl -u v2ray -e

# 检查配置文件语法
v2ray -test -c /usr/local/etc/v2ray/config.json

7.2 代理连接失败

  1. 检查V2Ray服务状态

    bash 复制代码
    sudo systemctl status v2ray
  2. 检查配置文件

    • 确认服务器地址、端口、密码/UUID等信息是否正确
    • 确认协议类型是否正确(vmess/trojan/ss)
  3. 检查网络连接

    bash 复制代码
    # 测试服务器连通性
    ping 服务器地址
    
    # 测试端口连通性
    telnet 服务器地址 端口
  4. 检查防火墙设置

    bash 复制代码
    sudo iptables -L -n
  5. 尝试更换节点

    如果当前节点不可用,尝试使用订阅中的其他节点。

7.3 订阅链接问题

  1. 429错误(Too Many Requests)

    • 订阅链接请求过于频繁,等待一段时间后再试
    • 减少请求频率,避免被服务器限流
  2. 订阅内容解析失败

    • 检查订阅链接是否正确
    • 确认订阅内容是否为标准的base64编码
  3. 找不到支持的节点

    • 检查订阅内容中是否包含vmess/trojan/ss节点
    • 尝试手动解码订阅内容查看节点信息

7.4 代理环境变量问题

  1. 代理设置无效

    • 确认端口号是否正确(HTTP代理为10809,SOCKS5代理为10808)
    • 检查V2Ray是否正常运行并监听这些端口
  2. 只对部分应用生效

    • 某些应用可能不遵循系统代理设置,需要单独配置
    • 尝试使用proxychains等工具强制应用走代理

8. 高级配置

8.1 自动更新订阅配置

创建一个定时任务,定期更新V2Ray配置:

bash 复制代码
# 编辑crontab
crontab -e

添加以下内容(每天凌晨2点更新配置):

复制代码
0 2 * * * /path/to/v2ray_sub.sh "https://your-subscription-link" /usr/local/etc/v2ray/config.json && systemctl restart v2ray

8.2 配置PAC规则

如果你想实现更智能的代理分流,可以配置路由规则:

json 复制代码
"routing": {
  "domainStrategy": "IPOnDemand",
  "rules": [
    {
      "type": "field",
      "domain": ["domain:google.com", "domain:github.com"],
      "outboundTag": "proxy"
    },
    {
      "type": "field",
      "domain": ["domain:baidu.com", "domain:qq.com"],
      "outboundTag": "direct"
    },
    {
      "type": "field",
      "ip": ["geoip:private", "geoip:cn"],
      "outboundTag": "direct"
    },
    {
      "type": "field",
      "domain": ["geosite:cn"],
      "outboundTag": "direct"
    }
  ]
}

8.3 使用v2rayA图形界面(推荐)

如果你不喜欢命令行操作,可以使用v2rayA图形界面:

bash 复制代码
# 安装v2rayA
wget -qO - https://apt.v2raya.org/key/public-key.asc | sudo apt-key add -
echo "deb https://apt.v2raya.org/debian/ v2raya main" | sudo tee /etc/apt/sources.list.d/v2raya.list
sudo apt update
sudo apt install v2raya

# 启动v2rayA
sudo systemctl start v2raya
sudo systemctl enable v2raya

然后访问 http://localhost:2017 进行配置。


总结

通过本指南,你应该能够在Linux系统上成功安装、配置和使用V2Ray代理。如果遇到问题,请参考"常见问题排查"章节,或查阅V2Ray官方文档获取更多信息。

记住,定期更新V2Ray和订阅配置可以保持代理的稳定性和安全性。

相关推荐
薛定谔的猫19821 天前
RAG(二)基于 LangChain+FAISS + 通义千问搭建轻量级 RAG 检索增强生成系统
运维·服务器·langchain
米高梅狮子1 天前
4. Linux 进程调度管理
linux·运维·服务器
再创世纪1 天前
让USB打印机变网络打印机,秀才USB打印服务器
linux·运维·网络
fengyehongWorld1 天前
Linux ssh端口转发
linux·ssh
昨夜见军贴06161 天前
IACheck AI审核如何实现自动化来料证书报告审核,全面提升生产效率与合规水平
运维·人工智能·自动化
知识分享小能手1 天前
Ubuntu入门学习教程,从入门到精通, Ubuntu 22.04中的Shell编程详细知识点(含案例代码)(17)
linux·学习·ubuntu
浩子智控1 天前
电子产品设计企业知识管理
运维·服务器·eclipse·系统安全·硬件工程
Xの哲學1 天前
深入解析 Linux systemd: 现代初始化系统的设计与实现
linux·服务器·网络·算法·边缘计算
龙月1 天前
journalctl命令以及参数详解
linux·运维
EndingCoder1 天前
TypeScript 的基本类型:数字、字符串和布尔
linux·ubuntu·typescript