Linux下V2Ray安装配置完全指南
本文档提供了在Linux系统上安装、配置和使用V2Ray的完整流程,包括从订阅链接自动生成配置文件、设置代理环境变量以及常见问题的解决方案。
目录
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 代理连接失败
-
检查V2Ray服务状态:
bashsudo systemctl status v2ray
-
检查配置文件:
- 确认服务器地址、端口、密码/UUID等信息是否正确
- 确认协议类型是否正确(vmess/trojan/ss)
-
检查网络连接:
bash# 测试服务器连通性 ping 服务器地址 # 测试端口连通性 telnet 服务器地址 端口
-
检查防火墙设置:
bashsudo iptables -L -n
-
尝试更换节点 :
如果当前节点不可用,尝试使用订阅中的其他节点。
7.3 订阅链接问题
-
429错误(Too Many Requests):
- 订阅链接请求过于频繁,等待一段时间后再试
- 减少请求频率,避免被服务器限流
-
订阅内容解析失败:
- 检查订阅链接是否正确
- 确认订阅内容是否为标准的base64编码
-
找不到支持的节点:
- 检查订阅内容中是否包含vmess/trojan/ss节点
- 尝试手动解码订阅内容查看节点信息
7.4 代理环境变量问题
-
代理设置无效:
- 确认端口号是否正确(HTTP代理为10809,SOCKS5代理为10808)
- 检查V2Ray是否正常运行并监听这些端口
-
只对部分应用生效:
- 某些应用可能不遵循系统代理设置,需要单独配置
- 尝试使用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和订阅配置可以保持代理的稳定性和安全性。