ShadowsocksR 协议插件文档

概要

用于方便地产生各种协议接口。实现为在原来的协议外套一层编码和解码接口,不但可以伪装成其它协议流量,还可以把原协议转换为其它协议进行兼容或完善(但目前接口功能还没有写完,目前还在测试完善中),需要服务端与客户端配置相同的协议插件。插件共分为两类,包括混淆插件和协议定义插件。

现有插件介绍

1.混淆插件

此类型的插件用于定义加密后的通信协议,通常用于协议伪装,部分插件能兼容原协议。

plain:表示不混淆,直接使用协议加密后的结果发送数据包

http_simple:并非完全按照http1.1标准实现,仅仅做了一个头部的GET请求和一个简单的回应,之后依然为原协议流。使用这个混淆后,已在部分地区观察到似乎欺骗了QoS的结果。对于这种混淆,它并非为了减少特征,相反的是提供一种强特征,试图欺骗GFW的协议检测。要注意的是应用范围变大以后因特征明显有可能会被封锁。此插件可以兼容原协议(需要在服务端配置为http_simple_compatible),延迟与原协议几乎无异(在存在QoS的地区甚至可能更快),除了头部数据包外没有冗余数据包,客户端支持自定义参数,参数为http请求的host,例如设置为cloudfront.com伪装为云服务器请求,可以使用逗号分割多个host如a.com,b.net,c.org,这时会随机使用。注意,错误设置此参数可能导致连接被断开甚至IP被封锁,如不清楚如何设置那么请留空。服务端也支持自定义参数,意义为客户端仅能填写的参数列表,以逗号分割。
本插件的高级设置(C#版、python版及ssr-libev版均支持):本插件可以自定义几乎完整的http header,其中前两行的GET和host不能修改,可自定义从第三行开始的内容。例子:
baidu.com#User-Agent: abc\nAccept: text/html\nConnection: keep-alive
这是填于混淆参数的内容,在#号前面的是上文所说的host,后面即为自定义header,所有的换行使用\n表示(写于配置文件时也可直接使用\n而不必写成\n,换行符亦会转换),如遇到需要使用单独的\号,可写为\\,最末尾不需要写\n,程序会自动加入连续的两个换行。

http_post:与http_simple绝大部分相同,区别是使用POST方式发送数据,符合http规范,欺骗性更好,但只有POST请求这种行为容易被统计分析出异常。此插件可以兼容http_simple,同时也可兼容原协议(需要在服务端配置为http_post_compatible),参数设置等内容参见http_simple,密切注意如果使用自定义http header,请务必填写boundary。

random_head(不建议使用):开始通讯前发送一个几乎为随机的数据包(目前末尾4字节为CRC32,会成为特征,以后会有改进版本),之后为原协议流。目标是让首个数据包根本不存在任何有效信息,让统计学习机制见鬼去吧。此插件可以兼容原协议(需要在服务端配置为random_head_compatible),比原协议多一次握手导致连接时间会长一些,除了握手过程之后没有冗余数据包,不支持自定义参数。

tls1.2_ticket_auth(强烈推荐):模拟TLS1.2在客户端有session ticket的情况下的握手连接。目前为完整模拟实现,经抓包软件测试完美伪装为TLS1.2。因为有ticket所以没有发送证书等复杂步骤,因而防火墙无法根据证书做判断。同时自带一定的抗重放攻击的能力,以及包长度混淆能力。如遇到重放攻击则会在服务端log里搜索到,可以通过grep "replay attack"搜索,可以用此插件发现你所在地区线路有没有针对TLS的干扰。防火墙对TLS比较无能为力,抗封锁能力应该会较其它插件强,但遇到的干扰也可能不少,不过协议本身会检查出任何干扰,遇到干扰便断开连接,避免长时间等待,让客户端或浏览器自行重连。此插件可以兼容原协议(需要在服务端配置为tls1.2_ticket_auth_compatible),比原协议多一次握手导致连接时间会长一些,使用C#客户端开启自动重连时比其它插件表现更好。客户端支持自定义参数,参数为SNI,即发送host名称的字段,此功能与TOR的meek插件十分相似,例如设置为cloudfront.net伪装为云服务器请求,可以使用逗号分割多个host如a.com,b.net,c.org,这时会随机使用。注意,错误设置此参数可能导致连接被断开甚至IP被封锁,如不清楚如何设置那么请留空。推荐自定义参数设置为cloudflare.comcloudfront.net。服务端暂不支持自定义参数。

2.协议定义插件

此类型的插件用于定义加密前的协议,通常用于长度混淆及增强安全性和隐蔽性,部分插件能兼容原协议。

origin:表示使用原始SS协议,此配置速度最快效率最高,适用于限制少或审查宽松的环境。否则不建议使用。

verify_deflate(不建议):对每一个包都进行deflate压缩,数据格式为:包长度(2字节)|压缩数据流|原数据流Adler-32,此格式省略了0x78,0x9C两字节的头部。另外,对于已经压缩过或加密过的数据将难以压缩(可能增加1~20字节),而对于未加密的html文本会有不错的压缩效果。因为压缩及解压缩较占CPU,不建议较多用户同时使用此混淆插件。此插件不能兼容原协议,千万不要添加_compatible的后缀。

verify_sha1(即原版OTA协议,已废弃):对每一个包都进行SHA-1校验,具体协议描述参阅One Time Auth,握手数据包增加10字节,其它数据包增加12字节。此插件能兼容原协议(需要在服务端配置为verify_sha1_compatible)。

auth_sha1(已废弃):对首个包进行SHA-1校验,同时会发送由客户端生成的随机客户端id(4byte)、连接id(4byte)、unix时间戳(4byte),之后的通讯使用Adler-32作为效验码。此插件提供了能抵抗一般的重放攻击的认证,默认同一端口最多支持64个客户端同时使用,可通过修改此值限制客户端数量,使用此插件的服务器与客户机的UTC时间差不能超过1小时,通常只需要客户机校对本地时间并正确设置时区就可以了。此插件与原协议握手延迟相同,能兼容原协议(需要在服务端配置为auth_sha1_compatible),支持服务端自定义参数,参数为10进制整数,表示最大客户端同时使用数。

auth_sha1_v2(已废弃):与auth_sha1相似,去除时间验证,以避免部分设备由于时间导致无法连接的问题,增长客户端ID为8字节,使用较大的长度混淆。能兼容原协议(需要在服务端配置为auth_sha1_v2_compatible),支持服务端自定义参数,参数为10进制整数,表示最大客户端同时使用数。

auth_sha1_v4(不建议):与auth_sha1对首个包进行SHA-1校验,同时会发送由客户端生成的随机客户端id(4byte)、连接id(4byte)、unix时间戳(4byte),之后的通讯使用Adler-32作为效验码,对包长度单独校验,以抵抗抓包重放检测,使用较大的长度混淆,使用此插件的服务器与客户机的UTC时间差不能超过24小时,即只需要年份日期正确即可。能兼容原协议(需要在服务端配置为auth_sha1_v4_compatible),支持服务端自定义参数,参数为10进制整数,表示最大客户端同时使用数。

auth_aes128_md5auth_aes128_sha1(均推荐):对首个包的认证部分进行使用Encrypt-then-MAC模式以真正免疫认证包的CCA攻击,预防各种探测和重防攻击,同时此协议支持单端口多用户,具体设置方法参见breakwa11的博客。使用此插件的服务器与客户机的UTC时间差不能超过24小时,即只需要年份日期正确即可,针对UDP部分也有做简单的校验。此插件不能兼容原协议,支持服务端自定义参数,参数为10进制整数,表示最大客户端同时使用数。

auth_chain_a(推荐):对首个包的认证部分进行使用Encrypt-then-MAC模式以真正免疫认证包的CCA攻击,预防各种探测和重防攻击,数据流自带RC4加密,同时此协议支持单端口多用户,不同用户之间无法解密数据,每次加密密钥均不相同,具体设置方法参见breakwa11的博客。使用此插件的服务器与客户机的UTC时间差不能超过24小时,即只需要年份日期正确即可,针对UDP部分也有加密及长度混淆。使用此插件建议加密使用none。此插件不能兼容原协议,支持服务端自定义参数,参数为10进制整数,表示最大客户端同时使用数,最小值支持直接设置为1,此插件能实时响应实际的客户端数量(你的客户端至少有一个连接没有断开才能保证你占用了一个客户端数,否则设置为1时其它客户端一连接别的就一定连不上)。

auth_chain_b(推荐):与auth_chain_a几乎一样,但TCP部分采用特定模式的数据包分布(模式由密码决定),使得看起来像一个实实在在的协议,使数据包分布分析和熵分析难以发挥作用。如果你感觉当前的模式可能被识别,那么你只要简单的更换密码就解决问题了。此协议为测试版本协议,不能兼容原协议

auth_chain_c(推荐):与auth_chain_b相比,尽力使得数据包长度分布归属到模式中,让包分布看起来更规整。但此版本与auth_chain_b相比对带宽有更多的浪费。

auth_chain_d(推荐):与auth_chain_c相比,在一定程度上增加了各种密码生成的模式的最大适用长度,这样就不需要在极端情况下再临时生成随机数,降低大包传输时的计算量,提高下载极限速度。

推荐使用auth_chain_*系列插件,在以上插件里混淆能力较高,而抗检测能力最高,即使多人使用也难以识别封锁。同时如果要发布公开代理,以上auth插件均可严格限制使用客户端数(要注意的是若为auth_sha1_v4_compatible,那么用户只要使用原协议就没有限制效果),而auth_chain_*协议的限制最为精确。

混淆特性

name RTT encode speed bandwidth anti replay attack cheat QoS anti analysis
plain 0 100% 100% No 0 /
http_simple 0 20%/100% 20%/100% No 90 70
http_post 0 20%/100% 20%/100% No 100 70
random_head (X) 1 100% 85%/100% No 0 10
tls1.2_ticket_auth 1 98% 75%/ 95% Yes 100 90

说明:

  • 20%/100%表示首包为20%,其余为100%速度(或带宽),其它的 RTT 大于0的混淆,前面的表示在浏览普通网页的情况下平均有效利用带宽的估计值,后一个表示去除握手响应以后的值,适用于大文件下载时。
  • RTT 表示此混淆是否会产生附加的延迟,1个RTT表示通讯数据一次来回所需要的时间。
  • RTT 不为0且没有 anti replay attack 能力的混淆,不论协议是什么,都存在被主动探测的风险,即不建议使用random_head。 RTT 为0的,只要协议不是 origin,就没有被主动探测的风险。当然由于原协议本身也存在被主动探测的风险,在目前没有观察到主动探测行为的情况下,暂时不需要太担心。
  • cheat QoS 表示欺骗路由器 QoS 的能力,100表示能完美欺骗,0表示没有任何作用,50分左右表示较为严格的路由能识别出来。
  • anti analysis 表示抗协议分析能力,plain 的时候依赖于协议,其它的基于网友反馈而给出的分值。值为100表示完美伪装。

协议特性

假设 method = “aes-256-cfb”
以下所有协议与均 anti CPA

name RTT encode speed bandwidth anti CCA anti replay attack anti MITM detect anti packet length analysis
origin 0 100% 99% No No No 0
verify_deflate 0 30% 97%~110% No No No 6
verify_sha1 (X) 0 85% 98%/99% No No No 0
auth_sha1 (X) 0 95% 97% No Yes No 4
auth_sha1_v2 (X) 0 94% 80%/97% No Yes No 10
auth_sha1_v4 0 90% 85%/98% No Yes No 10
auth_aes128_md5 0 80% 70%/98% Yes Yes Yes 10
auth_aes128_sha1 0 70% 70%/98% Yes Yes Yes 10
auth_chain_a 0 70% 75%/98% Yes Yes Yes 15
auth_chain_b 0 68% 70%/98% Yes Yes Yes 20
auth_chain_c 0 69% 70%/98% Yes Yes Yes 20
auth_chain_d 0 70% 70%/98% Yes Yes Yes 20

说明:

  • 以上为浏览普通网页(非下载非看视频)的平均测试结果,浏览不同的网页会有不同的偏差
  • encode speed仅用于提供相对速度的参考,不同环境下代码执行速度不同
  • verify_deflate的bandwidth(有效带宽)上限110%仅为估值,若数据经过压缩或加密,那么压缩效果会很差
  • verify_sha1的bandwidth意为上传平均有效带宽98%,下载99%
  • auth_aes128_md5的bandwidth在浏览普通网页时较低(为了较强的长度混淆,但单个数据包尺寸会保持在 TCP MSS 以内,所以其实对网速影响很小),而看视频或下载时有效数据比率比auth_sha1要高,可达97%,所以不用担心下载时的速度。auth_chain_a及auth_aes128_md5类似
  • 如果同时使用了其它的混淆插件,会令bandwidth的值降低,具体由所使用的混淆插件及所浏览的网页共同决定
  • 对于抗包长度分析一列,满分为100,即0为完全无效果,5以下为效果轻微,具体分析方法可参阅方校长等人论文
  • 对于抗包时序分析一列,方校长的论文表示虽然可利用,但利用难度大(也即他们还没能达到实用级),目前对此也不做处理

混淆与协议配置建议

  • 协议推荐:协议用auth_chain_*最佳,此时推荐不使用加密(设置为none),混淆随意
  • 加密选择:若协议用auth_chain_*,那加密用none(但不代表密码可以不写或两边不匹配),若协议不是auth_aes128_md5auth_aes128_sha1,那么不能使用rc4加密(可用rc4-md5)。这时加密可以在rc4-md5、salsa20、chacha20-ietf三个里面选择(rc4-md5可换为aes系列,salsa20可换为chacha20或bf-cfb),如果使用SSR还可特别选择rc4-md5-6。
  • 混淆推荐:如果QoS在你的地区明显,混淆建议在http_simpletls1.2_ticket_auth中选择,具体选择可以通过自己的试验得出。如果选择混淆后反而变慢,那么混淆请选择plain。如果你不在乎QoS,但担心你的个人vps能不能持久使用,那么混淆选择plaintls1.2_ticket_auth,协议选择auth_chain_*auth_aes128_*
  • 如果你用于玩游戏,或对连接延迟有要求的情况下,建议不要使用tls1.2_ticket_auth混淆,用其它混淆或plain
  • 服务端里,http_simplehttp_post是相互兼容的,没有使用上的区别
  • 如果你在公司,或学校,或某些环境下,发现原版SS协议不可用,建议你启用http_simplehttp_posttls1.2_ticket_auth混淆,同时端口相应使用80或443,通常能解决问题。同时能躲避你所在环境下的网络封锁(如禁止访问网盘禁止上传等等)
  • 如果使用tls1.2_ticket_auth混淆或不开启混淆,那么协议最好不要使用originverify_sha1
  • 如果使用二重代理,一般你只需要考虑越过防火墙的那一段使用混淆或加强协议,除非为了匿名
  • 如果你发现你的代理突然不能用了,但换一个端口又能用了,或者等15分钟到半小时后又能用了,这种情况下请联系我

配置方法

服务端配置:使用最新SSR的manyuser分支
user-config.json或config.json里有一个protocol的字段,目前的可能取值为:
origin
verify_deflate (不建议)
verify_sha1 (已过时)
verify_sha1_compatible (已过时)
auth_sha1 (已过时)
auth_sha1_compatible (已过时)
auth_sha1_v2 (已过时)
auth_sha1_v2_compatible (已过时)
auth_sha1_v4 (不建议)
auth_sha1_v4_compatible (不建议)
auth_aes128_md5
auth_aes128_sha1
auth_chain_a
auth_chain_b

user-config.json或config.json里有一个obfs的字段,目前的可能取值为:
plain
http_simple
http_simple_compatible
http_post
http_post_compatible
random_head (已过时)
random_head_compatible (已过时)
tls1.2_ticket_auth
tls1.2_ticket_auth_compatible

默认为
"protocol":"auth_aes128_md5",
"obfs":"tls1.2_ticket_auth_compatible",
相应的
协议插件参数默认为"protocol_param":""
混淆插件参数默认为"obfs_param":""
对于protocol,必须服务端与客户端严格匹配
服务端配置为xxabc_compatible时(以compatible为后缀的),即服务端支持使用原版客户端,或使用配置插件为xxabcplain的ssr客户端。

客户端配置:使用本ssr版本,在编辑服务器配置里找到相应节点,最后在protocol选项和obfs选项的列表里选择需要使用的插件,然后填写相应的参数即可

兼容性

目前ssr-libev客户端、ssr-python及ssr-csharp支持全部没有标注为过时或不推荐的协议和混淆。

实现接口

以下以C#语言为例做说明

interface IObfs

成员函数

InitData()
参数:无
返回:一个自定义类型变量,通常用于保存此接口的全局信息,不应返回null,c语言中返回void*
说明:第一次创建实例前调用,同一服务端配置不会重复调用,服务端在建立监听时调用,客户端在第一次连接时调用。

SetServerInfo(ServerInfo serverInfo)
参数:ServerInfo结构,包含成员变量:

  • host: 字符串类型,服务端ip,客户端需要把域名转换为ip,如有前置代理,则直接使用配置时所用的域名也可,服务端需要获取监听ip
  • port: 整数类型,服务端监听端口
  • param: 用户设置的参数,字符串类型
  • data: 由InitData返回的结果,为object类型(c语言中使用void*)
  • iv: 客户端或服务端加密时使用的iv数组(c语言中需要添加额外字段以记录其长度,下同)
  • recv_iv: 客户端或服务端接收到的iv数组
  • key: 加密时使用的key(不是原key,是通过BytesToKey生成的指定长度数组)
  • tcp_mss: 整数类型,TCP分包大小,设置为1460
  • overhead: 整数类型,协议头部大小,需要由调用方设置

返回:无
说明:实例构造的时候(每个连接建立时)调用,调用前iv和key必须已经初始化;而接收到数据后先初始化recv_iv再调用插件。

int GetOverhead() 参数:无
返回:此插件在通信时的附加头部大小

Dispose()
参数:无
返回:无
说明:实例析构时(每个连接关闭时)调用

byte[] ClientPreEncrypt(byte[] plaindata, int datalength, out int outlength)
参数:需要处理的字节数组及其长度
返回:处理后的字节数组及其长度
说明:客户端发送到服务端数据加密前调用此接口

byte[] ClientEncode(byte[] encryptdata, int datalength, out int outlength)
参数:需要编码的字节数组及其长度
返回:编码后的字节数组及其长度
说明:客户端发送到服务端数据加密后调用此接口

byte[] ClientDecode(byte[] encryptdata, int datalength, out int outlength, out bool needsendback)
参数:需要解码的字节数组及其长度
返回:解码后的字节数组及其长度,以及needsendback标记是否立即回发服务端数据。如needsendback为true,则会立即调用ClientEncode,调用时参数是一个长度为0的字节数组
说明:客户端收到服务端数据在解密前调用此接口

byte[] ClientPostDecrypt(byte[] plaindata, int datalength, out int outlength)
参数:需要处理的字节数组及其长度
返回:处理后的字节数组及其长度
说明:客户端收到服务端数据在解密后调用此接口

byte[] ServerPreEncrypt(byte[] plaindata, int datalength, out int outlength)
参数:需要处理的字节数组及其长度
返回:处理后的字节数组及其长度
说明:服务端发送到客户端数据加密前调用此接口

byte[] ServerEncode(byte[] encryptdata, int datalength, out int outlength)
参数:需要编码的字节数组及其长度
返回:编码后的字节数组及其长度
说明:服务端发送到客户端数据加密后调用此接口

byte[] ServerDecode(byte[] encryptdata, int datalength, out int outlength, out bool needdecrypt, out bool needsendback)
参数:需要解码的字节数组及其长度
返回:解码后的字节数组及其长度,以及needdecrypt标记数据是否需要解密(一般都应该为true),以及needsendback标记是否立即回发客户端数据。如needsendback为true,则会立即调用ServerEncode并发送其返回结果,调用时参数是一个长度为0的字节数组
说明:服务端收到客户端数据在解密前调用此接口

byte[] ServerPostDecrypt(byte[] plaindata, int datalength, out int outlength)
参数:需要处理的字节数组及其长度
返回:处理后的字节数组及其长度
说明:服务端收到客户端数据在解密后调用此接口

byte[] ClientUdpPreEncrypt(byte[] plaindata, int datalength, out int outlength)
参数:需要处理的字节数组及其长度
返回:处理后的字节数组及其长度
说明:客户端发送到服务端UDP数据加密前调用此接口

byte[] ClientUdpPostDecrypt(byte[] plaindata, int datalength, out int outlength)
参数:需要处理的字节数组及其长度
返回:处理后的字节数组及其长度
说明:客户端收到服务端UDP数据在解密后调用此接口

byte[] ServerUdpPreEncrypt(byte[] plaindata, int datalength, out int outlength)
参数:需要处理的字节数组及其长度
返回:处理后的字节数组及其长度
说明:服务端发送到客户端UDP数据加密前调用此接口

byte[] ServerUdpPostDecrypt(byte[] plaindata, int datalength, out int outlength)
参数:需要处理的字节数组及其长度
返回:处理后的字节数组及其长度
说明:服务端收到客户端UDP数据在解密后调用此接口

插件编写

有两类插件,一类是协议插件,一类是混淆插件

其中接口InitData, SetServerInfo, Dispose接口必须实现,其它的接口为通讯接口

编写协议插件的话,需要重写ClientPreEncrypt, ClientPostDecrypt, ServerPreEncrypt, ServerPostDecrypt,其它的按原样返回,needdecrypt必须为true,needsendback必须为false

编写混淆插件的话,需要重写ClientEncode, ClientDecode, ServerEncode, ServerDecode,其它的按原样返回。

如果编写的部分仅含客户端部分,那么只需要编写Client为前缀的两个接口,服务端同理。

目前支持此插件接口的,有 ShadowsocksR C# 和 ShadowsocksR Python

一个逗比写的逗比脚本ssr.sh

脚本特点:

目前网上的各个ShadowsocksR脚本基本都是只有 安装/启动/重启 等基础功能,对于小白来说还是不够简单方便。既然是一键脚本,那么就要尽可能地简单,小白更容易接受使用!

  • 支持 限制 用户速度
  • 支持 限制 端口设备数
  • 支持 显示 当前连接IP
  • 支持 显示 SS/SSR连接+二维码
  • 支持 切换管理 单/多端口
  • 支持 一键安装 锐速
  • 支持 一键安装 BBR
  • 支持 一键封禁 垃圾邮件(SMAP)/BT/PT

下载安装:

wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ssr.sh && chmod +x ssr.sh && bash ssr.sh

ss面板-ssrpanel-(一键脚本版)

ssr多用户安装脚本


wget -N --no-check-certificate https://raw.githubusercontent.com/FunctionClub/SSR-Bash-Python/master/install.sh && bash install.sh

安装完成后输入 ssr 回车即可使用
卸载脚本

wget -N --no-check-certificate https://raw.githubusercontent.com/FunctionClub/SSR-Bash-Python/master/uninstall.sh && bash uninstall.sh

修改版安装&更新

wget -q -N --no-check-certificate https://raw.githubusercontent.com/hotmop/SSR-duoyonghu/master/install.sh && bash install.sh

卸载

wget -q -N --no-check-certificate https://raw.githubusercontent.com/hotmop/SSR-duoyonghu/master/install.sh && bash install.sh uninstall

BT


yum install -y wget && wget -O install.sh http://download.bt.cn/install/install.sh && sh install.sh

改密
cd /www/server/panel && python tools.pyc panel

wget安装

yum -y install wget

BBR

wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh && chmod +x bbr.sh && ./bbr.sh

测试命令:

uname -r

SS-panel肥羊魔改清爽版


yum install screen wget -y &&screen -S ss 
wget -N --no-check-certificate https://raw.githubusercontent.com/mmmwhy/ss-panel-and-ss-py-mu/master/ss-panel-v3-mod.sh && chmod +x ss-panel-v3-mod.sh && bash ss-panel-v3-mod.sh

十一ssrpanel


一键脚本【仅支持Centos 7.x 64位系统】:

yum install screen wget -y &&screen -S ssrpanel
wget --no-check-certificate https://raw.githubusercontent.com/marisn2017/ssrpanel/master/ssrpanel.sh&&chmod +x ssrpanel.sh&&bash ssrpanel.sh

乱码请使用英文版脚本:

wget --no-check-certificate https://raw.githubusercontent.com/marisn2017/ssrpanel/master/ssrpanel_en.sh&&chmod +x ssrpanel_en.sh&&bash ssrpanel_en.sh

cd shadowsocksr

改user-config.json

vi user-config.json
vi usermysql.json

检查
python server.py
遇到加密方式libsodium not found问题

yum install wget m2crypto git libsodium -y
yum -y groupinstall "Development Tools"
wget https://github.com/jedisct1/libsodium/releases/download/1.0.16/libsodium-1.0.16.tar.gz
tar xf libsodium-1.0.16.tar.gz && cd libsodium-1.0.16
./configure && make -j2 && make install
echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.confldconfig

关于邮件配置:
修改/home/wwwroot/网站文件夹/config/mail.php文件,以阿里云邮件推送为例,修改以下几项配置
‘driver’ => ‘smtp’,

‘host’ => ‘smtpdm.aliyun.com’,

‘port’ => 465,

‘from’ => [

'address' => '阿里云邮件推送的发件地址',
'name' => '重置密码',

‘encryption’ => ‘ssl’,

‘username’ => ‘阿里云邮件的发件地址’, //也就是和上面那个一样

‘password’ => ‘阿里云邮件的smtp密码’,
其他的smtp邮件服务也是一样,host、port、邮件发送地址、密码改成相应的就行了。
改完了以后别忘了在网站后台的设置→系统设置中修改网站地址为你的网站地址

注意,
安装ssr后端的服务器,每次系统重启后需要重新启动ssr后端
代码如下

cd shadowsocksr
sudo sh logrun.sh

006UUDzMgy1fq9btyq84ng30m80gox6p.gif

宝塔ssrpanel


基于宝塔面板一键安装ssrpanel脚本。

前提条件:

1.安装宝塔面面板,PHP版本选择7.1,其他默认,使用Nginx环境。

2.新建站点,记住域名。

3.新建数据库,记住数据库用户和密码,(数据库名同用户名)。

4.运行下面的脚本:

wget https://coding.net/u/cvc/p/ssrpanel/git/raw/master/install.sh &&
bash install.sh

ss-panelmod魔改版


要求centos 7 x64

yum install screen wget -y &&screen -S ss 
wget -N --no-check-certificate https://raw.githubusercontent.com/mmmwhy/ss-panel-and-ss-py-mu/master/ss-panel-v3-mod.sh && chmod +x ss-panel-v3-mod.sh && bash ss-panel-v3-mod.sh

sspanel v3一键魔改ui版


wget -N --no-check-certificate https://raw.githubusercontent.com/echo-marisn/ss-panel-v3-mod_UIChanges-one-click-script/master/ss-panel-v3-mod_UIChanges-one-click-script.sh && chmod +x ss-panel-v3-mod_UIChanges-one-click-script.sh && bash ss-panel-v3-mod_UIChanges-one-click-script.sh

ss-panel v3一键脚本


yum install screen wget -y &&screen -S ss
wget -N --no-check-certificate https://raw.githubusercontent.com/mmmwhy/ss-panel-and-ss-py-mu/master/ss-panel_node.sh && chmod +x ss-panel_node.sh && bash ss-panel_node.sh

输入1安装即可

默认账号:91vps

默认密码:91vps

修改ssh端口
vi /etc/ssh/sshd_config
service sshd restart #重启生效
管理ssr
supervisorctl {start|stop|restart} ssr
修改mysql密码

wget http://soft.vpser.net/lnmp/ext/reset_mysql_root_password.sh
sh reset_mysql_root_password.sh

ssv3一键脚本


系统需要centos7.x版本.

wget 4ker.cc/s/ssv3.sh;bash ssv3.sh
此脚本后端可以更换为ssr后端,用于流控支持ssr,自行更换后端即可。

ss-panel v2 前后端一键安装脚本


仅支持CentOS 6+

wget --no-check-certificate https://raw.githubusercontent.com/echo-marisn/ssv2/master/v2.sh&&chmod +x v2.sh&&bash v2.sh

MS主题


https://github.com/izhangxm/ss-panel-v3-mod

MS一键


wget -N --no-check-certificate https://raw.githubusercontent.com/echo-marisn/ssrv3-one-click-script/master/v3-ms.sh && chmod +x v3-ms.sh && ./v3-ms.sh 2>&1 | tee v3-ms.log

原版带主题


wget -N --no-check-certificate https://raw.githubusercontent.com/echo-marisn/ssrv3-one-click-script/master/ssrv3.sh && chmod +x ssrv3.sh && ./ssrv3.sh 2>&1 | tee ssrv3.log

多协议多用户的v2ray管理面板(sprov-ui)

支持的功能

  • 系统运行状态监控
  • 多协议、多用户管理
  • 禁用、启用单个账号
  • 支持设置监听的 IP(多 IP 服务器下)
  • 流量统计(支持所有协议)

支持的 v2ray 协议

  • vmess(v2ray 特色)
  • shadowsocks(经典 ss)
  • mtproto(Telegram 专用)
  • dokodemo-door(端口转发)
  • socks(socks 4、socks 4a、socks 5)
  • http(http 代理)

支持的 vmess 传输配置

  • tcp
  • kcp + 伪装
  • ws + 伪装 + tls

一、sprov-ui安装&升级

推荐内存在256MB及以上的vps安装,在低内存的vps下可能运行不佳,你可以试试设置虚拟内存来缓解内存压力。

支持的系统,最好是纯净版的系统,在精简版的系统中可能会安装失败:

  • CentOS 7(推荐)
  • Ubuntu 16
  • Ubuntu 18
  • Debian 8
  • Debian 9

一键安装&升级命令

面板已内置升级功能,每 30 分钟从 Github 检测一次

wget -O install.sh -N --no-check-certificate https://blog.sprov.xyz/sprov-ui.sh && bash install.sh
wget -O install.sh -N --no-check-certificate https://github.com/sprov065/sprov-ui/raw/master/install.sh && bash install.sh

以上两条命令皆可,两者是一样的,只需要运行一个,如果其中一个有错误,可以运行另外一个。

使用以上一键命令安装sprov-ui,如果你已安装过,也可以使用上述命令进行升级到更新的版本。

稍等片刻,该脚本会安装Java环境、v2ray(如果已安装则会强制升级到最新版)、以及关闭防火墙,安装过程中会让你输入面板监听端口、登录用户名和密码,推荐自己定义,不使用默认的。

安装v2ray面板

手动安装&升级

由于系统的种类多,各个商家也可能会定制自己的Linux系统,我没办法照顾到所有的系统,所以一键脚本有可能会出现安装失败的情况,如果多次安装都失败了,请参照以下的手动安装教程。

安装Java环境与curl

此步若安装Java环境失败,请自行百度你的系统+安装Java 8,本软件需要Java 8(也称Java 1.8)及以上版本才能运行。

安装完成后,使用 /usr/bin/java -version 命令查看Java版本,确保是1.8版本及以上。

CentOS 7+

yum install java-1.8.0-openjdk curl -y

Ubuntu 16+ / Debian 8+

apt install default-jre curl -y

安装v2ray

已安装则会强制升级到最新版

bash <(curl -L -s https://install.direct/go.sh) -f

关闭防火墙

如果你会自己管理防火墙,可以按照自己的方式来。有些商家可能会在服务器外又设置一道防火墙,也需要关闭,具体每个商家管理方式都不一样,请自行解决。

CentOS 7+

systemctl stop firewalld systemctl disable firewalld

Ubuntu 16+

ufw disable

Debian 8+

iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT iptables -F

创建sprov-ui配置文件

请自行修改命令中的端口、用户名、密码,默认是80、sprov、blog.sprov.xyz

mkdir /etc/sprov-ui -p echo "port=80" > /etc/sprov-ui/sprov-ui.conf echo "username=sprov" >> /etc/sprov-ui/sprov-ui.conf echo "password=blog.sprov.xyz" >> /etc/sprov-ui/sprov-ui.conf

下载sprov-ui软件包

mkdir /usr/local/sprov-ui -p last_version=$(curl --silent "https://api.github.com/repos/sprov065/sprov-ui/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') wget -N --no-check-certificate -O /usr/local/sprov-ui/sprov-ui.jar https://github.com/sprov065/sprov-ui/releases/download/${last_version}/sprov-ui-${last_version}.jar

创建sprov-ui.service文件

直接一次性执行

echo "[Unit]" > /etc/systemd/system/sprov-ui.service echo "Description=sprov-ui Service" >> /etc/systemd/system/sprov-ui.service echo "After=network.target" >> /etc/systemd/system/sprov-ui.service echo "Wants=network.target" >> /etc/systemd/system/sprov-ui.service echo "" >> /etc/systemd/system/sprov-ui.service echo "[Service]" >> /etc/systemd/system/sprov-ui.service echo "Type=simple" >> /etc/systemd/system/sprov-ui.service java_cmd="/usr/bin/java" echo "ExecStart=${java_cmd} -jar /usr/local/sprov-ui/sprov-ui.jar" >> /etc/systemd/system/sprov-ui.service echo "" >> /etc/systemd/system/sprov-ui.service echo "[Install]" >> /etc/systemd/system/sprov-ui.service echo "WantedBy=multi-user.target" >> /etc/systemd/system/sprov-ui.service systemctl daemon-reload

至此,sprov-ui安装完毕。

手动升级

使用以下命令重新下载软件包就能升级了,升级完成后记得重启sprov-ui

last_version=$(curl --silent "https://api.github.com/repos/sprov065/sprov-ui/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') wget -N --no-check-certificate -O /usr/local/sprov-ui/sprov-ui.jar https://github.com/sprov065/sprov-ui/releases/download/${last_version}/sprov-ui-${last_version}.jar

安装谷歌bbr

参考这篇文章:谷歌bbr – tcp加速工具

二、sprov-ui使用

sprov-ui使用systemd来管理,以下是常用的命令,使用这些命令时,可能不会输出任何信息,也可能会输出一些信息,都是正常的。如果输出了错误信息,比如包含了error等字样,才代表出错了,需要排查错误。

systemctl start sprov-ui      # 启动sprov-ui systemctl restart sprov-ui    # 重启sprov-ui systemctl stop sprov-ui       # 关闭sprov-ui systemctl status sprov-ui     # 查看sprov-ui运行状态 systemctl enable sprov-ui     # sprov-ui开机启动 systemctl disable sprov-ui    # 取消sprov-ui开机启动

启动sprov-ui后,在浏览器地址栏中输入你的服务器IP加冒号端口号,切记是英文的冒号,不是中文的冒号,访问sprov-ui面板。

使用你设置的用户名和密码登录sprov-ui面板。

登录

登录后可以看到你的服务器的基本状态以及 v2ray 的运行状况。

此页面显示的是系统的状态,比如【已运行】表示的是服务器已运行的时间,而不是 v2ray 运行的时间。【网络】和【流量】显示的是服务器外网的网络速度和流量,如果你发现面板统计了内网的流量,请告知我你的系统版本和所有网卡名称,我将作出修正。

系统运行状态

账号列表可以看到你的 v2ray 账号,在这里你可以选择添加多个账号,或者删除、修改账号,添加、修改、删除账号之后记得点击【重启】来使配置生效。

【重置】是重置流量的功能,每个账号可单独重置流量,最上面的【重置】按钮可重置所有账号的流量。

账号列表

三、客户端使用

可以在这篇文章的第五章看起,包括Windows、macOS、安卓、iOS的教程。

四、常见问题

sprov-ui启动失败:Address already in use

这个问题是因为面板的监听端口被占用了,换个端口即可。

sprov-ui启动失败:port out of range:xxxx

面板监听的端口超出正常范围,正常范围是1-65535,换个端口即可。

vmess 协议的账号连不上,其它的账号都连得上,端口也是通的

这是因为你的服务器时间和本地时间相差过大,vmess 协议要求服务器的 UTC 时间和本地 UTC 时间相差不超过 90 秒,服务器与本地的时区不一样没关系,但是分钟数要相同,请自行修改服务器时间。

所有账号都连不上,或者刚刚添加/修改的账号连不上

添加、删除、修改账号之后都需要重启 v2ray 才会生效新的配置,点击网页上的【重启】按钮即可,不是【重启面板】。还有确保你的端口是通的,防火墙都放行了。

开启 v2ray api 失败:xxxx

这个错误的原因一般就是你的 v2ray 配置文件格式过老了,v2ray 的 v4.1 版本开始启用了新的配置文件格式,本面板只支持 v4.1 版本之后的配置文件。

通用解决方法:

  • 先备份好你的 v2ray 节点信息
  • 删除 /etc/v2ray/config.json 文件
  • 重新使用此命令安装 v2ray:bash <(curl -L -s https://install.direct/go.sh) -f
  • 重启面板

五、高级操作

使用域名

首先你需要一个域名,并将域名解析到你 vps 的 IP,直接使用域名加端口号登录面板即可,无需其它配置。

sprov-ui 面板配置文件

面板配置文件在 /etc/sprov-ui/ 文件夹下,包含两个文件,一个是 sprov-ui.conf,一个是 v2ray-extra-config.json。

sprov-ui.conf

port=80

username=sprov

password=blog.sprov.xyz

此文件配置了 sprov-ui 的端口、用户名、密码,可以随意修改,留空则使用默认配置。配置错误会导致面板启动失败,例如:port=111111(非法端口号)。

v2ray-extra-config.json

{

    "disabled-inbounds": [],

    "inbounds": []

}

此文件为 v2ray 配置文件的扩展,为一个 json 文件,包含两个属性:inbounds、disabled-inbounds。

inbounds 为一个数组,包含若干个 inbound,主要记录流量数据,每个 inbound 的格式如下:

{

    "tag": "",      // tag 标识,不能为空

    "downlink": 0,  // 下行流量,单位 Byte

    "uplink: 0      // 上行流量,单位 Byte

}

disabled-inbounds 为一个数组,包含若干个 inbound,记录被禁用的 inbound,每个 inbound 都是一个完整的 v2ray inbound,并且还包含流量数据。

面板服务器迁移

面板的服务器迁移很简单,首先需要备份面板配置文件和 v2ray 配置文件,分别是:/etc/sprov-ui/ 文件夹下所有文件,/etc/v2ray/config.json,如何备份请自行解决。

然后在新服务器上重新安装面板,之前备份的文件覆盖掉现有的,最后启动或重启面板即可。

六、总结

以上就是我花了几天来开发的 v2ray 面板,名字叫 sprov-ui,如果你在使用中遇到了问题,或者你有更多的建议,推荐加入 Telegram 群组讨论,也可以在下方评论,或者在 Github 提 issue。

问问题前请先在评论区和 Github 查看别人是否与你遇到了同样的问题,如果尝试了所有解决方案仍然不行,那么请仔细描述你所遇到的问题,将你的系统版本(CentOS 7 ?Ubuntu 16 ?)、sprov-ui 的状态信息、v2ray 的状态信息等等所有相关的信息发上来,不要太多,选取重要的即可,不要就说一句“不行”、“不可以”、“没反应”,这样叫我怎么解决呢。

提问格式,根据具体问题,可适当去除不相关的内容:

  • 简短描述所遇到的问题:
  • 使用的系统:
  • sprov-ui 状态信息:
  • v2ray 状态信息:
  • v2ray 配置内容(cat /etc/v2ray/config.json):
  • 使用的浏览器:

感谢你的使用。

V2Ray 的工作机制

这篇文章是解释 V2Ray 的工作机制,推荐各位新手朋友仔细阅读一下。了解V2ray的工作原理,有利于你更好的使用这个工具。

V2Ray 单服务器模式

V2ray和其它的网络代理工具一样,你需要在一台配置了 V2Ray 的服务器,然后在自己的设备上安装 V2Ray 客户端,然后即可流畅地访问互联网。

一个 V2Ray 服务器可同时支持多台设备,使用不同的代理协议访问。同时,经过合理的配置,V2Ray 可以识别并区分需要代理和不需要代理的流量,直连的流量不需要绕路。

V2Ray 桥接模式

如果你不想在每一台设备上都配置路由,你也可以设置一台中转服务器,用于接收客户端发来的所有流量,然后在服务器中进行转发判断。

V2Ray 工作原理

在配置 V2Ray 之前,不妨先来看一下 V2Ray 的工作原理,以下是单个 V2Ray 进程的内部结构示意图。多个 V2Ray 之间互相独立,互不影响。

  1. 需要配置至少一个传入协议(Inbound)和一个传出协议(Outbound)才可以正常工作。协议列表(V2Ray 支持以下协议: Blackhole、Dokodemo-door、Freedom、HTTP、Shadowsocks、Socks、VMess)
  2. 传入协议通常可以配置用户认证,如 ID 和密码等;
  3. 传入协议收到数据之后,会交给分发器(Dispatcher)进行分发;
  4. 传入协议负责与客户端(如浏览器)通信:
  5. 传出协议负责将数据发给服务器,如另一台主机上的 V2Ray。
  6. 当有多个传出协议时,可以配置路由(Routing)来指定某一类流量由某一个传出协议发出。
  7. 路由会在必要时查询 DNS 以获取更多信息来进行判断。

nginx 模块讲解

1. 通用配置选项:

–prefix= 指定Nginx的安装路径,所有其他的路径都要依赖于该选项

–sbin-path= 指定Nginx二进制文件的路径。如果没有指定,那么这个路径将依赖于–prefix选项

–conf-path= 指定Nginx的配置文件的路径,如果在命令行没有指定配置文件,那么将会通过这里指定路径。

–error-log-path= 指定错误日志文件路径,Nginx将会往里面写入错误日志文件,除非有其它的配置。

–pid-path= 指定的Nginx master进程的PID文件位置,通常在/var/run下

–lock-path= 共享存储器互斥锁文件的路径

–user= worker进程运行的用户

–group= worker进程运行的组

–with-file-aio. 为FreeBSD4.3 +和linux 2.6.22 +系统启用异步I/O

–with-debug 这个选项用于启用调试日志,在生产环境的系统中不推荐使用

2. 邮件代理的配置选项:

–with-mail 该选项用于启用Mail模块,该模块默认没有被激活

–with-mail_ssl_module 为了代理任何一种类型的使用SSL/TLS的Mail,激活该模块

–without-mail_pop3_module 在启用Mail模块后,单独地禁用pop3模块

–without-mail_imap_module 再启用mail模块后,单独地禁用IMAP模块

–without-mail_smtp_module 在启用mail模块后,单独地禁用smtp模块

–without–http 该选项将完全禁用http模块,如果你只想支持

3. 指定路径的配置选项:

–without-http_perl_module Nginx配置能够使用扩展使用Perl代码,这个选项启用这个模块(此模块会降低性能)

–without-perl_module_path= 对于额外嵌入的Perl模块,使用该选项指定该Perl解析器的路径,也可以通过配置选项来指定Perl模块解析器的位置

–without—perl= 如果在默认路径中没有找到Perl,那么指定Perl的路径

–http-log-path= Http访问日志的默认路径

–http-client-body-temp-path= 从客户端收到请求后,该选项设置的目录用于作为请求体临时存放的目录。如果WebDAV模块启用,那么推荐设置该路径为同一文件系统上的目录作为最终的目的地

–http-proxy-temp-path= 在使用代理后,通过该选项设置存放临时文件路径

–http-fastcgi-temp-path= 设置FastCGI临时文件的目录

–http-uwsgi-temp-path= 设置uWSGI临时文件的目录

–http-scgi-temp-path= 设置SCGI临时文件的目录

4. 各种模块配置选项:

–with-http_ssl_module 如果需要对流量进行加密,可以使用该选项,在URLs中开始部分将会是https(需要OpenSSL库)

–with-http_realip_module 如果你的Nginx在七层负载均衡器或者是其他设备之后,它们将http头中的客户端IP地址传递,那么你将会需要启用这个模块。在多个客户处于一个IP地址的情况下使用

–with-http_addition_module 这个模块作为输出过滤器,使你能够在请求经过一个location前或者后时在该location本身添加内容

–with-http_xslt_module 该模块用于处理XML响应转换,基于一个或者多个XSLT格式(需要libxml2和libxslt库)

–with-http_image_filter_module 该模块被作为图像过滤器使用,在将图形投递到客户之前进行处理(需要libgd库)

–with-http_geoip_module 使用该模块,能够设置各种变量以便在配置文件中区段使用,基于地理位置查找客户端IP地址(需要MaxMfind GeoIP库和相应的预编译数据库文件)

–with-http_sub_module 该模块实现了替代过滤,在响应中用一个字符串替代另一个字符串

–with-http_dav_module 启用这个模块将激活使用WebDAV的配置指令。注意:这个模块也只在有需要使用的基础上启用,如果配置不正确,它将带来安全问题。

–with-http_flv_module 如果需要提供Flash流媒体视频文件,那么该模块将会提供伪流媒体

–with-http_mp4_module 这个模块支持H.264/AAC文件伪流媒体

–with-http_gzip_module 当被调用的资源没有.gz结尾格式的文件时,如果想支持发送预压缩版本的静态文件,那么使用该模块

–with-http_gunzio_module 对应不支持gzip编码的客户,该模块用于为客户解压缩预压缩内容

–with-http_random_index_module 如果你想提供从一个目录中随机选择文件的索引文件,那么这个模块需要被激活

–with-http_secure_link_module 该模块提供了一个机制,它会将一个哈希值链接到一个URL中,因此,只有那些使用正确的密码能够计算链接

–with-http_stub_status_module 启用这个模块后会收集Nginx自身的状态信息。输出的状态信息可以使用RRDtool或类似的东西来绘制成图

FastAdmin – 基于ThinkPHP5和Bootstrap的极速后台开发框架

介绍

FastAdmin是一款基于ThinkPHP5+Bootstrap的极速后台开发框架。

主要特性

  • 基于Auth验证的权限管理系统
    • 支持无限级父子级权限继承,父级的管理员可任意增删改子级管理员及权限设置
    • 支持单管理员多角色
    • 支持管理子级数据或个人数据
  • 强大的一键生成功能
    • 一键生成CRUD,包括控制器、模型、视图、JS、语言包、菜单等
    • 一键压缩打包JS和CSS文件,一键CDN静态资源部署
    • 一键生成控制器菜单和规则
    • 一键生成API接口文档
  • 完善的前端功能组件开发
    • 基于AdminLTE二次开发
    • 基于Bootstrap开发,自适应手机、平板、PC
    • 基于RequireJS进行JS模块管理,按需加载
    • 基于Less进行样式开发
    • 基于Bower进行前端组件包管理
  • 强大的插件扩展功能,在线安装卸载升级插件
  • 通用的会员模块和API模块
  • 共用同一账号体系的Web端会员中心权限验证和API接口会员权限验证
  • 二级域名部署支持,同时域名支持绑定到插件
  • 多语言支持,服务端及客户端支持
  • 强大的第三方模块支持(CMS博客文档生成)
  • 整合第三方短信接口(阿里云、腾讯云短信)
  • 无缝整合第三方云存储(七牛、阿里云OSS、又拍云)功能
  • 第三方富文本编辑器支持(Summernote、Tinymce、百度编辑器)
  • 第三方登录(QQ、微信、微博)整合
  • Ucenter整合第三方应用

安装使用

https://doc.fastadmin.net

在线演示

https://demo.fastadmin.net

用户名:admin

密 码:123456

提 示:演示站数据无法进行修改,请下载源码安装体验全部功能

界面截图

控制台

问题反馈

在使用中有任何问题,请使用以下联系方式联系我们

交流社区: https://forum.fastadmin.net

QQ群: 636393962(满) 708784003(满) 964776039(3群)

Email: (karsonzhang#163.com, 把#换成@)

Github: https://github.com/karsonzhang/fastadmin

Gitee: https://gitee.com/karson/fastadmin

特别鸣谢

感谢以下的项目,排名不分先后

ThinkPHP:http://www.thinkphp.cn

AdminLTE:https://adminlte.io

Bootstrap:http://getbootstrap.com

jQuery:http://jquery.com

Bootstrap-table:https://github.com/wenzhixin/bootstrap-table

Nice-validator: https://validator.niceue.com

SelectPage: https://github.com/TerryZ/SelectPage

版权信息

FastAdmin遵循Apache2开源协议发布,并提供免费使用。

本项目包含的第三方源码和二进制文件之版权信息另行标注。

版权所有Copyright © 2017-2018 by FastAdmin (https://www.fastadmin.net)

All rights reserved。

Zcurd与Eova对比

都没实际项目用过,Zcurd读过源码,Eova读过文章,个人感觉几点差别:

1、界面
Eova界面做的不够精细。Zcurd更漂亮些,能看出作者更用心,更注重细节。

2、模式
快速开发一般有两种模式,一是引擎模式,就是按正常开发时的代码,向上抽取一层,实现动态化。 另一种是生成代码模式,根据一定配置,生成正常开发时的代码,基本功能都有了,可以手动上加上一些个性功能。

Eova采用的是引擎模式。Zcurd两种模式都支持,可以先用引擎模式,当不能满足业务要求时,生成出来手动改。这个设计确实化了不少心思。Eova虽说只有引擎模式,但支持的更多,单表、一对多表、树表等。

Eova有个比较好的设计,将动态设计分为 控件、组件、业务三层,组件由控件组装成,业务由组件构成,每层均可自由定制。理论上每种控件,每种组件,每种业务只实现一次,后续直接复用。这种设计比较好,是文档上说的,实际源码没看过。

3、学习成本
好像Zcurd更简单些,因为简单,所以简单。

体验地址
http://zcurddemo.duapp.com/login
git: https://git.oschina.net/515097842/zcurd

本观点出自zcurd技术交流1群。

TTL和DNS TTL的区别

什么是TTL?

  TTL是IP协议包中的一个值,指定数据报被路由器丢弃之前允许通过的网段数量。

在很多情况下数据包在一定时间内不能被传递到目的地。解决方法就是在一段时间后丢弃这个包,然后给发送者一个报文,由发送者决定是否要重发。TTL是由发送主机设置的,以防止数据包不断在IP互联网络上永不终止地循环。转发IP数据包时,要求路由器至少将TTL减小1。当记数到0时,路由器决定丢弃该包,并发送一个ICMP报文给最初的发送者。

TTL值帮助我们大致的识别主机的操作系统类型:

UNIX及类UNIX操作系统ICMP回显应答的TTL字段值为255

Compaq Tru64 5.0 ICMP回显应答的TTL字段值为64

微软Windows NT/2K操作系统ICMP回显应答的TTL字段值为128

微软Windows 95操作系统ICMP回显应答的TTL字段值为32

特殊情况:

Linux Kernel 2.2.x&2.4.x ICMP回显应答的TTL字段值为64

FreeBSD 4.1,4.0,3.4;

Sun Solaris 2.5.1,2.6,2.7,2.8;

OpenBSD 2.6,2.7,

NetBSD

HP UX 10.20

ICMP回显应答的TTL字段值为255

Windows 95/98/98SE

Windows ME

ICMP回显应答的TTL字段值为32

Windows NT4 WRKS

Windows NT4 Server

Windows 2000

Windows XP

ICMP回显应答的TTL字段值为128

 

什么是DNS TTL值?

TTL(Time-To-Live),简单的说它表示一条域名解析记录在DNS服务器上缓存时间.当各地的DNS服务器接受到解析请求时,就会向域名指定的DNS服务器发出解析请求从而获得解析记录;在获得这个记录之后,记录会在DNS服务器中保存一段时间,这段时间内如果再接到这个域名的解析请求,DNS服务器将不再向DNS服务器发出请求,而是直接返回刚才获得的记录;而这个记录在DNS服务器上保留的时间,就是TTL值。

合理设置域名TTL值:

1、增大TTL值,以节约域名解析时间

通常情况下域名解析记录是很少更改的。我们可以通过增大域名记录的TTL值让记录在各地DNS服务器中缓存的时间加长,这样在更长的时间段内,我们访问这个网站时,本地ISP的DNS服务器就不需要向域名的NS服务器发出解析请求,而直接从本地缓存中返回域名解析记录。

TTL值是以秒为单位的,通常的默认值都是3600,也就是默认缓存1小时。我们可以根据实际需要把TTL值扩大,例如要缓存一天就设置成86400。

2、减小TTL值,减少更换空间时的不可访问时间

更换域名空间时会对DNS记录进行修改,因为DNS记录缓存的问题,新的域名记录在有的地方可能生效了,但在有的地方可能等上一两天甚至更久才生效,只就导致有部分用户在一段时间内无法不可访问网站了。

  1.   为了尽可能的减小这个各地的解析时间差,合理的做法是:
  2.   先查看域名当前的TTL值。
  3.   修改TTL值为可设定的最小值,建议为60秒。
  4.   等待一天,保证各地的DNS服务器缓存都过期并更新了记录。
  5.   设置修改DNS解析到新的记录,这个时候各地的DNS就能以最快的速度更新到新的记录。
  6.   确认各地的DNS已经更新完成后,再TTL值设置成常用的值(如:TTL=86400)。

在电脑运行中,当你PING一个IP时,会出现一些数据,那么TTL=114代表什么意思?

  1.   TTL是一个ip协议的值,它告诉网络,数据包在网络中的时间是否太长而应被丢弃。有很多原因使包在一定时间内不能被传递到目的地。
  2.   TTL的初值通常是系统缺省值,是包头中的8位的域。TTL的最初设想是确定一个时间范围,超过此时间就把包丢弃。由于每个路由器都至少要把TTL域减一,TTL通常表示包在被丢弃前最多能经过的路由器个数。当记数到0时,路由器决定丢弃该包,并发送一个ICMP报文给最初的发送者。
  3.   不同操作系统的ttl初始值是不同的,Linux系统的TTL值为64或255,Windows NT/2000/XP系统的默认TTL值为128,Win7系统的TTL值是64,Windows 98系统的TTL值为32,UNIX主机的TTL值为255。
  4.   因此如果用户主机是win2000系统,用128-114=14,表示用户主机达到目标主机经过了14个路由器节点。

锐速&BBR究竟哪家强?

我以前也有想过这个问题,但是秉承着哪个容易安装我就选哪个的原则,基本上用的都是BBR,因为锐速对内核限制的很死……还有就是家庭网络下是否有必要在个人PC上使用锐速……

实验一:所以说到底哪家强

由于手里并没有太多的可以随便开的机子,而且测试实际上工作量挺大的,所以这次实验变量只设计了两个,并且样本数就一个(。

变量

网络优化

什么都不装

锐速

BBR

BBR魔改

相对于国内的网络环境

Vultr日本(低延迟低丢包)

Digital Ocean新加坡(高延迟高丢包)

测试方法

秉承着怎么方便怎么来的做法,我在CentOS 6.9系统下进行什么都不装和锐速的网络测试,在Ubuntu 16.04下进行BBR和BBR魔改的网络测试

网络测试有两部分:

1,使用ZBench-CN.sh进行测试

2,在深圳天威联通100M网络环境下进行H5网页测速

用到的代码:

  #CentOS 6.9锐速

  wget--no-check-certificate-O appex.sh https://raw.githubusercontent.com/0oVicero0/serverSpeeder_Install/master/appex.sh&&chmod+x appex.sh&&bash appex.sh install'2.6.32-642.el6.x86_64'

  #Ubuntu/Debian BBR

  wget--no-check-certificate-qO'BBR.sh''https://moeclub.org/attachment/LinuxShell/BBR.sh'&&chmod a+x BBR.sh&&bash BBR.sh-f

  #Ubuntu/Debian BBR魔改

  wget--no-check-certificate-qO'BBR_POWERED.sh''https://moeclub.org/attachment/LinuxShell/BBR_POWERED.sh'&&chmod a+x BBR_POWERED.sh&&bash BBR_POWERED.sh

  #ZBench-CN.sh测速脚本

  wget https://raw.githubusercontent.com/FunctionClub/ZBench/master/ZBench-CN.sh&&bash ZBench-CN.sh

  #Docker一键安装脚本

  wget-qO-https://get.docker.com/|sh

  #H5网页测速Docker

  docker run-d-p 2333:80 ilemonrain/html5-speedtest:latest

测试结果

Vultr 日本(低延迟低丢包)
H5网页测速

  • 什么都不装
  • 锐速
  • BBR
  • BBR魔改

测速脚本

  • 什么都不装
  • 锐速
  • BBR
  • BBR魔改

Digital Ocean 新加坡(高延迟高丢包)

H5网页测速

  • 什么都不装
  • 锐速
  • BBR
  • BBR魔改

测速脚本

  • 什么都不装
  • 锐速
  • BBR
  • BBR魔改

结果分析

在测试过程中,我发现使用测试脚本得到的结果和实际想象偏差很大,而且就算在同样条件下测试两次得到的数据也有可能会有很大偏差,我觉得这可能是因为测速服务器在同时被多人通过脚本使用,因此无法独占测试出准确的结果

而H5测速是很直观的,能找到拥塞控制下达到的最大稳定速度,而单纯的脚本测速可能会因为测速文件不够大、拥塞控制慢开始过程太长并且测速是通过计算平均速度而导致最终结果不一定准确,所以我觉得还是从家庭宽带进行H5测速比较靠谱

然而这样样本数就很单一了(

可以推测:

1,这三种加速对高延迟高丢包的网络有极大的改善效果

2,BBR魔改确实比BBR的效果要好(魔改实际上是调整了原版BBR的配置参数)

在我目前所处的网络环境下,可以推测:

1,BBR魔改的效果要比锐速稍好

2,在低延迟低丢包的情况下,使用这三种网络优化手段可能反而会导致网络性能下降,但是下降并不明显

当然,并不是说测了下发现低延迟低丢包就不应该上加速,因为从国内到国外始终是无法避免网络高峰期出口拥堵的情况的,国外的机子推荐能上还是上了

总结,推荐还是上BBR魔改

无论是从体感角度和便利程度上考虑,我都觉得BBR魔改要优于锐速,并且锐速并不能用于OVZ,但是BBR可以

后话

我后来又尝试了在 Windows 服务器上装锐速与不装的区别

nazwa 的波兰服务器,往 Google 盘传文件,不装锐速是5MB/s,装锐速是18.5MB/s

相信这个结果十分明显了

实验二:个人PC有必要上锐速吗

锐速有Windows版,我只在国外Windows机子上用过,效果相当可以,但是并不知道如果在家庭网络环境下使用效果如何

测试方法

因为是在实验一之前临时想到的,所以并没有事先准备,直接让朋友用 nazwa 的波兰机子(高延迟低丢包)搭建了H5测速平台

仍然是在深圳天威联通100M网络环境下测速

测试结果

个人PC直连

个人PC装锐速并开启入向流量加速

结果分析

看到测试结果的时候我也是一脸懵逼的
我原来以为应该至少会有一点加速效果,然而事实上是速度反而慢了很多

接着我关掉了锐速,重新进行测试

确实,网速又回到了正常水平

但是我也有听朋友说他那里的网络下,开锐速访问日本VPS的速度会有很大提升

我猜测,在家用网络环境下使用锐速,效果应该和运营商、线路、目的地有关系,并且入向流量加速需要占用一点上传宽带,也有可能是天威上传宽带太小(3Mbps)的原因

因此并不能断定家用网络环境下使用锐速是好或者不好的,具体情况应该根据自己测试决定