2022年1月

title

最近尝试了下azure cli配置私有api发现新版本已经不再支持密钥对形式设置请求自定义credential的年限了,因此记录下流程备忘。

一、注册Azure应用,修改私有api的credential有效年限

方法一、Azure cli配置application credentials

手动登录Azure DD后台https://portal.azure.com/
注册新的应用,选择第三项:

  • 任何组织目录(任何 Azure AD 目录 - 多租户)中的帐户和个人 Microsoft 帐户(例如,Skype、Xbox)

并选择重定向 URI跳转平台为web,地址为http://localhost:53682/即可,新的应用注册成功,我们需要通过命令行来设定超过2年有效期的secrect密钥对,官方默认只支持证书形式的授权可以定义超过2年有效期,原来的密钥对最长只支持2年。

https://docs.microsoft.com/en-us/cli/azure/install-azure-cli-windows?tabs=azure-cli
点此查询下载最新的azure-cli工具并进行安装
如果最新版本无法使用对应的功能,则在此页面修改下载指定版本:
https://azcliprod.blob.core.windows.net/msi/azure-cli-.msi
比如需要下载v2.29.1:
https://azcliprod.blob.core.windows.net/msi/azure-cli-2.29.1.msi
安装完毕后就可以使用cmd或者powershell进行az指令操作了

输入az login --allow-no-subscriptions登录,自动跳转到azure登录页面,选择你的管理员或者需要设置api的office365账号登录即可
参数:
https://docs.microsoft.com/en-US/cli/azure/ad/sp/credential?view=azure-cli-latest#az_ad_sp_credential_reset
因为新的版本更新舍弃了这种不安全的密钥对生成请求,所以可能需要旧版本的azure cli,这里不做演示了,修改指令可以参考:

az ad sp credential reset --name {name of your AD app} --end-date 2099-12-31 --credential-description DescriptionHere
az ad sp credential reset --name {name of your AD app} --password {whatever password you want to keep} --end-date 2099-12-31--credential-description secrect
az ad sp credential reset --name zzzzzzzz-xxxxxxxx-yyyyyyyyy --year 99 --credential-description secrect

而使用证书进行配置参考如下:

az ad sp credential reset --name myapp --cert "@~/cert.pem" --append

方法二、使用graph-explorer进行Post请求配置

https://developer.microsoft.com/zh-cn/graph/graph-explorer
使用方法和需要的权限说明参看:
https://docs.microsoft.com/en-us/graph/api/application-addpassword?view=graph-rest-beta&tabs=http

Permission typePermissions (from least to most privileged)
Delegated(work or school account)Application.ReadWrite.All,Directory.ReadWrite.All, Directory.AccessAsUser.All
Delegated(personal Microsoft account)Application.ReadWrite.All
ApplicationApplication.ReadWrite.OwnedBy,Application.ReadWrite.All, Directory.ReadWrite.All

这里用的office365账号,所以在修改权限-预览版项目记得添加Application.ReadWrite.All,Directory.ReadWrite.All, Directory.AccessAsUser.All三项权限,

再添加post请求网址为:
https://graph.microsoft.com/v1.0/applications/你的应用对应的object id(对象ID)/addPassword

内容参考如下:

{
    "passwordCredential": {
        "displayName": "任意描述",
        "endDateTime": "2122-01-27T00:00:00Z"
    }
}

Post

提交获得回应后记下secretText的值,只在此刻出现一次,以后无法获得。新版本的认证用的是client ID +这个secretText 值,所以务必保存好。
如果是以前创建的applications目前似乎还在沿用client id +client secret 组合。
保存完毕,返回Azure应用详情页面选择证书和密钥栏目,刷新应该就有新的密钥对信息了,保存好你的secretText值,这个和之前的客户端client ID是用来rclone授权访问所需的,之后添加需要的权限信息:Microsoft Graph,委托 权限,具体权限如下:
Files.Read、Files.ReadWrite、Files.Read.All、Files.ReadWrite.All、offline_access、User.Read
permission
如果需要读取/写入SharePoint网站内容还应添加Sites.Read.All或者Sites.ReadWrite.All

最后转移所有者为对应子号用户即可完毕。
拓展阅读:
https://tip.rclone.org/onedrive/#getting-your-own-client-id-and-key

二、多账号OneDrive快速配置授权

如果你有多个子号需要查询OneDrive driveUrl,那么用管理员管理用户栏选择对应用户后查看OneDrive项目,点击创建新的访问地址
get onedrive link
获得OneDrive地址授权后直接打开,右键查看网页源代码,搜索driveUrl,对应的ID保存可以方便后面快速配置rclone config文件。快捷访问地址:
view-source:https://{yoururl}-my.sharepoint.com/personal/{your_users_link}/_layouts/15/onedrive.aspx
授权所有需要的子号的应用能访问你的OneDrive则很简单,去后台管理,组(Group),创建一个新的office 365组,将需要的子号全部拉入成员即可。

最后对此子号的OneDrive页面点击右上角齿轮设置,对网站集管理员进行配置,添加用户组为对应OneDrive管理员即可授权所有组员和他们对应的应用api都能访问你的OneDrive文件了
admin add group
参考地址形如:
https://{yoururl}-my.sharepoint.com/personal/{your_users_link}/_layouts/15/mngsiteadmin.aspx

三、rclone多账号api快速配置和灵活切换

  • 新建rclone config文件如下:
[OnedriveMusic]
type = onedrive
client_id = e1b2097d-xxxx-yyyy-zzzz-7e4d1274a540
client_secret = LRq3GOzzzzxxxxxxxxyyyyyypwHJvt_GC
token = {"access_token":"xxxxx","token_type":"Bearer","refresh_token":"yyyyy","expiry":"2022-01-25T18:47:26.387649+08:00"}
drive_id = b!iBlBFe-xxxxxxxxxxxxxxxxxxxxxxxxxxx
drive_type = business
  • 刷新token直接使用此指令:
rclone authorize "onedrive" "your client ID" "client secret"

将新的token更替上述token=后内容即可
这样你可以快速配置多个子号的应用api访问指定单个OneDrive,只需要将drive_id=项目修改即可,一台vps跑一个应用的api,从而突破单api下载上传限速。

  • 获取需要传递的任务文件清单:
rclone lsf GdriveA: > /root/.config/rclone/task.txt
gclone lsf GdriveSA:{xxxxxxxxx} > E:\software\rclone\task_list.txt --max-depth 10
  • 统计需要转移的文件总大小:
rclone size GdriveA: -v --stats 15s --transfers 4  --include-from "/root/.config/rclone/list.txt"
gclone ncdu GdriveSA:{1xxxdddafafaddo}

演示的两条指令分别为指定列表总文件大小指令,以及ncdu指令统计适合庞大文件的google 团队盘统计文件,不会出现rclone size指令那种遗落文件的问题。
自己按需调整。
然后手动拆分,用xls还是记事本都行,快捷键 ctl+shift+Home是从光标处往上选中到文首所有内容。

  • 最后,多任务分发:
    OneDrive 自身的一些限制问题,请先尝试小型任务,略有所得后再进行大肆搬迁.
    参考示例:
gclone copy GdriveSA:{xxxxxxxxxxx}/DL音声合集 OnedriveMusicAPI1:/同人音声/DL音声合集 -q --log-file=C:\Software\rclone-v1.56.2-windows-amd64\task\error.txt --stats 15s --transfers 6  --cache-chunk-size 20M --ignore-checksum --ignore-size --drive-acknowledge-abuse  --bwlimit 40M --max-size 250G --retries 3  --include-from "C:\Software\rclone-v1.56.2-windows-amd64\task\DL音声合集1.txt" 
gclone copy GdriveSA:{xxxxxxxxxxx}/DL音声合集 OnedriveMusicAPI2:/同人音声/DL音声合集 -q --log-file=C:\Software\rclone-v1.56.2-windows-amd64\task\error.txt --stats 15s --transfers 6  --cache-chunk-size 20M --ignore-checksum --ignore-size --drive-acknowledge-abuse  --bwlimit 40M --max-size 250G --retries 3  --include-from "C:\Software\rclone-v1.56.2-windows-amd64\task\DL音声合集2.txt" 
gclone copy GdriveSA:{xxxxxxxxxxx}/DL音声合集 OnedriveMusicAPI3:/同人音声/DL音声合集 -q --log-file=C:\Software\rclone-v1.56.2-windows-amd64\task\error.txt --stats 15s --transfers 6  --cache-chunk-size 20M --ignore-checksum --ignore-size --drive-acknowledge-abuse  --bwlimit 40M --max-size 250G --retries 3  --include-from "C:\Software\rclone-v1.56.2-windows-amd64\task\DL音声合集3.txt"

如果你想了解微软的Onedrive隐藏限额经验简介,不妨参看:
[post cid="836" cover=""/]
如果你想查询OneDrive拷贝细节配置和常见错误解决方法,可以看看:
[post cid="741" cover=""/]
如果你想更新你的emby库,苦于提取获得新增文件清单同步到OneDrive,可以参考:
[post cid="760" cover=""/]
如果你还不太了解rlcone或者相对rclone系列各种工具有着深入了解研究想法,可以看看我踩过的坑,多少会有些帮助:
[post cid="721" cover=""/]

最后,滥用和松鼠党的归宿终究逃不过这位老哥的结局,逃得了Google drive,也顶不住微软的制裁的,各位且用且珍惜:
https://answers.microsoft.com/zh-hans/msoffice/forum/all/%E6%88%91%E6%98%AF%E5%BC%80%E5%8F%91%E4%BA%BA/8f891794-cf10-4a34-b38d-1b8776fe4235

另外一些修改方式参考大佬们的分享:
修改应用密钥有效期之 Chrome 扩展 TamperDev 篇
修改应用密钥有效期之 Fiddler 篇
修改应用密钥有效期之 Charles 篇
修改应用密钥有效期之 azure-cli 篇
修改应用密钥有效期之 Graph Explorer 篇

title

一、yandex账号注册和商业版免费套餐选择

https://360.yandex.ru/
右上侧选择商业用途即可到达商务套餐注册页面
这个是老毛子仿照微软的office365和google的workspace套件做的一套办公商务在线服务系统
https://360.yandex.ru/business/
点击get started 黄色按钮
https://360.yandex.ru/business/tariff?from=landing
即可到达套餐选择页面,划到页面最下方,左边那个尝试limited version就是免费版本了
Try limited version

促销活动截止到2022.02.02,这简直就是针对gsuite legacy宣布不再免费,强制升级付费版后,我们白嫖党使用域名邮箱的福音
选择右侧limited version即可跳转到yandex账号注册界面
free limit version
我们直接注册新账号即可
填写基本的信息,国内ip注册的话直接填你的手机号就行,国外ip的话加上+86,如果不想手机号注册,就输错验证码,选择密保问题注册。注册成功后直接会跳转到此页面,选择刚注册好的账号作为选定组织,就可以获得免费版的yandex360套件了
yandex360

二、个人域名邮箱验证配置

我们选择直接添加域名邮箱或者你也可以从左侧菜单进入域名邮箱配置,
对了,如果你默认是俄语,点击页面左下角选择中间的en英语即可,或者使用chrome浏览器的翻译功能
language switch

按着流程提示在域名服务商添加对应txt解析,等待解析生效(最多72小时),就可以验证域名归属成功.
DNS record verify

去你的域名服务商添加对应解析即可
[collapse status="false" title="各大DNS服务商添加解析演示"]

腾讯云dnspod演示为:
DNSpod

porkbun猪肉包的解析添加演示为:
porkbun

namesilo解析添加演示为:
namesilo

[/collapse]

一般稍等片刻,即可验证成功
DNS record verified

当然繁忙时候可能需要数个小时甚至1,2天,最长不超过72小时,你也可以选择其他方式进行域名归属验证。

接下来就是添加mx解析
add mx record

这里不做过多演示,dnspod示例:
DNSpod add mx record

稍等片刻检测成功:
mx record verified

让yandex接管域名的DNS解析(可选,类似于cloudflare接管你域名商默认解析服务)

添加SPF,高级用法大佬们自己摸索
最普通的就是添加一个@ TXT值:

v=spf1 redirect=_spf.yandex.net

add SPF record

一般也是直接生效:
SPF record verified

添加DKIM记录(防止不法分子伪装你域名发信诈骗,增强身份验证,强烈推荐配置)
add DKIM record

内容为新增一个mail._domainkey记录的txt解析,记录值则是网站给你提供的加密字段

dnspod add DKIM record

一切完毕,你就可以正常稳妥使用你的域名邮箱服务了
DKIM verified

三、添加您的域名邮箱用户并使用

添加一个新账号,使用你的company(域名后缀)
add user

设置完毕后此账号登录一次,没事做的话也可以对此company域名账号也添加对应的辅助邮箱,手机号,保障安全。
first login

访问你的邮箱https://mail.yandex.ru/,进入设置
email settings

建议添加为第三方app专用一次性密码来收件,进入你的个人主页进行设置开启:
https://passport.yandex.ru/profile/
add app secret

密码仅显示一次,请记好了再关闭页面,不小心忘了就删除重新创建一个
create new secret

使用此密码添加到你win10邮件app或者其他smtp收件即可,pop3安全兼容问题,不太推荐使用了。
smtp account login

测试收发信,去Mjj最爱的检测网址进行跑分验证:
https://www.mail-tester.com/
过短的信件内容也容易被判spam,建议模仿正常信件内容测试更准
根据提示可以尝试添加一个txt解析主机记录为_dmarc的值为

v=DMARC1; p=none

title
dd win之后必须要做的安全措施推荐:

1.修改3389远程访问默认端口

此举措可以减少90%爆破程序,这里推荐使用nat.ee大佬配置的cmd批处理脚本
tool.cmd

修改访问端口推荐10000-65535高位端口区间

2.修改默认登录管理员

Administrator属于爆破人员必用登录用户名,修改此项可以再次降低80%风险,顺带设置较复杂的密码更佳

方法为:

windows>>管理工具>>计算机管理>>本地用户和组>>用户

添加一个新的用户名,常规选项去掉勾选用户下次登陆时必须更改密码选项

隶属于 选项 添加Administrators
以及Remote Desktop Users

远程登录测试ok后,将Administrator 账号常规选项勾选禁用,这样就无法远程访问了,当然你也可以删除此账号,但是以防万一,建议先禁用确认无误后再删除。

3.安装IPBan等安全工具

IPBan的安装,主要是win2012环境需要配置强制NTLM v2访问,以及.net Frame work 4.5.2版本的安装 ,而win2016默认都ok,省略了这些手动配置。所以我们重点说下

win2012系统的配置

IPBan在windows2012环境下需要一些基本配置才能正确生效,记录如下
官方的一键安装脚本需要power shell 5.1+版本,我们当前的2012系统默认版本查询:
打开powershell输入$PSVersionTable
发现PSVersion值为4.0
PSversionTable

版本较低,需要手动升级:
https://docs.microsoft.com/en-us/powershell/scripting/windows-powershell/install/installing-windows-powershell?view=powershell-7.2

WMF5.1

win2012原版选择图中版本即可

win2012原版

如果是win2012 R2,则选择powershell 5.1版本选择对应WMF安装程序(win8.1&win2k12R2)即可
也可以在这里直接找到单独版本:

https://go.microsoft.com/fwlink/?linkid=839516

如果你的系统关闭了windows update服务,则通过点击windows图标,选择管理工具,选择服务,找到windows update启动服务即可

温馨提示:

安装WMF5.1需要系统 .net framework 4.5以上版本,核心功能需要4.5.2以上版本才能生效,而且IPBan运行一些功能也需要对应的4.5.2以上版本,如果你系统版本过低,访问微软下载安装对应版本:

https://docs.microsoft.com/en-us/dotnet/framework/install/guide-for-developers?redirectedfrom=MSDN

windows 2012 R2最高可安装4.6.2版本,但是貌似没有中文版本,在判断用户活跃状态时,IPBan调用对应dll库方法会出错,所以我们这里选择更新到4.5.2版本:

https://dotnet.microsoft.com/en-us/download/dotnet-framework/thank-you/net452-web-installer

安装好必备环境组件后,就可以直接使用powershell一键脚本进行IPBAN的安装了:

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/DigitalRuby/IPBan/master/IPBanCore/Windows/Scripts/install_latest.ps1'))

One click install script

安装完毕后会自动配置相关服务,开启系统登录/注销事件安全审计,并且打开配置文件

ctrl+f查询appsettings项,找到下图两个红线标记位置,一个是失败次数,另一个是封禁时间,默认是5次登录失败,封禁1天
config

你也可以手动访问C:\Program Files\IPBan\ipban.config文件随时进行调整

额外的安全措施

关闭NTLM认证方式前,务必确认系统设置远程设置项目里面仅允许安全连接项目去掉勾选。
右键我的电脑,属性,系统高级设置,远程
remote settings
Allow connections only from computers running Remote Desktop with Network Level Authentication (recommended)
此项去掉勾选,否则你进行下面的设置后,就无法远程访问你的vps了
cmd输入gpedit.msc开启本地组策略编辑器,找到以下内容:
计算机配置>Windows 设置>安全设置>本地策略>安全选项,修改以下三项:
网络安全: LAN管理器身份验证级别 仅发送NTLMv2响应。拒绝LM和NTLM(&)此项是需要使用outlook的朋友设置,因为无法禁用NTLM
网络安全:限制NTLM:传入 NTLM流量 拒绝所有账户 此项为普通用户推荐项
网络安全:限制NTLM:审计传入NTLM流量 启用对所有账户的审核 此项可以不开
本地组策略

Required
Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options
Network security: LAN Manager authentication level -- Send NTLMv2 response only. Refuse LM & NTLM
Network security: Restrict NTLM: Audit Incoming NTLM Traffic -- Enable auditing for all accounts
Network security: Restrict NTLM: Incoming NTLM traffic -- Deny all accounts
事实上,我们一般只需要修改 网络安全:限制NTLM:传入 NTLM流量 拒绝所有账户 就行
修改完毕后重启,如果你需要通过win2012r2这些旧系统的rdp客户端远程访问此vps,那么之前设置过保存credentials,需要清除重新创建凭据,曾经保存的凭据无法应用于此vps的NTLM2远程访问

手动安装配置IPBan

如果你嫌powershell更新繁琐,你也可以下载官方windows安装包进行手动安装配置,解压zip包到C:\Software\IPBan, 手动配置对应服务,管理员打开cmd,输入指令:

sc create IPBAN type= own start= auto binPath= C:\Software\IPBan\DigitalRuby.IPBan.exe DisplayName= IPBAN

cmd命令查询需要执行的安全审计:

auditpol /list /subcategory:* /r

列表中登录事件和登录/注销事件是需要记录的,实际上仅仅审计登录/注销事件即可,这个是用来记录登录ip,方便ipban获取登录ip进行对应ip封禁。
输入如下指令进行审计开启:

auditpol /set /category:"{69979849-797A-11D9-BED3-505054503030}" /success:enable /failure:enable
auditpol /set /category:"{69979850-797A-11D9-BED3-505054503030}" /success:enable /failure:enable

计算机配置>Windows 设置>安全设置>本地策略>安全选项,修改以下项:
网络安全:限制NTLM:传入 NTLM流量 拒绝所有账户
手动配置 C:\Software\IPBan\ipban.config 定位appsettings项,修改次数2和ban的时间为2分钟,保存后重启服务,用一台机器测试ban是否生效。
卸载的话,cmd输入:

sc.exe stop IPBAN
sc.exe delete IPBAN
rmdir /s /q "C:/Program Files/IPBan"

Windows2016安装IPBan

win2016 安装IPBan只需要打开powershell执行一键脚本即可:

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/DigitalRuby/IPBan/master/IPBanCore/Windows/Scripts/install_latest.ps1'))

title

一、楔子

V2ray客户端更新,新年开始淘汰Vmess的md5验证算法,加上折腾了梅林路由系统发现vmess只能跑个20mbps,终于有了些动力关注下最新的Vless协议和新的Xtls黑科技。
说实话,从我个人习惯和对协议伪装的理解来说,Vmess+websockets+tls这种模式,是易于理解并且可靠朴素的。但是技术更新那么快,多少了解下新形势还是非常有必要的。
Vless 相对于Vmess少了些什么?
少了在tls加密下对数据的第二层加密,充分依赖tls的伪装可靠性,在tls的包裹下快乐裸奔tcp数据,也就是普通的http明文数据
Xtls又为何称为extreme TLS?
技术层面上不懂,但是据说大佬将其搭配Vless协议做到了直接接手nginx路由分发角色,同时无缝处理到位vless的加密流量和普通的tls加密流量,从而让full cone也成为可能
更高的响应分发效率,去掉了没必要的再次数据加密,从而在路由系统和手机端能节省大量cpu和内存性能,在低端客户端环境下,会有极大的带宽提升体验,看起来很值得我去尝试下

普通的Vmess +ws+tls转换为Vless+ws+tls的话很简单,基本上用v2ray新版就可以做到,v2ray依然做后端接收nginx通过path传递过来的数据,去掉alterID项,修改加密模式vmess为vless,基本上就行
而主推的vless搭配模式则是将nginx和之前vmess角色对调,让vless在第一线进行数据识别分发,然后按着alpn或者path来进行包裹分拣,path下发后下沉分配到对应协议组合,如vmess加密数据,或者trojan数据,而alpn识别分发通过fallback回落到对应的nginx以及其他端口的伪装代理。

二、批判

vless的野心,xtls的狂妄,可以看出开发者的热血和踌躇满志,然而经过我三天的折腾,一个通宵加废寝忘食研究后发现,官方对nginx和建站正常运转的忽视,以及大量的文档过期将近1年的疏于维护,我隐约看到,真正的程序员那种挑灯夜战,只为真理和极致,在市场运营方面为何没有地位了。
作为一个用户,对于一个开源产品唧唧歪歪,没有任何贡献进行指点江山,我确实是在做宵小之辈的事情。
我没有任何资格可以指责,但是我实在忍不住想谈谈这种开发者的断层问题,你要理解为我针对谁,那也行吧

用户到底需要什么?
稳定
既是协议可靠上的稳定,也是学习更新上手的稳定
别的不说,跟随v2ray项目衍生的windows客户端v2rayN,多次更新的体验,就让人左右不适。
不提之前各种版本漏洞没有任何通知,全靠自己github和朋友信息圈子奔走相告,对于最基本的用户,浑然不觉自己已然是裸奔
后面更新的路由协议规则变成规则集,简直让用户束手无策。可能是觉得大家用习惯的右键>>>选择服务器>>展开服务器列表>>选择合适的服务器>>>再进行系统配置选择
这种繁琐的事情已经没有任何挑战了,再给你搞一套路由规则,甚至里面没有国外vps访问国内站点默认的仅代理国内ip之类的傻瓜预设,这是三组参数里面自己慢慢调整,字面上对于新手来说还模棱两可
优秀的销售从不让你做任何选择,而是帮你做选择
这尼玛让人A33排列组合一阵之后发现不爽,还得help myself自己动手,打开自定义设置一看,菜单都完全变样了,这规则集我要它何用,我就是要让自己个人想代理的几个域名加入代理列表,仅此而已,规则集也没有个直接添加规则的按钮,还得导入做好的文档,瞬间失去兴致,卸载重新用旧版本了
依稀记得10年前有一款似乎叫诺顿 vpn啥的,自动帮你选择最优节点,整个界面就是一个大大的按钮,点一下,就连通,变绿色,点关闭,就红色,停止工作,对于太多的用户来说,他们要用你了,你动一动干活了,就行了

三、真实故事

说到这想起一个mjj说的真实故事,他一顿操作给他的女朋友还是女同事搞定了iplc warp disney+ Netflix一条龙服务,节点双手奉上,v2rayNG帮忙配置完毕。
“教会”了他的那个她怎么看片,结果第二天她就蹦蹦跳跳过来不好意思地问,为什么今天用不了了
“你先启动v2rayNG,就是那个黑色的V字app,然后就可以看视频了”
“我启动了呀”
某mjj迅速自查一番所有节点发现都正常没被墙,然后劈里啪啦打字回复“不应该啊,你怎么启动的,流程详细说说”
“就是你教我的,先点开V,然后就可以打开红色的N看了,但是看不了”
“哦,你那v2rayNG都没选择节点点击那个绿色飞机启动”
“哦哦,原来还要再点一下纸飞机哦”

你以为这样的女朋友很傻很少见么?我说说我老婆吧,我帮她也是安装好了v2rayNG和Netflix以及一个nplayer用来局域网看电视剧的
几乎相同的事情发生在我的身上了:
“老公你上次给我安装的看韩剧的东东是哪个啊?”
“你那个加速器打开了么?”
“打开了呀,视频app是哪个呢?”
“我不是只给你安装了一个视频app么,就是那个红色的N”
“哦哦,上几次都是另外一个彩色的n那个视频app,分不清了”
“嗯,其实那个叫播放器,不是视频app”
然而她已然抱着手机去看韩剧了,我的解释估计完全没兴趣听也记不住。

四、编的故事

小故事说完了,个中滋味每个人体会都有所不同
那么对于一个男人来说,尤其是划水娱乐脚本多年的男人,本以为vless就是个小儿科,结果长达30多个小时的折腾后,我只想说
又臭又长的千足虫json格式搭配v2ray/xray团队语焉不详,懂得都懂的玄幻文档和互相矛盾,互相过期,惜字如金的解释,堪比微软和甲骨文大厂大项目的文档参数解释
我感觉就像3岁的时候学字,这个是大,这个叫做小,这个是山,这个是水,好了现在你可以描绘出一幅美景了,大大的山里流淌着小小的水流,你认识到水能组成小溪,自然而然小溪越来越大就成了江河湖海,最后汇聚成一副美丽的画卷....

“vless草鸡吊,xtls黑科技,the next generation!”
“vless配置很简单的啦,你就这样,那样,就配置好了”
说真的,团队们做的那套一键脚本还真是淋漓尽致,颇有三大操作系统部署,全系统掌控的全面详尽水准了,说大佬们没努力没水平那是不可能的,但是对于想自己用上的人来说,看着那演示和参数解释怎么看怎么怪异迷茫。
fallback难理解吗?并不难,开发者以为用户很难接受nginx和vless互换角色?
并不是,用户疑惑的是,为何vmess不要做回落,vless一定要做防检测回落干嘛?
alpn又是啥?对于不学网络和前端,不认识tcp udp网络协议不懂应用层协议层什么4层7层的Netflix用户来说,这不亚于考研
一蹦蹦这么多新参数出来,那本来就如同鬼画桃符的json配置,对于很多新手来说,都是勉强熟悉看懂了它的身材长相,捧在手心怕化了,小心翼翼把大佬劈里啪啦分享的配置文件一字不漏塞进自己的config.json里面小心翼翼按下Esc输入冒号wq检查无误后,并且拼写几次错误systemctl restart v2ray,终于成功了,就如视珍宝地雪藏供奉好,甚至不惜重金买下瓦工48.79刀套餐,果断加入新的快照,输入详细的备注信息提醒自己快照的内容,然后呼出一口气终于可以享受了
结果新版v2ray,vless之类的推荐的配置要么一个encryption none丢某个大括号的大括号里面,要么一个decryption none丢某个位置,也不解释下为什么要它们,为什么又不能写在哪里,要么这边客户端可以填加密auto,服务端什么的alterID不用64了,可以只要填4了,又是客户端小于服务端数字就行,又变成服务端要改成0,又让人举棋不定到底是删掉还是改成0都行,又是新年大礼包一堆 closed pipe吓得一堆萌新不知所措
一个字,乱,两个字,混乱,三个字,真的乱,四个字,一片混乱
我真怀疑跟这些大佬一起上班的同事会不会疯,迭代规则,信息传递,项目进度,客户推送真的是屎山叠屎山,史无前例,然后一堆萌新蹲在屎山边上看到一颗光头突然蹦出来,手中握着一枚金灿灿的屎色的金币,大呼,我找到了真理!

我本就是想体验下vmess换成vless少一层加密,好像还有个xtls更快更强,仅此而已,结果让我去学各种path,又增加什么dest xver还有alpn还有什么http/1.1,http2还有什么h2c和http2啥区别啊,http/1.1是不是只有http协议啊,nginx到底支不支持h2c啊,我现在访问自己的站点又是啥方式啊,怎么看啊,nginx又要with xxx module又要with xxx module还要xxx module然后才开始有资格体验受苦
一堆人说要默认留alpn 1.1啊,又有人说要alpn 2优先啊,放前面尽量让所有https fallback到http2啊(萌新瑟瑟发抖,是不是一个位置没放好就要被嗅探啊,好怕啊),又看到说各个回落path部分以最后的优先起效啊,为什么alpn 2优先怎么还放在最前面啊,啊不,什么是上面下面,什么是前面后面啊,我这只看到一条千足虫json眼睛花,哎哟喂这里多了个},哎呀那里又多了个],卧槽decryption放进到clients框框里面了....大佬,大佬你怎么不说话了啊,救救我啊

一个星期过去了,饱受摧残的萌新打着饱嗝终于塞满了各种知识,接受了大佬们一通洗脑并且熟悉明白了这个vless能干各种事情,比如vless皮trojan馅的,vless皮咬开蹦出个vmess馅的,又比如咬开一个还能包着vmess还跳出来个ws的,还有trojan馅吃出来fallback回nginx的
大佬语重心长的说,vless的四种写法,你明白了嘛?
“明白了”
“好,让我考考你,请默写/vmesstcp /websocket /vmessws以及默认回落到trojan的四种写法”
萌新埋头刷刷刷奋笔疾书,大佬微微颔首
“大佬大佬,我这次终于满分了吧!”
“不,刚好及格而已,请问若你用 Nginx/Caddy 等反代 WS,acceptProxyProtocol值应该为true或false?”
“ture ?吧?”萌新A试探着回答
“大佬,什么是反代啊?”萌新B好奇宝宝问。
大佬我行我素,继续提问“支持"cipherSuites"的最小版本是1.2还是1.3?”“v2ray 版本不小于 v4.几才完美支持 trojan 协议?”
萌新们垂头丧气....

半个月过去了

“喂,你修的啥?”萌新A问身旁
“哦,我就老老实实学好vmess+tls +ws,回家好好种田就行了,你呢?”萌新B回问
“我在攻克cf cdn教材了,有希望进修三本,加油了”萌新A握了握拳。
“切,一群书呆子,把后端vmess换成vless,学习效率加倍,很简单的捷径都学不会”一位伪学霸路过嘲讽
“我已经开始经脉倒转,马上要参透vmess小周天倒转成vless大周天了哈哈哈”一位结丹期小能开始狂笑
“弱者,本座vless+tls+tcp已经略有心得了,秒你只需要一招”元婴期大佬蔑视
“哈哈哈哈,老子Xtls终成正果了!”渡劫期强者霸气四射
“咦,我好像学会了Vless +Xtls+ws+tcp?”一位披头散发的大佬从洞窟闭关出界
“什么嘛,我才筑基的都知道长老说的xtls不能和ws一起存在”一位新学子撇撇嘴
“大哥哥这是为什么呀,xtls不是说万能的嘛?”一位无灵根小姑娘咬着棒棒糖路过随口问道
“哎呀,我哪知道那么多,什么xtls不能ws搭配,因为啥谁前谁后功法不同,和nginx功法功能不同,有的能加cdn有的不能外套cdn,哎呀老复杂了”
“对啊,为什么啊,我就说感觉经脉不通,等等,那我刚才学会的是幻觉,不对,我怎么身体变轻了,我的肉身已经不见了?不。。。”那位披头散发大佬刚南柯一梦出关被点醒就化成了灰烬。
一位戴着眼镜的师姐路过,
“咦,是陆师姐,你怎么弃武从文了?”一群追捧者扼腕叹息,百思不得其解
“哦,我只是发现世俗界的牛津大学好像比这个学起来简单多了,顺手考个证,这不加深点理论理解,过来再研究修仙,不碍事”

五、篇落

vless配置参考和简单解释
安装脚本使用了xray的:

bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install

Vless前置+tcp+xtls回落nginx是比较不错的性能之选,简单贴出此配置如下
[collapse status="false" title="Vless+tcp+xtls配置示例"]

{
  "log": {
    "loglevel": "warning",
    "error": "/var/log/xray/error.log", 
    "access": "/var/log/xray/access.log"
  },
  "inbounds": [
    {
      "port": 443, 
      "protocol": "vless",
      "settings": {
        "clients": [
          {
            "id": "d7bfb96f-xxxx-yyyy-zzzz-b4520bc1b5c8", 
            "flow": "xtls-rprx-direct",
            "email": "a@omo.moe"
          }
        ],
        "decryption": "none",
        "fallbacks": [
          {
            "alpn": "h2",
            "dest": "/dev/shm/h2c.sock",
            "xver": 0
          },
          {
            "dest": "/dev/shm/h1.sock", 
            "xver": 0
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "xtls", 
        "xtlsSettings": { 
          "alpn":[
            "h2", 
            "http/1.1"
          ],
          "minVersion": "1.2",
          "cipherSuites": "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
          "certificates": [
            {
              "ocspStapling": 3600, 
              "certificateFile": "/usr/local/cert/omo_moe.crt", 
              "keyFile": "/usr/local/cert/omo_moe.key"
            }
          ]
        }
      },
      "sniffing": {
        "enabled": true,
        "destOverride": [
          "http",
          "tls"
        ]
      }
    }
  ],
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "protocol": [
          "bittorrent"
        ],
        "outboundTag": "blocked"
      }
    ]
  },
  "outbounds": [
    {
      "protocol": "freedom",
      "settings": {}
    },
    {
      "tag": "blocked",
      "protocol": "blackhole",
      "settings": {}
    }
  ]
}

[/collapse]
示例的是unix进程方式对接nginx,另一种fallback方式是端口方式,对于http2协议和http/1.1,因为后端nginx监听不能在同一个端口监听两种协议,所以只能分开

nginx这边对接配置如下:

server
{
  listen 80;
  server_name www.us.omo.moe us.omo.moe;
  return 301 https://us.omo.moe$request_uri;
#  access_log /var/log/nginx/omo.moe.access.log main;

}
server
{
  listen unix:/dev/shm/h1.sock;
  listen unix:/dev/shm/h2c.sock http2;

  server_name default_server;
#  return 301 https://us.omo.moe$request_uri;
#  add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; #启用HSTS

  root /home/wwwroot/omo.moe;

  index index.html index.htm index.php;
  #charset koi8-r;
  access_log /var/log/nginx/omo.moe.access.log main;

  #        return 301 https://us.omo.moe$request_uri;
  ssl_certificate "/usr/local/cert/omo_moe.crt";
  ssl_certificate_key "/usr/local/cert/omo_moe.key";
  ssl_session_timeout 10m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  ssl_prefer_server_ciphers on;

  error_page 404 /404.html;
  error_page 500 502 503 504 /50x.html;

需要注意的是,80端口www/不带www的在vless作为分发得到的http2和http/1.1流量数据不能直接301跳转到同一个https://域名,我不会,我学的都快走火入魔了,已经放弃了,好像大佬与萌新都不在乎这点小细节
第二个server段内,带www的https也无法跳转到不带www的https,我就注释掉了,否则无限循环重定向
所以目前研究的进展只能做到手动输入http:域名的跳到https,和直接https访问,而带www的http会跳转到带www的https从而报错,并且直接访问www的https也是报错
我真的不想为了vless那点性能提升去学习透彻毛子的nginx庞大的参数了
这是老夫学会的一式半招,在此分享留给有缘人希望能帮你参透一二吧
对了, location ~ .php
这些php区域里面记得填上

fastcgi_param HTTPS "on";

因为从vless接手过来的数据就是纯粹的无加密tcp数据了,你只能强制让nginx服务器转变成https数据再out发送出去。
没加密的tcp数据是什么样子的?那是剑意,只能意会,不可言传,自己悟去吧
最后我知道你想问的,vless真的安全嘛?
我只想说,我不懂,我觉得像皇帝的新衣,它很凉快,很轻便很强大,但是确实是穿着衣服的呢。
哦,忘说了, r6400用vless+xtls能跑到60mbps了,确实还不错。
如果无法忍受https://www 不能跳转的小问题,那么折中方案就是vless+ws+tls ,nginx前置依旧,只简单修改vmess配置为vless的即可,参考示例:
[collapse status="false" title="nginx+ws+tls+vless"]

{
  "log": {
    "access": "/var/log/v2ray/access.log",
    "error": "/var/log/v2ray/error.log",
    "loglevel": "debug"
  },
  "inbounds": [
    {
      "listen": "127.0.0.1",
      "port": 12345,
      "protocol": "vless",
      "settings": {
        "clients": [
          {
            "id": "your UUID"
          }
        ],
        "decryption": "none"
      },
      "sniffing": {
        "destOverride": [
          "http",
          "tls"
        ],
        "enabled": true
      },
      "streamSettings": {
        "network": "ws",
        "security": "auto",
        "wsSettings": {
          "headers": {},
          "path": "/yourpath"
        }
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "settings": {}
    }
  ]
}

[/collapse]

附 中转配置
中转的话,貌似vless无法直接中转?所以outbound这里沿用vmess或者你喜欢的其他trojan或者什么的协议应该也可以达到效果。落地机依然保持原来的vmess或者对应接收协议不变就行,建议配置完毕后清除所有#//注释内容。
当然你也可以将中转鸡完全做成流量转发配置,也就是iptables,firewalld,gost纯转发流量。
另外作为落地机只是解锁流媒体典型场景,还可以在中转鸡添加routing区块配置只转发Netflix流量到落地机,实现私家车合租落地节点,减少滥用的效果。

"routing": {
    "rules": [
      {
        "outboundTag": "blocked",
        "protocol": [
          "bittorrent"
        ],
        "type": "field"
      },
      {
        "type": "field",
        "outboundTag": "HKT",
        "domain": ["geosite:netflix"] // netflix流量走 落地机
      }
    ]
  }

[collapse status="false" title="vless中转鸡配置示例"]

{
    "stats": { }, 
    "log": {
        "loglevel": "warning", 
        "access": "/var/log/v2ray/access.log", 
        "error": "/var/log/v2ray/error.log"
    }, 
    "api": {
        "tag": "api", 
        "services": [
            "StatsService"
        ]
    }, 
    "policy": {
        "levels": {
            "0": {
                "statsUserUplink": true, 
                "statsUserDownlink": true
            }
        }, 
        "system": {
            "statsInboundUplink": true, 
            "statsInboundDownlink": true
        }
    }, 
    "inbounds": [
        {
            "listen": "127.0.0.1",
            "port": 12345, 
            "protocol": "vless", 
            "settings": {
                "clients": [
                    {
                        "email": "a@omo.moe", 
                        "id": "UUID_1", 
                        "level": 0
                    }, 
                    {
                        "email": "b@omo.moe", 
                        "id": "UUID_2", 
                        "level": 0
                    }, 
                    {
                        "email": "c@omo.moe", 
                        "id": "UUID_3", 
                        "level": 0
                    }
                ],
    "decryption": "none"
            }, 
            "sniffing": {
              "destOverride": [
              "http",
              "tls"
              ],
              "enabled": true
            },
            "streamSettings": {
                "network": "ws", 
                "security": "auto",
                "wsSettings": {
                    "headers": {},
                    "path": "/yourpath"
                }
            }
        }, 
        {
            "listen": "127.0.0.1", 
            "port": 8080, 
            "protocol": "dokodemo-door", 
            "settings": {
                "address": "127.0.0.1"
            }, 
            "tag": "api"
        }
    ], 
    "outbounds": [
        {
            "protocol": "freedom", 
            "settings": { }, 
            "tag": "direct"
        }, 
        {
            "protocol": "vmess", 
            "settings": {
                "vnext": [
                    {
                        "address": "hkt.omo.moe", 
                        "port": 23333, #落地机nat nginx对应的外部端口是23333,所以中转鸡outbound转发到落地机的监听端口是23333.
                        "users": [
                            {
                                "email": "b@omo.moe", 
                                "alterId": 0,
                                "id": "UUID_2", 
                                "level": 0,
                                "security": "auto"
                            }
                        ]
                    }
                ]
            },
            "streamSettings": {
                "network": "ws", 
                "security": "tls", 
                "tlsSettings": {
                    "allowInsecure": false,
                    "serverName": "hkt.omo.moe"
                }, 
                "wsSettings": {
#                    "certificates": [ #这里一路都是我自己域名转发,不确定如果你的落地机使用别的域名或者证书是否需要添加对应落地机的证书配置,放着供参考
#                        {
#                            "certificateFile": "/usr/local/cert/omo_moe.crt",
#                            "keyFile": "/usr/local/cert/omo_moe.key"
#                       }
#        ],
        "headers": {
          "Host":"hkt.omo.moe"
        },
                    "path": "/yourpath"
                }
            }, 
            "tag": "hkt"
        }, 
        {
            "protocol": "shadowsocks", 
            "settings": {
                "servers": [
                    {
                        "address": "2.2.2.2", 
                        "method": "aes-256-gcm", 
                        "password": "mypassword", 
                        "port": 1997, 
                        "ota": false
                    }
                ]
            }, 
            "tag": "ss"
        }
    ], 
    "routing": {
        "strategy": "rules", 
        "settings": {
            "domainStrategy": "IPOnDemand", 
            "rules": [
                {
                    "type": "field", 
                    "outboundTag": "direct", 
                    "domain": [
                        "geosite:cn"
                    ]
                }, 
                {
                    "type": "field", 
                    "outboundTag": "direct", 
                    "ip": [
                        "geoip:cn", 
                        "geoip:private"
                    ]
                }, 
                {
                    "type": "field", 
                    "user": [
                        "b@omo.moe"
                    ], 
                    "outboundTag": "hkt"
                }, 
                {
                    "type": "field", 
                    "domain": [
                        "xx.xx"
                    ], 
                    "outboundTag": "ss"
                }, 
                {
                    "inboundTag": [
                        "api"
                    ], 
                    "outboundTag": "api", 
                    "type": "field"
                }
            ]
        }
    }
}

而我们落地机依然保持不变,演示如下:

{
    "stats": { },
    "log": {
        "loglevel": "warning",
        "access": "/var/log/v2ray/access.log",
        "error": "/var/log/v2ray/error.log"
    },
    "api": {
        "tag": "api",
        "services": [
            "StatsService"
        ]
    },
    "policy": {
        "levels": {
            "0": {
                "statsUserUplink": true,
                "statsUserDownlink": true
            }
        },
        "system": {
            "statsInboundUplink": true,
            "statsInboundDownlink": true
        }
    },
    "inbounds": [
        {
            "port": 12345,
            "protocol": "vmess",
            "settings": {
                "clients": [
                    {
                        "email": "a@omo.moe",
                        "id": "UUID_1",
                        "level": 0,
                        "alterId": 0
                    },
                    {
                        "email": "b@omo.moe", #这里对接的是中转机UUID_2,从nat外部端口23333映射到内网443端口,nginx监听443后反代配置传到vps内部12345本地端口。
                        "id": "UUID_2",
                        "level": 0,
                        "alterId": 0
                    },
                    {
                        "email": "c@omo.moe",
                        "id": "UUID_3",
                        "level": 0,
                        "alterId": 0
                    }
                ]
            },
            "streamSettings": {
                "network": "ws",
                "wsSettings": {
                    "path": "/yourpath"
                }
            }
        },
        {
            "listen": "127.0.0.1",
            "port": 8080,
            "protocol": "dokodemo-door",
            "settings": {
                "address": "127.0.0.1"
            },
            "tag": "api"
        }
    ],
    "outbounds": [
        {
            "protocol": "freedom",
            "settings": { }
        }
    ],
    "routing": {
        "settings": {
            "rules": [
                {
                    "inboundTag": [
                        "api"
                    ],
                    "outboundTag": "api",
                    "type": "field"
                }
            ]
        },
        "strategy": "rules"
    }
}
//使用/usr/bin/v2ray/v2ctl api --server=127.0.0.1:8080 StatsService.QueryStats 'pattern: "" reset: false'查询>流量数据
///usr/bin/v2ray/v2ctl api --server=127.0.0.1:8080 StatsService.GetStats 'name: "user>>>a@omo.moe>>>traffic>>>uplink" reset: false'查询指定用户流量

[/collapse]

六、后记:

执着于和墙作斗争的精神,诞生了这些无私奉献的大佬,我从他们的工作节奏,开发点滴能感觉的到那种对抗甚至带着一丝疯癫,为了证明自己还是为了炫耀,其实都是一念之间。
其实我并不看好xray甚至整个v2ray的前景,大佬们可敬,但是走向的路确是可悲的,历史的车轮滚滚向前,哪怕你一只蚂蚁做出来钢筋小屋,也只会被车轮压进泥土,成为最坚固的牺牲品
国内反诈app战略部署于miui13,各种银行卡断卡行动,手机卡局停,地域性不发货,本人来当地营业厅实名解封,越来越多的摄像头和大数据收集,越来越快的舆论公关清理效率,我们注定只会成为可悲的蚂蚁,有的蚂蚁嘲笑着独行的瓢虫居无定所,随时被飞鸟叼走的动荡生活,自己捧着按劳分配的那些食物躲在蚁穴安然自得,有的蚂蚁羡慕外面的自由和挑战,当然,有的瓢虫也会羡慕蚂蚁的安定和谐。
可是蚂蚁终究是蚂蚁,即便长了翅膀,飞出去,也无法融入瓢虫,瓢虫再好奇蚂蚁的生活,也只是暂居,终究心向蓝天,随时会离开。
我是一只蚂蚁,我在嘲笑那些奋斗在一线和车轮斗争的工蚁们,等着他们力竭,等着他们被撕成碎片,化为养料加固这钢筋牢笼
我是好人?因为我也在冒死分享,只是和他们岗位不同?
我是坏人?因为我在嘲讽前行者,冷眼旁观?
我不知道,其实我们都不是人啦
这世道,有几个人有资格是人?
都是蚂蚁
都会化成风
只不过每只蚂蚁确实都羡慕会飞的瓢虫
有的真的长出翅膀,飞向远方
有的只能在心中长出翅膀
想飞
因此我们在此相遇
We To Fly

新的一年,大家继续前行,或许你就能翻出来屎山里面属于自己的那枚金币