分類
Linux

shadowsocks client and firefox on Ubuntu 12

V2Ray簡單搭建

科技發展日新月異,以下關於客戶端於服務器的配置應該已經廢棄了,較新的配置示例請參閱官方倉庫 v2ray-examples


參考:V2Ray 簡化文檔V2Ray 官方文檔。我用的打包好的版本,下載就能直接跑。配置文件默認放在程序目錄,名字是 config.json。

服務端配置如下,其中 uuid 可以用命令行工具 uuidgen 生成或到 uuidgenerator 獲取。

{
  "log":{
    "access": "/root/v2ray/access.log", 
    "error": "/root/v2ray/error.log",
    "loglevel": "warning"
  },
    "routing": {
        "domainStrategy": "AsIs",
        "rules": [
            {
                "type": "field",
                "ip": [
                    "geoip:private"
                ],
                "outboundTag": "block"
            }
        ]
    },
  "inbound": {
    "port": 1111, // 服务器监听端口
    "listen": "0.0.0.0",
    "protocol": "vmess",    // 主传入协议
    "settings": {
      "clients": [
        {
          "id": "564032s1-ec9a-4c25-9e7a-9f4as8092c4d"
        }
      ]
    }
  },
  "outbound": [
        {
            "protocol": "freedom",
            "tag": "direct"
        },
        {
            "protocol": "blackhole",
            "tag": "block"
        }
  ]
}

客戶端:

{
  "log": {
    "access": "/home/42/Programs/v2ray/access.log",
    "error": "/home/42/Programs/v2ray/error.log",
    "loglevel": "warning"
  },
  "inbound": [
    {
      "listen": "127.0.0.1",
      "port": 1080,
      "tag": "socks-inbound",
      "protocol": "socks",
      "settings": {
        "auth": "noauth",
        "udp": true,
        "ip": "127.0.0.1"
      },
      "sniffing": {
        "enabled": true,
        "destOverride": [
          "http",
          "tls"
        ]
      }
    },
    {
      "tag": "http-in",
      "listen": "127.0.0.1",
      "port": 1081,
      "protocol": "http"
    }
  ],
  "outbound": [
    {
      "protocol": "vmess",
      "settings": {
        "vnext": [
          {
            "address": "111.111.111.111",
            "port": 1111,
            "users": [
              {
                "id": "564032s1-ec9a-4c25-9e7a-9f4as8092c4d"
              }
            ]
          }
        ]
      },
      "tag": "proxy"
    },
    {
      "protocol": "freedom",
      "settings": {},
      "tag": "direct"
    },
    {
      "protocol": "blackhole",
      "settings": {},
      "tag": "blocked"
    }
  ],
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "ip": [
          "geoip:private"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": [
          "geosite:category-ads"
        ],
        "outboundTag": "blocked"
      }
    ]
  }
}

xfce 口味的 Fedora,在應用程式選單/設定值/工作階段與初始啟動/應用程式自動啟動中加入指令 /home/42/Programs/v2ray/v2ray run -config /home/42/Programs/v2ray/config.json 即可開機自啟。服務器自動啟動可以複製 systemd/system/v2ray.service 來實現:

sudo cp systemd/system/v2ray.service /etc/systemd/system/v2.service
#查看 ExecStart= 行的命令,最好修改為絕對路徑,如
ExecStart=/my/path/to/v2 run -config /my/path/to/v2/config.json
#啟用開機啟動
sudo systemctl enable v2

V2Ray Nginx WebSocket tsl配置

服務端配置

{
  "log": {
    "loglevel": "warning",
    "access": "/root/v2ray/access.log",
    "error": "/root/v2ray/error.log"
  },
  "inbound": {
    "port": 10000,
    "listen": "127.0.0.1",
    "protocol": "vmess",
    "settings": {
      "clients": [
        {
          "id": "564032s1-ec9a-4c25-9e7a-9f4as8092c4d"
        }
      ]
    },
    "streamSettings": {
      "network": "ws",
      "wsSettings": {
        "path": "/ftBazz"
      }
    }
  },
  "outbound": {
    "protocol": "freedom",
    "settings": {}
  }
}

客戶端配置

{
  "log": {
    "loglevel": "warning",
    "access": "/home/42/Programs/v2ray/access.log",
    "error": "/home/42/Programs/v2ray/error.log"
  },
  "inbound": [
    {
      "listen": "127.0.0.1",
      "port": 1080,
      "tag": "socks-inbound",
      "protocol": "socks",
      "settings": {
        "auth": "noauth",
        "udp": true,
        "ip": "127.0.0.1"
      },
      "sniffing": {
        "enabled": true,
        "destOverride": [
          "http",
          "tls"
        ]
      }
    },
    {
      "tag": "http-in",
      "listen": "127.0.0.1",
      "port": 1081,
      "protocol": "http"
    }
  ],
  "outbound": [
    {
      "protocol": "vmess",
      "settings": {
        "vnext": [
          {
            "address": "yourDomin.info",
            "port": 443,
            "users": [
              {
                "id": "564032s1-ec9a-4c25-9e7a-9f4as8092c4d"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "ws",
        "security": "tls",
        "wsSettings": {
          "headers": {
            "Host": "YOUR.DOMAIN"
          },
          "path": "/YOUR_RANDOM_PATH"
        }
      },
      "tag": "proxy"
    }
  ],
  "dns": {
    // Static hosts, similar to hosts file.
    "hosts": {
      // The following settings help to eliminate DNS poisoning in mainland China.
      // It is safe to comment these out if this is not the case for you.
      //"domain:github.io": "pages.github.com"
    },
    "servers": [
    "45.90.28.136",
    "45.90.30.136"
    {
      "address": "114.114.114.114",
      "port": 53,
        // List of domains that use this DNS first.
      "domains": [
        "geosite:cn"
      ]
    },
    "8.8.8.8"
    "localhost"
    ]
  },
  "routing": {
    "strategy": "rules",
    "settings": {
      "domainStrategy": "AsIs",
      "rules": [
        {
          "type": "field",
          "ip": [
            "geoip:private"
          ],
          "outboundTag": "direct"
        }
      ]
    }
  }
}

Nginx 配置

server {
  listen  443 ssl;
  ssl on;
  ssl_certificate       /etc/v2ray/v2ray.crt;
  ssl_certificate_key   /etc/v2ray/v2ray.key;
  ssl_protocols         TLSv1.2 TLSv1.3;
  ssl_ciphers           HIGH:!aNULL:!MD5;
  server_name           yourDomin.info;
        location /YOUR_RANDOM_PATH {
        if ($http_upgrade != "websocket") {
            return 404;
        }
        proxy_redirect off;
        proxy_pass http://127.0.0.1:10000;#假设WebSocket监听在环回地址的10000端口上
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

生成Let's Encrypt的證書:

#安裝 acme
curl  https://get.acme.sh | sh
#centos6 被提示安裝 yum install socat
#生成證書(生成證書時 acme 需要使用80端口)
sudo ~/.acme.sh/acme.sh --issue -d yourDomin.info --standalone -k ec-256
#將證書和密鑰安裝到 /etc/v2ray
mkdir /etc/v2ray
sudo ~/.acme.sh/acme.sh --installcert -d yourDomin.info --fullchainpath /etc/v2ray/v2ray.crt --keypath /etc/v2ray/v2ray.key --ecc
#至此證書已生成完畢,Let's Encrypt 的證書有效期 90 天,更新命令如下
sudo ~/.acme.sh/acme.sh --renew -d yourDomin.info --force --ecc

在 Termux 中運行 v2fly

由於 golang 的網絡模塊寫死了 /etc/resolv.conf 來解析域名,所以在使用 ws 協議且未做 DNS 配置時,便會出現如下報錯:

2020/09/09 06:32:42 [Warning] [1366338444] v2ray.com/core/app/proxyman/outbound: failed to process outbound traffic > v2ray.com/core/proxy/vmess/outbound: failed to find an available destination > v2ray.com/core/common/retry: [v2ray.com/core/transport/internet/websocket: failed to dial WebSocket > v2ray.com/core/transport/internet/websocket: failed to dial to (wss://YOUR.TARGET.DOMAIN/):  > dial tcp: lookup YOUR.TARGET.DOMAIN on [::1]:53: read udp [::1]:58084->[::1]:53: read: connection refused v2ray.com/core/transport/internet/websocket: failed to dial WebSocket > v2ray.com/core/transport/internet/websocket: failed to dial to (wss://YOUR.TARGET.DOMAIN/):  > dial tcp: lookup YOUR.TARGET.DOMAIN on [::1]:53: read udp [::1]:33167->[::1]:53: read: connection refused v2ray.com/core/transport/internet/websocket: failed to dial WebSocket > v2ray.com/core/transport/internet/websocket: failed to dial to (wss://YOUR.TARGET.DOMAIN/):  > dial tcp: lookup YOUR.TARGET.DOMAIN on [::1]:53: read udp [::1]:52240->[::1]:53: read: connection refused v2ray.com/core/transport/internet/websocket: failed to dial WebSocket > v2ray.com/core/transport/internet/websocket: failed to dial to (wss://YOUR.TARGET.DOMAIN/):  > dial tcp: lookup YOUR.TARGET.DOMAIN on [::1]:53: read udp [::1]:40725->[::1]:53: read: connection refused v2ray.com/core/transport/internet/websocket: failed to dial WebSocket > v2ray.com/core/transport/internet/websocket: failed to dial to (wss://YOUR.TARGET.DOMAIN/):  > dial tcp: lookup YOUR.TARGET.DOMAIN on [::1]:53: read udp [::1]:38532->[::1]:53: read: connection refused] > v2ray.com/core/common/retry: all retry attempts failed

最簡單的解決辦法是利用 Termux 提供的用了模仿正常 Linux 環境的 termux-chroot 命令。

pkg install proot
termux-chroot ./v2ray -config config.conf

另外三個方法,一是修改 go 的源碼,然後自己打包 v2ray;二是配置 v2ray 的 DNS;三是在 Termux 中編譯。都不簡單。參考:V2ray在非标准linux环境中的DNS域名解析问题再次探讨 #633 安卓上运行ARM版本,不能使用域名,只能使用IP的问题

雖然 aarch64 構架的手機用 linux-arm64-v8a.zip 這個包也沒問題,但是如果你想打出安卓包也是可以的。方法如下:

#1, 備好梯子
#2, 安裝 golang https://golang.org/doc/install
#3, 獲取 v2ray 源碼並解壓
go get -u -v v2ray.com/core/...
# 也可以從 github 獲取
#4, 構建可執行文件
cd $(go env GOPATH)/src/v2ray.com/core/main
env CGO_ENABLED=0 GOOS=android GOARCH=arm64 go build -o $HOME/v2ray -ldflags "-s -w"

cd $(go env GOPATH)/src/v2ray.com/core/infra/control/main
env CGO_ENABLED=0 GOOS=android GOARCH=arm64 go build -o $HOME/v2ctl -tags confonly -ldflags "-s -w"
#如果網絡不好,可以嘗試 export GOPROXY=https://goproxy.io
#更多構建信息參考官方 https://www.v2fly.org/developer/intro/compile.html#%E5%89%8D%E5%BA%8F%E5%B7%A5%E4%BD%9C
#及 Go (Golang) GOOS and GOARCH https://gist.github.com/asukakenji/f15ba7e588ac42795f421b48b8aede63

一個 vmess 鏈接轉換成 config.json (僅供參考)

vmess://YXV0bqo4ZjllYTYyMC44Z1k1L1QyM2MtxDVjMCtxNmFhYjBjqDFhMmJAYXBwLdNvbWlvaHV3LmxpdzU6NDQz?remarks=NodeName&path=/&obfs=websocket&tls=1
{
  "policy": null,
  "log": {
    "access": "",
    "error": "",
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "tag": "proxy",
      "port": 1080,
      "listen": "127.0.0.1",
      "protocol": "socks",
      "sniffing": {
        "enabled": true,
        "destOverride": [
          "http",
          "tls"
        ]
      },
      "settings": {
        "auth": "noauth",
        "udp": true,
        "ip": null,
        "address": null,
        "clients": null,
        "decryption": null
      },
      "streamSettings": null
    }
  ],
  "outbounds": [
    {
      "tag": "proxy",
      "protocol": "vmess",
      "settings": {
        "vnext": [
          {
            "address": "YOUR.TARGET.DOMAIN",
            "port": 443,
            "users": [
              {
                "id": "8f9wa620-8x95-423q-85h0-16akb0c81a2n",
                "alterId": 0,
                "email": "[email protected]",
                "security": "auto",
                "encryption": null
              }
            ]
          }
        ],
        "servers": null,
        "response": null
      },
      "streamSettings": {
        "network": "ws",
        "security": "tls",
        "tlsSettings": {
          "allowInsecure": false,
          "serverName": null
        },
        "tcpSettings": null,
        "kcpSettings": null,
        "wsSettings": {
          "connectionReuse": true,
          "path": null,
          "headers": null
        },
        "httpSettings": null,
        "quicSettings": null
      },
      "mux": {
        "enabled": false,
        "concurrency": 8
      }
    },
    {
      "tag": "direct",
      "protocol": "freedom",
      "settings": {
        "vnext": null,
        "servers": null,
        "response": null
      },
      "streamSettings": null,
      "mux": null
    },
    {
      "tag": "block",
      "protocol": "blackhole",
      "settings": {
        "vnext": null,
        "servers": null,
        "response": {
          "type": "http"
        }
      },
      "streamSettings": null,
      "mux": null
    }
  ],
  "stats": null,
  "api": null,
  "dns": null,
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "port": null,
        "inboundTag": [
          "api"
        ],
        "outboundTag": "api",
        "ip": null,
        "domain": null
      }
    ]
  }
}

本文更新於 2024/04/19。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *