科学上网

最近两会,科学上网又宕机了。打算专心学习一下 v2ray 的插件和配置,此笔记用于备忘操作过程中的细节。也涉及 linux 系统的基础操作。

为了安全(和方便),提出以下要求或目标:禁用账号密码登录,全部改用密钥。 建立 vps 后的第一步

关于 v2ray xray v2fly,可以看看 V2Ray、Trojan、XRay

新手上路

请移步到 V2Fly 项目的新手上路

相比 Project V 项目,上述说明要友好很多。

v2ray

在 shell 中修改 config.json 是不够友好的,推荐通过在线或离线的 json 工具编辑之后整体拷贝。

使用 v2ray 本质是学习如何配置其 config.json,配置的核心在于其路由模块分流和传输配置。

1
2
# 检测配置文件合法性
$ /usr/bin/v2ray/v2ray -test -config ./config.json

如果没有配置路由(或没有匹配的规则时),会以 outbounds 中的第一个出口作为默认的出口。

路由规则中 domain 和 ip 格式约定:路由功能

在 V2Ray 中,星号 * 不具备通配符的意义,如果想要匹配所有子域名,正确的格式是: domain:jd.com,而非 *.jd.com

domain: 代表子域名

服务端部署,推荐 一键安装脚本
Mux 多路复用,只需在客户端开启,服务器会自动识别,所以只给客户端的配置。

伪装和混淆

保持低调

v2ray 可以自行选择传输层的形式。

mKCP 使用 UDP 来模拟 TCP 连接,请确定主机上的防火墙配置正确。

windows 下验证 tcp 端口使用 telnet 127.0.0.1 80 即可,但要验证 udp 端口却没有合适的命令,需要下载工具包 nmap 网站,不需要 exe 安装,下载其命令行压缩包即可

windows 平台的 v2rayN 提到 放弃 kcp 了

动态端口

客户端不用额外设定

怎么确认动态端口生效?

  • 通过查看服务端 v2ray 占用的端口,可以验证其是否生效。

  • 在 Windows 客户端通过 wireshark 监控流量,可以验证是否生效。

    v2rayN 一直没生效呀;客户端使用 Qv2ray 验证是可以的。

延迟测试、连通性测试等选项,需要更换通信方式:

  • imcp 的 ping 连通,不一定能用。意义不大
  • tcp 在改用 kcp/udp 后肯定不通
  • 通过代理访问某个 url 的方式,推荐(windows 平台 v2rayN 快捷键 ctrl-r

websocket + tls + web

为什么需要 websocket + tls + web? 我之前使用的基础配置,今天醒来所有客户端通信异常,能够 ping 成功,但端口被禁了。换了个端口使用正常,但也就说明已经被 GFW 盯上了。2020年5月21日

通过 namesilo 购买域名,配置域名解析。

使用 一键安装脚本 选项 4 部署即可。自行调整防火墙端口 不再推荐此脚本源于:

  • Caddy 启动失败,无法创建证书

    failed to obtain certificate: acme: Error -> One or more domains had a problem

  • 并不能一步到位,比如,更安全的 只监听本地

TLS 证书生成和更新,使用 acme.sh 指南,安装后 acme.sh 会自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书(但依旧需要执行 --install-cert 命令手工拷贝证书)。

acme.sh 的源站提到:

Remember: Using sudo is not recommended.

实际操作之后,发现全程使用 root 用户是最方便的,创建普通用户反而束手束脚(即便授权 sudo 也意义不大)

1
2
3
4
5
6
7
8
9
10
11
12
# 安装 nginx
yum install nginx
# 启动服务
systemctl start nginx
# 生成证书
$ acme.sh --issue -d ilyw.xyz -k ec-256 --nginx
# 安装证书(2021年1月18日,单独执行此命令拷贝)
$ acme.sh --installcert -d ilyw.xyz \
--fullchainpath /etc/pki/nginx/server.crt \
--keypath /etc/pki/nginx/private/server.key \
--ecc \
--reloadcmd "service nginx force-reload"

默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件。正确的使用方法是使用 --install-cert 命令,并指定目标位置, 然后证书文件会被 copy 到相应的位置

生成证书的注意事项

使用 acme.sh 生成证书,容易踩坑。但是 Let’s Encrypt 有申请错误的限制,同一域名同一账号连续失败 5 次后会被暂停申请 1 个小时,然后就出现如下提示

1
2
3
4
5
Create new order error. Le_OrderFinalize not found. {
"type": "urn:ietf:params:acme:error:rateLimited",
"detail": "Error creating new order :: too many failed authorizations recently: see https://letsencrypt.org/docs/rate-limits/",
"status": 429
}

这个就是频繁提交失败后被服务器暂停申请了,等 1 个小时再试就好了。为了避免频繁申请,就要做好前期工作:

  • 避免报错 Can not find conf file for domain, 参考 issue1065 修改 nginx.conf 的 server_name _; 配置。
  • 保证 nginx.conf 配置有效性(没有有效证书时,保持 TLS server 部分处于注释的状态)
  • 避免报错 nginx: [error] invalid PID number "" in "/run/nginx.pid",先启动 nginx 服务再尝试申请证书。

允许内网转发

如果在设置完成之后不能成功使用,可能是由于 SElinux 机制(如果你是 CentOS 7 的用户请特别留意 SElinux 这一机制)阻止了 Nginx 转发向内网的数据。如果是这样的话,在 V2Ray 的日志里不会有访问信息,在 Nginx 的日志里会出现大量的 “Permission Denied” 字段,要解决这一问题需要在终端下键入以下命令: setsebool -P httpd_can_network_connect 1