<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[mcdona1d's Blog]]></title><description><![CDATA[Life is short live it up]]></description><link>https://mcdona1d.me/</link><image><url>https://mcdona1d.me/favicon.png</url><title>mcdona1d&apos;s Blog</title><link>https://mcdona1d.me/</link></image><generator>Ghost 2.37</generator><lastBuildDate>Sun, 05 Apr 2026 08:18:03 GMT</lastBuildDate><atom:link href="https://mcdona1d.me/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[https的s到底意味什么]]></title><description><![CDATA[<h2 id="https-http-">https相比http多了什么</h2><p>HTTP(<strong>H</strong>yper<strong>T</strong>ext <strong>T</strong>ransfer <strong>P</strong>rotocol 超文本传输协议)：是一种用于分布式、协作式和超媒体信息系统的应用层协议，是一个客户端（用户）和服务端（网站）之间请求和应答的标准，通常使用TCP协议，HTTP是万维网的数据通信的基础。</p><p>HTTPS(<strong>H</strong>yper<strong>T</strong>ext <strong>T</strong>ransfer <strong>P</strong>rotocol <strong>S</strong>ecure 超文本传输安全协议)：常称为<code>HTTP over TLS</code>、<code>HTTP over SSL</code>或<code>HTTP Secure</code>）HTTPS经由HTTP进行通信，但利用SSL/TLS来加密数据包。</p><h2 id="ssl-tls-">SSL与TLS区别</h2><ul><li>SSL（<strong>S</strong>ecure <strong>S</strong></li></ul>]]></description><link>https://mcdona1d.me/httpsde-sdao-di-yi-wei-shi-yao-2/</link><guid isPermaLink="false">5f2510b8bb03610001362906</guid><dc:creator><![CDATA[mcdona1d]]></dc:creator><pubDate>Wed, 09 Oct 2019 06:50:00 GMT</pubDate><content:encoded><![CDATA[<h2 id="https-http-">https相比http多了什么</h2><p>HTTP(<strong>H</strong>yper<strong>T</strong>ext <strong>T</strong>ransfer <strong>P</strong>rotocol 超文本传输协议)：是一种用于分布式、协作式和超媒体信息系统的应用层协议，是一个客户端（用户）和服务端（网站）之间请求和应答的标准，通常使用TCP协议，HTTP是万维网的数据通信的基础。</p><p>HTTPS(<strong>H</strong>yper<strong>T</strong>ext <strong>T</strong>ransfer <strong>P</strong>rotocol <strong>S</strong>ecure 超文本传输安全协议)：常称为<code>HTTP over TLS</code>、<code>HTTP over SSL</code>或<code>HTTP Secure</code>）HTTPS经由HTTP进行通信，但利用SSL/TLS来加密数据包。</p><h2 id="ssl-tls-">SSL与TLS区别</h2><ul><li>SSL（<strong>S</strong>ecure <strong>S</strong>ockets <strong>L</strong>ayers 安全套接层）</li><li>TLS（<strong>T</strong>ransport <strong>L</strong>ayer <strong>S</strong>ecurity 安全传输层）</li></ul><p>SSL和TLS是一种能够在服务器，machines和通过网络运行的应用程序（列如，客户端连接到web服务器）之间提供身份认证和数据加密的<strong>加密协议</strong>。SSL是TLS的前世。多年来，新版本的发布用来解决漏洞，提供更强大支持，更安全的密码套件和算法。</p><p>TLS只不过是SSL的一个<strong>最新的版本</strong>。</p><h3 id="-">参考</h3><ul><li><a href="https://www.globalsign.com/en/blog/ssl-vs-tls-difference">SSL vs. TLS - What's the Difference?</a></li><li><a href="https://juejin.im/post/6844903620320690184">TLS与SSL之间关系</a></li></ul><h2 id="-ssl-">为什么购买的证书名字叫SSL证书</h2><p>实际上应该称为适用于SSL(或TLS)加密的证书，目前来说称为TLS证书更为合适，SSL只是习惯性的叫法并且一直沿用下来(如OpenSSL)，所以在理解上会导致一些歧义。</p><h2 id="-s-osi-">多出来的S到底工作在OSI网络模型的哪一层</h2><p>SSL协议实现为HTTP协议的透明包装。就OSI模型而言，它有点像灰色区域。作用于应用层(七层)和运输层(四层)之间，但通常在应用层中实现。所以对于这个问题，OSI模型只是一种概念模型，并没能很好的表达SSL的位置。</p><h3 id="--1">参考</h3><ul><li><a href="https://www.jianshu.com/p/5ee027c51af0">SSL/TSL到底是属于哪一层的协议？</a></li></ul><h2 id="--2">证书的本质是什么</h2><p>证书的本质为**权威机构(CA供应商)<strong>对</strong>目标机构(申请证书的企业)<strong>按照不同等级的要求进行核验后所颁发的用于给</strong>目标机构客户(网站用户)**进行核查的一种证明。<br>所以在这种角色关系中，CA的权威性至关重要，如果CA存在被入侵或私自签发证书的情况，那会直接被各系统/浏览器将其根拉入黑名单。</p><h2 id="-https-">浏览器如何验证https证书合法性</h2><ol><li>客户端发送信息，带上支持的SSL或者TLS版本（不同浏览器支持程度不同）。</li><li>服务器返回确认使用的加密通信协议版本以及加密随机数和CA证书。</li><li>浏览器验证证书（存在双向验证和单项验证） -&gt; OCSP或者CRL 结合自带truststore。</li><li>检查CA证书的根证书颁发机构是否受浏览器信任。</li><li>检查CA证书中的证书吊销列表，检查证书是否被吊销。</li><li>检查CA证书是否在有效期内。</li><li>检查部署CA证书的网站域名与证书颁发的域名是否一致。</li><li>浏览器核对该网站是否存在于欺诈网站数据库中。</li></ol><h2 id="-ocsp">本地内置跟证书与OCSP</h2><p>系统或浏览器中都会内置部分权威CA的根证书，但是同时又有OCSP(在线证书状态检查协议Online Certificate Status Protocol)或CRL(撤销证书列表Certificate Revocation Lists)这种技术的存在，这两者在验证证书有效性上的功能是否重复，OCSP存在的意义是啥</p><p>首先要说明的是，一张被签发的证书完全可以在离线状态下依赖内置根证书验证有效性，但是如果证书签发后被吊销，则需要OCSP或者CRL即证书吊销列表进行核验</p><p>OCSP是服务于客户端场景的，通过OCSP，浏览器可以在线向CA证书颁发机构查询证书的有效性，从而在证书泄漏等问题发生后，及时有效的保护客户端浏览的安全</p><h2 id="--3">如何验证中间证书</h2><p>每一张证书都是由上级CA证书签发的，上级CA证书可能还有上级，最后会找到根证书。根证书即自签证书，自己签自己。<br>当你验证一张证书是否是由上级CA证书签发的时候，你必须有这张上级CA证书。通常这张证书会内置在浏览器或者是操作系统中，有些场景下应用系统也会保留。</p><h3 id="--4">中间证书缺失问题</h3><p>由于系统只内置了根证书及部分中间证书，如果当前要验证的证书恰恰是由非内置的中间证书所签发，如何验证证书的合法性?</p><p>如 在Godaddy在证书购买页面中，提到在<em>较旧版本浏览器或服务器可能需要的中间证书</em>，所以在部署证书时，为何更好的兼容性，需要将中间证书拼接到自己的证书中。</p>]]></content:encoded></item><item><title><![CDATA[聊一聊我用过的电视盒子]]></title><description><![CDATA[<!--kg-card-begin: markdown--><blockquote>
<p>托朋友从美国带回来的apple tv 4k已经到手了将近一周的时间,不算深度体验,但也对这个东西非常满意,借此聊一下我用过的四款完全不同的盒子</p>
</blockquote>
<h2 id="3">小米盒子3</h2>
<p>小米盒子是我认为的最优秀的国产安卓盒子,与国内内容提供商合作,内置了众多的视频内容,可以语音直接搜索,语音识别质量还是非常出色的,但是小米产品一直以来的尿性,在系统层次注入众多广告,比如开机广告,打开第三方app得广告,自家的推广广告都让人十分恶心,强制安装自家app,让原本就不富裕的空间雪上加霜,总之这种行为非常垃圾,<br>
号称支持<code>airplay</code>和<code>dlan</code>,但是稳定时实在不敢恭维,十次有两三次次失败,但是有三四次根本发现不了设备,此外充电器有高频噪音,质量也是不敢恭维<br>
最后这个产品的终结以被root为标志,删除了自带的众多垃圾app,准备转给家里人继续贡献光和热</p>
<h2 id="appletv3">apple tv 3</h2>
<p>apple tv3是个巧合,以99包邮的价格买过来,300块钱的价格又了卖出去,在我手里存活了将近一周的时间,卖掉的主要原因还是因为非智能设备,没有扩展的可能,国内观看在线视频依赖hosts大法,视频质量不佳,稳定不佳,维护成本高,只有<code>airplay</code>可圈可点,所以没玩几天就卖掉了</p>]]></description><link>https://mcdona1d.me/liao-yi-liao-wo-yong-guo-de-dian-shi-he-zi/</link><guid isPermaLink="false">5db2a2ca53ae51000144154f</guid><dc:creator><![CDATA[mcdona1d]]></dc:creator><pubDate>Fri, 18 May 2018 15:13:41 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><blockquote>
<p>托朋友从美国带回来的apple tv 4k已经到手了将近一周的时间,不算深度体验,但也对这个东西非常满意,借此聊一下我用过的四款完全不同的盒子</p>
</blockquote>
<h2 id="3">小米盒子3</h2>
<p>小米盒子是我认为的最优秀的国产安卓盒子,与国内内容提供商合作,内置了众多的视频内容,可以语音直接搜索,语音识别质量还是非常出色的,但是小米产品一直以来的尿性,在系统层次注入众多广告,比如开机广告,打开第三方app得广告,自家的推广广告都让人十分恶心,强制安装自家app,让原本就不富裕的空间雪上加霜,总之这种行为非常垃圾,<br>
号称支持<code>airplay</code>和<code>dlan</code>,但是稳定时实在不敢恭维,十次有两三次次失败,但是有三四次根本发现不了设备,此外充电器有高频噪音,质量也是不敢恭维<br>
最后这个产品的终结以被root为标志,删除了自带的众多垃圾app,准备转给家里人继续贡献光和热</p>
<h2 id="appletv3">apple tv 3</h2>
<p>apple tv3是个巧合,以99包邮的价格买过来,300块钱的价格又了卖出去,在我手里存活了将近一周的时间,卖掉的主要原因还是因为非智能设备,没有扩展的可能,国内观看在线视频依赖hosts大法,视频质量不佳,稳定不佳,维护成本高,只有<code>airplay</code>可圈可点,所以没玩几天就卖掉了</p>
<h2 id="nexusplayer">NexusPlayer</h2>
<p>再之后买了nexusplayer,玩了大概一年的时间,最后又以购买价卖出去,卖的原因纯粹是因为买了4k,产品很优秀,小米的缺点全没有,华硕代工,原生<code>android tv 8.0</code>系统.<br>
相反,作为舶来品,视频资源也一律没有,但是可以安装各类国产视频app,是一个很好的均衡,也可以安装<code>android tv</code>版<code>youtube</code>,或者通过<code>dsvideo</code>来看nas上的视频(专为<code>android tv</code>开发,小米只能使用手机版)<br>
他作为主力陪伴了我一年的时间,也存在一些缺点,比如遥控器在不操作休眠之后唤醒有一个延时,大概十秒,着急暂停的时候比较不爽,好在性能足够用,不会强奸式的安装app,锁屏的壁纸十分大气,非常舒服,<code>chromecast</code>时灵时不灵也没找到原因.要说明的是,安装国产电视app之后,由于国产app十分流氓,甚至会在屏幕唤醒强插欢迎广告,还有会严重影响运行速度,占用不是很丰富的1g内存,后来也由于我没有看这类视频的需求,就全部卸载了,运行速度提升了不少</p>
<h2 id="appletv4k">apple tv 4k</h2>
<p>作为一款未在大陆且'有生之年'内不可能在大陆发行的苹果产品,再加上苹果产品生态的闭环和门槛,导致了其在电视内容上是和安卓盒子没法比的,但是依然不影响他成为一个极为优秀的产品和苹果生态的一环</p>
<p>apple tv 4k对于我的需求简直是完美的产品:</p>
<ul>
<li>稳定可靠的<code>airplay</code></li>
<li>丝滑流畅的系统</li>
<li>功能强大ui炫酷的第三方app比如<code>infuse</code>,<code>youtube</code></li>
<li>绝对看不到的广告</li>
</ul>
<p>虽然apple tv 4k对于一个盒子有近乎变态的性能:3g内存,a10x处理器,性能基本等同10.5″ ipad pro,但是我没有4k输出设备也体会不到这么强大的性能<br>
有一定的游戏生态,但是我有switch ps4也轮不到用他来玩游戏<br>
我想要的只是一个,没有广告,强大稳定用着舒服的盒子,不需要视频内容,但能连接我的nas就好,视频内容我可以通过ipad来<code>airplay</code>解决</p>
<p>再具体说一下apple tv 4k带来的惊喜</p>
<ul>
<li>
<p>音量控制与nexus player设计理念相同主张电视音量由电视控制,不进行另外层级的干预,但是他更进一步,遥控器有按键,通过hdmi-cec可以直接调整电视音量,或者可以学习红外线遥控信息来支持老式设备</p>
</li>
<li>
<p>细腻流畅的动画与操作</p>
</li>
<li>
<p>支持主动睡眠(nexus player不支持,小米盒子支持)</p>
</li>
<li>
<p>完善的app生态,比如强大的infuse</p>
</li>
<li>
<p>同样是群晖app也要比android tv版更精致</p>
</li>
<li>
<p>屏保均为4k航拍动画,相比nexus playe的壁纸,各有优劣</p>
</li>
<li>
<p>与ios生态完美整合:</p>
<ul>
<li>自动同步wifi,账号及icloud信息</li>
<li>文字输入环节手机主动推送录入窗口,不需要另外安装app</li>
<li>支持airpods作为音频输出源(airpods统治一切音频出口)</li>
</ul>
</li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[通过ipset实现自动规划路由翻墙的方案实现]]></title><description><![CDATA[<!--kg-card-begin: markdown--><blockquote>
<ol>
<li>新搬了家,换成了联通的家用宽带,摆脱了之前无敌垃圾的宽带通.构建无墙方案又有了客观因素可以实施了</li>
</ol>
</blockquote>
<blockquote>
<ol start="2">
<li>前些天由于进行了200Mbps的迅雷下载,居然把ac68u的cpu几乎跑满,瞬间感觉设备遇到了瓶颈,又有了升级理由,考虑之前一直心水的ubnt er-x</li>
</ol>
</blockquote>
<blockquote>
<ol start="3">
<li>对于er-x这个设备的选型,之前有一个顾虑,就是对mtk这个不怎么高大上的厂商的mt7621方案的顾虑,之前使用过mt7620方案的路由器,印象很一般,但是调研之后,发现7621虽然看起来跟7620型号很相似,但是7621确实是mtk的旗舰级方案,并且配备了众多硬件加速芯片,事实上结果也并没让我失望,另一点,对于er-x原生使用dnsmasq很满意,此外作为准专业设备,可以直接通过命令行配置,在添加大量路由表的情况下,也是ui界面无法做到的方便</li>
</ol>
</blockquote>
<h2 id>实现效果</h2>
<p>通过以下配置,可以做到网络环境内设备的无感知翻墙,维护者只需要对域名列表做维护,既可实现翻墙,且翻墙设备故障后不影响正常的网络访问</p>
<h2 id>流程图</h2>
<p><img src="https://mcdona1d.me/content/images/2020/07/ipset-fq.png" alt="ipset-fq"></p>
<h2 id>核心服务</h2>
<p>翻墙无非要解决的就是两点问题:</p>
<ol>
<li>dns污染</li>
<li>通过代理访问被屏蔽的ip</li>
</ol>
<p>为了解决这两点,我分别使用了<code>dnsencrypt</code>和<code>shadowsocks-libev</code><br>
<code>dnsencrypt</code>无需细说,直接搭建并找到合适的服务器即可使用(我是用的cisco的服务),但是也计划将此服务实现的功能合并通过shadowsocks-libev完成,结构越简单,可靠性越高</p>
<p><code>shadowsocks-libev</code></p>]]></description><link>https://mcdona1d.me/tong-guo-ipset-shi-xian-zi-dong-gui-hua-lu-you-fan-qiang-de-fang-an-shi-xian/</link><guid isPermaLink="false">5db2a2ca53ae51000144154e</guid><dc:creator><![CDATA[mcdona1d]]></dc:creator><pubDate>Tue, 15 May 2018 16:16:35 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><blockquote>
<ol>
<li>新搬了家,换成了联通的家用宽带,摆脱了之前无敌垃圾的宽带通.构建无墙方案又有了客观因素可以实施了</li>
</ol>
</blockquote>
<blockquote>
<ol start="2">
<li>前些天由于进行了200Mbps的迅雷下载,居然把ac68u的cpu几乎跑满,瞬间感觉设备遇到了瓶颈,又有了升级理由,考虑之前一直心水的ubnt er-x</li>
</ol>
</blockquote>
<blockquote>
<ol start="3">
<li>对于er-x这个设备的选型,之前有一个顾虑,就是对mtk这个不怎么高大上的厂商的mt7621方案的顾虑,之前使用过mt7620方案的路由器,印象很一般,但是调研之后,发现7621虽然看起来跟7620型号很相似,但是7621确实是mtk的旗舰级方案,并且配备了众多硬件加速芯片,事实上结果也并没让我失望,另一点,对于er-x原生使用dnsmasq很满意,此外作为准专业设备,可以直接通过命令行配置,在添加大量路由表的情况下,也是ui界面无法做到的方便</li>
</ol>
</blockquote>
<h2 id>实现效果</h2>
<p>通过以下配置,可以做到网络环境内设备的无感知翻墙,维护者只需要对域名列表做维护,既可实现翻墙,且翻墙设备故障后不影响正常的网络访问</p>
<h2 id>流程图</h2>
<p><img src="https://mcdona1d.me/content/images/2020/07/ipset-fq.png" alt="ipset-fq"></p>
<h2 id>核心服务</h2>
<p>翻墙无非要解决的就是两点问题:</p>
<ol>
<li>dns污染</li>
<li>通过代理访问被屏蔽的ip</li>
</ol>
<p>为了解决这两点,我分别使用了<code>dnsencrypt</code>和<code>shadowsocks-libev</code><br>
<code>dnsencrypt</code>无需细说,直接搭建并找到合适的服务器即可使用(我是用的cisco的服务),但是也计划将此服务实现的功能合并通过shadowsocks-libev完成,结构越简单,可靠性越高</p>
<p><code>shadowsocks-libev</code>使用的是官方推荐的一个较为高级的用法,核心是<code>ss-redir</code>,具体搭建方法可以参考文档的<code>Transparent proxy</code>部分: <a href="https://github.com/shadowsocks/shadowsocks-libev">https://github.com/shadowsocks/shadowsocks-libev</a></p>
<p>我使用树莓派2b来作为以上两个服务的载体,性能足够,实际测试在翻墙服务端连接状况良好的情况下,youtube 4k是无压力的</p>
<p>调度工具为dnsmasq,通过制定策略,实现域名的分开解析,避免了国内服务使用国外dns解析到国外cdn的尴尬,解析这一步,本人的原则为宁可不完善,也不可泛滥,即可以接受一些域名被污染,也不接受大量域名依赖翻墙服务.因为我认为各种国内外域名名单及gfwlist是不够准确的</p>
<h2 id>流程实现</h2>
<p>个人是很不喜欢将ss服务跑在路由上的,路由器的孱弱的cpu我认为并不适合跑这类服务,乖乖做好路由功能就好,ss服务的性能消耗影响了路由器网络质量就有点得不偿失<br>
此流程实现的核心在于<code>ipset</code>,通过此工具,可以将<code>dnsmasq</code>解析到的地址添加到一个<code>firewall group</code>中,再通过防火墙策略,匹配<code>group</code>中的ip地址,如果符合则附加路由规则, 指定下一跳地址到翻墙终端,实现翻墙<br>
<code>ipset</code>依赖2.66以后版本的<code>dnsmasq</code>,最新的<code>edgeos</code>版本为v1.10.3,已经内置了2.78版本的<code>dnsmasq</code>,所以省去了编译的流程,直接使用既可<br>
配置不多,参照以下</p>
<blockquote>
<p>树莓派已经固定了ip地址,为10.0.0.3</p>
</blockquote>
<pre><code class="language-bash"># 创建firewall group,并通过ipset将地址添加到此group,此处写出两条作为实例,扩展方法后面讲
set firewall group address-group CROSS_WALL_SET
set service dns forwarding options server=/google.com/10.0.0.3
set service dns forwarding options ipset=/google.com/CROSS_WALL_SET
set service dns forwarding options server=/twitter.com/10.0.0.3
set service dns forwarding options ipset=/twitter.com/CROSS_WALL_SET

# 创建一条static table,内容为指定下一跳地址为10.0.0.3
set protocols static table 1 route 0.0.0.0/0 next-hop 10.0.0.3

# 创建防火墙规则,将符合firewall group中的ip按照刚才配置的static table走
set firewall modify AUTO_VPN rule 20 action modify
set firewall modify AUTO_VPN rule 20 destination group address-group CROSS_WALL_SET
set firewall modify AUTO_VPN rule 20 modify table 1
set firewall modify AUTO_VPN rule 20 protocol all

# 将防火墙规则应用到switch0虚拟接口,即路由器的lan区域
set interfaces switch switch0 firewall in modify AUTO_VPN
</code></pre>
<p>通过以上流程既可完成对路由器的配置,如果想手动维护域名,只需要将要翻墙的域名转换为<code>dnsmasq</code>命令(一条解析及一条<code>ipset</code>为一组)继续添加既可,如果想大而全,可以通过此github项目https://github.com/smallfount/gfwlist2dnsmasq 将<code>gfwli</code>st全部转换为<code>dnsmasq</code>配置,具体对于性能的损耗暂时还没有调研</p>
<h3 id="vlan">如果开启了vlan</h3>
<p>需要额外设置</p>
<pre><code>set firewall source-validation disable
</code></pre>
<p>并且在对应的vlan中应用防火墙规则</p>
<pre><code>set interfaces ethernet eth1 vif 10 firewall in modify AUTO_VPN
</code></pre>
<p>参考：<a href="https://help.ui.com/hc/en-us/articles/360005460813-UniFi-USG-Advanced-Policy-Based-Routing-">https://help.ui.com/hc/en-us/articles/360005460813-UniFi-USG-Advanced-Policy-Based-Routing-</a></p>
<h2 id>流程验证</h2>
<p>配置完成后,尝试解析一个规则内的域名,解析完成后,通过一下命令来查看<code>firewall group</code>中的地址列表变更情况</p>
<pre><code class="language-bash">show firewall group CROSS_WALL_SET
</code></pre>
<p>将<code>firewall group</code>中的地址进行traceroute,并检查路由,如果顺利的到了翻墙服务器,则流程走通</p>
<h2 id="todo">todo</h2>
<ul>
<li>对<code>dnsmasq</code>解析到的结果的缓存时间设置</li>
</ul>
<h2 id>参考文档及感谢</h2>
<blockquote>
<p>感谢以下博客的作者提供了思路和做法</p>
</blockquote>
<ul>
<li><a href="https://xiaoding.org/?p=391">https://xiaoding.org/?p=391</a></li>
<li><a href="https://sskaje.me/misc/ubnt/page/2/">https://sskaje.me/misc/ubnt/page/2/</a></li>
<li><a href="https://help.ubnt.com/hc/en-us/articles/204952274-EdgeRouter-Policy-based-routing-source-address-based-">https://help.ubnt.com/hc/en-us/articles/204952274-EdgeRouter-Policy-based-routing-source-address-based-</a></li>
<li><a href="https://help.ubnt.com/hc/en-us/articles/205223470-EdgeRouter-Policy-based-routing-for-destination-port">https://help.ubnt.com/hc/en-us/articles/205223470-EdgeRouter-Policy-based-routing-for-destination-port</a></li>
<li><a href="https://51mx.xyz/2016/03/22/fq-edgeos/">https://51mx.xyz/2016/03/22/fq-edgeos/</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[macOS 文件夹多语言设置]]></title><description><![CDATA[<!--kg-card-begin: markdown--><blockquote>
<p>在终端里使用中文文件夹非常的不方便,但是在Finder里使用英文看起来却又不舒服.仔细观察发现macOS的家目录的文件夹,其实是英文命名的,却会根据系统语言来转换显示方式.所以可以仿照这种方式来自己设置,下面只介绍实现成本最低的方式</p>
</blockquote>
<ol>
<li>
<p>将文件夹重命名,增加<code>.localized</code>后缀,如<code>Device.localized</code></p>
</li>
<li>
<p>在需要国际化命名的文件夹内部创建<code>.localized</code><strong>文件夹</strong></p>
</li>
<li>
<p>打开文本编辑 -&gt; 新建文稿 -&gt; 格式,选择纯文本</p>
</li>
<li>
<p>编辑内容为你的文件夹英文名及对应的中文名,如</p>
</li>
</ol>
<pre><code>&quot;Device&quot; = &quot;设备&quot;;
</code></pre>
<ol start="5">
<li>
<p>保存,名称为<code>zh.strings</code>,位置为<code>.localized</code>文件夹内,纯文本编码为 UTF-16,保存 -&gt; 选择使用<code>.strings</code></p>
</li>
<li>
<p>执行<code>pkill Finder</code></p></li></ol>]]></description><link>https://mcdona1d.me/macos-wen-jian-jia-duo-yu-yan-she-zhi/</link><guid isPermaLink="false">5db2a2ca53ae51000144154a</guid><dc:creator><![CDATA[mcdona1d]]></dc:creator><pubDate>Mon, 11 Sep 2017 11:33:23 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><blockquote>
<p>在终端里使用中文文件夹非常的不方便,但是在Finder里使用英文看起来却又不舒服.仔细观察发现macOS的家目录的文件夹,其实是英文命名的,却会根据系统语言来转换显示方式.所以可以仿照这种方式来自己设置,下面只介绍实现成本最低的方式</p>
</blockquote>
<ol>
<li>
<p>将文件夹重命名,增加<code>.localized</code>后缀,如<code>Device.localized</code></p>
</li>
<li>
<p>在需要国际化命名的文件夹内部创建<code>.localized</code><strong>文件夹</strong></p>
</li>
<li>
<p>打开文本编辑 -&gt; 新建文稿 -&gt; 格式,选择纯文本</p>
</li>
<li>
<p>编辑内容为你的文件夹英文名及对应的中文名,如</p>
</li>
</ol>
<pre><code>&quot;Device&quot; = &quot;设备&quot;;
</code></pre>
<ol start="5">
<li>
<p>保存,名称为<code>zh.strings</code>,位置为<code>.localized</code>文件夹内,纯文本编码为 UTF-16,保存 -&gt; 选择使用<code>.strings</code></p>
</li>
<li>
<p>执行<code>pkill Finder</code>重启Finder,显示效果</p>
</li>
</ol>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[终于买了心水已久的Synology]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>很多人不明白，为什么要花三四千买一个硬件性能这么差的小盒子用，装个电脑不好么</p>
<h2 id>价格分析</h2>
<p>首先，群晖的价格那还有这几部分组成:</p>
<ul>
<li>硬件成本</li>
<li>盘位使用费即dsm系统费用</li>
<li>税</li>
</ul>
<p>比如我购买的DS218+，中国大陆的标价为2780,价格组成大概估算如下:</p>
<ul>
<li>10%进口税，17%消费税，攻击600的税，可以参考pchone台湾售价验证这个想法</li>
<li>每个盘位授权使用费500，这个费用并不是没有根据，比如微软会按处理器核数收钱，相同配置，多盘位价格会大幅增加，双盘位大概为1000元，盘位价格也就是dsm的系统授权价格,附带的免费dsm系统实际上并不便宜</li>
<li>硬件1000，估算依据是216+和416play的对比，及716和916的对比，以及dx513的售价</li>
</ul>
<p>其次，nas的定位是家庭服务器，服务器需要具备7<em>24小时的工作能力，一般普通家用电脑电脑的标准是5</em>8小时</p>
<h2 id>作用分析</h2>
<p>说完群晖贵，接下来说群晖用来做什么</p>
<p>最近几年由于ssd的普及，迫于价格因素，买新设备时,不会选择硬盘特别富裕的版本<br>
这几年也逐步把身边的设备换成了苹果之流，身边也只是剩下一台老旧的win本应急备用<br>
由于设备多，每台设备空间小，就会导致数据异常分散，难以统一.</p>]]></description><link>https://mcdona1d.me/zhong-yu-mai-le-xin-shui-yi-jiu-de-synology/</link><guid isPermaLink="false">5db2a2ca53ae51000144154c</guid><dc:creator><![CDATA[mcdona1d]]></dc:creator><pubDate>Tue, 05 Sep 2017 02:57:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>很多人不明白，为什么要花三四千买一个硬件性能这么差的小盒子用，装个电脑不好么</p>
<h2 id>价格分析</h2>
<p>首先，群晖的价格那还有这几部分组成:</p>
<ul>
<li>硬件成本</li>
<li>盘位使用费即dsm系统费用</li>
<li>税</li>
</ul>
<p>比如我购买的DS218+，中国大陆的标价为2780,价格组成大概估算如下:</p>
<ul>
<li>10%进口税，17%消费税，攻击600的税，可以参考pchone台湾售价验证这个想法</li>
<li>每个盘位授权使用费500，这个费用并不是没有根据，比如微软会按处理器核数收钱，相同配置，多盘位价格会大幅增加，双盘位大概为1000元，盘位价格也就是dsm的系统授权价格,附带的免费dsm系统实际上并不便宜</li>
<li>硬件1000，估算依据是216+和416play的对比，及716和916的对比，以及dx513的售价</li>
</ul>
<p>其次，nas的定位是家庭服务器，服务器需要具备7<em>24小时的工作能力，一般普通家用电脑电脑的标准是5</em>8小时</p>
<h2 id>作用分析</h2>
<p>说完群晖贵，接下来说群晖用来做什么</p>
<p>最近几年由于ssd的普及，迫于价格因素，买新设备时,不会选择硬盘特别富裕的版本<br>
这几年也逐步把身边的设备换成了苹果之流，身边也只是剩下一台老旧的win本应急备用<br>
由于设备多，每台设备空间小，就会导致数据异常分散，难以统一.所以这些设备需要一个统一的文件中心，就是nas</p>
<p>我目前需要nas做的，首先是有一个空间去储存大量的电影和美剧，云储存,除了dropbox,icloud之外,别的都不靠谱,没准哪天你的文件就以违背相关法律为里有删除了.而且，面对如今的文化封杀和文化氛围,屯一些优秀的动画作品是有必要的，我不能接受我的后代是看着喜洋洋等垃圾动漫长大的</p>
<p>其次我需要一个空间把我近几年来的照片收集整理，由于我使用的设备经历了，android，windows phone，iOS ，数据分散在google photo，onedrive，icloud等云储存上.整理是一方面，还有一方面是，为以后可能会接触的摄影做准备。单反相机的一张图动辄几十m，原图浏览传输分享并不是一个好的办法，需要nas来压缩并集中友好的呈现</p>
<p>剩下的，我需要一个time machine中心，来备份我的三台mac，群晖的time chine功能可以完全满足这种需求</p>
<p>可能要做的,是利用群晖的计算能力,来承担一台服务器应有的作用,比如通过docker或者虚拟机来运行ubuntu,并以此为基础实现一些自由网络浏览的功能</p>
<p>作为下载中心,由于win设备在我这里被边缘化，我并没有一个合适的设备来下载东西，mac并不适合长时间高负荷工作，所以这部分功能依然交给nas，作为一个7*24的设备，做这种事再擅长不过,自带的download station也很强大</p>
<p>剩下一个原因，群晖作为媒体中心，一个无线的大硬盘，对于终端是非常有好的。我自己使用显示器再加电视盒子作为媒体终端，我自己之前使用的设备是小米盒子3。但是我自己和小米的价值观非常冲突，我也接受不了我自己花钱买硬件还要被你强奸看广告的商业方式，宁可加钱也不要广告。所以nas就成为我摆脱小米盒子的一步。小米盒子虽然广告多，但是不可否认功能十分符合国情和强大的，最新的小米盒子3s更是把3的内存和储存提升了一倍，可是小米盒子终究是小米的盒子，我还是不愿意为了这些去接受广告的。<br>
我的解决办法有两条，一是购买原生android tv盒子，另一个就是四代的apple tv<br>
。最终我在闲鱼淘到了一个nexus player，一个谷歌14年底推出，16年终止服务的亲儿子。经过试用，对比小米盒子，总结出来以下优缺点:<br>
先说问题:</p>
<ul>
<li>无法识别ntfs格式硬盘，</li>
<li>遥控器问题最大，大概分为两类，
<ul>
<li>由于是给电视机设计的盒子，所以并没有关屏按键和音量调整，这个和设计逻辑有关，淡化盒子的存在，统一控制入口。支持hdmi cec。由于我使用的显示器，所以遇到这个问题</li>
<li>第二个问题，国产app不按照安卓规范开发。在安卓5.0以后的规范中，菜单键就已经被干掉，可是部分电视app依然需要菜单键实现一些操作</li>
</ul>
</li>
</ul>
<p>以上的问题有一个不方便的解决方法:经过测试，是用我的罗技多媒体无线键盘，发现盒子是支持菜单键和锁屏的，但是音量控制先天缺失,无法弥补<br>
最终的办法是淘宝18块钱买了2.4g安卓兼容遥控器，来实现偶尔的菜单键和关屏<br>
考虑过使用小米盒子遥控来配对nexusplayer,但是发现并不能配对成功</p>
<p>再说说好处:</p>
<ul>
<li>系统方面，绝对原生，支持更新到android tv 8.0</li>
<li>可能是心理作用，感觉比小米盒子要显示清晰，音质因为设备垃圾没有什么感觉</li>
<li>质量，由于是华硕代工,整个产品拿在手里非常有质感，相比小米盒子的变压器在不工作的时候会一直发出高频噪音，非常烦人，非常垃圾的品控</li>
<li>看一下性能，atom四核处理器1g ram 8g rom。首先目前我没有遇到任何由于x86处理器导致的兼容性问题，其次原生系统非常流畅，1g ram完全够用，电视不需要频道多任务切换，8g 的rom也有将近6g可用非常富裕</li>
</ul>
<p>扯远了，数据中心化的另外一个好处是，只要有网，随时播放，我从电视盒子看到一半，带上pad，在马桶上接着刚才的进度看，完美的体验</p>
<h2 id>网络结构</h2>
<p>目前我的硬件设备是以下几个</p>
<ul>
<li>Router: Asus ac68u</li>
<li>Nas: Synology DS218+</li>
<li>Ups: APC BK650</li>
<li>树莓派: Type 2B<br>
我这一套网络核心设备成本大约在6000元左右，结合以上种种好处，这个价格并不是不能被接受，也就相当于一个低配iphine8差不多的价格<br>
这套设备可以无形中提升你的使用体验，增加你的依赖性</li>
</ul>
<p>我自己折腾的核心是用更加专业的设备去做专业的事，换来更好整体体验</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[干掉被Google.hk强奸的关键词过滤]]></title><description><![CDATA[<!--kg-card-begin: markdown--><blockquote>
<p>听说Google HK的简体中文自带r18过滤且不可关闭,不爽,干掉他</p>
</blockquote>
<h1 id>常规方法</h1>
<p>打开Google时直接访问http://www.google.com/ncr<br>
ncr是<code>no country redirection</code>,是一个强制不跳转的命令</p>
<h1 id="chrome">但是最多的场景是Chrome直接搜索</h1>
<p>去Chrome的设置,在管理搜索引擎中,新加一个搜索引擎,名字就叫做<code>Google Global</code>吧</p>
<p>关键字随意,叫<code>google.com</code>吧</p>
<p>查询网址最重要了,从网页源码中把Google自带的扒出来了,强制使用https的不带.hk</p>
<pre><code>https://www.google.com/search?q=%s&amp;{google:RLZ}{google:originalQueryForSuggestion}{google:assistedQueryStats}{google:searchFieldtrialParameter}{google:iOSSearchLanguage}</code></pre>]]></description><link>https://mcdona1d.me/gan-diao-google-hk/</link><guid isPermaLink="false">5db2a2ca53ae510001441549</guid><dc:creator><![CDATA[mcdona1d]]></dc:creator><pubDate>Tue, 22 Aug 2017 08:47:38 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><blockquote>
<p>听说Google HK的简体中文自带r18过滤且不可关闭,不爽,干掉他</p>
</blockquote>
<h1 id>常规方法</h1>
<p>打开Google时直接访问http://www.google.com/ncr<br>
ncr是<code>no country redirection</code>,是一个强制不跳转的命令</p>
<h1 id="chrome">但是最多的场景是Chrome直接搜索</h1>
<p>去Chrome的设置,在管理搜索引擎中,新加一个搜索引擎,名字就叫做<code>Google Global</code>吧</p>
<p>关键字随意,叫<code>google.com</code>吧</p>
<p>查询网址最重要了,从网页源码中把Google自带的扒出来了,强制使用https的不带.hk</p>
<pre><code>https://www.google.com/search?q=%s&amp;{google:RLZ}{google:originalQueryForSuggestion}{google:assistedQueryStats}{google:searchFieldtrialParameter}{google:iOSSearchLanguage}{google:searchClient}{google:sourceId}{google:instantExtendedEnabledParameter}{google:contextualSearchVersion}ie={inputEncoding}
</code></pre>
<p>保存设置为默认引擎,再试试,搞定</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[D54250 安装 macOS 10.12.6 黑苹果]]></title><description><![CDATA[<!--kg-card-begin: markdown--><blockquote>
<p>注1: 安装黑苹果是一个十分玄学的过程,请准备好十足的耐心<br>
注2:在你我硬件<strong>完全</strong>相同的情况下,也不保证按照此流程可以顺利安装成功.所以请尽量按照此流程来操作</p>
</blockquote>
<hr>
<blockquote>
<p>因为手贱在本来趋近完美的10.11.7上安装了一个安全性更新,导致系统再也启动不了了.问题也不好排查,虽然可以通过TimeMachine恢复至没问题的状态,可是AppStore上总有个数字1看着也不痛快.那就升级10.12.6吧.顺便把网卡也升级一下,这样硬件基本就没有遗憾了</p>
</blockquote>
<h2 id>硬件配置</h2>
<ul>
<li><a href="http://ark.intel.com/products/76977/Intel-NUC-Kit-D54250WYK">Intel® NUC Kit D54250WYK</a></li>
<li>CPU: Intel® Core™ i5-4250U Processor (3M Cache, up to 2.60 GHz)</li>
<li>Graphics: Intel® HD Graphics 5000</li>
<li>Codec: Realtek ALC283</li>
<li>Memory: Crucial DDR3L 1.</li></ul>]]></description><link>https://mcdona1d.me/d54250-an-zhuang-macos-10-12-6-hei-ping-guo/</link><guid isPermaLink="false">5db2a2ca53ae510001441550</guid><dc:creator><![CDATA[mcdona1d]]></dc:creator><pubDate>Sun, 20 Aug 2017 15:50:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><blockquote>
<p>注1: 安装黑苹果是一个十分玄学的过程,请准备好十足的耐心<br>
注2:在你我硬件<strong>完全</strong>相同的情况下,也不保证按照此流程可以顺利安装成功.所以请尽量按照此流程来操作</p>
</blockquote>
<hr>
<blockquote>
<p>因为手贱在本来趋近完美的10.11.7上安装了一个安全性更新,导致系统再也启动不了了.问题也不好排查,虽然可以通过TimeMachine恢复至没问题的状态,可是AppStore上总有个数字1看着也不痛快.那就升级10.12.6吧.顺便把网卡也升级一下,这样硬件基本就没有遗憾了</p>
</blockquote>
<h2 id>硬件配置</h2>
<ul>
<li><a href="http://ark.intel.com/products/76977/Intel-NUC-Kit-D54250WYK">Intel® NUC Kit D54250WYK</a></li>
<li>CPU: Intel® Core™ i5-4250U Processor (3M Cache, up to 2.60 GHz)</li>
<li>Graphics: Intel® HD Graphics 5000</li>
<li>Codec: Realtek ALC283</li>
<li>Memory: Crucial DDR3L 1.35v 1600 4G *2</li>
<li>SSD: SAMSUNG 850 EVO 250G MSATA</li>
<li>Wireless Adapter: Dell DW1550 (BCM94352/20702 combo)</li>
</ul>
<h2 id="macos10117">之前的 <code>macOS 10.11.7</code></h2>
<p>之前运行的系统为<code>OS X El Capitan</code>的最后一个大版本,但是良心的苹果在新系统推出之后继续推送系统安全性补丁及Safari和iTunes的更新<br>
之前我是用的无线网卡为<code>BCM94322HM8L</code>,一块17块钱包邮的神卡,支持5Ghz wifi(<code>802.11n</code>,非<code>802.11ac</code>),不具备蓝牙功能,mac系统下完美免驱,在刷写硬件ID后可解锁更多支持网段,并且设备名变<code>AirPort Extreme</code>,是最佳的黑苹果<strong>试机卡</strong><br>
在之前的黑苹果中,系统趋于完美,美中不足的是通过<code>hdmi</code>和<code>miniDP</code>输出画面时,并不能同时输出声音,只能通过3.5mm耳机接口输出,此外由于硬件限制,在蓝牙残缺的情况下,也不能使用AirDrop和handoff等非常必要实际的功能,所以更换网卡便成了完美黑苹果在硬件上的最后一步</p>
<h2 id="macos10126">更新至 <code>macOS 10.12.6</code></h2>
<p>作为目前主要mac的最后一版系统,更新到此版本更是让黑苹果在软件商离完美更近了一步</p>
<h3 id="macossierra">制作原版<code>macOS Sierra</code>安装优盘</h3>
<blockquote>
<p>以下流程可能略有删减,以<a href="https://www.tonymacx86.com/threads/customacmini-2014-intel-nuc-haswell-i5-4250u-sierra.201537/">此链接</a>的详细教程为准</p>
</blockquote>
<ol>
<li>先在白苹果的AppStore下,下载<code>macOS Sierra</code></li>
<li>准备一个大于8G的优盘,使用GUID分区表格式化成<code>Mac OS Extended (Journaled)</code>,名称为<code>USB</code>(下面会用到)</li>
<li>执行以下命令,将<code>macOS Sierra</code>写入优盘</li>
</ol>
<pre><code>sudo /Applications/Install\ macOS\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/USB/ --applicationpath /Applications/Install\ macOS\ Sierra.app --nointeraction
</code></pre>
<ol start="4">
<li>安装<code>Clover</code>引导(<strong>重要</strong>)
<ol>
<li>安装<code>Clover_v2.4k_r4173</code>到优盘,自定义安装项如图<br>
<img src="https://mcdona1d.me/content/images/2018/05/18151a3b-50e9-4de3-bc1a-63f3c7ea82a7.png" alt="18151a3b-50e9-4de3-bc1a-63f3c7ea82a7"><br>
<img src="https://mcdona1d.me/content/images/2018/05/7f59851d-67cf-4189-93ac-368ff2f2cfdf.png" alt="7f59851d-67cf-4189-93ac-368ff2f2cfdf"></li>
</ol>
</li>
<li>安装完成后,拷贝<code>Sebinouse_20160925.zip</code>的clover文件夹中的内容到<code>/Volumes/EFI/EFI/CLOVER</code>中,安装优盘制作完成</li>
</ol>
<h3 id="bios">修改BIOS</h3>
<blockquote>
<p>建议在修改BIOS前先F9恢复默认设置,然后F10保存,重启,再进入BIOS进行更改</p>
</blockquote>
<p>启动时在INTEL LOGO出现时,摁 F2 进入 BIOS<br>
以下为具体更改项:</p>
<ol>
<li>
<p>Boot &gt; Boot Priority.<br>
Enable 'UEFI Boot' and disable 'Legacy Boot' :</p>
</li>
<li>
<p>Boot &gt; Boot Configuration<br>
Enable 'Boot USB Devices First'<br>
Disable 'Network Boot'</p>
</li>
<li>
<p>Power &gt; Secondary Power Settings<br>
Set Wake on LAN from S4/S5 to &quot;Stay Off&quot;</p>
</li>
<li>
<p>Security &gt; Intel(R) VT for Directed I/O (VT-d).<br>
Disable 'VT-d'</p>
</li>
<li>
<p>Devices &gt; Video.<br>
Set the &quot;IGD Minimum Memory&quot; to 128 Mo</p>
</li>
</ol>
<h3 id="macossierra">正式安装 macOS Sierra</h3>
<p>将优盘插入后置USB接口(安装过程中所有涉及USB操作均建议使用后置USB接口),启动<br>
在Clover GUI中选择<code>Install Mac OS X from USB</code></p>
<h3 id>安装完成</h3>
<p>安装完成后,继续使用优盘的引导进入系统并初始化系统创建账户<br>
将所有需要的文件考入系统中<br>
打开终端,执行</p>
<pre><code>sudo spctl --master-disable
</code></pre>
<p>输入密码,既可打开任何来源</p>
<p>安装clover到硬盘,具体参数同制作优盘<br>
安装完成后finder左侧出现efi分区,将Sebinouse_20160925.zip`的clover文件夹中的内容到efi分区的clover文件夹下,合并<br>
解压 ccc.zip,将其拖动(安装)到应用程序<br>
拔掉优盘,重新启动</p>
<h3 id="bcm20702a0">激活蓝牙(BCM20702A0)</h3>
<blockquote>
<p>主要参考文章中使用的网卡由于免驱的原因,没有对网卡部分做任何提及.对于我使用的<code>bcm94352</code>,需要额外使用<code>kext</code>来驱动</p>
</blockquote>
<p>由于此网卡的特性,需要在开机时给网卡注入驱动才能正确运行,win及linux都支持此功能,mac不支持<br>
参照<a href="https://github.com/the-darkvoid/BrcmPatchRAM">此开源项目</a>的方法,首选使用win类系统(我使用的win pe,免安装),在设备管理器中找到名为<code>BCM20702A0</code>的设备,查看硬件ID,比如我的卡(Dell DW1550)两个值分别为</p>
<pre><code>USB\VID_413C&amp;PID_8143&amp;REV_0112
USB\VID_413C&amp;PID_8143
</code></pre>
<p>在项目对应的README中,根据<code>PID</code>和<code>VID</code>找到对应项目,说明此网卡是被此驱动所支持的</p>
<pre><code>Tested PatchRAM devices:

[0489:e032] 20702 Combo USB
[0489:e042] 20702A1 Lenovo China *
[0489:e079] Lenovo China 43162 NGFF
...
...
...
[13d3:3435] Azurewave (4352/20702 combo)
[13d3:3456] Azurewave (4352/20702 combo)
[413c:8143] Dell DW1550 (4352/20702 combo)
</code></pre>
<p>总结最终的使用方法为挂在<code>EFI</code>分区,复制项目中的<code>BrcmFirmwareData.kext</code>及<code>BrcmPatchRAM2.kext</code>到<code>EFI/Clover/kexts/10.12/</code>目录中<br>
重启电脑,在加载苹果系统时会有文字输出,此时在注入驱动,完成后会自动重启,检查是否开启成功,如未成功,建议多重启几次<br>
成功的标志为,系统偏好设置中出现蓝牙面板,可以搜索并连接到设备,如出现但搜索不到,再次重启</p>
<h3 id="bcm94352">开启无线网卡(BCM94352)</h3>
<blockquote>
<p>在主要的参考帖中,他使用的无线网卡为苹果官网的<code>bcm4360</code>,可能是macbook air的拆机卡,完全免驱.缺点是需要转接才能使用.我使用的卡为bcm94352,苹果自带的驱动依然可以原生驱动,但是需要做一些小改动</p>
</blockquote>
<blockquote>
<p><strong>此步骤的<code>流程3及以后操作</code>在我打包的<code>clover</code>中已包含,无需重复操作</strong></p>
</blockquote>
<ol>
<li>打开文件</li>
</ol>
<pre><code>sudo vim /System/Library/Extensions/IO80211Family.kext/Contents/PlugIns/AirPortBrcm4360.kext/Contents/Info.plist
</code></pre>
<ol start="2">
<li>找到以下字段,增加一行<code>&lt;string&gt;pci14e4,43b1&lt;/string&gt;</code>,修改完成后如下</li>
</ol>
<pre><code>&lt;key&gt;IONameMatch&lt;/key&gt;
&lt;array&gt;
    &lt;string&gt;pci14e4,43ba&lt;/string&gt;
    &lt;string&gt;pci14e4,43a3&lt;/string&gt;
    &lt;string&gt;pci14e4,43b1&lt;/string&gt;
    &lt;string&gt;pci14e4,43a0&lt;/string&gt;
    &lt;string&gt;pci14e4,4331&lt;/string&gt;
    &lt;string&gt;pci14e4,4353&lt;/string&gt;
&lt;/array&gt;
</code></pre>
<ol start="3">
<li><strong>重启!一定要重启!</strong></li>
<li>打开<code>clover configurator</code>挂载EFI分区</li>
<li>打开EFI分区中的<code>config.plist</code></li>
<li>进入<code>Kernel and Kext Patches</code>标签</li>
<li>在 <code>KextsToPatch</code>中增加以下条目<br>
|name*|find*[HEX]|replace*[HEX]|Comment|MatchOS|<br>
|:--:|:--:|:--:|:--:|:--:|<br>
|AirPortBrcm4360|81F952AA00007529|81F952AA00006690|AirPortBrcm4360|10.12.<em>|<br>
|AirPortBrcm4360|6B100000750D|6B1000009090|AirPort Extreme|10.12.</em>|</li>
<li>保存编辑后的<code>config.plist</code></li>
<li>重启,wifi工作正常,5Ghz正常,系统报告中型号显示正常,Airdrop支持</li>
</ol>
<p><strong>此时第一个玄学来了,HDMI及miniDP的音频输出已经可以正常使用!</strong><br>
连接wifi,进行下一步需要使用网络,并且需要已有音频设备</p>
<h3 id="alc283">修复音频输出(ALC283)</h3>
<blockquote>
<p>3.5mm接口的输出是本次黑苹果中最后解决的问题.在解决过程中也遇到了第二个玄学,就是驱动完成后,不能打开系统偏好设置中的声音面板,否则会掉声卡驱动,造成声音失真,空洞,自动忽略人声</p>
</blockquote>
<p>此解决方法主要参考了主参考文档的#82的方法,如图<br>
<img src="https://mcdona1d.me/content/images/2018/05/fa408eed-c0d8-4157-840f-f6367bddfe44.png" alt="fa408eed-c0d8-4157-840f-f6367bddfe44"></p>
<p>使用项目为:<a href="https://github.com/toleda/audio_CloverALC">https://github.com/toleda/audio_CloverALC</a><br>
具体做法是</p>
<ol>
<li>在保证appleHDA.kext干净的情况下</li>
<li>挂在系统的EFI分区</li>
<li>下载此项目源码</li>
<li>解压audio_cloverALC-120.command.zip</li>
<li>打开解压出来的audio_cloverALC-120_v1.0f3.command</li>
<li>输入账户密码,yyy</li>
<li>重启</li>
</ol>
<h3 id="imessage">修改序列号,激活iMessage</h3>
<blockquote>
<p>macOS每次开机时,<code>ROM(UUID生成)</code>和<code>MLB(Board Serial Number)</code>是标准和唯一的OS值.如果该值从开机启动发生变化,那么iMessage会无法激活,苹果将把你的UUID,序列号或苹果ID拉入黑名单,<code>Clover</code>生成的<code>ROM</code>和<code>MLB</code>值也自动列入黑名单.而黑苹果没有官方授予的这些值,如果不手工设置,则被列入黑名单,无法使用iMessage,FaceTime和Siri</p>
</blockquote>
<ol>
<li>
<p>打开<code>clover configurator</code>挂载EFI分区</p>
</li>
<li>
<p>打开EFI分区中的<code>config.plist</code></p>
</li>
<li>
<p>进入<code>SMBIOS</code>标签</p>
</li>
<li>
<p>点击<code>Serial Number</code>下的<code>Generate New</code>,会自动生成一组<code>Serial Number</code>和<code>Board Serial Number</code><br>
<img src="https://mcdona1d.me/content/images/2018/05/a5f68af5-858e-4a4e-9e20-3fb9bc91685f.png" alt="a5f68af5-858e-4a4e-9e20-3fb9bc91685f"></p>
</li>
<li>
<p>复制新生成的<code>Serial Number</code>,去苹果官网<a href="https://checkcoverage.apple.com/cn/zh/">查询序列号</a></p>
</li>
<li>
<p>如果得到的结果为<strong>很抱歉，这个序列号无效。请检查您的信息并再试一次。</strong>,则此序列号可以使用,如果可以查询到设备信息,则再次生成一个<br>
<img src="https://mcdona1d.me/content/images/2018/05/f2775645-cb93-4880-998e-aaa22f7b6433.png" alt="f2775645-cb93-4880-998e-aaa22f7b6433"></p>
</li>
<li>
<p>完成后点击<code>System Parameters</code>标签,在<code>Custom UUID</code>旁点击<code>Generate New</code>,生成一个新的<code>UUID</code>,复制此<code>UUID</code>到<code>SMBIOS</code>的<code>SmUUID</code>下</p>
</li>
<li>
<p>保存编辑后的<code>config.plist</code></p>
</li>
<li>
<p>依次执行以下命令,删除文件</p>
</li>
</ol>
<pre><code>sudo rm -rf ~/Library/Caches/com.apple.messages
sudo rm -rf ~/Library/Caches/com.apple.imfoundation.IMRemoteURLConnectionAgent
sudo rm -rf ~/Library/Preferences/com.apple.ichat*
sudo rm -rf ~/Library/Preferences/com.apple.imagent*
sudo rm -rf ~/Library/Preferences/com.apple.imessage*
sudo rm -rf ~/Library/Preferences/com.apple.imservice*
sudo rm -rf ~/Library/Messages
</code></pre>
<ol start="10">
<li>打开磁盘工具,选择系统分区,点击急救<br>
<img src="https://mcdona1d.me/content/images/2018/05/efc35b03-7190-400d-bb4a-f424b5c6b066.png" alt="efc35b03-7190-400d-bb4a-f424b5c6b066"></li>
<li>重启系统,登陆iMessage</li>
</ol>
<h3 id>杂项,收尾及注意事项</h3>
<ol>
<li>建议处理完成所有操作之后,使用time machine进行一次完整备份</li>
<li>在<code>clover configurator</code>可以修改为自己喜欢的Clover主题<br>
编辑硬盘为Macintosh HD,下方的时间定义为3s,可自动跳过clover加载,如设置为0则直接跳过</li>
<li>定期进行Time machine操作</li>
<li>如果安装appstore中的系统或安全更新,务必先进行time machine备份</li>
</ol>
<h2 id>目前完美程度及问题</h2>
<p>黑苹果不可能做到100%的完美,在未解决的问题中,对日常使用基本没有任何影响<br>
所以我认为,到目前为止,基本做到了99%的完美程度</p>
<p><strong>测试并完美驱动的项目:</strong></p>
<ul>
<li><code>CPU</code>频率动态(通过Intel Power Gadget查看)</li>
<li><code>HD5000</code>正常,显存动态</li>
<li>有线网卡内建,(系统报告中显示为<code>en0</code>,<code>App Store</code>正常)</li>
<li>无线网卡正常(系统报告中显示为<code>AirPort Extreme</code>,<code>5Ghz</code>支持,<code>AirDrop</code>支持)</li>
<li>蓝牙正常(<code>AirDrop</code>支持,<code>Handoff</code>支持)</li>
<li><code>HDMI</code>&amp;<code>miniDP</code>视频及音频输出正常</li>
<li><code>3.5mm</code>耳机麦克风复合接口输出正常</li>
<li><code>iMessage</code>&amp;<code>FaceTime</code>正常</li>
<li><code>SSD Trim</code>开启</li>
<li><code>USB2.0</code>&amp;<code>USB3.0</code>正常</li>
<li>关机后可以自动断电</li>
<li>睡眠重新唤醒后网络正常</li>
</ul>
<p><strong>目前的问题为:</strong></p>
<ul>
<li>开机走进度条花屏</li>
<li>NUC自带的IR接收器可能没有驱动,未测试.白苹果应该是支持此功能的,但是我基本没有需求,就没有去搞</li>
<li>使用HDMI或miniDP输出音频时,不可以调整输出音量</li>
<li>长时间打开系统偏好设置中的声音面板,会导致3.5mm输出异常,通过切换输入输出标签可以恢复,但是一定时间后依然会导致异常,彻底解决办法为重启</li>
<li>3.5mm复合音频接口插入苹果耳机有波形显示,但是不能正常使用,可能是不兼容苹果耳机标准</li>
</ul>
<p><strong>没有测试的项目:</strong></p>
<ul>
<li>开启HiDPI,没有对应的显示器,无法测试</li>
</ul>
<h2 id>参考</h2>
<ul>
<li>
<p>10.12.6安装主要参考文章<br>
<a href="https://www.tonymacx86.com/threads/customacmini-2014-intel-nuc-haswell-i5-4250u-sierra.201537/">https://www.tonymacx86.com/threads/customacmini-2014-intel-nuc-haswell-i5-4250u-sierra.201537/</a></p>
</li>
<li>
<p>BCM20702A0 蓝牙驱动方法主要参考<br>
<a href="https://github.com/the-darkvoid/BrcmPatchRAM">https://github.com/the-darkvoid/BrcmPatchRAM</a></p>
</li>
<li>
<p>BCM94352HMB wifi驱动方法主要参考文章<br>
<a href="http://bbs.pcbeta.com/viewthread-1693529-1-2.html">http://bbs.pcbeta.com/viewthread-1693529-1-2.html</a><br>
<a href="http://bbs.pcbeta.com/forum.php?mod=viewthread&amp;tid=1504926">http://bbs.pcbeta.com/forum.php?mod=viewthread&amp;tid=1504926</a></p>
</li>
<li>
<p>Realtek ALC283 声卡驱动方法主要参考<br>
<a href="https://github.com/toleda/audio_CloverALC">https://github.com/toleda/audio_CloverALC</a></p>
</li>
<li>
<p>修复iMessage主要参考文章<br>
<a href="http://www.haolie.net/thread-675.htm">http://www.haolie.net/thread-675.htm</a></p>
</li>
</ul>
<h2 id>两个玄学</h2>
<ul>
<li>
<p>安装完wifi之后hdmi输出自动回复</p>
</li>
<li>
<p>不能打开系统偏好设置中的声音选项,否则会掉驱动</p>
</li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[macOS中使用命令将ISO写入U盘]]></title><description><![CDATA[<!--kg-card-begin: markdown--><ol>
<li>查看u盘挂载位置</li>
</ol>
<pre><code>➜  ~ diskutil list
/dev/disk0 (internal):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                         251.0 GB   disk0
   1:                        EFI EFI                     314.6 MB   disk0s1
   2:          Apple_CoreStorage Macintosh HD            250.0 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3

/dev/disk1 (internal, virtual):
   #:                       TYPE NAME                    SIZE</code></pre>]]></description><link>https://mcdona1d.me/macoszhong-shi-yong-ming-ling-jiang-isoxie-ru-upan/</link><guid isPermaLink="false">5db2a2ca53ae510001441546</guid><dc:creator><![CDATA[mcdona1d]]></dc:creator><pubDate>Tue, 28 Mar 2017 09:09:06 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><ol>
<li>查看u盘挂载位置</li>
</ol>
<pre><code>➜  ~ diskutil list
/dev/disk0 (internal):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                         251.0 GB   disk0
   1:                        EFI EFI                     314.6 MB   disk0s1
   2:          Apple_CoreStorage Macintosh HD            250.0 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3

/dev/disk1 (internal, virtual):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           +249.7 GB   disk1
                                 Logical Volume on disk0s2
                                 A49055F0-BF95-473D-8454-DEFB279E4D5C
                                 Unencrypted

/dev/disk3 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.7 GB    disk3
   1:             Windows_FAT_32 NO NAME                 15.7 GB    disk3s1

</code></pre>
<ol start="2">
<li>umount 卸载u盘</li>
</ol>
<pre><code>➜  ~ sudo diskutil unmountDisk /dev/disk3
Unmount of all volumes on disk3 was successful
</code></pre>
<p>3、将镜像写入U盘</p>
<pre><code>➜  ~ sudo dd if=/Volumes/ExtraData/System/CentOS-6.7-x86_64-bin-DVD1.iso of=/dev/disk3 bs=1m
3715+0 records in
3715+0 records out
3895459840 bytes transferred in 138.002629 secs (28227432 bytes/sec)
</code></pre>
<p>4、写入过程中没有提示,可以使用iostat命令查看磁盘写入状态<br>
根据disk3的<code>MB/s</code>可以看到正在写入磁盘</p>
<pre><code>➜  ~ iostat -w 2
              disk0               disk2               disk3       cpu    load average
    KB/t  tps  MB/s     KB/t  tps  MB/s     KB/t  tps  MB/s  us sy id   1m   5m   15m
   32.70  116  3.72    60.41    0  0.02     4.17    4  0.02  12  8 80  3.56 3.14 2.74
    4.80    7  0.04   512.00   50 24.97     4.00 6233 24.35   3 31 66  3.56 3.14 2.74
    0.00    0  0.00   512.00   48 23.98     4.00 6091 23.79   1 31 68  3.35 3.10 2.73
    0.00    0  0.00   512.00   48 23.99     4.00 6322 24.69   1 30 69  3.35 3.10 2.73
    0.00    0  0.00   512.00   51 25.49     4.00 6599 25.78   2 30 69  3.35 3.10 2.73
    8.57    7  0.06   512.00   52 25.93     4.00 6563 25.64   2 29 69  3.25 3.08 2.73
    5.69   13  0.07   512.00   56 27.98     4.00 7239 28.28   4 27 69  3.25 3.08 2.73
    8.45   31  0.26   488.32   51 24.51     4.00 6344 24.78   2 29 69  3.15 3.06 2.72
   21.17   89  1.84   512.00   53 26.49     4.00 6710 26.21   2 27 71  3.15 3.06 2.72
    6.00    9  0.05   512.00   60 29.98     4.00 7447 29.09   2 25 73  3.15 3.06 2.72
    9.00    4  0.04   512.00   60 29.99     4.00 7908 30.89   1 24 75  3.05 3.05 2.72
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[VMware Fusion关闭分辨率自动适配]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>mac os下在VMware Fusion安装Windows 7，不论怎么设置，总是自动的修改屏幕分辨率到最优分辨率，但是MAC的最优分辨率太高，在Windows下面完全没有办法看。改高dpi的方法也会造成许多软件不兼容导致的文字显示不完整，所以关闭分辨率适配是最佳的办法。</p>
<p>1.打开终端</p>
<pre><code>vim ~/Library/Preferences/VMware\ Fusion/preferences
</code></pre>
<p>2.在末尾添加两行：</p>
<pre><code>pref.autoFitGuestToWindow = &quot;FALSE&quot;
pref.autoFitFullScreen = &quot;stretchGuestToHost&quot;
</code></pre>
<blockquote>
<p>第一行表示关闭自动适配客户端分辨率<br><br>
第二行表示当全屏切换的时候关闭自动适配分辨率</p>
</blockquote>
<p>3.关闭Vmware，重新启动Vmware和虚拟机即可。</p>
<p>此解决办法的出处：<a href="https://communities.vmware.com/thread/456215">https://communities.vmware.com/thread/456215</a></p>
<!--kg-card-end: markdown-->]]></description><link>https://mcdona1d.me/vmware-fusionguan-bi-fen-bian-lu-zi-dong-gua-pei/</link><guid isPermaLink="false">5db2a2ca53ae510001441545</guid><dc:creator><![CDATA[mcdona1d]]></dc:creator><pubDate>Fri, 17 Mar 2017 03:34:22 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>mac os下在VMware Fusion安装Windows 7，不论怎么设置，总是自动的修改屏幕分辨率到最优分辨率，但是MAC的最优分辨率太高，在Windows下面完全没有办法看。改高dpi的方法也会造成许多软件不兼容导致的文字显示不完整，所以关闭分辨率适配是最佳的办法。</p>
<p>1.打开终端</p>
<pre><code>vim ~/Library/Preferences/VMware\ Fusion/preferences
</code></pre>
<p>2.在末尾添加两行：</p>
<pre><code>pref.autoFitGuestToWindow = &quot;FALSE&quot;
pref.autoFitFullScreen = &quot;stretchGuestToHost&quot;
</code></pre>
<blockquote>
<p>第一行表示关闭自动适配客户端分辨率<br><br>
第二行表示当全屏切换的时候关闭自动适配分辨率</p>
</blockquote>
<p>3.关闭Vmware，重新启动Vmware和虚拟机即可。</p>
<p>此解决办法的出处：<a href="https://communities.vmware.com/thread/456215">https://communities.vmware.com/thread/456215</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[删除Chrome地址栏记录中不需要的网址(访问历史)]]></title><description><![CDATA[<!--kg-card-begin: markdown--><blockquote>
<p>Chrome的地址栏自动补齐功能提供了非常方便的地址预测功能<br>
浏览器可以通过用户当前输入的字符来与用户的访问历史与书签匹配<br>
然后在下拉栏中为用提供准确的补齐方案排名, 提高用户访问效率</p>
</blockquote>
<blockquote>
<p>在大部分情况下, 这个功能是非常好用的<br>
但是有时, 出于某些原因, 用户需要移除某个记录(网址无法访问,网址更换域名等)<br>
Chrome提供了组合键<code>Shift+Delete</code>来删除地址栏下拉记录中的某个网址</p>
</blockquote>
<h4 id>实际操作</h4>
<ol>
<li>在地址栏中输入所需删除网址的完整URL或部分关键字</li>
<li>使用<code>↑</code>键或<code>↓</code>键移动蓝色高亮选框,使用 <code>Page Up</code>或<code>Page Down</code>移动蓝色高亮选框到首项或末项</li>
<li>使用<code>Shift+Delete</code>来删除选中记录</li>
<li>再次输入关键字, 补齐方案中已没有了已删除的记录</li>
</ol>
<p><strong>注意: 已加入书签的URL会在左侧显示☆号, 这部分记录必须在书签中删除</strong></p>
<!--kg-card-end: markdown-->]]></description><link>https://mcdona1d.me/shan-chu-chromedi-zhi-lan-ji-lu-zhong-bu-xu-yao-de-wang-zhi-fang-wen-li-shi/</link><guid isPermaLink="false">5db2a2ca53ae510001441544</guid><dc:creator><![CDATA[mcdona1d]]></dc:creator><pubDate>Mon, 06 Mar 2017 09:06:07 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><blockquote>
<p>Chrome的地址栏自动补齐功能提供了非常方便的地址预测功能<br>
浏览器可以通过用户当前输入的字符来与用户的访问历史与书签匹配<br>
然后在下拉栏中为用提供准确的补齐方案排名, 提高用户访问效率</p>
</blockquote>
<blockquote>
<p>在大部分情况下, 这个功能是非常好用的<br>
但是有时, 出于某些原因, 用户需要移除某个记录(网址无法访问,网址更换域名等)<br>
Chrome提供了组合键<code>Shift+Delete</code>来删除地址栏下拉记录中的某个网址</p>
</blockquote>
<h4 id>实际操作</h4>
<ol>
<li>在地址栏中输入所需删除网址的完整URL或部分关键字</li>
<li>使用<code>↑</code>键或<code>↓</code>键移动蓝色高亮选框,使用 <code>Page Up</code>或<code>Page Down</code>移动蓝色高亮选框到首项或末项</li>
<li>使用<code>Shift+Delete</code>来删除选中记录</li>
<li>再次输入关键字, 补齐方案中已没有了已删除的记录</li>
</ol>
<p><strong>注意: 已加入书签的URL会在左侧显示☆号, 这部分记录必须在书签中删除</strong></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[编译Bash 实现rsyslog远程审计]]></title><description><![CDATA[在中小型企业，公司不同运维人员基本都是以root 账户进行服务器的登陆管理，缺少了账户权限审计制度。不出问题还好，出了问题，就很难找出源头。
　　这里介绍下，如何利用编译bash使不同的客户端在使用root登陆服务器时，记录各自的操作，并且可以在结合ELK 日志分析系统，来收集登陆操作日志]]></description><link>https://mcdona1d.me/bash-bian-yi-shi-xian-rsyslogyuan-cheng-shen-ji/</link><guid isPermaLink="false">5db2a2ca53ae510001441547</guid><dc:creator><![CDATA[mcdona1d]]></dc:creator><pubDate>Thu, 08 Sep 2016 07:07:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id>出发点</h2>
<p>在中小型企业，公司不同运维人员基本都是以root 账户进行服务器的登陆管理，缺少了账户权限审计制度。不出问题还好，出了问题，就很难找出源头。<br>
　　这里介绍下，如何利用编译bash使不同的客户端在使用root登陆服务器时，记录各自的操作，并且可以在结合ELK 日志分析系统，来收集登陆操作日志</p>
<h2 id>环境</h2>
<ul>
<li>CentOS 6.7</li>
<li>Development tools</li>
<li>SElinux 关闭</li>
</ul>
<h2 id>搭建部署</h2>
<h3 id="bash">下载bash源码</h3>
<pre><code class="language-bash">[root@yum_repo bin]# wget http://ftp.gnu.org/gnu/bash/bash-4.1.tar.gz
[root@yum_repo bin]# tar xvf bash-4.1.tar.gz
[root@yum_repo bin]# cd bash-4.1
</code></pre>
<h3 id="bashsyslog">修改bash源码，开启syslog功能</h3>
<p>先修改<code>config-top.h</code>文件，删除以下行注释（注释符号是<code>/* */</code>）修改如下：</p>
<pre><code class="language-cpp">/* #define SYSLOG_HISTORY */
</code></pre>
<p>修改为：</p>
<pre><code class="language-cpp">#define SYSLOG_HISTORY
</code></pre>
<p>然后修改以下行：</p>
<pre><code class="language-cpp">#if defined (SYSLOG_HISTORY)
# define SYSLOG_FACILITY LOG_USER
# define SYSLOG_LEVEL LOG_INFO
#endif
</code></pre>
<p>修改为：</p>
<pre><code class="language-cpp">#if defined (SYSLOG_HISTORY)
# define SYSLOG_FACILITY LOG_LOCAL1
# define SYSLOG_LEVEL LOG_DEBUG
#endif
</code></pre>
<p>修改下<code>bashhist.c</code>文件，根据自己的需要指定的格式，并传入相应的变量，修改如下：</p>
<pre><code class="language-cpp">void
bash_syslog_history (line)
const char *line;
{
char trunc[SYSLOG_MAXLEN];
 
if (strlen(line) &amp;lt; SYSLOG_MAXLEN)
syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, &quot;HISTORY: PID=%d UID=%d %s&quot;, getpid(), current_user.uid, line);
else
{
strncpy (trunc, line, SYSLOG_MAXLEN);
trunc[SYSLOG_MAXLEN - 1] = '\0';
syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, &quot;HISTORY (TRUNCATED): PID=%d UID=%d %s&quot;, getpid(), current_user.uid, trunc);
}
}
</code></pre>
<p>修改为：</p>
<pre><code class="language-cpp">void
bash_syslog_history (line)
const char *line;
{
char trunc[SYSLOG_MAXLEN];
 
if (strlen(line) &amp;lt; SYSLOG_MAXLEN)
syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, &quot;HISTORY: PPID=%d PID=%d SID=%d UID=%d User=%s %s&quot;, getppid(), getpid(), getsid(getpid()), current_user.uid, current_user.user_name, line);
else
{
strncpy (trunc, line, SYSLOG_MAXLEN);
trunc[SYSLOG_MAXLEN - 1] = '\0';
syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, &quot;HISTORY (TRUNCATED): PPID=%d PID=%d SID=%d UID=%d User=%s %s&quot;, getppid(), getpid(), getsid(getpid()), current_user.uid, current_user.user_name, trunc);
}
}
</code></pre>
<h3 id>编译安装</h3>
<pre><code class="language-bash">[root@yum_repo bash-4.1]# ./configure --prefix=/usr/local/bash_new
[root@yum_repo bash-4.1]# make &amp;&amp; make install
</code></pre>
<p>编译完成后，将新的bash 追加到 /etc/shells 中，并修改root用户的登陆shell 环境为新编译的shell。如下</p>
<pre><code class="language-bash">[root@yum_repo bash-4.1]# echo &quot;/usr/local/bash_new/bin/bash&quot; &gt;&gt; /etc/shells
[root@yum_repo bash-4.1]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/usr/local/bash_new/bin/bash
[root@yum_repo bash-4.1]# vim /etc/passwd
root:x:0:0:root:/root:/usr/local/bash_new/bin/bash
</code></pre>
<h2 id>检查效果</h2>
<h3 id="syslogng">使用syslog-ng</h3>
<h4 id="syslogng">安装syslog-ng</h4>
<pre><code class="language-bash">[root@yum_repo bash-4.1]# yum install syslog-ng
</code></pre>
<h4 id="syslogng">配置syslog-ng</h4>
<p>编辑<code>/etc/syslog-ng/syslog-ng.conf</code><br>
在末尾增加以下内容，将<code>local1</code>的<code>debug</code>级别日志输出到<code>/var/log/bash</code>文件中</p>
<pre><code>filter f_bash { facility(local1) and level(debug); };
destination d_bash { file(&quot;/var/log/bash&quot;); };
log { source(s_sys); filter(f_bash); destination(d_bash); };
</code></pre>
<p>配置完成后重启syslog-ng</p>
<pre><code>[root@yum_repo bash-4.1]# /etc/init.d/syslog-ng restart
</code></pre>
<h3 id="rsyslog">使用rsyslog</h3>
<h4 id="rsyslog">安装rsyslog（系统默认已安装）</h4>
<pre><code class="language-bash">[root@yum_repo bash-4.1]# yum install rsyslog
</code></pre>
<h4 id="rsyslog">配置rsyslog</h4>
<p>编辑<code>/etc/rsyslog.conf</code><br>
在末尾增加以下内容，将<code>local1</code>的<code>debug</code>级别日志输出到<code>/var/log/bash</code>文件中</p>
<pre><code>local1.debug  /var/log/bash
</code></pre>
<p>配置完成后重启rsyslog</p>
<pre><code>[root@yum_repo bash-4.1]# /etc/init.d/rsyslog restart
</code></pre>
<h3 id>最终效果</h3>
<p>注销当前root用户，重新登陆后，查看/var/log/bash，如下就可以看到记录了操作命令</p>
<pre><code class="language-bash">[root@yum_repo bin]# tail -f /var/log/bash 
Sep  2 16:43:51 localhost bash: HISTORY: PPID=1811 PID=7921 SID=9638 UID=0 User=root exit
Sep  2 16:44:01 localhost bash: HISTORY: PPID=1811 PID=8021 SID=9638 UID=0 User=root tail -f /var/log/bash 
Sep  2 16:44:33 localhost bash: HISTORY: PPID=8084 PID=8105 SID=8084 UID=0 User=root ls
Sep  2 16:44:37 localhost bash: HISTORY: PPID=8084 PID=8105 SID=8084 UID=0 User=root ps -ef
Sep  2 16:57:39 localhost bash: HISTORY: PPID=8084 PID=8105 SID=8084 UID=0 User=root history |grep wget
Sep  2 16:58:56 localhost bash: HISTORY: PPID=8084 PID=8105 SID=8084 UID=0 User=root cd /root/rpmbuild/
</code></pre>
<h2 id="rpm">打包成rpm包</h2>
<p>配置完成后的bash需要打包成rpm包然后发布在私有源中，方便所有机器批量部署</p>
<ol>
<li>将编辑好的bash源码重新打包成<code>.tar.gz</code>格式，之后置于<code>rpmbuild</code>工作目录的<code>SOURCES</code>文件夹中</li>
<li>在<code>SPECS</code>文件夹中新建<code>bash.spec</code></li>
</ol>
<pre><code>Name:Bash_with_syslog	
Version:v4.1
Release:	1%{?dist}
Summary:This bash is enable syslog to local1,and the level is debug	

Group:System Environment/Shells	
License:GPLv3 license	
URL:https://www.gnu.org/software/bash/
Source0:bash-4.1.tar.gz


%description
Bash with syslog

%prep
rm -rf /root/rpmbuild/BUILD/bash-4.1
zcat /root/rpmbuild/SOURCES/bash-4.1.tar.gz | tar -xvf -

%build
cd $RPM_BUILD_DIR/bash-4.1
./configure --prefix=/usr/local/logbash/
make 

%install
cd $RPM_BUILD_DIR/bash-4.1
make install DESTDIR=%{buildroot}

%files
%defattr(-,root,root)
/usr/local/logbash

%clean
cd $RPM_BUILD_DIR/bash-4.1
make clean
</code></pre>
<ol start="3">
<li><strong>build</strong></li>
</ol>
<h2 id>总结</h2>
<p>相对于使用<code>PROMPT_COMMAND</code>的方式，直接更改源码编译bash存在：<br>
优点：</p>
<ul>
<li>分发部署更加简单</li>
<li>命令开始执行时记录，而不是结束时记录</li>
</ul>
<p>问题：</p>
<ul>
<li>更换bash 和 sh 以外的shell操作不会被记录 依然存在</li>
<li>使用shell脚本只会记录执行的脚本名称，内容不会被记录 依然存在</li>
<li>被ssh远程执行的命令不会被记录 依然存在</li>
</ul>
<h2 id="rsyslogv8">rsyslog v8配置</h2>
<p><strong>Server:</strong></p>
<pre><code>template( name=&quot;hongjiu_bash_dyna&quot; type=&quot;string&quot; string=&quot;/data/command-audit/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log&quot; )
if ( $syslogfacility-text == &quot;local1&quot; ) then {
    action(type=&quot;omfile&quot; DynaFile=&quot;hongjiu_bash_dyna&quot;)
    stop
}
</code></pre>
<p><strong>Client:</strong></p>
<pre><code>local1.debug  /var/log/bash

if ($syslogfacility-text == &quot;local1&quot;) then {
        action(
        type=&quot;omfwd&quot;
        Target=&quot;es&quot;
        Port=&quot;514&quot;
        Protocol=&quot;tcp&quot;
        action.resumeRetryCount=&quot;-1&quot;
        name=&quot;action_forward_hongjiu_bash&quot;
        queue.filename=&quot;action_forward_hongjiu_bash&quot;
        queue.size=&quot;50000&quot;
        queue.dequeuebatchsize=&quot;1000&quot;
        queue.maxdiskspace=&quot;5G&quot;
        queue.type=&quot;linkedlist&quot;
        queue.maxfilesize=&quot;500M&quot;
        queue.saveonshutdown=&quot;on&quot;
    )
    stop
}
</code></pre>
<h2 id>参考</h2>
<ul>
<li><a href="http://blog.hellosa.org/2013/07/27/log-bash-history-to-syslog-on-centos-6.html">http://blog.hellosa.org/2013/07/27/log-bash-history-to-syslog-on-centos-6.html</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[SSH 在本地执行远程机器上的命令]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>在本地使用 <code>ssh $RemoteNode &lt;cmd&gt;</code>可以在执行远程机器上的命令，例如<code>ssh  user@node ls /local</code>会执行远程机器上的<code>ls /local</code>命令，如果想在远程机器上连续执行多条命令，可以用单引号或者双引号将这些命令括起来，</p>
<p>例如：<code>ssh user@node &quot;cd /local ; pwd ; ls&quot;</code></p>
<p>如果想在本地启动远程机器上的命令后就返回来，可以这样<code>ssh user@node &quot;/local/x.sh 1&gt;/dev/null 2&gt;&amp;1 &amp;&quot;</code></p>
<p>注意如果没有<code>&quot;</code></p>]]></description><link>https://mcdona1d.me/ssh-zai-ben-di-zhi-xing-yuan-cheng-ji-qi-shang-de-ming-ling/</link><guid isPermaLink="false">5db2a2ca53ae510001441541</guid><dc:creator><![CDATA[mcdona1d]]></dc:creator><pubDate>Tue, 06 Sep 2016 07:21:18 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>在本地使用 <code>ssh $RemoteNode &lt;cmd&gt;</code>可以在执行远程机器上的命令，例如<code>ssh  user@node ls /local</code>会执行远程机器上的<code>ls /local</code>命令，如果想在远程机器上连续执行多条命令，可以用单引号或者双引号将这些命令括起来，</p>
<p>例如：<code>ssh user@node &quot;cd /local ; pwd ; ls&quot;</code></p>
<p>如果想在本地启动远程机器上的命令后就返回来，可以这样<code>ssh user@node &quot;/local/x.sh 1&gt;/dev/null 2&gt;&amp;1 &amp;&quot;</code></p>
<p>注意如果没有<code>&quot;&quot;</code>例如<code>ssh user@node cd /local ; ls</code>则<code>ls</code>只会执行<code>cd /local</code>命令，<code>ls</code>命令在本地执行，加了双引号或者单引号，则被括起来的命令被当做ssh命令的一个参数，所以会在远程连续执行。</p>
<h2 id="ssh">单引号和双引号在ssh命令中的区别</h2>
<p>以一个例子来说明问题，</p>
<p>假设本地机器上配置了Java环境变量，在本地执行<code>echo $JAVA_HOME=/opt/jdk</code></p>
<p>假若我想查看远程机器上的JAVA环境变量，则只能使用单引号了，<code>ssh user@node 'echo $JAVA'</code>, 则是<code>' ' </code>中的<code>$JAVA</code>不会被shell解析，而是当做一个字符串，此时参数<code>echo $JAVA</code>传递给了ssh；</p>
<p>如果我们使用<code>ssh user@node &quot;echo $JAVA&quot;</code>，则shell首先会解析<code>$JAVA</code>，得到它的值，则该命令就变成了<code>ssh user@node 'echo /opt/jdk'</code>了</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Linux审计并收集history记录]]></title><description><![CDATA[实现功能：将每台服务器上用户执行的每条命令及当时的相关环境如登录IP、执行时所在目录、执行时间、登录时间、主机IP、用户名等信息收集到某台中心服务器。 用到的工具或服务：rsyslog、logger、logrotate。]]></description><link>https://mcdona1d.me/ri-zhi-guan-li-1-shen-ji-bing-shou-ji-historyji-lu/</link><guid isPermaLink="false">5db2a2ca53ae510001441540</guid><category><![CDATA[Linux]]></category><category><![CDATA[OPS]]></category><dc:creator><![CDATA[mcdona1d]]></dc:creator><pubDate>Tue, 23 Aug 2016 08:04:45 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><blockquote>
<p>实现功能：将每台服务器上用户执行的每条命令及当时的相关环境如登录IP、执行时所在目录、执行时间、登录时间、主机IP、用户名等信息收集到某台中心服务器。<br>
用到的工具或服务：rsyslog、logger、logrotate。</p>
</blockquote>
<p>先简单介绍相关的服务和用到的环境变量再整合实现：</p>
<h2 id="1logger">1、logger</h2>
<p>logger 是一个shell 命令接口，可以通过该接口使用rsyslog(rsyslog是syslog的加强版，如果系统是syslog也可以)的系统日志模块，还可以从命令行直接向系统日志文件（或者自定义的文件）写入一行信息。<br>
logger的用法，具体的参数可以用man查看。</p>
<pre><code>logger [-is] [-f file] [-p pri] [-t tag] [-u socket] [ message ... ]
</code></pre>
<p>常用的参数如下：</p>
<pre><code>-i     逐行记录每一次logger的进程ID。
-s     记录消息到标准错误, 包括系统日志。
-f     file 记录特定的文件(将file的内容作为message)。
-p     pri 输入消息的特定优先级。 优先级可以是自定义的数值或者诸如&quot;facility.level&quot;的格式. 举例： &quot;-p local3.info&quot;，local3 facility这个设备的消息级别为info。默认是&quot;user.notice&quot;
-t     tag 为每行信息打上特定的标签.
-u     sock 以特定的socket代替内嵌系统常规工作
-d     使用一个数据进程代替一个流连接到这个socket.
--     结束参数列表， 这个允许消息以一个“-”开始
</code></pre>
<p>其中&quot;facility.level&quot;与rsyslog中的一样。</p>
<h2 id="2rsysylog">2、rsysylog</h2>
<p>Linux系统日志信息分为两个部分内核信息和设备信息。共用配置文件/etc/rsyslog.conf<br>
内核信息 -&gt; klogd -&gt; syslogd -&gt; /var/log/messages等文件<br>
设备信息 -&gt; syslogd -&gt; /var/log/messages等文件<br>
其中设备可以使用自定义的设备local0-local7，使用自定义的设备照样可以将设备信息(日志)送给rsyslog。</p>
<h2 id="3prompt_command">3、PROMPT_COMMAND</h2>
<p>Linux系统的环境变量PROMPT_COMMAND的内容会在bash提示符显示之前被执行。该环境变量的默认值是 history -a 功能是将目前新增的history追加到histfiles 中，默认写入隐藏文件~/.bash_history中。</p>
<pre><code>[root@test01 ~]# echo $PROMPT_COMMAND
history -a
</code></pre>
<p>在文件/etc/profile追加一行，更改该环境变量的内容，让其执行我们指定的审计语句(审计语句中有自定义的设备local0，其日志等级info)。</p>
<pre><code>[root@test01 ~]# tail -n 1 /etc/profile
export PROMPT_COMMAND='logger -p local0.info &quot;$(ifconfig | grep -E &quot;eth|em&quot; -A 1 | grep &quot;10.0&quot; | grep -oP &quot;(?&lt;=addr:)[\d\.]+&quot;) $(who am i |awk &quot;{print \$1\&quot; \&quot;\$2\&quot; \&quot;\$3\&quot; \&quot;\$4\&quot; \&quot;\$5}&quot;) [`pwd`] $(history 1 | { read x cmd; echo &quot;$cmd&quot;; })&quot;'
[root@test01 ~]#source /etc/profile
</code></pre>
<p>为了防止用户覆盖PROMPT_COMMAND,可以设置这个环境变量为readonly。<br>
审计语句的功能：bash环境下每次执行一条命令后，logger会将执行该命令和该命令的相关环境如登录IP、执行目录、执行时间、主机IP、执行用户等信息（可以看成是自定义设备local0，设备的日志等级自定义为info级别）送给rsyslog服务器。</p>
<h2 id="4">4、整合实现</h2>
<p>为了保证日志的完整性，除了将日志发送到远程的rsyslog日志集中服务器外，还落地存储一份到本地。本地和远程的rsyslog服务配置如下：</p>
<pre><code>*.info;mail.none;authpriv.none;cron.none;local0.none    /var/log/messages
</code></pre>
<p>该行新增加内容local0.none，意思是所有local0设备的全部等级日志信息都不记录到文件/var/log/messages中。</p>
<pre><code>local0.info                                                /var/log/audit.log
</code></pre>
<p>这是新增加的一行内容，意思是所有local0设备的info等级的日志信息记录到文件/var/log/audit.log中。<br>
远程集中接收日志的rsyslog服务器的配置文件也要改成和上面的两行一样，修改配置文件后需要重启rsyslogd服务使其生效。</p>
<pre><code>*.* @192.168.192.168
</code></pre>
<p>这行还是不变，意思是所有日志的所有等级都发送一份到远程(IP为192.168.192.168)的rsyslog日志集中服务器。@表示使用UDP协议发送，@@表示使用TCP协议发送。</p>
<p>由于audit.log文件会不断地增大，需要类似像message、cron等日志一样的切割，要在logrotate的配置文件/etc/logrotate.d/syslog增加一行就行了。</p>
<pre><code>/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
#以下为新增的一行
/var/log/audit.log
{
    sharedscripts
    postrotate
    /bin/kill -HUP `cat /var/run/syslogd.pid 2&gt; /dev/null` 2&gt; /dev/null || true
    endscript
}
</code></pre>
<p>最后看看结果：<br>
本地文件/var/log/audit.log</p>
<pre><code>[root@test01 ~]# tail /var/log/audit.log
Nov  6 10:08:15 test01 root: xxx.xxx.xxx.xxx root pts/0 2014-11-06 09:30 (xxx.xxx.xxx.xxx) [/root] logger
Nov  6 10:08:38 test01 root: xxx.xxx.xxx.xxx root pts/0 2014-11-06 09:30 (xxx.xxx.xxx.xxx) [/root] vim /etc/profile
Nov  6 10:36:19 test01 root: xxx.xxx.xxx.xxx root pts/0 2014-11-06 09:30 (xxx.xxx.xxx.xxx) [/root] man logger
Nov  6 10:36:19 test01 root: xxx.xxx.xxx.xxx root pts/0 2014-11-06 09:30 (xxx.xxx.xxx.xxx) [/root] man logger
Nov  6 10:36:27 test01 root: xxx.xxx.xxx.xxx root pts/0 2014-11-06 09:30 (xxx.xxx.xxx.xxx) [/root] man rsyslog
Nov  6 10:36:51 test01 root: xxx.xxx.xxx.xxx root pts/0 2014-11-06 09:30 (xxx.xxx.xxx.xxx) [/root] man rsyslogd
Nov  6 10:41:40 test01 root: xxx.xxx.xxx.xxx root pts/0 2014-11-06 09:30 (xxx.xxx.xxx.xxx) [/root] tail /etc/profile
Nov  6 10:56:17 test01 root: xxx.xxx.xxx.xxx root pts/0 2014-11-06 09:30 (xxx.xxx.xxx.xxx) [/root] tail -n 1 /etc/profile
Nov  6 11:24:49 test01 root: xxx.xxx.xxx.xxx root pts/0 2014-11-06 09:30 (xxx.xxx.xxx.xxx) [/root] vim /etc/rsyslog.conf
Nov  6 11:28:20 test01 root: xxx.xxx.xxx.xxx root pts/0 2014-11-06 09:30 (xxx.xxx.xxx.xxx) [/root] cat /etc/logrotate.d/syslog
[root@test01 ~]#
</code></pre>
<p>远程集中收集日志的服务器文件/var/log/audit.log</p>
<pre><code>[root@xxxxxx log]# tail /var/log/audit.log
Nov  6 11:02:56 xx-xx-06 root: xxx.xxx.xxx.xxx root pts/0 2014-11-06 10:59 (xxx.xxx.xxx.xxx) [/root] vim /etc/crontab
Nov  6 11:03:11 xx-xx-01-WEB06 root: xxx.xxx.xxx.xxx root pts/1 2014-11-06 11:02 (xxx.xxx.xxx.xxx) [/root] more /opt/xxx/xxxxxxx/xxx/xxx/settings_local.php
Nov  6 11:03:28 xx-xx-06 root: xxx.xxx.xxx.xxx root pts/0 2014-11-06 10:59 (xxx.xxx.xxx.xxx) [/root] vim /etc/crontab
Nov  6 11:03:34 xx-xx-06 root: xxx.xxx.xxx.xxx root pts/0 2014-11-06 10:59 (xxx.xxx.xxx.xxx) [/root] ps aux | grep sphinx
Nov  6 11:03:50 xx-xx-06 root: xxx.xxx.xxx.xxx root pts/0 2014-11-06 11:03 (xxx.xxx.xxx.xxx) [/root] ps aux | grep sphinx
Nov  6 11:04:06 xx-xx-06 root: xxx.xxx.xxx.xxx root pts/0 2014-11-06 11:03 (xxx.xxx.xxx.xxx) [/root] /usr/local/mongodb/mongostat
Nov  6 11:24:49 xxxx root: xxx.xxx.xxx.xxx root pts/0 2014-11-06 09:30 (xxx.xxx.xxx.xxx) [/root] vim /etc/rsyslog.conf
Nov  6 11:28:20 xxxx root: xxx.xxx.xxx.xxx root pts/0 2014-11-06 09:30 (xxx.xxx.xxx.xxx) [/root] cat /etc/logrotate.d/syslog
Nov  6 11:38:18 xxxx root: xxx.xxx.xxx.xxx root pts/0 2014-11-06 09:30 (xxx.xxx.xxx.xxx) [/root] tail /var/log/audit.log
Nov  6 11:42:52 xxxxxxxxx root:  root pts/0 2014-11-06 09:28 (xxx.xxx.xxx.xxx) [/var/log] tailf /var/log/audit.log
[root@xxxxxx log]#
</code></pre>
<p>存在的小的瑕疵，就是敲空命令的时候会将最近一次执行的命令的信息再重复送一份给rsyslog。</p>
<p>目前已知问题：</p>
<ul>
<li>更换bash 和 sh 以外的shell操作不会被记录</li>
<li>使用shell脚本只会记录执行的脚本名称，内容不会被记录</li>
<li>被ssh远程执行的命令不会被记录</li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Centos 编译ngrok实现内网透穿 代替花生棒]]></title><description><![CDATA[本文使用已经开源的ngrok1.7版本自己搭建服务端，解决花生壳内网版、花生棒的端口映射数量限制及流量限制。更加随心随欲的进行内网透穿，同时服务配置好后也降低了内网透穿的操作难度，值得一试]]></description><link>https://mcdona1d.me/centos-bian-yi-ngrokshi-xian-nei-wang-tou-chuan-dai-ti-hua-sheng-bang/</link><guid isPermaLink="false">5db2a2ca53ae51000144153c</guid><category><![CDATA[Raspberry Pi]]></category><category><![CDATA[Linux]]></category><category><![CDATA[CentOS 6.5]]></category><category><![CDATA[Ngrok]]></category><dc:creator><![CDATA[mcdona1d]]></dc:creator><pubDate>Fri, 25 Dec 2015 09:02:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id>本文中依赖的主要环境</h2>
<pre><code class="language-roboconf">Server:CentOS 6.5 X64 
Client:RaspberryPi ARM Debian 7
主域名:mcdona1d.me
ngrok子域名:ngrok.mcdona1d.me
</code></pre>
<p>首先安装必要的工具：</p>
<pre><code class="language-bash">yum install -y openssl git mercurial bzr subversion
</code></pre>
<p>以下这套工具是Linux的开发工具套件，但此程序为<code>Go</code>语言编写，用的也是<code>Go</code>的编译器。我不知道有没有用，90%可能此次编译没用。但是我是早就装过了，所以如果出问题的话就装一下吧</p>
<pre><code class="language-bash">yum groupinstall -y &quot;Development tools&quot;
</code></pre>
<h2 id>服务端</h2>
<h3 id="ngrok">获取 ngrok 源码</h3>
<pre><code class="language-bash">git clone https://github.com/inconshreveable/ngrok.git ngrok
cd ngrok
以下命令基本都在ngrok目录下执行
</code></pre>
<h3 id>生成必要的证书文件</h3>
<p>生成并替换源码里默认的证书，注意域名修改为你自己的。</p>
<blockquote>
<p>之后编译出来的服务端客户端会基于这个证书来加密通讯，保证了安全性</p>
</blockquote>
<pre><code>export NGROK_DOMAIN=&quot;mcdona1d.me&quot;

openssl genrsa -out base.key 2048
openssl req -new -x509 -nodes -key base.key -days 10000 -subj &quot;/CN=$NGROK_DOMAIN&quot; -out base.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj &quot;/CN=$NGROK_DOMAIN&quot; -out server.csr
openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt

cp base.pem assets/client/tls/ngrokroot.crt
cp server.crt assets/server/tls/snakeoil.crt
cp server.key assets/server/tls/snakeoil.key
</code></pre>
<blockquote>
<p>ngrok通过bindata将ngrok源码目录下的<code>assets</code>目录（资源文件）打包到可执行文件(<code>ngrokd</code>和<code>ngrok</code>)中去，<code>assets/client/tls</code>和<code>assets/server/tls</code>下分别存放着用于<code>ngrok</code>和<code>ngrokd</code>的默认证书文件，我们需要将它们替换成我们自己生成的。因此<strong>这一步务必放在编译可执行文件之前</strong></p>
</blockquote>
<h3 id>编译</h3>
<h4 id>配置编译环境</h4>
<p>首先需要配置<code>Go</code>语言编译环境<br>
从此网站下载<code>Go</code>语言源码<a href="http://www.golangtc.com/download">http://www.golangtc.com/download</a><br>
根据我的系统我使用的是<code>go1.4.2.linux-amd64.tar.gz</code><br>
将解压后的<code>go</code>文件夹转移到<code>/usr/local/</code>目录下</p>
<pre><code class="language-bash">cd /root
wget http://www.golangtc.com/static/go/go1.4.2/go1.4.2.linux-amd64.tar.gz
tar -zxvf go1.4.2.linux-amd64.tar.gz
mv go/ /usr/local/
cd /root/ngrok/
</code></pre>
<p>然后将</p>
<pre><code class="language-bash">cp /usr/local/go/bin/* /usr/bin/
</code></pre>
<p>如果提示覆盖，则摁y同意</p>
<h4 id>设置编译变量</h4>
<blockquote>
<p>以下三条环境变量根据你的实际情况来设置</p>
</blockquote>
<pre><code>export GOOS=&quot;linux&quot; GOARCH=&quot;amd64&quot; GOPATH=/root/ngrok/
</code></pre>
<pre><code class="language-bash">make release-server
</code></pre>
<p>如果一切正常而且你的服务器在国外，并且是CentOS7且最近<code>yum update</code>过的话，<code>ngrok/bin</code>目录下应该有<code>ngrok</code>、<code>ngrokd</code>两个可执行文件。但是一般不会那么正常~<br>
首先程序编译会从<code>GoogleCode</code>下载<code>log4go</code>依赖，一般情况是不方便下载的。解决办法是</p>
<pre><code>vi /root/ngrok/src/ngrok/log/logger.go
</code></pre>
<p><img src="https://mcdona1d.me/content/images/2016/04/1451028961241.png" alt="Alt text"></p>
<p>将第四行的<code>log &quot;code.google.com/p/log4go&quot;</code>换成这个</p>
<pre><code>log &quot;github.com/keepeye/log4go&quot;
</code></pre>
<p>解决这个问题之后继续编译，程序可能会卡在这一步<br>
<img src="https://mcdona1d.me/content/images/2016/04/1451007885666.png" alt="Alt text"><br>
仔细研究前辈的编译过程之后，得知这一步居然要求<code>Git</code>的版本！<br>
此时我的<code>Git</code>版本为<code>1.7.1</code>，据说需要升级到<code>1.7.9.5</code>以上。<br>
以下是我<code>CentOS 6.5</code>的升级方法</p>
<pre><code>rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
rpm -i http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
vi /etc/yum.repos.d/rpmforge.repo
找到[rpmforge-extras]，把enabled=0改成enabled=1
</code></pre>
<p><img src="https://mcdona1d.me/content/images/2016/04/1451008121638.png" alt="Alt text"><br>
修改完成后</p>
<pre><code class="language-bash">yum update git
</code></pre>
<p>升级完成后版本为<code>1.7.12.4</code>，继续执行编译，即可顺利编译完成</p>
<pre><code class="language-bash">sudo make release-server
</code></pre>
<h3 id>运行</h3>
<pre><code class="language-bash">/root/ngrok/bin/ngrokd -domain=&quot;mcdona1d.me&quot; -httpAddr=&quot;:8000&quot;
</code></pre>
<p><img src="https://mcdona1d.me/content/images/2016/04/1451029974991.png" alt="Alt text"></p>
<p>出现以上字样没有报错即为<strong>成功</strong></p>
<h3 id>配置开机自动运行</h3>
<p>将以下代码粘贴入<code>rc.local</code>保存即可</p>
<pre><code class="language-bash">vi /etc/rc.local
/root/ngrok/bin/ngrokd -domain=&quot;mcdona1d.me&quot; -httpAddr=&quot;:8000&quot; &gt; /var/log/ngrok.log &amp;
</code></pre>
<h2 id>客户端</h2>
<p>客户端根据实际情况编译，下面给出四种客户端的编译命令，具体X86或X86_64或arm根据自己情况更改</p>
<pre><code class="language-bash">cd /usr/local/go/src
以下四条根据情况选择一条执行
GOOS=linux GOARCH=amd64 ./make.bash #Linux 64位
GOOS=darwin GOARCH=amd64 ./make.bash #MacOS 64位
GOOS=windows GOARCH=386 ./make.bash #Windows 32位
GOOS=linux GOARCH=arm ./make.bash #Linux ARM架构 适用于树莓派
</code></pre>
<p>等待执行完毕后回到ngrok目录</p>
<pre><code class="language-bash">cd /root/ngrok
export GOOS=&quot;linux&quot; GOARCH=&quot;arm&quot; GOPATH=/root/ngrok/
make release-client
</code></pre>
<p>执行完毕后会在<code>/root/ngrok/bin/linux_arm</code>生成适用于<code>arm</code>架构的树莓派可用的客户端<code>ngrok</code></p>
<p>将<code>ngrok</code>拷贝到<code>client</code>服务器中并<code>chmod +x ngrok</code>增加执行权限，并创建一个配置文件<code>ngrok.cfg</code>，内容如下：</p>
<pre><code class="language-roboconf">server_addr: &quot;mcdona1d.me:4443&quot;
trust_host_root_certs: false
</code></pre>
<p>执行ngrok：<br>
<code>-subdomain=</code>为你的二级域名 <code>80</code>为client需要映射到公网的端口</p>
<pre><code class="language-bash">./ngrok -config=./ngrok.cfg -subdomain=ngrok 80
</code></pre>
<p><img src="https://mcdona1d.me/content/images/2016/04/1451017162848.png" alt="Alt text"><br>
<strong>online即为成功</strong></p>
<blockquote>
<p>需要最后提及的是，<code>ngrok</code>会同时请求<code>ngrok.mcdona1d.me</code>和<code>mcdona1d.me</code>的解析，因为我两个域名解析地址不同，所以一直失败。但是我又不能把主域名更改解析地址，遂在host文件中手动添加一行解析地址，问题解决，内网透穿成功</p>
</blockquote>
<h2 id>参考</h2>
<p><a href="http://tonybai.com/2015/03/14/selfhost-ngrok-service/">搭建自己的ngrok服务</a><br>
<a href="https://imququ.com/post/self-hosted-ngrokd.html">搭建 ngrok 服务实现内网穿透</a><br>
<a href="http://www.ekan001.com/articles/38">自行编译ngrok服务端客户端，替代花生壳，跨平台</a><br>
<a href="http://www.jinglingshu.org/?p=10444">自编译搭建ngrok服务实现内网穿透</a><br>
<a href="http://www.izcv.com/1010.html">搭建ngrok服务器实现内网穿透及映射</a><br>
<a href="http://www.cnblogs.com/blackpuppy/p/upgrade_git_from_171_to_17124_on_centos.html">在CentOS上把Git从1.7.1升级到1.7.12.4</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[OpenWRT + Raspberry Pi 按规则配置透明网关]]></title><description><![CDATA[本文介绍了通过Openwrt路由的dns解析和静态路由转发。结合树莓派做OpenVPN客户端。实现了纯手工指定规则来进行透明路由的方法。文末提供了几种针对gfw对OpenVPN封杀的解决思路]]></description><link>https://mcdona1d.me/openwrt-raspberry-pi-an-gui-ze-pei-zhi-tou-ming-wang-guan/</link><guid isPermaLink="false">5db2a2ca53ae51000144153b</guid><category><![CDATA[Raspberry Pi]]></category><category><![CDATA[OpenWRT]]></category><category><![CDATA[VPN]]></category><dc:creator><![CDATA[mcdona1d]]></dc:creator><pubDate>Thu, 10 Dec 2015 08:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id>本文需要已具备的因素</h2>
<p>基于OpenWRT的路由器（我的设备为Newifi Y1）<br>
树莓派（树莓派2）<br>
OpenVPN账户（<a href="https://www.digitalocean.com/?refcode=69cda22205ee">DigitalOcean</a>自己搭建）</p>
<h2 id>初始化</h2>
<h3 id="openvpn">在树莓派上安装OpenVPN</h3>
<pre><code class="language-bash">apt-get install openvpn
</code></pre>
<h3 id="openvpn">启动OpenVPN</h3>
<p>拷贝OpenVPN的五个文件到<code>/etc/openvpn/config</code>中(没有的话自己新建文件夹)<br>
修改.ovpn文件中的ca、cert、key 三项后对应位置为实际对应的位置</p>
<pre><code class="language-bash">openvpn --config /etc/openvpn/config/*.ovpn &amp;
</code></pre>
<p>一般出现此条信息即为成功<br>
<img src="https://mcdona1d.me/content/images/2016/04/1449734271183.png" alt="Alt text"><br>
连接成功后<code>ifconfig</code>检查是否出现名为<code>tun0</code>的网卡</p>
<h3 id>开启树莓派转发</h3>
<pre><code class="language-bash">vi /etc/sysctl.conf
</code></pre>
<p>取消注释以下一条并修改其参数</p>
<pre><code>net.ipv4.ip_forward=1
</code></pre>
<p>执行</p>
<pre><code class="language-bash">sysctl -p
</code></pre>
<p>使刚才的修改立即生效</p>
<p>配置iptables，使系统强制转发所有流量</p>
<pre><code class="language-bash">iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
iptables-save
</code></pre>
<h3 id>配置路由器</h3>
<h4 id="ip">树莓派分配静态IP</h4>
<p>网路--&gt;DHCP/DNS--&gt;静态地址分配</p>
<h4 id="googledns">为Google DNS增加静态路由</h4>
<p>网路--&gt;静态路由--&gt;路由表<br>
<img src="https://mcdona1d.me/content/images/2016/04/1449733803934.png" alt="Alt text"><br>
将Google DNS转发至刚才为树莓派分配的静态地址中<br>
<img src="https://mcdona1d.me/content/images/2016/04/1449733843834.png" alt="Alt text"></p>
<h3 id>树莓派设置路由</h3>
<pre><code>/sbin/route add -net 8.8.0.0/16 dev tun0
</code></pre>
<p><strong>至此基础环境搭建完毕</strong></p>
<h2 id>处理新规则流程</h2>
<blockquote>
<p>以自动处理Google为例讲解此流程</p>
</blockquote>
<h3 id>路由器</h3>
<pre><code class="language-bash">nslookup www.google.com 8.8.8.8
</code></pre>
<p>得到未被污染的IP地址<br>
编辑dnsmasq</p>
<pre><code class="language-bash">vi /etc/dnsmasq.conf
</code></pre>
<p>在末尾增加以下条目</p>
<pre><code>server=/google.com/8.8.8.8
</code></pre>
<p>使Google域名使用8.8.8.8进行解析<br>
添加完毕后重启dnsmasq</p>
<pre><code class="language-bash">/etc/init.d/dnsmasq restart
</code></pre>
<p>将未被污染的ip地址添加到之前修改过的静态路由表中<br>
<img src="https://mcdona1d.me/content/images/2016/04/1449734414868.png" alt="Alt text"><br>
保存应用生效</p>
<h3 id>树莓派</h3>
<p>增加路由规则</p>
<pre><code>/sbin/route add -net 74.125.0.0/16 dev tun0
</code></pre>
<p>检查路由规则</p>
<pre><code class="language-bash">netstat -rn
</code></pre>
<p>即可看到当前路由规则</p>
<p>使用以下命令检查是否可以打开网页</p>
<pre><code class="language-bash">curl www.google.com
</code></pre>
<p>如获取到</p>
<pre><code class="language-html">&lt;HTML&gt;&lt;HEAD&gt;&lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html;charset=utf-8&quot;&gt;
&lt;TITLE&gt;302 Moved&lt;/TITLE&gt;&lt;/HEAD&gt;&lt;BODY&gt;
&lt;H1&gt;302 Moved&lt;/H1&gt;
The document has moved
&lt;A HREF=&quot;http://www.google.com.hk/url?sa=p&amp;amp;hl=zh-CN&amp;amp;pref=hkredirect&amp;amp;pval=yes&amp;amp;q=http://www.google.com.hk/%3Fgws_rd%3Dcr&amp;amp;ust=1449738375234893&amp;amp;usg=AFQjCNEvR5Yi7Es8o3Uk6P2TlyC7uPRLZA&quot;&gt;here&lt;/A&gt;.
&lt;/BODY&gt;&lt;/HTML&gt;
</code></pre>
<p>即为在树莓派上已经通过OpenVPN转发此流量</p>
<h2 id>测试</h2>
<p>在路由器上继续执行</p>
<pre><code class="language-bash">curl www.google.com
</code></pre>
<p>如依然可以返回刚才的结果，则系统解析转发正常</p>
<h2 id="faq">FAQ</h2>
<p>其实此时Google依然无法打开，从刚才获取到的html文件中也可看出，Google被重定向到离你的服务器最近的机房中，此时需要继续分析，添加规则。本文仅提供思路，方法大同小异<br>
因为涉及到DNS缓存、浏览器缓存等问题可能依然会出现各种奇葩问题，需耐心寻找解决办法 and Google it<br>
<strong>正常情况下，OpenVPN一天内被封杀端口属于正常情况，具体的信息为<code>TLS auth error</code>，更换端口可暂时解决</strong></p>
<h2 id>附录</h2>
<h3 id="openvpn">提供两种顺利使用OpenVPN方法</h3>
<h4 id="ssh">ssh隧道双重加密</h4>
<ol>
<li>修改OpenVPN服务端配置文件使其为tcp模式</li>
<li>修改客户端配置文件使其为tcp模式并且修改服务器地址为<code>localhost</code></li>
<li>使用如下命令建立ssh隧道将服务器端口映射至本机</li>
</ol>
<pre><code> ssh -L 1194:localhost:1194 user@webserver
</code></pre>
<ol start="4">
<li>启动VPN客户端连接</li>
</ol>
<h4 id="shadowsocks">使用shadowsocks代理</h4>
<p>SS提供了OpenVPN使用ss代理连接的办法<br>
官方文档的地址为<br>
<a href="https://github.com/shadowsocks/shadowsocks/wiki/Connect-to-OpenVPN-over-Shadowsocks">https://github.com/shadowsocks/shadowsocks/wiki/Connect-to-OpenVPN-over-Shadowsocks</a></p>
<p>具体办法是：<br>
服务端启动ss服务及OpenVPN服务<br>
客户端启动ss服务</p>
<pre><code>sslocal -c /etc/shadowsocks.json -d start
</code></pre>
<p>在OpenVPN的.ovpn文件末尾加上</p>
<pre><code>socks-proxy 127.0.0.1 1080
route SHADOWSOCKS_SERVER_IP 255.255.255.255 net_gateway
</code></pre>
<p>即可使用shadowsocks代理OpenVPN流量</p>
<h4 id="obfsproxy">使用obfsproxy混搅流量</h4>
<h4 id="stunnel">使用stunnel混搅流量</h4>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>