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和订阅配置可以保持代理的稳定性和安全性。

相关推荐
T0uken8 分钟前
【Linux】HAProxy:结合 WG 实现内网 TCP 反代
linux·运维·tcp/ip
鸢时望巧9 分钟前
Shell循环(二)
运维·开发语言
wanhengidc38 分钟前
大数据服务器和普通服务器之间的区别
大数据·运维·服务器
网硕互联的小客服39 分钟前
如何诊断服务器硬盘故障?出现硬盘故障如何处理比较好?
大数据·运维·服务器
vortex51 小时前
Linux Shell 中的 dash 符号 “-”
linux·运维·服务器
月堂1 小时前
Linux操作系统-性能优化
linux·运维·服务器
依旧天真无邪2 小时前
Chrome 优质插件计划
前端·chrome
科士威传动2 小时前
滚珠导轨在汽车自动化装配线中的核心传动
运维·自动化·汽车
夕泠爱吃糖3 小时前
Linux 文件内容的查询与统计
android·linux·c#
love530love3 小时前
【笔记】NVIDIA AI Workbench 中安装 cuDNN 9.10.2
linux·人工智能·windows·笔记·python·深度学习