标签 代理 下的文章

前些日子尝试通过电报来实现短信多终端同步的方案,很成功,并且为了实验稳定性开了一天。到了第二天早晨再看,服务是正常的。但新来的短信就是没再往Tg上面发送。

最先想到的就是梯子有问题了,通过尝试也发现确实是梯子的问题。具体表现就是浏览器会报503错误。

现在使用的是v2ray方法,在刚搭建好的时候也遇到过503问题,所以惯性的认为这次出现这个问题也是由于服务器时间与本地时间不一致导致的(服务器商授时比实际时间快了3分钟,不知道什么毛病)。

不过当我查看服务器时间时候,发现问题好像没那么简单了——因为服务器时间很正常,说明并不是时间出错导致的这个问题——一下子就感觉问题严重了起来。

查看服务状态(systemctl status v2ray),是active,一切如常;查看运行日志(/var/log/v2ray/access.log),一大溜的invalid user。这是认证错误;但是我并没有改过我的config文件(/etc/v2ray/config.json)啊,为什么会失效呢?

上网搜索类似的情况,并没有什么有用的解答。不过在网上冲浪的过程中,v2ray的github页面提交issue的模板让我想到了一个可能的原因:

  • 我的安卓机应用是play商店自动更新的
  • 我的iOS应用是商店自动更新的
  • 我的Archlinux是及时跟进版本的
  • 我的openSUSE刚刚做了一次dup,所有存在新版本的软件都升级到了最新

这些都指向了一个可能的原因:版本不同(github上面就写到了如果客户端和服务端版本不同请注明)。我的客户端全部到了最新而服务端已经很久没有更新过了。

所以先尝试把服务端更新到了最新,再次尝试。

仍然503.

这就真让我百思不得其解了。

不过在查看服务状态时,有一行信息引起了我的注意:它提示读取的配置文件路径是/usr/local/etc/v2ray/config.json

咦?跟网上大多数提到的/etc/v2ray/config.json不一样啊。查看了一下usr的配置文件,里边只有一行:

{}

这就很好的解释了为啥认证会失败了。啥配置都没有,能存在有效用户就怪了。

虽然不知道为什么之前的/etc/v2ray/config.json可以生效,但既然它现在貌似读取的是带usr的路径,那给它补上就得了呗。

不过为了延续之前的路径,做一个软连接可能是更恰当的选择。直接ln -s /etc/v2ray/config.json /usr/local/etc/v2ray——当然,提前把usr那个空的config文件删掉。

尝试重启服务systemctl restart v2ray,查看状态……

退出。

不过下面的信息给出了明确的信息:日志文件无法写入。

那就把日志文件的读写权限给上去就得了呗chmod 666 /var/log/v2ray/*

再次启动服务,成功。尝试通过客户端连接,也成功了。


这问题出现的还挺突然的——因为前一天还是可以正常使用的东西,在啥都没手工动过的情况下就不能用了,还是非常没有头绪去解决的。不过好在没有什么特别令人费解的问题(虽然突然间读取的配置文件路径就变了有些令人费解),很快也就解决掉了。但关键在于网上竟然没有一篇文章能适配到这个问题上,所以还是写下来了。

以前就听说过这个工具。但当时整体看上去部署好麻烦,而且我的工具又并不是不稳定,再加上当时看这玩意儿要想做到只转发境外又很麻烦,所以也就一直没在意过它。但最近越来越发现,我的努比亚仿佛天生就屏蔽ss的流量,所以感觉可能还是换一换工具能好一些。说干就干,开始迁移

介绍

V2Ray是近几年十分流行的网络工具,其功能强大,用途不限于如此,但因其能有效跨越而广为人知。有如下大放异彩的特点:

  • 开源。是Project V的核心工具,源代码开源;
  • 多协议支持。传输层支持TCP、mKCP、WebSocket等,上层协议支持Socks、ss、以及自定义的VMess等;
  • 可同时支持多个入站和出站协议,每个协议独立工作;
  • 多平台支持。原生支持Windows、Linux、MacOS三大常用平台,安卓、iOS两大移动平台有丰富的第三方工具;
  • 隐蔽性。流量可伪装成网页流量,更难被检测和干扰。

一句话总结:更好更强大,但更难上手和用好。

部署

现在已经有一键脚本。直接使用即可(Linux)。

curl -L -s https://install.direct/go.sh | bash

安装完成后,配置文件为/etc/v2ray/config.json,其中,”inbounds”下的这几项信息需要记录:port(端口)、clients中的id(用户id)和alterId(额外id),它们将在配置客户端时用到。

在VPS中放行上面提到的port,然后启动服务:

systemctl enable v2ray
systemctl start v2ray

即可使用。

但当前是没有什么伪装措施的,或者说,仅仅是使用了默认的vmess方法进行“混淆”。一旦检测到,那么必然就会露馅。所以接下来进行进一步的“打扮”。

伪装

通过一个正常的网站进行伪装,一来可以合理的解释为什么会有数据传送到这个ip上;二来可以走一层cdn,进一步伪装服务器ip和真实的作用;三来可以套上一层https,数据包就又加密了一次;四来,如果你的vps被屏蔽了,套上cdn还能让你的vps起死回生。

但这需要你有一个域名。

至于解析和cdn,我选择通过cloudflare来实现。当然也可以用其他的,比如直接使用域名商的域名解析。使用cf的好处在于可以直接提供cdn和https,省去了另行配置cdn和申请域名签名的步骤。

当然,如果有更好的cdn服务商就不要用cloudflare了…都快用烂了。

先将域名解析配置好。一级域名肯定是你自己的(比如是123.com)至于使用哪个二级域名无所谓(比如v.123.com,接下来以这个域名为例),或者直接使用主域名也可以。注意把cf的小云彩点亮以使用cdn功能——嫌慢的话就点灭,但https需要你为域名申请一个证书。

切换到SSL/TLS标签,将加密模式切换到Flexible;切换到Edge Certificates子标签,启动Always user HTTPS

至此,cf设置完成,接下来设置服务器。

进入到你服务器的宝塔面板(我一直在用宝塔面板,如果你使用单纯的环境,相信接下来的东西你也是会配置的),进行如下操作:

  1. 新建上述域名的网站。静态站还是动态站无所谓,反正有一个网站就行,这个网站也可以正常使用。比如说浏览器访问是你公司的wiki站点,实际上在提供v2ray服务
  2. 确定后,打开该站点的设置页—配置文件,在结尾的}前增加下述代码(开头是location 不知道为啥l总是显示不出来)

    location /v2ray { #使用软件访问v.123.com/v2ray,会连接到v2ray服务,浏览器访问则返502错误。这里的路径可以自定义
           proxy_redirect off;
        proxy_pass http://127.0.0.1:12345;   #v2ray的端口。应该与前边提到的port相同
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $Host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    其实就是反代,直接在网站设置的反向代理标签设置也可以。

  3. 修改前边生成的config.json,在inbounds下增加相关的配置,最终类似于这样:

     "inbounds": [{
        "port": 12345,
        "protocol": "vmess",
        "settings": {
          "clients": [
            {
              "id": "xxxxx",
              "level": 1,
              "alterId": 64
            }
          ]
        },   #上面的都是自动生成的,不必修改
        "streamSettings": {     # 载体配置段,设置为websocket
            "network": "ws",
            "wsSettings": {
              "path": "/v2ray"  # 与nginx中的路径保持一致
            }
          },
        "listen": "127.0.0.1" # 出于安全考虑,建议只接受本地链接
      }],

    注意:json文件不支持注释,上述配置中”#”号及后续内容都要删掉。

  4. 配置无误后,重启v2ray服务:systemctl restart v2ray

接下来浏览器访问域名,确定是https访问,并且出现首页内容,而URL输入映射到v2ray的地址(如前面假设的 v.123.com/v2ray),返回 Bad Request,则几乎可以说明配置完成了。接下来就到客户端了。

使用

Win和手机端的软件网上有很多,所以这里只说设置的内容

  • 地址/address:前边设置的域名(这里的例子应该写 v.123.com)
  • 端口/port:443
  • id:inbounds中的id
  • 额外id/alterId:inbounds中的alterId
  • 加密方式/Security:auto
  • 传输协议/network:ws
  • 伪装类型/type:none
  • 伪装域名留空
  • path:前边在nginx中设置的路径(这里的例子应该写/v2ray)
  • 启用tls传输

至于Linux,archlinuxcn源提供qv2ray,自带流量区分,即只处理出境流量。安装使用这个软件即可,设置同上。

这个问题应该是从72版本开始的——如果我没记错的话。但是目测不会是Chrome的bug,因为到了76版本更加的变本加厉了…不过还好,办法总比困难多。

1、版本号≤75

具体来说应该就是72~75吧。这几个版本号还是比较容易解决的。只需要去往chrome://flags,将Enable Network Service给禁用掉即可。

究其原因(下面这些都是我猜的),大概就是从72开始,Chrome将网络服务作为独立进程执行。而系统监听的是Chrome这个进程,并没有相应真正发送网络请求的进程,所以Chrome的请求便直接发出去,不能经过代理了。而将这个选项禁用,也就是让Chrome的网络服务运行在程序内,那么网络请求便可以被监听到,PAC模式便也正常了。

2、版本号76+

76应该是最新的版本号了——至少在Archlinux里面是这样的。

即使之前你已经调整过,并且顺利解决了,但当你升级到了76这个版本号的时候,就能惊喜的发现:这个问题又复发了。

如果你还想按照75-的那种操作方法修正,那么很遗憾,Enable Network Service这个选项已经不存在了。

所以可以证明一件事:72~75出现的问题不能说是Chrome的bug,而是Network Service这个新特性导致的问题,而且Chrome大概是不打算修复这个问题的…

但总不能一直使用全局系统代理吧…国内网站绕一圈国外再回来…太慢了。

所以还是要想想解决方案,让PAC模式可以应用。

如果在Chrome://flags里边,以Network Serivce为关键字查找的话,会找到一项Runs network service in-process的选项。回顾一下刚刚说到的出现这个问题的原因,仿佛这个选项会管用?

很不幸,这个选项是没用的。所以暂时就不要想着能通过Chrome自己的设置来解决这个问题了。

好在Chrome的插件里边有一个神器——SwitchyOmega。通过它来判断是否需要使用代理就行了。


  • 从Chrome应用商店安装 Proxy SwitchyOmega
  • 进入插件设置页,新建情景模式(我这里名字叫做proxy),类型代理服务器
  • 在这个情景模式下,设置代理协议为SOCKS5,服务器和端口为127.0.0.1:1080(这两项应该与你代理软件内对应的本地设置相同)
  • 新建一个情景模式(我这里名字叫做auto switch),类型自动切换模式
  • 在这个情景模式下,添加规则列表,格式为AutoProxy,网址https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt,对应这一条的情景模式选择刚刚创建的proxy。看图

  • 点一下立即更新情景模式,待正文框内出现内容,代理便设置完成

现在,点击Chrome地址栏边上的SwitchyOmega图标,选择auto Switch,问题便解决了。


其实这样设置之后,并没有通过系统的PAC,而是Chrome自己判断并决定是直接访问还是间接访问。也就是说,即使系统没有配置好全局的PAC,而仅仅是启动了一个代理服务,通过该方法同样可以让Chrome顺利跨越。所以,为了不荒废系统代理的作用,还是希望有朝一日Chrome的Network Service可以被系统监听到并响应吧…

以CentOS7为例。

1. 安装Python相关工具以及shadowsocks

yum install m2crypto python-setuptools
easy_install pip
pip install shadowsocks
若不能成功安装m2crypto,请先用以下命令安装其依赖包:
yum install -y openssl-devel gcc swig python-devel autoconf libtool

2. 配置chacha20加密方法(可选)

chacha20 加密算法后可以提高密钥加密和解密速度,同时可以规避GFW利用OpenSSL特性进行特征包跟踪的问题
  1. 安装套件:yum groupinstall "Development Tools"
  2. 下载libsodium:wget https://github.com/jedisct1/libsodium/releases/download/1.0.11/libsodium-1.0.11.tar.gz
  3. 编译安装:tar xvf libsodium-1.0.11.tar.gz && cd libsodium-1.0.11 && ./configure && make && make install
  4. 更新动态库:ldconfig

3. 服务器配置

vi /etc/shadowsocks.json

其中,shadowsocks名称随意更改,下面用到这个名称的地方注意对应即可。

写入如下配置:

{
"server":"0.0.0.0",
"server_port":your server port,
"local_address": "127.0.0.1",
"local_port":1080,
"password":"your password",
"timeout":600,
"method":"chacha20",# 若未进行第二步,此处推荐设置为`aes-256-cfb`
"fast_open": false
}

其中:

server_port处填写你想要的端口号,之后在客户端中需要填入

password处填写连接密码

method处可以更改加密方法,一般默认即可

如果有多用户,可以通过下面方法配置:

{
"server":"0.0.0.0",
"local_address": "127.0.0.1",
"local_port":1080,
"port_password": {
"port1": "password1",
"port2": "password2"
},
"timeout":300,
"method":"aes-256-cfb",
"fast_open": false
}

如上,只需添加多个端口和密码即可。

4. 配置防火墙端口

没有安装防火墙建议安装一下,然后开启防火墙相应的端口。这里以开启443端口为例。

firewall-cmd --permanent --zone=public --add-port=443/tcp
firewall-cmd --reload

5. 配置Shadowsocks 服务自启动

使用rc.local完成即可。注意需要先通过命令 chmod +x /etc/rc.local 保证该脚本可执行。

之后在该文件结尾加入一行
ssserver -c /etc/shadowsocks.json -d start
保存即可。