关于社区禁止发布 VPN 搭建等内容的公告

即日起,众所周知的原因,SegmentFault 社区将禁止发布 VPN 类交易、搭建、推广的相关内容,一些技术探讨类的内容是被允许的。希望社区用户能理解,一起为中文开发者社区创造一个良好的技术交流环境。随着 SegmentFault 社区在中文开发者社区得到越来越多的关注,很多厂商也会选择在 SF 社区建立官方账号,发布技术内容,我是非常欢迎和鼓励互联网技术团队入驻 SF 社区发布有价值的技术内容的。同时有个别厂商,也恶意的发布和滥用社区,发布各种骚扰式的推广内容,近期我们也已经删除和封禁了上百个账号,此处居多的是很多技术培训机构。我们不反对在 SF 社区推广你们的产品和品牌,但是不要滥用社区,你不尊重这里的规则,不把这里当回事,别人也不会尊重你。如果你想在社区推广自己的品牌,请根据社区规范建立你的账号,发布有价值的技术内容;你也可以联系官方投放社区广告,推荐你们的服务和产品。官方的精力有限,有很多恶意内容未必能第一时间发掘,也欢迎广大用户积极的举报违规内容,我们收到后会第一时间进行处理,一起努力营造良好的技术交流环境。

February 27, 2019 · 1 min · jiezi

Vultr 教程目录

本节我们为大家介绍Vultr各方面教程,这些教程均为Vultr中文网原创教程。让您可以在20分钟内完成购买、配置服务器、搭建WordPress博客程序。一起来看吧! 手把手 图文购买教程 通过SSH管理服务器 1分钟快速搭建55 3分钟快速安装宝塔面板 5分钟快速搭建WordPress博客

February 26, 2019 · 1 min · jiezi

构建Potatso问题集锦及解决方案

转载请注明文章出处:https://tlanyan.me/build-pota…前言半年前写过一篇构建自用Shadowsocks客户端Potatso的教程“构建自己的iOS网络代理客户端”。当时除libYAML依赖下载不正常外,编译测试使用全过程都很顺利。文章投递到几个平台被数万网友围观,不少网友根据教程在构建时遇到各种问题。最初我以为是网友看教程不仔细或构建环境差异造成,没多注意。后来陆续有网友加我QQ,让我怀疑写完文章后代码有了重大更新。终于在昨天(除夕)抽出时间,用最新版的代码构建Potatso并安装到我最新版iOS系统的iPad上。这个过程花费了几个小时,覆盖了许多网友咨询我的问题,本文中将一一给出解决方案。如果你的Xcode版本是9.4.1,使用commitID为318a5e1的代码,根据“构建自己的iOS网络代理客户端”中的教程可以顺利的编译和安装Potatso到iOS12系统以下的设备。如果你的设备升级到了最新版,或者遇到其他问题,请继续阅读本文。为什么执着于构建自用Shadowsocks客户端?由于iOS生态的封闭性,正常情况下只能通过App Store下载应用。应用下架后,会导致手机重置、购买买新设备后无法安装。安卓、Windows、MacOS则不会有这个问题,只要安装文件存在,总是有得用。所以针对iOS设备构建自用的客户端很有必要,尤其是SS这类随时有可能下架的应用。本文构建Potatso客户端最终得工程文件以及生成的ipa包已上传到百度云盘:https://pan.baidu.com/s/1twyM…如果构建过程中遇到本文列出以外的问题,欢迎留言或加Q群688196496。构建步骤这节简要回顾构建Potatso的流程:1. 安装Cocospods如果已安装,请略过此步。更新系统的gem版本:打开终端,输入:sudo gem update –system;设置国内gem源:gem sources –list输出为https://gems.ruby-china.org/请略过此步;否则先删除官方源再添加gems国内源:gem sources –remove https://rubygems.org/; gem sources –add https://gems.ruby-china.org/;安装Cocospods:sudo gem install cocoapods。2. 构建Potatso构建Potatso的步骤如下:克隆代码:git clone https://github.com/haxpor/Potatso.git;更新子模块:cd Potatso; git submodule update –init;安装依赖:打开Podfile,将第一行改成:source ‘https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git'(使用清华的CocoaPods源),然后运行pod install –verbose;使用XCode打开Potatso.xcworkspace;更改Potatso及PacketTunnel、TodayWidget两个子项目的Bundle ID,例如本人分别改成:potatso.tlanyan.me、potatso.tlanyan.me.PacketTunnel和potatso.tlanyan.me.TodayWidget;更改Potatso及PacketTunnel、TodayWidget两个子项目Capabilities中的App Group和Keychain Sharing的Group:在"App Groups"中删除原有的group.io.wasin.potatso,新增自己的group,例如:“group.potatso.tlanyan.me”;在"Keychain Sharing"中输入自己的group ID;打开"PotatsoBase/Potatso.m"文件,将shareGroupIdentifier函数的返回值改成自己的group id;将iPhone等iOS设备连接到电脑,目标选择新接入的设备,点击左上角的“build and run”按钮,Xcode会编译并安装App到设备上,然后启动。可能遇到的问题昨天几个小时的折腾,遇到的十来个问题。下文将一一列出,并给出解决方案。构建过程中你可能会遇到不止一个错误,请根据错误信息按Ctrl + F在本文查找。如果遇到其他问题,欢迎留言或加Q群688196496。1. the sandbox is not in sync with the Podfile.lock. Run ‘pod install’ or update your CocosPods installation.问题截图:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“842” height=“206” class=“aligncenter size-full wp-image-3193” />原因: pod依赖未安装解决办法: 安装依赖,执行命令:pod install –verbose2. url: (7) Failed to connect to pyyaml.org port 80: Connection refused错误描述: 执行pod install,前面一切顺利,到libYAML会出现问题:Installing LibYAML (0.1.4)[!] Error installing LibYAML[!] /usr/bin/curl -f -L -o /var/folders/dj/ljst94xx47l7fn3wz4q9bwsw0000gn/T/d20180822-4467-1cotycr/file.tgz http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz –create-dirs –netrc-optional –retry 2 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 –:–:– –:–:– –:–:– 0 curl: (7) Failed to connect to pyyaml.org port 80: Connection refused原因: libYAML的官网关闭了80端口访问解决办法: 编辑" /Users/你的用户名/.cocoapods/repos/master/Specs/5/b/9/LibYAML/0.1.4/LibYAML.podspec.json"文件,将"http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz"改成“https://pyyaml.org/download/l…”备注: 此解决方案来自貌似LibYAML官方人员的回复,亲测可以。当然可以使用前文“构建自己的iOS网络代理客户端”中所说的网络劫持方法。3. Diff:/Podfile.lock: No such file or directory使用新版代码并安装好依赖后,这应该是构建过程中最先出现的问题。问题截图:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“854” height=“246” class=“aligncenter size-full wp-image-3192” />原因:根据错误描述跟踪脚本执行流程,发现是执行预构建脚本时SRCROOT环境变量的值无法获取(或被错误置为空)导致。解决方案: 尝试过更改构建时生成的临时脚本文件、注入全局环境变量等,这些方法均不凑效。后来通过diff发现脚本由文件Potatso.xcodeproj/project.pbxproj文件中的配置生成,该文件在pod install后被修改。解决办法很简单:还原更改。执行完pod install命令后,执行git checkout Potatso.xcodeproj/project.pbxproj,问题解决。4. No podspec found for CallbackURLKit in ./Library/CallbackURLKit问题截图:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“665” height=“93” class=“aligncenter size-large wp-image-3194” />原因: 子模块的代码未下载解决方案: 初始化子模块代码,执行命令:git submodule update –init5. The operation couldn’t be completed. Unable to log in with account ‘xxxx’. The login details for account ‘xxxx’ / No profiles for ‘xxxx’ were found: Xcode couldn’t find any iOS App Development provisioning profiles matching ‘xxx’ / Code signing is required for product type…问题截图:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“855” height=“221” class=“aligncenter size-full wp-image-3195” />原因: Apple ID过期未续费解决方案: Apple ID续费或换其他可用的ID6. No account for team ‘xxx’. Add a new account in the Accounts preference pane or verify that your accounts have valid…错误信息基本与上一条相同,只是账号换成了team ID。问题截图:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“878” height=“214” class=“aligncenter size-full wp-image-3198” />原因: team ID不在已添加的账号内解决方案: 在属性页面的Team中选择自己的账号7. Your account does not have sufficient permissions to modify containers. / No profiles for ‘xxxx’ were found问题截图:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“380” height=“149” class=“aligncenter size-full wp-image-3196” />原因: 该Bundle ID已经被其他Apple ID使用解决方案: 换一个新的8. An Application Group with Identifier ‘xxxx’ is not available. Please enter a different string.问题截图:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“493” height=“197” class=“aligncenter size-full wp-image-3197” />原因: Group ID已经被其他Apple ID使用解决方案: 用一个新的9. Module ‘Crashlytics’ not found这个错误未截图。原因: Podfile文件里没有加这个库解决方案: 打开Podfile,在def library中添加一行:pod ‘Crashlytics’, ‘> 3.10.7’,然后执行pod install –verbose。备注: 该解决方案参考Github的issue: https://github.com/haxpor/Pot…。注意pod安装依赖后,会更改Potatso.xcodeproj/project.pbxproj文件,直接编译会出现第二个问题。正确操作应当如下:先备份Potatso.xcodeproj/project.pbxproj文件,然后执行pod install –verbose,成功后将文件覆盖。后续出现pod依赖更新的情况也应该按此步骤操作。10. Could not locate device support files问题截图:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“412” height=“148” class=“aligncenter size-full wp-image-3199” />原因: Xcode版本过低,不支持iOS 12.1系统。根据官方页面,需要Xcode 10<img src=“https://tlanyan.me/wp-content...; alt=”" width=“888” height=“493” class=“aligncenter size-full wp-image-3200” />解决方案: 安装Xcode 10,文件较大,根据网速需要一定时间,请耐心等待11. Invalid redeclaration of ‘<-’ EnumOprators.swift问题截图:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“294” height=“619” class=“aligncenter size-full wp-image-3201” />原因: ObjectMapper的版本过低解决办法: 使用新版的ObjectMapper:打开Podfile,将ObjectMapper那一行改成pod ‘AlamofireObjectMapper’, ‘> 5.0’备注: 解决方案参考https://stackoverflow.com/que…12. Type ‘RLMIterator<proxy>’ does not conform to protocol ‘Sequence’</proxy>问题截图:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“283” height=“379” class=“aligncenter size-full wp-image-3203” /><img src=“https://tlanyan.me/wp-content...; alt=”" width=“665” height=“264” class=“aligncenter size-large wp-image-3204” />原因: 这个问题不清楚具体原因。怀疑是Realm这个库的问题,没有实现Sequence接口。我将RealmSwift改到最新的3.7.6问题亦没有解决。不懂Swift,不过感觉是RMLIterator或者Proxy/RuleSet等存在问题。解决办法: 注销PotatsoMode/DBUtils.swift中的相关代码,具体是174-190和202-218行之间的代码。备注: 解决方案来自:https://github.com/haxpor/Pot…。所有错误中,只有这个错误不是完美解决。13. Initializer for conditional binding must have Optional type, not ‘[Rule]‘问题截图:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“379” height=“151” class=“aligncenter size-full wp-image-3205” />原因: 非nil值不应该使用if let(我自己的理解,毕竟不懂Swift)解决办法: 将Potatso/Core/API.swift第65和256行的if和大括号去掉,65行修改示意:<pre>// 修改前// if let parsedObject = Mapper<Rule>().mapArray(JSONArray: rulesJSON as! [[String : Any]]){// let parsedObject = Mapper<Rule>().mapArray(JSONArray: rulesJSON as! [[String : Any]])// rules.append(contentsOf: parsedObject)//}// 修改后let parsedObject = Mapper<Rule>().mapArray(JSONArray: rulesJSON as! [[String : Any]])rules.append(contentsOf: parsedObject)</pre>备注: 解决办法的灵感来自:https://stackoverflow.com/que…。当然这个问题和Potatso无关。还有一个错误截图:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“766” height=“661” class=“aligncenter size-full wp-image-3202” />具体什么忘了。如果你遇到了或者有解决方案,可留言告诉我。参考构建自己的iOS网络代理客户端 ...

February 11, 2019 · 3 min · jiezi

系统出现大量HTTP Auto Proxy Detection Worker Process

转载请注明文章出处:https://tlanyan.me/many-http-…今天打开任务管理器,发现有大量“HTTP Auto Proxy Detection Worker Process”进程,画风如下:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“1002” height=“890” class=“aligncenter size-full wp-image-3215” />根据进程名称,应该和代理有关,因为电脑上开着Shadowsocks。但是这么多什么鬼?打群架吗?退出SS程序,发现这些进程不会随之退出。意识到这超出了我的知识范围,于是马上打开Google学学。根据有限的搜索结果,基本上确认和SS有关,并且仅会出现在1809版的Windows 10上。我今天才发现这个现象,顺便确认了系统是1809版的bug10:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“690” height=“619” class=“aligncenter size-full wp-image-3216” />花了一个多小时理解WPAD、PAC和pacjsworker.exe关系,并加上自己反复测验,得到一些结论:HTTP Auto Proxy Detection Worker Process进程的程序文件是"C:WindowsSystem32pacjsworker.exe",由WPAD服务启动;这些进程不能手工杀死,重启系统才能解决,用户退出(logout)再登录也不行;WPAD服务(Win HTTP Web Proxy Auto Discovery Service)的属性不能修改,通过重启WPAD服务杀死进程的路也不通;1809版本才会出现,在这之前版本的系统上运行正常;根据Twitter链接https://twitter.com/epakskape…情况复现:打开SS客户端,选择PAC模式,勾选启用系统代理;然后按电源键(或其他方式)让电脑进入休眠;接着唤醒电脑进入桌面,任务管理器中就多了一个HTTP Auto Proxy Detection Worker Process进程;如此反复进入休眠又启动,每次都会出现一个新进程;后来发现不需要休眠也能复现情况:打开SS客户端,选择PAC模式,打开任务管理器;然后不断禁用/启用系统代理,在任务管理器窗口中可实时看到每次启用系统代理后都会多一个进程;最新版的SS客户端依然有这个问题;每次SS启动系统代理后的PAC地址均不同;PAC地址中的secret参数仅在勾选“保护本地PAC(secure local PAC)”选项时才会出现,但t参数一直都在。根据网上知识,加上个人实验和思考,对问题原因的理解为:WPAD是系统关键服务,用户不能更改;以PAC模式启动SS时,SS会在LAN配置中设置一个新的PAC脚本地址;WPAD检测到有新的PAC脚本地址,唤醒一个新的pacjsworker.exe进程监听该地址;PAC地址失效后,监听进程不退出,于是进程堆积,慢慢出现几十上百个进程的壮观场景。总结问题根源:1. Windows 10的进程不自动退出;2. 每次从休眠过来后,SS客户端生成不同的PAC地址并将其配置到LAN设置中。把问题搞清楚了,解决方案基本上章口就莱:使用全局模式;全局模式不会设置PAC配置脚本,WPAD服务也就不会拉起新的进程;等待巨硬修复问题;去年下半年就爆出问题,到现在问题依旧,应该有得等(本人最近才更新1809版本,故而发现得迟);另外我不认为这是巨硬的锅,他们未必会修复;重新编译SS客户端,生成相同的PAC(至少未重启SS客户端前PAC地址应一致)。我的解决方案是重新编译SS客户端,根据 @Joelism 的提示及自己理解,做了两个方案的客户端:方案一:总是生成相同的PAC地址,除非人工编辑"pac-secret.txt"文件。改动代码如下:<pre>// 文件: shadowsocks-csharpControllerServicePACServer.cspublic void UpdateConfiguration(Configuration config){this._config = config;if (config.secureLocalPac){// 注释掉部分// var rd = new byte[32];// RNG.GetBytes(rd);// PacSecret = $"&secret={Convert.ToBase64String(rd)}";if (!File.Exists(PAC_SECRET_FILE)){ var rd = new byte[32]; RNG.GetBytes(rd); string secret = Convert.ToBase64String(rd); PacSecret = $“secret={secret}”; File.WriteAllText(PAC_SECRET_FILE, secret);}else{ PacSecret = $“secret={File.ReadAllText(PAC_SECRET_FILE)}”;}}else{PacSecret = “”;}// 注释掉部分// PacUrl = $“http://127.0.0.1:{config.localPort}/pac?t={GetTimestamp(DateTime.Now)}{PacSecret}";PacUrl = $“http://127.0.0.1:{config.localPort}/pac?{PacSecret}”;}</pre>这个方案保证不管系统休眠重启,还是退出SS客户端再打开,都只会有一个HTTP Auto Proxy Detection Worker Process进程。仅当系统中无PAC进程运行时才生成新的PAC地址并设置到LAN中。代码如下:<pre>// 文件: shadowsocks-csharpControllerShadowsocksController.csprotected void Reload(){Encryption.RNG.Reload();// some logic in configuration updated the config when saving, we need to read it again_config = Configuration.Load();StatisticsConfiguration = StatisticsStrategyConfiguration.Load();if (privoxyRunner == null) { privoxyRunner = new PrivoxyRunner(); } if (_pacServer == null) { _pacServer = new PACServer(); _pacServer.PACFileChanged += pacServer_PACFileChanged; _pacServer.UserRuleFileChanged += pacServer_UserRuleFileChanged; // 这一行代码从外部移入 _pacServer.UpdateConfiguration(_config); } // 每次唤醒都更新的代码删除 // _pacServer.UpdateConfiguration(_config); if (gfwListUpdater == null) { gfwListUpdater = new GFWListUpdater(); gfwListUpdater.UpdateCompleted += pacServer_PACUpdateCompleted; gfwListUpdater.Error += pacServer_PACUpdateError; }这个方案保证不退出SS客户端情况下只有一个pacjsworker.exe进程。缺点是如果频繁退出并重启SS客户端,同样会出现有大量进程的现象。根据源代码思路,我认为第二种方案更合理,是原作者想要的。当然你应该想得到,我是先根据网上提示实现方案一,测试达到效果后继续思考才做出的方案二。从这个角度也是方案二更合理。两个方案的exe文件我都编译好了,需要请自取:方案一 方案二稍后我会发一个pull request到官方库,使用方案二修复该问题。问题相关网页https://github.com/shadowsock…https://github.com/XX-net/XX-...https://github.com/shadowsock...https://github.com/shadowsock...https://steamcn.com/t430331-1-1http://bbs.pcbeta.com/forum.p… ...

February 11, 2019 · 1 min · jiezi

ssr 客户端下载及使用方法!

GIthub 地址windows 版 直达下载解压windows 8 及以上系统打开 4.0exe 启动客户端win7系统则打开 2.0exe 启动设置方法差不多,服务器 IP 端口 密码 加密方式 都要和搭建时候设置一致.安卓版 直达也是要和服务端搭建过程中自己设置的信息一致…转自博客:MR96.ME —— 玖六先生的自留地

January 29, 2019 · 1 min · jiezi

vps 一键安装谷歌BBR加速

Google 开源了其 TCP BBR 拥塞控制算法,并提交到了 Linux 内核,从 4.9 开始,Linux 内核已经用上了该算法。部署了最新版内核,开启TCP BBR 加速的 VPS,网速可以提升几个数量级。使用root用户登录服务器,执行以下命令:wget –no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh && chmod +x bbr.sh && ./bbr.sh安装大概需要两分钟,安装完成后会提示是否重启服务器输入 y 重启服务器重启需要一般只要几秒钟重新连接服务器,验证是否成功安装最新内核并开启 BBR 加速,执行命令:uname -r内核版本显示为最新版就表示 成功了5 $ 服务器优化后 Youtube 可以达到 4K 画质..博客:Mr96.me-玖六先生的自留地

January 25, 2019 · 1 min · jiezi

ubuntu下的代理玄学问题

出于众所周知的原因,我在公司的新加坡服务器上搭了个ss服务器。然后在本地客户端,用ss+polipo实现全局代理,并在System settings->network->proxy里设置为polipo的端口,并在命令行设置了export http_proxy等等。一切完毕,代理顺利运行,google顺利进入。然后ubuntu系统可能由于几个月没关机导致有点不稳定,关机重启。重启之后,出现了一个神奇的问题:Postman不能访问localhost了。浏览器可以访问,chrome的Postman web版插件能访问,Postman客户端却不能访问。代理开着,提示polipo返回的502页面。以为是代理的问题,把代理全关掉,返回无法访问(跟没开服务一样)。于是我陷入了无限的懵逼,开始排查问题。首先怀疑是postman代理设置的问题,进入设置,并无不妥,但还是各种更改了一番设置,没效果。然后怀疑是系统代理没关干净,于是把相关脚本改了一下,把export http_proxy等注释掉,source之,没效果。怀疑polipo或者ss开机启动设置,关掉开机启动,没效果。代理进程没杀干净?netstat grep了,干净的。一脸懵逼。想起来当初出现问题的由头是重启了一下,于是又重启了一下。好了。。。玄学。。。

January 25, 2019 · 1 min · jiezi