<?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[Colin's Blog]]></title><description><![CDATA[Thoughts, stories and ideas.]]></description><link>https://blog.mozcp.com/</link><image><url>https://blog.mozcp.com/favicon.png</url><title>Colin&apos;s Blog</title><link>https://blog.mozcp.com/</link></image><generator>Ghost 4.48</generator><lastBuildDate>Thu, 05 Mar 2026 06:28:37 GMT</lastBuildDate><atom:link href="https://blog.mozcp.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[在 remix v2 中使用 CJS 作为服务端模块格式]]></title><description><![CDATA[<p>&#x5728; remix v2 &#x7248;&#x672C;&#x4E2D;&#x9ED8;&#x8BA4;&#x7684;&#x670D;&#x52A1;&#x7AEF;&#x6A21;&#x5757;&#x683C;&#x5F0F;&#x662F; ESM&#xFF0C;&#x8FD9;&#x5728; nodejs &#x73AF;&#x5883;&#x4E2D;&#xFF0C;&#x6709;&#x4E9B;&#x5305;&#x7531;&#x4E8E;&#x6CA1;<br>&#x6709;&#x63D0;&#x4F9B; ESM exports &#x4ECE;&#x800C;&#x5BFC;&#x81F4;&#x65E0;&#x6CD5;&#x4F7F;&#x7528;&#x8FD9;&#x4E9B;&#x5305;&#xFF0C;&#x8FD9;</p>]]></description><link>https://blog.mozcp.com/zai-remix-v2-zhong-shi-yong-cjs-zuo-wei-fu-wu-duan-mo-kuai-ge-shi/</link><guid isPermaLink="false">6571a196207ea60001c206ff</guid><dc:creator><![CDATA[Colin Cheng]]></dc:creator><pubDate>Thu, 07 Dec 2023 10:44:37 GMT</pubDate><content:encoded><![CDATA[<p>&#x5728; remix v2 &#x7248;&#x672C;&#x4E2D;&#x9ED8;&#x8BA4;&#x7684;&#x670D;&#x52A1;&#x7AEF;&#x6A21;&#x5757;&#x683C;&#x5F0F;&#x662F; ESM&#xFF0C;&#x8FD9;&#x5728; nodejs &#x73AF;&#x5883;&#x4E2D;&#xFF0C;&#x6709;&#x4E9B;&#x5305;&#x7531;&#x4E8E;&#x6CA1;<br>&#x6709;&#x63D0;&#x4F9B; ESM exports &#x4ECE;&#x800C;&#x5BFC;&#x81F4;&#x65E0;&#x6CD5;&#x4F7F;&#x7528;&#x8FD9;&#x4E9B;&#x5305;&#xFF0C;&#x8FD9;&#x65F6;&#x53EF;&#x4EE5;&#x5C06;&#x6A21;&#x5757;&#x683C;&#x5F0F;&#x6539;&#x6210; CJS &#x3002;</p><p>&#x9996;&#x5148;&#x5728; remix &#x914D;&#x7F6E;&#x6587;&#x4EF6; <code>remix.config.js</code>, &#x670D;&#x52A1;&#x7AEF;&#x542F;&#x52A8;&#x6587;&#x4EF6; <code>server.js</code> &#x7684;&#x540E;&#x7F00;&#x7531;<br><code>.js</code> &#x6539;&#x6210; <code>mjs</code>&#xFF0C;&#x7136;&#x540E;&#x5728; <code>remix.config.mjs</code> &#x4E2D;&#xFF0C;&#x5C06; <code>serverModuleFormat</code> &#x7684;&#x503C;&#x6539;<br>&#x6210; <code>cjs</code>&#x3002;</p><p>&#x7136;&#x540E;&#x5728; <code>package.json</code> &#x4E2D;&#xFF0C;&#x53BB;&#x6389; <code>type: &quot;module&quot;</code>&#xFF0C;&#x5E76;&#x5C06; <code>scripts</code> &#x91CC;&#x7684; <code>server.js</code> &#x5168;&#x90E8;&#x6539;&#x6210; <code>server.mjs</code>&#x3002;</p><p>&#x8FD9;&#x6837;&#x6539;&#x4E86;&#x4E4B;&#x540E;&#xFF0C;&#x4F7F;&#x7528; <code>npm run dev</code> &#x53EF;&#x4EE5;&#x6B63;&#x5E38;&#x542F;&#x52A8;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x4E86;&#xFF0C;&#x4F46;&#x4F1A;&#x53D1;&#x73B0;&#x4FEE;&#x6539;&#x6587;&#x4EF6;&#x65F6;&#x6CA1;&#x6709;<br>HMR &#x6CA1;&#x6709;&#x751F;&#x6548;&#xFF0C;&#x5728;&#x6539;&#x6210; CJS &#x524D;&#x662F;&#x6B63;&#x5E38;&#x7684;&#x3002;</p><p>&#x901A;&#x8FC7;&#x4E00;&#x756A;&#x67E5;&#x627E;&#x540E;&#xFF0C;&#x53D1;&#x73B0;&#x662F; CJS &#x52A0;&#x8F7D;&#x7F13;&#x5B58;&#x5BFC;&#x81F4;&#x7684;&#x3002;</p><p>&#x5728; <code>server.mjs</code> &#x4E2D;&#x4F7F;&#x7528; <code>import()</code> &#x6765;&#x52A0;&#x8F7D; CJS &#x683C;&#x5F0F;&#x7684;&#x6A21;&#x5757; <code>build/index.js</code> &#x65F6;&#xFF0C;<br>&#x7F13;&#x5B58;&#x4E86;&#x8BE5;&#x6A21;&#x5757;&#x3002;&#x539F;&#x6765;&#x4F7F;&#x7528; ESM &#x683C;&#x5F0F;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x6539;&#x53D8;&#x52A0;&#x8F7D;&#x6587;&#x4EF6;&#x7684; query string &#x7684;&#x65B9;&#x5F0F;&#x5237;&#x65B0;<br>&#x7F13;&#x5B58;&#xFF08;&#x5373;&#x5728; ESM &#x52A0;&#x8F7D;&#x4E2D;&#x7531;&#x4E8E; URL &#x4E0D;&#x4E00;&#x6837;&#x800C;&#x8BA4;&#x4E3A;&#x662F;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x6A21;&#x5757;&#x4E86;&#xFF09;&#xFF0C;&#x4F46;&#x5728; CJS &#x4E2D;&#x8FD9;&#x79CD;&#x65B9;<br>&#x5F0F;&#x5931;&#x6548;&#x4E86;&#xFF0C;&#x5728; CJS &#x52A0;&#x8F7D;&#x4E2D;&#xFF0C;&#x8BE5;&#x6A21;&#x5757;&#x6700;&#x540E;&#x4F1A;&#x7F13;&#x5B58;&#x5728; <code>require.cache</code> &#x91CC;&#xFF0C;&#x8FD9;&#x91CC; cache &#x662F;&#x4EE5;<br>&#x6587;&#x4EF6;&#x7EDD;&#x5BF9;&#x8DEF;&#x5F84;&#x4E3A; key &#x6765;&#x7F13;&#x5B58;&#x4E86;&#xFF0C;&#x6240;&#x4EE5;&#x6539;&#x53D8;&#x6587;&#x4EF6;&#x7684; URL &#x4F46;&#x6CA1;&#x6709;&#x6539;&#x53D8;&#x6587;&#x4EF6;&#x8DEF;&#x7ECF;&#x662F;&#x65E0;&#x6CD5;&#x5237;&#x65B0;&#x7F13;&#x5B58;&#x7684;&#x3002;<br>&#x5982;&#x679C;&#x8981;&#x5237;&#x65B0;&#x8BE5;&#x6A21;&#x5757;&#xFF0C;&#x5FC5;&#x987B;&#x8981;&#x5220;&#x9664;&#x8FD9;&#x91CC;&#x7684;&#x7F13;&#x5B58;&#x3002;</p><p>&#x5728;&#x662F;&#x542F;&#x52A8; <code>npm run dev</code> &#x65F6;&#xFF0C;<code>server.mjs</code> &#x662F;&#x4EE5; ESM &#x683C;&#x5F0F;&#x52A0;&#x8F7D;&#x4E86;&#xFF0C;&#x800C; <code>require</code> &#x53D8;&#x91CF;&#x5728;<br>ESM &#x6A21;&#x5757;&#x4E2D;&#x4E0D;&#x5B58;&#x5728;&#x3002;&#x867D;&#x7136;&#x53EF;&#x4EE5;&#x5C06; <code>server.mjs</code> &#x540C;&#x6837;&#x8F6C;&#x6362;&#x56DE; CJS &#x6A21;&#x5757;&#xFF0C;&#x4F46;&#x6539;&#x52A8;&#x6709;&#x70B9;&#x591A;&#x3002;<br>&#x8FD8;&#x597D;&#x5728; <code>node:module</code> &#x5185;&#x7F6E;&#x6A21;&#x5757;&#x4E2D;&#xFF0C;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E2A;&#x521B;&#x5EFA; <code>require</code> &#x7684;&#x51FD;&#x6570;&#x53D8;&#x91CF;&#xFF1A;<code>createRequrie</code>&#xFF0C;<br>&#x901A;&#x8FC7;&#x65B0;&#x5EFA;&#x4E00;&#x4E2A; <code>require</code> &#x6765;&#x52A0;&#x8F7D; CJS &#x6A21;&#x5757;&#xFF0C;&#x8FD9;&#x6837;&#x6539;&#x52A8;&#x5C31;&#x5C0F;&#x5F97;&#x591A;&#x4E86;&#x3002;</p><p>&#x9996;&#x5148;&#x5728; <code>server.mjs</code> &#x7684;&#x5F00;&#x5934;&#x5F15;&#x5165; <code>createRequire</code> &#x51FD;&#x6570;&#x6765;&#x521B;&#x5EFA; <code>require</code> &#x53D8;&#x91CF;&#xFF1A;</p><pre><code class="language-mjs">import {createRequire} from &quot;node:module&quot;;
const require = createRequire(import.meta.url);
</code></pre><p>&#x7136;&#x540E;&#x5C06; <code>reimportRemixServer</code> &#x51FD;&#x6570;&#x66FF;&#x6362;&#x6210;&#x4EE5;&#x4E0B;&#x5185;&#x5BB9;&#xFF1A;</p><pre><code class="language-mjs">async function reimportServer() {
  for (const key of Object.keys(require.cache)) {
    if (key.endsWith(BUILD_PATH)) {
      delete require.cache[key];
    }
  }
  return require(BUILD_PATH);
}
</code></pre><p>&#x8FD9;&#x6837;&#x5C31;&#x53EF;&#x4EE5; remix v2 &#x7684;&#x9ED8;&#x8BA4;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x6A21;&#x5757;&#x683C;&#x5F0F;&#x6539;&#x6210; CJS &#x4E86;&#x3002;</p>]]></content:encoded></item><item><title><![CDATA[使用宿主机的目录作为 QEMU 虚拟机的主文件系统]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x4E00;&#x822C;&#x6211;&#x4EEC;&#x5728;&#x4F7F;&#x7528; KVM/QEMU &#x865A;&#x62DF;&#x673A;&#x65F6;&#xFF0C;&#x90FD;&#x662F;&#x9700;&#x8981;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;  block &#x8BBE;&#x5907;&#xFF0C;&#x7136;&#x540E;&#x683C;&#x5F0F;&#x5316;&#x6210;&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;&#x4F5C;&#x4E3A;&#x91CC;&#x9762;&#x7684;&#x4E3B;&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;&#xFF08;rootfs&#xFF09;&#x6765;</p>]]></description><link>https://blog.mozcp.com/use-host-directory-for-geust-rootfs/</link><guid isPermaLink="false">650b8aa6bceda2000117e91d</guid><category><![CDATA[9p]]></category><category><![CDATA[9pfs]]></category><category><![CDATA[QEMU]]></category><dc:creator><![CDATA[Colin Cheng]]></dc:creator><pubDate>Thu, 21 Sep 2023 00:21:26 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x4E00;&#x822C;&#x6211;&#x4EEC;&#x5728;&#x4F7F;&#x7528; KVM/QEMU &#x865A;&#x62DF;&#x673A;&#x65F6;&#xFF0C;&#x90FD;&#x662F;&#x9700;&#x8981;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;  block &#x8BBE;&#x5907;&#xFF0C;&#x7136;&#x540E;&#x683C;&#x5F0F;&#x5316;&#x6210;&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;&#x4F5C;&#x4E3A;&#x91CC;&#x9762;&#x7684;&#x4E3B;&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;&#xFF08;rootfs&#xFF09;&#x6765;&#x4F7F;&#x7528;&#x7684;&#x3002;&#x4F46;&#x8FD9;&#x91CC;&#x6709;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x5C31;&#x662F;&#x5728;&#x521B;&#x5EFA;&#x8BBE;&#x5907;&#x6587;&#x4EF6;&#x65F6;&#xFF0C;&#x9700;&#x8981;&#x9884;&#x5148;&#x8BBE;&#x5B9A;&#x8BE5; block &#x8BBE;&#x5907;&#x7684;&#x5927;&#x5C0F;&#xFF0C;&#x4E00;&#x65E6;&#x8BBE;&#x7F6E;&#x597D;&#xFF0C;&#x5728;&#x4F7F;&#x7528;&#x8FC7;&#x7A0B;&#x4E2D;&#x5982;&#x679C;&#x53D1;&#x73B0;&#x7A7A;&#x95F4;&#x4E0D;&#x8DB3;&#x9700;&#x8981;&#x6269;&#x5BB9;&#xFF0C;&#x4FEE;&#x6539;&#x8D77;&#x6765;&#x5C31;&#x4E0D;&#x662F;&#x90A3;&#x4E48;&#x65B9;&#x4FBF;&#x4E86;&#x3002;</p>
<p>&#x4F7F;&#x7528;&#x865A;&#x62DF;&#x673A;&#x7684;&#x53E6;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#x5C31;&#x662F;&#x600E;&#x4E48;&#x4FBF;&#x6377;&#x5730;&#x4E0E;&#x5BBF;&#x4E3B;&#x673A;&#x4EA4;&#x6362;&#x6587;&#x4EF6;&#xFF0C;&#x901A;&#x5E38;&#x60C5;&#x51B5;&#x4E0B;&#x4F1A;&#x4F7F;&#x7528;  nfs/smb &#x8FD9;&#x4E9B;&#x7F51;&#x7EDC;&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;&#x534F;&#x8BAE;&#xFF0C;&#x4F46;&#x8FD9;&#x9700;&#x8981;&#x5148;&#x90E8;&#x7F72;&#x5B83;&#x4EEC; &#x624D;&#x80FD;&#x4F7F;&#x7528;&#xFF0C;&#x6CA1;&#x529E;&#x6CD5;&#x505A;&#x5230;&#x5F00;&#x7BB1;&#x5373;&#x7528;&#x3002;</p>
<p>&#x901A;&#x8FC7;&#x641C;&#x7D22;&#x53D1;&#x73B0;&#x6709;&#x4E24;&#x79CD;&#x65B9;&#x6848;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x5171;&#x4EAB;&#x5BBF;&#x4E3B;&#x673A;&#x7684;&#x76EE;&#x5F55;&#x7ED9;&#x865A;&#x62DF;&#x673A;&#x7528;&#xFF0C;&#x5206;&#x522B;&#x662F; <a href="https://www.tauceti.blog/posts/qemu-kvm-share-host-directory-with-vm-with-virtio/">virtio-fs</a> &#x548C; <a href="https://wiki.qemu.org/Documentation/9p">9pfs</a>&#xFF0C;virtio-fs &#x9700;&#x8981;&#x5148;&#x542F;&#x52A8; virtfsd &#x670D;&#x52A1;&#xFF0C;&#x901A;&#x8FC7; libvirt &#x6765;&#x542F;&#x52A8;&#x865A;&#x62DF;&#x673A;&#x65F6;&#x5982;&#x679C;&#x914D;&#x7F6E;&#x4E86;&#x5171;&#x4EAB;&#x76EE;&#x5F55;&#xFF0C;&#x4F1A;&#x81EA;&#x52A8;&#x542F;&#x52A8;&#x8BE5;&#x670D;&#x52A1;&#xFF0C;&#x4F46;&#x901A;&#x8FC7; qemu &#x76F4;&#x63A5;&#x542F;&#x52A8;&#x865A;&#x62DF;&#x65F6;&#x5C31;&#x9700;&#x8981;&#x624B;&#x52A8;&#x542F;&#x52A8; virtfsd &#x4E86;&#x3002;&#x800C; 9pfs &#x5219;&#x6CA1;&#x6709;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x662F; qemu &#x5185;&#x7F6E;&#x652F;&#x6301;&#x7684;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x672C;&#x6587;&#x8981;&#x4ECB;&#x7ECD;&#x7684;&#x65B9;&#x6848;&#x4E86;&#x3002;</p>
<p>&#x5728;&#x4E24;&#x4E09;&#x5E74;&#x524D;&#xFF0C;&#x6211;&#x5C31;&#x5DF2;&#x7ECF;&#x6298;&#x817E;&#x8FC7; 9pfs&#xFF0C;&#x4F46;&#x90A3;&#x65F6;&#x53EA;&#x662F;&#x8BD5;&#x7528;&#x4E86;&#x4E0B;&#x5C31;&#x6CA1;&#x6709;&#x7EE7;&#x7EED;&#x7528;&#x4E86;&#xFF0C;&#x5370;&#x8C61;&#x4E2D;&#x5E94;&#x8BE5;&#x662F;&#x6709;&#x4E24;&#x4E2A;&#x95EE;&#x9898;&#x3002;</p>
<p>&#x5176;&#x4E2D;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#x662F;&#x6587;&#x4EF6;&#x5728;&#x5BBF;&#x4E3B;&#x673A;&#x4E0E;&#x865A;&#x62DF;&#x673A;&#x4E2D;&#x7684;&#x6743;&#x9650;&#x6620;&#x5C04;&#x95EE;&#x9898;&#xFF0C;&#x4F8B;&#x5982;&#x6709;&#x5728;&#x91CC;&#x9762;&#x7528; root &#x7528;&#x6237;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#xFF0C;&#x5B83;&#x5728;&#x91CC;&#x9762;&#x7684; owner &#x662F; root&#xFF0C;&#x90A3;&#x5728;&#x5916;&#x9762;&#x5E94;&#x8BE5;&#x662F;&#x4EC0;&#x4E48;&#xFF1F;&#x8FD9;&#x91CC; QEMU &#x63D0;&#x4F9B;&#x4E86; security_model &#x53C2;&#x6570;&#x7528;&#x4E8E;&#x63A7;&#x5236;&#xFF0C;&#x5B83;&#x7684;&#x503C;&#x5206;&#x522B;&#x662F; passthrough, mapped(mapped-xattr), mapped-file, none&#xFF0C;&#x5176;&#x4E2D; mapped &#x5728;&#x662F;&#x5C06;&#x6587;&#x4EF6;&#x5C5E;&#x6027;&#xFF08;&#x7684;&#x6620;&#x5C04;&#xFF09;&#x4FDD;&#x5B58;&#x5728;&#x6587;&#x4EF6; xattr &#x5C5E;&#x6027;&#x91CC;&#xFF0C;mapped-file &#x5219;&#x4FDD;&#x5B58;&#x5728;&#x72EC;&#x7ACB;&#x7684; .virtfs_metadata &#x6587;&#x4EF6;&#x5939;&#x5185;&#xFF0C;&#x800C; none &#x548C; passthrough &#x5219;&#x4E0D;&#x8FDB;&#x884C;&#x6620;&#x5C04;&#xFF0C;none &#x7684;&#x8BDD;&#x76F8;&#x5F53;&#x4E8E;&#x5728;&#x865A;&#x62DF;&#x673A;&#x5185;&#x521B;&#x5EFA;&#x7684;&#x6587;&#x4EF6;&#x7684; owner &#x4E3A;&#x5C5E;&#x4E3B;&#x673A;&#x7684;&#xFF0C;&#x5E76;&#x4E14;&#x65E0;&#x6CD5;&#x4F7F;&#x7528; chown &#x6765;&#x4FEE;&#x6539;&#xFF0C;passthrough &#x7C7B;&#x4F3C;&#xFF0C;&#x4F46;&#x53EF;&#x4EE5;&#x4FEE;&#x6539;&#xFF0C;&#x8FD9;&#x5C31;&#x8981;&#x6C42; qemu &#x4F7F;&#x7528; root &#x6743;&#x9650;&#x6765;&#x8FD0;&#x884C;&#x4E86;&#xFF0C;&#x5426;&#x5219; chown &#x65F6;&#x63D0;&#x793A;&#x6743;&#x9650;&#x4E0D;&#x8DB3;&#x3002;mapped &#x6216;&#x8005; mapped-file &#x9009;&#x9879;&#x5BF9;&#x4E8E;&#x6709;&#x4E00;&#x70B9;&#x6D01;&#x7656;&#x7684;&#x6211;&#x6765;&#x8BF4;&#xFF0C;&#x662F;&#x4E0D;&#x5E0C;&#x671B;&#x6709;&#x989D;&#x5916;&#x7684;&#x4FE1;&#x606F;&#x5199;&#x5165;&#x5230;&#x6587;&#x4EF6;&#x672C;&#x8EAB;&#x4EE5;&#x53CA;&#x591A;&#x4F59;&#x7684;&#x662F;&#x76EE;&#x5F55;&#x4E0A;&#x7684;&#x3002;&#x800C;&#x4E14;&#x8FD9;&#x91CC;&#x6709;&#x4E2A;&#x5F88;&#x5927;&#x7684;&#x95EE;&#x9898;&#x7684;&#xFF0C;&#x5728;&#x5BBF;&#x4E3B;&#x673A;&#x4E0A;&#x521B;&#x5EFA;&#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x7531;&#x4E8E;&#x6CA1;&#x6709;&#x8FD9;&#x4E9B;&#x9644;&#x52A0;&#x7684;&#x5C5E;&#x6027;&#xFF0C;&#x597D;&#x50CF;&#x5728;&#x865A;&#x62DF;&#x673A;&#x5185;&#x662F;&#x6709;&#x95EE;&#x9898;&#x7684;&#xFF08;&#x592A;&#x4E45;&#x7684;&#x4E5F;&#x5FD8;&#x8BB0;&#x5F53;&#x65F6;&#x6D4B;&#x7684;&#x65F6;&#x5019;&#x662F;&#x4EC0;&#x4E48;&#x95EE;&#x9898;&#x4E86;&#xFF09;&#x3002;&#x6BD4;&#x8F83;&#x7406;&#x60F3;&#x7684;&#x662F;&#x4F7F;&#x7528; passthrough &#x9009;&#x9879;&#xFF0C;&#x4F7F;&#x7528;&#x8BE5;&#x9009;&#x9879;&#x901A;&#x5E38;&#x9700;&#x8981; root &#x6743;&#x9650;&#x8FD0;&#x884C; qemu&#xFF0C;&#x800C;&#x4E14;&#x5728;&#x865A;&#x62DF;&#x673A;&#x5185;&#x5982;&#x679C;&#x4F7F;&#x7528; root &#x521B;&#x5EFA;&#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x5728;&#x5BBF;&#x4E3B;&#x673A;&#x4E0A;&#x4E5F;&#x662F;&#x663E;&#x793A;&#x4E3A; root owner &#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x8FD9;&#x6837;&#x5BBF;&#x4E3B;&#x673A;&#x4E0A;&#x666E;&#x901A;&#x7528;&#x6237;&#x8981;&#x770B;&#x7684;&#x8BDD;&#x4E5F;&#x4E0D;&#x65B9;&#x4FBF;&#x3002;</p>
<p>&#x800C;&#x53E6;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#x662F;&#x5F53;&#x65F6;&#x597D;&#x50CF; linux kernel &#x8FD8;&#x4E0D;&#x652F;&#x6301; 9p &#x4F5C;&#x4E3A; rootfstype &#x4F7F;&#x7528;&#x3002;</p>
<p>&#x6700;&#x8FD1;&#x5728; google &#x4E0A;&#x641C;&#x7D22;&#x65F6;&#xFF0C;&#x53D1;&#x73B0;&#x4E86; <a href="https://wiki.qemu.org/Documentation/9p_root_fs">9p_root_fs</a> &#x8FD9;&#x4E2A; wiki&#xFF0C;&#x8FD9;&#x7B2C;&#x4E8C;&#x4E2A;&#x95EE;&#x9898;&#x6765;&#x8D77;&#x6765;&#x5DF2;&#x7ECF;&#x89E3;&#x51B3;&#x3002;&#x800C;&#x521A;&#x597D;&#x6700;&#x8FD1;&#x7814;&#x7A76;&#x4E86;&#x4E0B; user namespace&#xFF0C;&#x53D1;&#x73B0;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; unshare &#x5C06;&#x5F53;&#x524D;&#x5BBF;&#x4E3B;&#x673A;&#x4E0A;&#x7684;&#x666E;&#x901A;&#x4F7F;&#x7528;&#x5207;&#x6362;&#x5230; root &#x6765;&#x8FD0;&#x884C;&#xFF0C;&#x8FD9;&#x6837;&#x5BF9;&#x4E8E;&#x7B2C;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#x4E5F;&#x6BD4;&#x8F83;&#x597D;&#x7684;&#x89E3;&#x51B3;&#x4E86;&#x3002;</p>
<p>&#x4E0B;&#x9762;&#x5C06;&#x4EE5;&#x5B89;&#x88C5; Arch Linux &#x4E3A;&#x4F8B;&#xFF0C;&#x4E3B;&#x8981;&#x53C2;&#x8003;&#x7684;&#x662F; <a href="https://wiki.qemu.org/Documentation/9p_root_fs">9p_root_fs</a>&#xFF0C;&#x8FD9; wiki &#x4F7F;&#x7528;&#x5B89;&#x88C5; debian &#x6765;&#x4F8B;&#x3002;</p>
<p>&#x5148;&#x786E;&#x8BA4;&#x4E0B; <code>/etc/subuid</code> &#x53CA; <code>/etc/subgid</code> &#x91CC;&#x5DF2;&#x7ECF;&#x6709;&#x5F53;&#x524D;&#x7528;&#x6237;&#x7684; subuid &#x53CA; subgid &#x7684; map &#x914D;&#x7F6E;&#xFF1A;</p>
<pre><code class="language-/etc/subuid">&lt;CURRENT_USER&gt;:10000:65536
</code></pre>
<pre><code class="language-/etc/subgid">&lt;CURRENT_USER&gt;:10000:65536
</code></pre>
<p>&#x4E0B;&#x8F7D;&#x597D; Arch Linux &#x7684;&#x5B89;&#x88C5;&#x955C;&#x50CF;&#xFF0C;&#x7136;&#x540E;&#x8FD0;&#x884C;&#xFF1A;</p>
<pre><code class="language-bash">unshare --map-auto --map-root-user \
qemu-system-x86_64 -machine pc,accel=kvm,dump-guest-core=off -m 2048 \
  -smp 4,sockets=1,dies=1,cores=4,threads=1 -rtc base=utc \
  -boot d -cdrom ./archlinux-x86_64.iso \
  -fsdev local,security_model=passthrough,id=fsdev-fs0,multidevs=remap,path=$PWD/base \
  -device virtio-9p-pci,id=fs0,fsdev=fsdev-fs0,mount_tag=fs0
</code></pre>
<p>&#x5176;&#x4E2D; <code>./archlinux-x86_64.iso</code> &#x4E3A;&#x4E0B;&#x8F7D;&#x7684;&#x5B89;&#x88C5;&#x955C;&#x50CF;&#xFF0C;<code>path=$PWD/base</code> &#x914D;&#x7F6E;&#x7684;&#x5206;&#x4EAB;&#x76EE;&#x5F55;&#x5F53;&#x524D;&#x76EE;&#x5F55;&#x4E0B;&#x7684; <code>base</code> &#x6587;&#x4EF6;&#x5939;&#x3002;</p>
<p><img src="https://raw.githubusercontent.com/zbinlin/blog/master/res/use-host-directory-for-geust-rootfs/img1.png" alt="qemu_running_img" loading="lazy"></p>
<p>&#x8FD0;&#x884C;&#x540E;&#x5728;&#x5F39;&#x7A97;&#x7684;&#x7A97;&#x53E3;&#x4E2D;&#x9009;&#x62E9;&#x7B2C;&#x4E00;&#x9879;&#xFF0C;&#x56DE;&#x8F66;&#xFF0C;&#x8FDB;&#x5165;&#x547D;&#x4EE4;&#x884C;&#x3002;</p>
<p>&#x5148;&#x6302;&#x8F7D; 9pfs &#x5230; /mnt &#x76EE;&#x5F55;&#x4E0A;&#xFF1A;</p>
<pre><code class="language-bash">mount -t 9p -o trans=virtio,version=9p2000.L,posixacl,msize=5000000,cache=mmap fs0 /mnt
</code></pre>
<p>&#x7136;&#x540E;&#x5C31;&#x53EF;&#x4EE5;&#x5C06;&#x57FA;&#x7840;&#x5305;&#x5B89;&#x88C5;&#x5230; /mnt &#x76EE;&#x5F55;&#x4E86;&#xFF1A;</p>
<pre><code class="language-bash">pacstrap -K /mnt base base-devel linux vim man-db man-pages
</code></pre>
<p>&#x88C5;&#x5B8C;&#x4E4B;&#x540E;&#x8FD0;&#x884C; <code>arch-chroot</code> &#x5207;&#x6362;&#x5230; /mnt&#xFF1A;</p>
<pre><code class="language-bash">arch-chroot /mnt
</code></pre>
<p>&#x8FDB;&#x884C;&#x4E00;&#x4E9B;&#x57FA;&#x672C;&#x7684;&#x914D;&#x7F6E;&#xFF0C;&#x8FD9;&#x4E2A;&#x8DDF;&#x4F20;&#x7EDF;&#x7684; Arch Linux &#x5B89;&#x88C5;&#x7C7B;&#x4F3C;&#xFF0C;&#x53EF;&#x4EE5;&#x53C2;&#x8003; <a href="https://wiki.archlinux.org/title/Installation_guide">https://wiki.archlinux.org/title/Installation_guide</a></p>
<p>&#x7136;&#x540E;&#x5728;&#x914D;&#x7F6E; initramfs &#x65F6;&#x5C06; 9p &#x7684;&#x76F8;&#x5173;&#x6A21;&#x5757;&#x914D;&#x7F6E;&#x8FDB;&#x53BB;&#xFF0C;&#x4FEE;&#x6539; <code>/etc/mkinitcpio.conf</code> &#x91CC;&#x7684; <code>MODULES=()</code> &#x4E3A;&#xFF1A;</p>
<pre><code class="language-conf">MODULES=(9p 9pnet 9pnet_virtio)
</code></pre>
<p>&#x4FDD;&#x5B58;&#xFF0C;&#x7136;&#x540E;&#x4F7F;&#x7528; <code>mkinitcpio -p linux</code> &#x91CD;&#x65B0;&#x751F;&#x6210; <code>/boot/initramfs-linux.img</code>&#x3002;</p>
<p>initramfs &#x6587;&#x4EF6;&#x751F;&#x6210;&#x597D;&#x540E;&#xFF0C;&#x8FD0;&#x884C;&#x4E0B; <code>passwd</code> &#x4FEE;&#x6539;&#x597D;&#x5BC6;&#x7801;&#xFF0C;&#x5B89;&#x88C5;&#x5C31;&#x7B97;&#x5B8C;&#x6210;&#x4E86;&#x3002;&#x8FD9;&#x65F6;&#x53EF;&#x4EE5;&#x9000;&#x51FA; chroot &#x73AF;&#x5883;&#xFF0C;&#x7136;&#x540E;&#x8FD0;&#x884C; <code>systemctl poweroff</code> &#x5173;&#x673A;&#x4E86;&#x3002;</p>
<p>&#x73B0;&#x5728;&#x53EF;&#x4EE5;&#x8FD0;&#x884C;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x6765;&#x542F;&#x52A8;&#x7CFB;&#x7EDF;&#x4E86;&#xFF1A;</p>
<pre><code class="language-bash">unshare --map-auto --map-root-user \
qemu-system-x86_64 -machine pc,accel=kvm,dump-guest-core=off -m 4096 \
  -smp 4,sockets=1,dies=1,cores=4,threads=1 -rtc base=utc \
  -boot strict=on -kernel $PWD/base/boot/vmlinuz-linux \
  -initrd $PWD/base/boot/initramfs-linux.img \
  -append &apos;root=fsRoot rw rootfstype=9p rootflags=trans=virtio,version=9p2000.L,msize=5000000,cache=mmap,posixacl console=ttyS0&apos; \
  -fsdev local,security_model=passthrough,multidevs=remap,id=fsdev-fsRoot,path=$PWD/base \
  -device virtio-9p-pci,id=fsRoot,fsdev=fsdev-fsRoot,mount_tag=fsRoot \
  -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny
</code></pre>
<p>&#x542F;&#x52A8;&#x540E;&#x9700;&#x8981;&#x914D;&#x7F6E;&#x4E0B;&#x7F51;&#x7EDC;&#xFF0C;&#x5206;&#x522B;&#x5F00;&#x542F; <code>systemd-networkd</code> &#x548C; <code>systemd-resolved</code> &#x670D;&#x52A1;&#xFF1A;</p>
<pre><code class="language-bash">systemctl enable --now systemd-networkd.service
systemctl enable --now systemd-resolved.service
</code></pre>
<p>&#x7F16;&#x8F91; <code>/etc/systemd/network/20-wire.network</code>&#xFF0C;&#x6DFB;&#x52A0;&#x4EE5;&#x4E0B;&#x5185;&#x5BB9;&#xFF1A;</p>
<pre><code class="language-systemd-network">[Match]
Name=ens*

[Network]
DHCP=yes
</code></pre>
<p>&#x4FDD;&#x5B58;&#xFF0C;&#x7136;&#x540E;&#x8FD0;&#x884C;&#x4E0B; <code>networkctl reload</code> &#x4F7F;&#x914D;&#x7F6E;&#x751F;&#x6548;&#x3002;</p>
<p>NOTE: &#x5982;&#x679C;&#x5728;&#x5B89;&#x88C5;&#x5B8C;&#x6210;&#x540E;&#x5728;&#x5B89;&#x88C5;&#x67D0;&#x4E2A;&#x5305;&#x65F6;&#x51FA;&#x9519;&#x5B89;&#x88C5;&#x4E0D;&#x4E86;&#xFF0C;&#x53EF;&#x4EE5;&#x5148;&#x8FD0;&#x884C;&#x4E0B; <code>pacman-key --populate</code> &#x66F4;&#x65B0;&#x4E0B; key</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[关于网站跳转、弹窗、唤起 APP 的“伪”技术分析（知乎篇）]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x9996;&#x5148;&#xFF0C;&#x8FD9;&#x91CC;&#x7684;&#x7F51;&#x7AD9;&#x8DF3;&#x8F6C;&#x3001;&#x5F39;&#x7A97;&#x3001;&#x5524;&#x8D77; APP &#x90FD;&#x662F;&#x6307;&#x5728;&#x975E;&#x7528;&#x6237;&#x7684;&#x610F;&#x613F;&#x4E0B;&#x3001;&#x64C5;&#x81EA;&#x5C06;&#x7528;&#x6237;&#x5E26;&#x79BB;&#x5F53;&#x524D;<br>
&#x9875;&#x9762;&#xFF0C;&#x8DF3;&#x8F6C;&#x5230;&#x6216;&#x5F39;&#x51FA;&#x4E00;&#x4E9B;&#x5E7F;</p>]]></description><link>https://blog.mozcp.com/zhihu-ad-popup-an/</link><guid isPermaLink="false">5f313377a36aea0001bc2702</guid><category><![CDATA[zhihu]]></category><dc:creator><![CDATA[Colin Cheng]]></dc:creator><pubDate>Mon, 10 Aug 2020 11:56:06 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x9996;&#x5148;&#xFF0C;&#x8FD9;&#x91CC;&#x7684;&#x7F51;&#x7AD9;&#x8DF3;&#x8F6C;&#x3001;&#x5F39;&#x7A97;&#x3001;&#x5524;&#x8D77; APP &#x90FD;&#x662F;&#x6307;&#x5728;&#x975E;&#x7528;&#x6237;&#x7684;&#x610F;&#x613F;&#x4E0B;&#x3001;&#x64C5;&#x81EA;&#x5C06;&#x7528;&#x6237;&#x5E26;&#x79BB;&#x5F53;&#x524D;<br>
&#x9875;&#x9762;&#xFF0C;&#x8DF3;&#x8F6C;&#x5230;&#x6216;&#x5F39;&#x51FA;&#x4E00;&#x4E9B;&#x5E7F;&#x544A;&#x3001;&#x63A8;&#x5E7F;&#x7684;&#x9875;&#x9762;&#x6216;&#x5524;&#x8D77; APP &#x6765;&#x6267;&#x884C;&#x4E00;&#x4E9B;&#x5E7F;&#x544A;&#x6216;&#x63A8;&#x5E7F;&#x64CD;&#x4F5C;&#x3002;<br>
&#x4E3B;&#x8981;&#x76EE;&#x7684;&#x662F;&#x83B7;&#x53D6;&#x5E7F;&#x544A;&#x5C55;&#x793A;&#x6216;&#x70B9;&#x51FB;&#x7684;&#x6536;&#x76CA;&#x3001;&#x4E0B;&#x8F7D;&#x5B89;&#x88C5;&#x63A8;&#x5E7F;&#x8F6F;&#x4EF6;&#xFF08;APP&#xFF09;&#x7684;&#x6536;&#x76CA;&#x4EE5;&#x53CA;&#x5524;&#x8D77; APP<br>
&#x83B7;&#x53D6;&#x5176;&#x4E3E;&#x529E;&#x7684;&#x6D3B;&#x52A8;&#x6536;&#x76CA;&#x3002;</p>
<p>&#x4E0A;&#x9762;&#x7684;&#x8FD9;&#x4E9B;&#x884C;&#x4E3A;&#x53EF;&#x4EE5;&#x5206;&#x4E3A;&#x4E3B;&#x52A8;&#x8DDF;&#x88AB;&#x52A8;&#x7684;&#x3002;&#x4E3B;&#x52A8;&#x6307;&#x662F;&#x7F51;&#x7AD9;&#x81EA;&#x5DF1;&#x52A0;&#x5165;&#x76F8;&#x5173;&#x4EE3;&#x7801;&#x6765;&#x89E6;&#x53D1;&#xFF0C;&#x8FD9;&#x79CD;&#x4E00;&#x822C;<br>
&#x51FA;&#x73B0;&#x5728;&#x4E00;&#x4E9B;&#x5783;&#x573E;&#x7AD9;&#x4E0A;&#x3002;&#x88AB;&#x52A8;&#x662F;&#x6307;&#x7F51;&#x7AD9;&#x88AB;&#x690D;&#x5165;&#x4E86;&#x6076;&#x610F;&#x4EE3;&#x7801;&#x800C;&#x89E6;&#x53D1;&#x7684;&#xFF0C;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x53EF;&#x80FD;&#x662F;&#x7F51;&#x7AD9;&#x81EA;&#x5DF1;<br>
&#x5E76;&#x4E0D;&#x77E5;&#x60C5;&#x7684;&#xFF0C;&#x4F46;&#x80FD;&#x53D1;&#x751F;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#xFF0C;&#x8BF4;&#x660E;&#x5B58;&#x5728;&#x5B89;&#x5168;&#x6F0F;&#x6D1E;&#xFF0C;&#x6216;&#x8005;&#x5B89;&#x5168;&#x65B9;&#x9762;&#x505A;&#x5F97;&#x4E0D;&#x5230;&#x4F4D;&#xFF0C;&#x5BFC;&#x81F4;&#x7F51;&#x7AD9;<br>
&#x7684;&#x6D41;&#x91CF;&#x88AB;&#x52AB;&#x6301;&#x4E86;&#x3002;</p>
<p>&#x6D41;&#x91CF;&#x52AB;&#x6301;&#xFF0C;&#x6709;&#x53EF;&#x80FD;&#x53D1;&#x751F; ISP &#x7684;&#x901A;&#x4FE1;&#x8BBE;&#x5907;&#x4E0A;&#xFF0C;&#x8FD8;&#x6709;&#x53EF;&#x80FD;&#x5728;&#x7528;&#x6237;&#x7684;&#x8DEF;&#x7531;&#x5668;&#x3001;&#x7535;&#x8111;&#x91CC;&#xFF08;&#x88AB;&#x5B89;&#x88C5;&#x4E86;&#x6076;&#x610F;&#x8F6F;&#x4EF6;&#xFF09;&#x3002;</p>
<p>&#x6D41;&#x91CF;&#x52AB;&#x6301;&#x662F;&#x5982;&#x4F55;&#x53D1;&#x751F;&#x7684;&#x5462;&#xFF1F;</p>
<p>&#x5148;&#x7B80;&#x5355;&#x8BF4;&#x4E0B;&#x6211;&#x4EEC;&#x6253;&#x5F00;&#x4E00;&#x4E2A;&#x7F51;&#x7AD9;&#xFF0C;&#x5176;&#x80CC;&#x540E;&#x6240;&#x53D1;&#x751F;&#x7684;&#x4E00;&#x4E2A;&#x8FC7;&#x7A0B;&#x3002;</p>
<p>&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#xFF0C;&#x4ECE;&#x6211;&#x4EEC;&#x8F93;&#x5165;&#x4E00;&#x4E2A;&#x94FE;&#x63A5;&#xFF08;URL&#xFF09;&#xFF0C;&#x6309;&#x56DE;&#x8F66;&#x540E;&#x3002;</p>
<p>&#x9996;&#x5148;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x5C06;&#x94FE;&#x63A5;&#x7684;&#x57DF;&#x540D;&#x90E8;&#x5206;&#x63D0;&#x53D6;&#x51FA;&#x6765;&#xFF0C;&#x8FDB;&#x884C;&#x57DF;&#x540D;&#x89E3;&#x6790;&#xFF0C;&#x4EE5;&#x5F97;&#x5230;&#x4E00;&#x4E2A; IP &#x5730;&#x5740;&#x3002;</p>
<p>&#x8FD9;&#x91CC;&#x53EF;&#x80FD;&#x4F1A;&#x53D1;&#x751F;&#x7B2C;&#x4E00;&#x6B21;&#x88AB;&#x52AB;&#x6301;&#xFF1A;DNS &#x52AB;&#x6301;&#x3002;&#x90A3; DNS &#x52AB;&#x6301;&#x662F;&#x5982;&#x4F55;&#x53D1;&#x751F;&#x7684;&#x5462;&#xFF1F;</p>
<p>&#x57DF;&#x540D;&#x89E3;&#x6790;&#x65F6;&#xFF0C;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x4E00;&#x822C;&#x4F1A;&#x5411;&#x6307;&#x5B9A;&#x7684; DNS &#x670D;&#x52A1;&#x5668;&#x8BF7;&#x6C42;&#x89E3;&#x6790;&#xFF0C;&#x8FD9;&#x4E2A; DNS &#x670D;&#x52A1;&#x5668;&#x5730;&#x5740;&#x4E00;&#x822C;<br>
&#x662F;&#x7531; ISP &#x63D0;&#x4F9B;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x7531;&#x81EA;&#x5DF1;&#x6765;&#x8BBE;&#x7F6E;&#x3002;&#x5982;&#x679C;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x7684; DNS &#x670D;&#x52A1;&#x5668;&#x8BBE;&#x7F6E;&#x88AB;&#x6076;&#x610F;&#x7BE1;&#x6539;&#x4E86;&#xFF0C;<br>
&#x5F53;&#x7CFB;&#x7EDF;&#x5411;&#x6076;&#x610F;&#x7684; DNS &#x670D;&#x52A1;&#x5668;&#x8BF7;&#x6C42;&#x89E3;&#x6790;&#x65F6;&#xFF0C;&#x8FD4;&#x56DE;&#x7684; IP &#x5730;&#x5740;&#x53EF;&#x80FD;&#x5DF2;&#x7ECF;&#x4E0D;&#x662F;&#x771F;&#x6B63;&#x7684;&#x94FE;&#x63A5;&#x7F51;&#x7AD9;<br>
&#x7684; IP &#x5730;&#x5740;&#x4E86;&#x3002;&#x8FD9;&#x6837;&#x8FDE;&#x63A5;&#x8BBF;&#x95EE;&#x7684;&#x5185;&#x5BB9;&#x5C31;&#x88AB;&#x52AB;&#x6301;&#x4E86;&#x3002;</p>
<p>&#x53E6;&#x5916;&#x8FD8;&#x6709;&#x4E00;&#x79CD; DNS &#x52AB;&#x6301;&#xFF0C;&#x53D1;&#x751F;&#x5728;&#x6211;&#x4EEC;&#x5411; DNS &#x670D;&#x52A1;&#x5668;&#x8BF7;&#x6C42;&#x540E;&#xFF0C;&#x5728; DNS &#x670D;&#x52A1;&#x5668;&#x8FD4;&#x56DE;&#x7ED3;&#x679C;&#x5230;&#x8FBE;<br>
&#x6211;&#x4EEC;&#x7684;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x524D;&#xFF0C;&#x4E2D;&#x9014;&#x88AB;&#x94FE;&#x8DEF;&#x4E0A;&#x7ECF;&#x8FC7;&#x7684;&#x6709;&#x5173;&#x8BBE;&#x5907;&#x62A2;&#x5148;&#x8FD4;&#x56DE;&#x4E86;&#x3002;&#x7531;&#x4E8E; DNS &#x534F;&#x8BAE;&#x7684;&#x7F3A;&#x9677;&#xFF0C;&#x5BFC;<br>
&#x81F4;&#x6211;&#x4EEC;&#x7684;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x5148;&#x63A5;&#x53D7;&#x4E86;&#x5148;&#x8FD4;&#x56DE; IP &#x5730;&#x5740;&#x3002;</p>
<p>&#x6211;&#x4EEC;&#x5F97;&#x5230; IP &#x5730;&#x5740;&#x540E;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x5411; IP &#x5730;&#x5740;&#x53D1;&#x8D77;&#x5EFA;&#x7ACB; TCP &#x8FDE;&#x63A5;&#x8BF7;&#x6C42;&#x3002;&#x5728;&#x8FDE;&#x63A5;&#x5EFA;&#x7ACB;&#x540E;&#xFF0C;&#x5982;&#x679C;<br>
&#x6211;&#x4EEC;&#x7684;&#x94FE;&#x63A5;&#x662F; <code>http://</code> &#x5F00;&#x5934;&#x7684;&#xFF0C;&#x4F1A;&#x76F4;&#x63A5;&#x53D1;&#x8D77; HTTP &#x8BF7;&#x6C42;&#xFF0C;&#x4F46;&#x7531;&#x4E8E; HTTP &#x534F;&#x8BAE;&#x662F;&#x660E;&#x6587;<br>
&#xFF08;plaintext&#xFF09;&#x534F;&#x8BAE;&#xFF0C;&#x8FD9;&#x5C31;&#x53EF;&#x80FD;&#x4F1A;&#x53D1;&#x751F;&#x88AB;&#x52AB;&#x6301;&#x3002;&#x540C;&#x6837;&#x7684;&#xFF0C;&#x53EF;&#x4EE5;&#x52AB;&#x6301; HTTP &#x8BF7;&#x6C42;&#x7684;&#xFF0C;&#x8FD8;&#x53EF;&#x80FD;&#x662F;<br>
&#x94FE;&#x8DEF;&#x4E0A;&#x9014;&#x7ECF;&#x7684;&#x8BBE;&#x5907;&#x3002;&#x5982;&#x679C;&#x672C;&#x5730;&#x8DEF;&#x7531;&#x5668;&#x6216;&#x7EC8;&#x7AEF;&#x88AB;&#x690D;&#x5165;&#x4E86;&#x6076;&#x610F;&#x8F6F;&#x4EF6;&#xFF0C;&#x6216;&#x6D4F;&#x89C8;&#x5668;&#x5B89;&#x88C5;&#x4E86;&#x6076;&#x610F;&#x6269;&#x5C55;<br>
&#xFF08;&#x63D2;&#x4EF6;&#xFF09;&#xFF0C;&#x4E5F;&#x5C31;&#x53EF;&#x80FD;&#x52AB;&#x6301; HTTP &#x8BF7;&#x6C42;&#x7684;&#x3002;</p>
<p>&#x5982;&#x679C;&#x94FE;&#x63A5;&#x662F;&#x4EE5; <code>https://</code> &#x5F00;&#x5934;&#xFF0C;&#x5728;&#x5EFA;&#x7ACB; TCP &#x8FDE;&#x63A5;&#x540E;&#xFF0C;&#x4F1A;&#x5148;&#x5728;&#x5176;&#x4E0A;&#x9762;&#x5EFA;&#x7ACB;&#x4E00;&#x6761;&#x52A0;&#x5BC6;&#x7684;&#x5B89;&#x5168;<br>
&#x96A7;&#x9053;&#xFF0C;&#x5373;&#xFF08;SSL/TLS&#xFF09;&#x3002;TLS &#x7684;&#x5EFA;&#x7ACB;&#x9700;&#x8981;&#x5411;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x8BF7;&#x6C42;&#x5305;&#x542B;&#x8BE5;&#x94FE;&#x63A5;&#x7684;&#x57DF;&#x540D;&#x7684;&#x8BC1;&#x4E66;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;<br>
&#x5728;&#x62FF;&#x5230;&#x8BC1;&#x4E66;&#x540E;&#xFF0C;&#x901A;&#x8FC7;&#x6D4F;&#x89C8;&#x5668;&#x6216;&#x7CFB;&#x7EDF;&#x5185;&#x7F6E;&#x7684;&#x6839;&#x8BC1;&#x4E66;&#x5BF9;&#x5176;&#x8BC1;&#x4E66;&#x6821;&#x9A8C;&#x3002;&#x53EA;&#x6709;&#x6821;&#x9A8C;&#x901A;&#x8FC7;&#x540E;&#xFF0C;TLS &#x624D;<br>
&#x6210;&#x529F;&#x5EFA;&#x7ACB;&#xFF0C;&#x5982;&#x679C;&#x6821;&#x9A8C;&#x4E0D;&#x901A;&#x8FC7;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x4F1A;&#x76F4;&#x63A5;&#x62D2;&#x7EDD;&#x8BE5;&#x8FDE;&#x63A5;&#x3002;</p>
<p>&#x5728;&#x5EFA;&#x7ACB; TSL &#x8FDE;&#x63A5;&#x540E;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x5C31;&#x53EF;&#x4EE5;&#x5B89;&#x5168;&#x5730;&#x5411;&#x670D;&#x52A1;&#x5668;&#x53D1;&#x8D77; HTTP &#x8BF7;&#x6C42;&#x4E86;&#xFF0C;&#x56E0;&#x4E3A;&#x8FDE;&#x63A5;&#x662F;&#x7ECF;&#x8FC7;&#x52A0;<br>
&#x5BC6;&#x7684;&#xFF0C;&#x6240;&#x4EE5;&#x6CBF;&#x9014;&#x7684;&#x8BBE;&#x5907;&#x5C31;&#x65E0;&#x6CD5;&#x5BF9;&#x5176;&#x8FDB;&#x884C;&#x52AB;&#x6301;&#x4E86;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x5982;&#x679C;&#x6D4F;&#x89C8;&#x5668;&#x5B89;&#x5168;&#x4E86;&#x6076;&#x610F;&#x7684;&#x6269;&#x5C55;&#xFF08;&#x63D2;<br>
&#x4EF6;&#xFF09;&#xFF0C;&#x8FD8;&#x662F;&#x53EF;&#x4EE5;&#x5BF9;&#x5176;&#x5185;&#x5BB9;&#x8FDB;&#x884C;&#x7BE1;&#x6539;&#x7684;&#x3002;</p>
<p>&#x4E0A;&#x9762;&#x7684;&#x5E9F;&#x8BDD;&#x597D;&#x50CF;&#x6709;&#x70B9;&#x591A;&#x4E86; :)&#xFF0C;&#x8FD8;&#x662F;&#x8FDB;&#x5165;&#x672C;&#x6587;&#x7684;&#x4E3B;&#x9898;&#x5427;&#x3002;</p>
<p>&#x5148;&#x4EA4;&#x5F85;&#x4E0B;&#x80CC;&#x666F;&#x3002;</p>
<p>&#x6700;&#x8FD1;&#x8FD9;&#x51E0;&#x5929;&#xFF08;2020-08-05&#xFF09;&#xFF0C;&#x4F7F;&#x7528;&#x624B;&#x673A;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#xFF08;Firefox&#xFF09;&#x6253;&#x5F00;&#x77E5;&#x4E4E;&#x7684;&#x94FE;&#x63A5;&#x65F6;&#xFF0C;&#x603B;&#x662F;&#x4F1A;&#x8DF3;<br>
&#x8F6C;&#x5230;&#x4E00;&#x4E2A;&#x6DD8;&#x5B9D;&#x7684;&#x5546;&#x54C1;&#x5217;&#x8868;&#x9875;&#x9762;&#xFF0C;&#x770B;&#x4E86;&#x4E0B;&#x8FD9;&#x4E2A;&#x9875;&#x9762;&#x7684;&#x94FE;&#x63A5;&#xFF0C;&#x53D1;&#x73B0;&#x5E26;&#x6709;&#x4E00;&#x4E2A; <code>pid</code> &#x53C2;&#x6570;&#xFF0C;&#x719F;&#x6089;<br>
&#x6DD8;&#x5B9D;&#x5BA2;&#x7684;&#x540C;&#x5B66;&#x5E94;&#x8BE5;&#x90FD;&#x77E5;&#x9053;&#xFF0C;&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x5E26;&#x6709;&#x8FD4;&#x5229;&#x63A8;&#x5E7F;&#x7684;&#x9875;&#x9762;&#x6765;&#x7684;&#x3002;&#x6211;&#x5FC3;&#x60F3;&#xFF0C;&#x77E5;&#x4E4E;&#x4E0D;&#x4F1A;&#x7F3A;&#x94B1;&#x5230;<br>
&#x8FD9;&#x79CD;&#x4EFD;&#x4E0A;&#x5427;&#xFF0C;&#x8FD9;&#x79CD;&#x4E25;&#x91CD;&#x5F71;&#x54CD;&#x5230;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#x7684;&#x9A9A;&#x64CD;&#x4F5C;&#x4E00;&#x822C;&#x53EA;&#x4F1A;&#x5728;&#x4E00;&#x4E9B;&#x5783;&#x573E;&#x7AD9;&#x51FA;&#x73B0;&#x7684;&#x3002;&#x5728;&#x5E26;&#x6709;&#x8FD9;<br>
&#x6837;&#x7684;&#x7591;&#x95EE;&#x4E0B;&#xFF0C;&#x4E5F;&#x5C31;&#x6709;&#x4E86;&#x8FD9;&#x6837;&#x4E00;&#x7BC7;&#x6587;&#x7AE0;&#xFF0C;&#x7B97;&#x662F;&#x505A;&#x4E0B;&#x7B14;&#x8BB0;&#x5427;&#x3002;</p>
<p>&#x5176;&#x5B9E;&#xFF0C;&#x6211;&#x6700;&#x5148;&#x6000;&#x7591;&#x7684;&#x5BF9;&#x8C61;&#x5E76;&#x4E0D;&#x662F;&#x77E5;&#x4E4E;&#xFF0C;&#x800C;&#x662F;&#x7535;&#x4FE1;&#x8FD0;&#x8425;&#x5546;&#xFF0C;&#x4F1A;&#x4EC0;&#x4E48;&#x5462;&#xFF0C;&#x6709;&#x7ECF;&#x9A8C;&#x5427; ;)&#xFF0C;&#x8FD9;&#x79CD;&#x4E8B;<br>
&#x5728;&#x51E0;&#x5E74;&#x524D;&#x662F;&#x7ECF;&#x5E38;&#x53D1;&#x751F;&#x7684;&#xFF0C;&#x7279;&#x522B;&#x662F;&#x5728;&#x4E00;&#x4E9B;&#x5C0F;&#x7684; ISP &#x4E0A;&#xFF0C;&#x6216;&#x8005;&#x5728;&#x519C;&#x6751;&#xFF08;&#x6709;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#x6211;&#x5C31;&#x4EB2;&#x8EAB;&#x7ECF;<br>
&#x5386;&#x8FC7;&#xFF09;&#x3002;&#x4E0D;&#x8FC7;&#x73B0;&#x5728;&#x7531;&#x4E8E; HTTPS &#x7684;&#x666E;&#x53CA;&#xFF0C;&#x4EE5;&#x53CA;&#x5176;&#x4ED6;&#x4E00;&#x4E9B;&#x60C5;&#x51B5;&#xFF0C;&#x8FD9;&#x79CD;&#x4E8B;&#x57FA;&#x672C;&#x4E0A;&#x5DF2;&#x7ECF;&#x6D88;&#x5931;&#x4E86;&#x3002;</p>
<p>&#x90A3;&#x73B0;&#x5728;&#x8FD9;&#x79CD;&#x662F;&#x4EC0;&#x4E48;&#x60C5;&#x51B5;&#x5462;&#xFF1F;</p>
<p>&#x7531;&#x4E8E;&#x624B;&#x673A;&#x7AEF;&#x67E5;&#x770B;&#x4E0D;&#x4E86;&#x8BF7;&#x6C42;&#xFF0C;&#x800C;&#x521A;&#x597D;&#x6211;&#x624B;&#x673A;&#x7AEF;&#x7684; <a href="https://developer.mozilla.org/en-US/docs/Tools/about:debugging#Connection_to_Firefox_for_Android_68">Firefox &#x7248;&#x672C;&#x662F; 68</a>&#xFF0C;<br>
&#x65E0;&#x6CD5;&#x5728; PC &#x7684; Firefox &#x4E0A;&#x4F7F;&#x7528; Remote Debugging&#xFF0C;&#x56E0;&#x6B64;&#x8FD9;&#x91CC;&#x4F7F;&#x7528; chromium &#x6765;&#x6D4B;&#x8BD5;&#x3002;</p>
<p>&#x6253;&#x5F00; chromium&#xFF0C;&#x6309; F12 &#x6253;&#x5F00; DevTools&#xFF0C;&#x5F00;&#x542F;&#x6A21;&#x62DF;&#x79FB;&#x52A8;&#x7AEF;&#x7684; UA &#xFF0C;&#x6253;&#x5F00;&#x4ECE;&#x624B;&#x673A;&#x7AEF;&#x590D;&#x5236;&#x8FC7;&#x6765;<br>
&#x7684;&#x77E5;&#x4E4E;&#x7684;&#x94FE;&#x63A5;&#xFF0C;&#x53D1;&#x73B0;&#x53EF;&#x4EE5;&#x6210;&#x529F;&#x590D;&#x73B0;&#x4E86;&#x3002;</p>
<p>&#x5148;&#x68C0;&#x67E5;&#x77E5;&#x4E4E;&#x94FE;&#x63A5;&#x7684; HTTPS &#x8BC1;&#x4E66;&#xFF0C;&#x53D1;&#x73B0;&#x8BC1;&#x4E66;&#x662F;&#x77E5;&#x4E4E;&#x7684;&#xFF08;&#x5982;&#x4E0B;&#x56FE;&#xFF09;&#xFF0C;&#x56E0;&#x6B64;&#x8FD9;&#x91CC;&#x5C31;&#x6392;&#x9664;&#x4E86;&#x7535;&#x4FE1;&#x8FD0;&#x8425;&#x5546;&#x5ACC;&#x7591;&#x4E86;&#x3002;</p>
<p><img src="https://raw.githubusercontent.com/zbinlin/blog/master/res/zhihu-ad-popup-analysis/ca.png" alt loading="lazy"><br>
<img src="https://raw.githubusercontent.com/zbinlin/blog/master/res/zhihu-ad-popup-analysis/ca1.png" alt loading="lazy"></p>
<p>&#x95EE;&#x9898;&#x56DE;&#x5230;&#x77E5;&#x4E4E;&#x4E0A;&#x6765;&#xFF0C;&#x5148;&#x4ECE; HTTP &#x8BF7;&#x6C42;&#x4EE5;&#x53CA;&#x6E90;&#x7801;&#x5165;&#x624B;&#x5206;&#x6790;&#x3002;</p>
<p>&#x4ECE;&#x5730;&#x5740;&#x680F;&#x53F3;&#x4FA7;&#x663E;&#x793A;&#x7684;&#x62E6;&#x622A;&#x5F39;&#x51FA;&#x7A97;&#x53E3;&#x7684;&#x63D0;&#x793A;&#x56FE;&#x6807;&#x91CC;&#x627E;&#x5230;&#x4E86;&#x5177;&#x4F53;&#x7684;&#x5F39;&#x7A97;&#x94FE;&#x63A5;&#xFF1A;</p>
<p><img src="https://raw.githubusercontent.com/zbinlin/blog/master/res/zhihu-ad-popup-analysis/popup1.png" alt loading="lazy"></p>
<p>&#x9F20;&#x6807;&#x79FB;&#x5230;&#x94FE;&#x63A5;&#x4E0A;&#xFF0C;&#x663E;&#x793A;&#x7684;&#x5B8C;&#x6574;&#x5730;&#x5740;&#x4E3A;&#xFF1A;<code>https://api.ad.scjcgj.top/api/jump/tongji?mid=jump_193</code></p>
<p>&#x7528; <code>whois</code> &#x67E5;&#x4E86;&#x4E0B;&#x8FD9;&#x4E2A; <code>scjcgj.top</code> &#x57DF;&#x540D;&#xFF0C;&#x53D1;&#x73B0;&#x7ECF;&#x8FC7;&#x9690;&#x79C1;&#x4FDD;&#x62A4;&#x4E86;&#x3002;</p>
<p>&#x6765;&#x5230; DevTools &#x7A97;&#x53E3;&#x4E2D;&#xFF0C;&#x70B9;&#x51FB; <code>Network</code> &#x5207;&#x6362;&#x5230; Network &#x9762;&#x677F;&#x3002;</p>
<p>&#x5148;&#x8BBE;&#x7F6E;&#x4E0B;&#x754C;&#x9762;&#xFF0C;&#x4EE5;&#x65B9;&#x4FBF;&#x5206;&#x6790;&#x3002;&#x70B9;&#x51FB;&#x9762;&#x677F;&#x53F3;&#x8FB9;&#x7684;&#x8BBE;&#x7F6E;&#x56FE;&#x6807;&#x6309;&#x94AE;&#xFF0C;&#x7136;&#x540E;&#x6309;&#x4E0B;&#x56FE;&#x6765;&#x8FDB;&#x884C;&#x8BBE;&#x7F6E;&#xFF1A;</p>
<p><img src="https://raw.githubusercontent.com/zbinlin/blog/master/res/zhihu-ad-popup-analysis/settings.png" alt="Network Panel Setting" loading="lazy"></p>
<p>&#x7136;&#x540E;&#x5728;&#x5217;&#x8868;&#x7684;&#x8868;&#x5934;&#x5904;&#x53F3;&#x952E;&#xFF0C;&#x5F39;&#x51FA;&#x7684;&#x83DC;&#x5355;&#x9009;&#x9879;&#x6309;&#x5982;&#x4E0B;&#x8BBE;&#x7F6E;&#xFF1A;</p>
<p><img src="https://raw.githubusercontent.com/zbinlin/blog/master/res/zhihu-ad-popup-analysis/columns-settings.png" alt="Table Columns Setting" loading="lazy"></p>
<p>&#x7ECF;&#x8FC7;&#x8BBE;&#x7F6E;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x5F88;&#x5BB9;&#x6613;&#x7684;&#x627E;&#x5230;&#x8DDF;&#x4E0A;&#x9762;&#x94FE;&#x63A5;&#x63A5;&#x8FD1;&#x7684;&#x57DF;&#x540D;&#xFF08;<code>ad.scjcgj.top</code>&#xFF09;&#x4E86;&#xFF1A;</p>
<p><img src="https://raw.githubusercontent.com/zbinlin/blog/master/res/zhihu-ad-popup-analysis/p1.png" alt loading="lazy"></p>
<p>&#x4ECE;&#x4E0A;&#x56FE;&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#x6765;&#xFF0C;&#x8FD9;&#x662F;&#x4E00;&#x4E2A; JS &#x6587;&#x4EF6;&#xFF0C;&#x7531; <code>https://www.zhihu.com/natsume/ruoying_m_banner.html</code> &#x5F15;&#x5165;&#x3002;</p>
<p>&#x8FD9;&#x4E2A; <code>https://www.zhihu.com/natsume/ruoying_m_banner.html</code> &#x5C31;&#x662F;&#x8FD9;&#x6B21;&#x95EE;&#x9898;&#x7684;&#x6839;&#x6E90;&#x4E86;&#xFF0C;&#x4F46;&#x5148;&#x4E0D;&#x8BF4;&#x8FD9;&#x4E2A;&#x3002;</p>
<p>&#x70B9;&#x51FB;&#x4E00;&#x4E0B;&#x8BE5;&#x884C;&#xFF0C;&#x5728;&#x5F39;&#x51FA;&#x7684;&#x7A97;&#x53E3;&#x91CC;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x8BE5;&#x8BF7;&#x6C42;&#x7684;&#x8BE6;&#x60C5;&#x7A97;&#x53E3;&#x3002;</p>
<p><img src="https://raw.githubusercontent.com/zbinlin/blog/master/res/zhihu-ad-popup-analysis/p2.png" alt loading="lazy"></p>
<p>&#x6211;&#x4EEC;&#x5207;&#x6362;&#x5230; <code>Response</code> &#x6807;&#x7B7E;&#xFF0C;&#x76F4;&#x63A5;&#x67E5;&#x770B;&#x5B83;&#x7684;&#x6E90;&#x7801;&#x3002;</p>
<p><img src="https://raw.githubusercontent.com/zbinlin/blog/master/res/zhihu-ad-popup-analysis/p3.png" alt="https://ad.scjcgj.top/wap/script/md/md-1000193/index.js" loading="lazy"></p>
<p>&#x8FD9;&#x91CC;&#x6709;&#x70B9;&#x610F;&#x601D;&#xFF0C;&#x4E0D;&#x77E5;&#x9053;&#x4ED6;&#x4EEC;&#x662F;&#x4E0D;&#x662F;&#x6545;&#x610F;&#x7684;&#xFF0C;&#x8FD9;&#x91CC;&#x6709;&#x4E00;&#x6BB5;&#x5DF2;&#x7ECF;&#x88AB;&#x6CE8;&#x91CA;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x5B83;&#x770B;&#x8D77;&#x6765;&#x50CF;&#x662F;<br>
&#x6B63;&#x5E38;&#x7684;&#x5E7F;&#x544A;&#x4EE3;&#x7801;&#x6765;&#x7684;&#xFF0C;&#x800C;&#x672A;&#x6CE8;&#x91CA;&#x7684;&#x4EE3;&#x7801;&#x4E0E;&#x5B83;&#x7684;&#x529F;&#x80FD;&#x57FA;&#x672C;&#x4E00;&#x6837;&#xFF0C;&#x90FD;&#x662F;&#x521B;&#x5EFA;&#x4E00;&#x4E2A; iframe&#xFF0C;&#x5E76;&#x52A0;<br>
&#x8F7D;&#x4E00;&#x4E2A;&#x94FE;&#x63A5;&#x3002;&#x4E2A;&#x4EBA;&#x731C;&#x6D4B;&#xFF0C;&#x6CE8;&#x91CA;&#x6389;&#x7684;&#x4EE3;&#x7801;&#x5E94;&#x8BE5;&#x662F;&#x4E3A;&#x4E86;&#x5E94;&#x4ED8;&#x5BA1;&#x6838;&#x7528;&#x7684;&#x5427;&#xFF0C;&#x5728;&#x5BA1;&#x6838;&#x901A;&#x8FC7;&#x540E;&#xFF0C;&#x5C31;<br>
&#x76F4;&#x63A5;&#x52A0;&#x8F7D;&#x6076;&#x610F;&#x7684;&#x4EE3;&#x7801;&#x4E86;&#x3002;</p>
<p>&#x6211;&#x4EEC;&#x7EE7;&#x7EED;&#x5206;&#x6790;&#x8FD9;&#x4E2A; iframe &#x52A0;&#x8F7D;&#x7684;&#x94FE;&#x63A5;&#xFF0C;&#x8FD9;&#x4E2A;&#x94FE;&#x63A5;&#x7684;&#x57DF;&#x540D;&#x662F; <code>api.ad.scjcgj.top</code>&#xFF0C;&#x56E0;&#x4E3A;&#x662F;<br>
iframe &#x52A0;&#x8F7D;&#x7684;&#xFF0C;DevTools &#x7ECF;&#x8FC7;&#x4E0A;&#x9762;&#x7684;&#x8BBE;&#x7F6E;&#x540E;&#xFF0C;&#x5F88;&#x5BB9;&#x6613;&#x5C31;&#x53EF;&#x4EE5;&#x627E;&#x51FA;&#x6765;&#x4E86;&#x3002;</p>
<p><img src="https://raw.githubusercontent.com/zbinlin/blog/master/res/zhihu-ad-popup-analysis/p4.png" alt="https://api.ad.scjcgj.top/api/report/get?cid=md-1000193&amp;t=&amp;h=144" loading="lazy"></p>
<p>&#x70B9;&#x51FB;&#x5F39;&#x51FA;&#x8BE6;&#x60C5;&#xFF0C;&#x5207;&#x6362;&#x5230; Response &#x6807;&#x7B7E;&#x67E5;&#x770B;&#x6E90;&#x7801;&#xFF0C;&#x8FD9;&#x91CC;&#x7684;&#x4EE3;&#x7801;&#x6BD4;&#x8F83;&#x6B63;&#x5E38;&#xFF0C;&#x9700;&#x8981;&#x7EE7;&#x7EED;&#x5206;&#x6790;&#x5B83;<br>
&#x52A0;&#x8F7D;&#x7684; JS&#xFF0C;&#x4F46;&#x8FD9;&#x91CC;&#x52A0;&#x8F7D;&#x7684;&#x6BD4;&#x8F83;&#x591A;&#xFF0C;&#x4E00;&#x4E2A;&#x4E00;&#x4E2A;&#x7684;&#x770B;&#x6709;&#x70B9;&#x9EBB;&#x70E6;&#x3002;&#x4E0D;&#x7528;&#x62C5;&#x5FC3;&#xFF0C;&#x70B9;&#x51FB;&#x65C1;&#x8FB9;&#x7684;<br>
<code>Initiator</code> &#x6807;&#x7B7E;&#xFF0C;&#x662F;&#x4E0D;&#x662F;&#x53D1;&#x73B0;&#x4E86;&#x70B9;&#x4EC0;&#x4E48;&#xFF1F;</p>
<p><img src="https://raw.githubusercontent.com/zbinlin/blog/master/res/zhihu-ad-popup-analysis/p5.png" alt loading="lazy"></p>
<p>&#x8FD9;&#x91CC;&#x5217;&#x51FA;&#x9875;&#x9762; <code>https://api.ad.scjcgj.top/api/report/get?cid=md-1000193&amp;t=&amp;h=144</code><br>
&#x91CC;&#x6240;&#x6709;&#x8BF7;&#x6C42;&#x7684;&#x8BF7;&#x6C42;&#x94FE;&#xFF0C;&#x5E76;&#x4E14;&#x5DF2;&#x7ECF;&#x6309;&#x8C03;&#x7528;&#x5173;&#x7CFB;&#x5C42;&#x7EA7;&#x5730;&#x6392;&#x5217;&#x597D;&#x4E86;&#x3002;</p>
<p>&#x5982;&#x679C;&#x6CE8;&#x610F;&#x770B;&#x7684;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x6700;&#x540E;&#x7684;&#x4E09;&#x884C;&#x7684;&#x94FE;&#x63A5;&#x6BD4;&#x8F83;&#x5F02;&#x5E38;&#xFF0C;&#x8FD9;&#x662F;&#x4E00;&#x79CD;&#x81EA;&#x5B9A;&#x4E49;&#x7684;&#x534F;&#x8BAE;&#x94FE;&#x63A5;&#xFF0C;&#x5982;&#x679C;<br>
&#x5E94;&#x7528;&#x5728;&#x7CFB;&#x7EDF;&#x91CC;&#x6CE8;&#x518C;&#x4E86;&#x67D0;&#x4E2A;&#x81EA;&#x5B9A;&#x4E49;&#x534F;&#x8BAE;&#xFF0C;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x91CC;&#x6253;&#x5F00;&#x8FD9;&#x4E2A;&#x81EA;&#x5B9A;&#x4E49;&#x534F;&#x8BAE;&#x7684;&#x94FE;&#x63A5;&#xFF0C;&#x5C31;&#x4F1A;&#x8C03;&#x7528;<br>
&#x8FD9;&#x4E2A;&#x5E94;&#x7528;&#x6765;&#x5904;&#x7406;&#x8FD9;&#x4E2A;&#x94FE;&#x63A5;&#x3002;&#x7B80;&#x5355;&#x5730;&#x8BF4;&#xFF0C;&#x4E5F;&#x5C31;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x70B9;&#x51FB;&#x8FD9;&#x4E2A;&#x94FE;&#x63A5;&#x6765;&#x5524;&#x8D77;&#x8BE5;&#x5E94;&#x7528;&#x3002;&#x5728;&#x79FB;&#x52A8;<br>
&#x8BBE;&#x5907;&#x4E3A;&#x738B;&#x7684;&#x56FD;&#x5185;&#x4E92;&#x8054;&#x7F51;&#x73AF;&#x5883;&#x91CC;&#xFF0C;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x5DF2;&#x7ECF;&#x7528;&#x5F97;&#x7089;&#x706B;&#x7EAF;&#x9752;&#x4E86;&#x3002;</p>
<p>&#x770B;&#x5F00;&#x5934;&#x7684;&#x534F;&#x8BAE;&#xFF0C;&#x6211;&#x731C;&#x8FD9;&#x4E09;&#x4E2A;&#x94FE;&#x63A5;&#x5206;&#x522B;&#x662F;&#x8C03;&#x7528; alipay&#x3001;&#x65B0;&#x6D6A;&#x5FAE;&#x535A;&#x3001;&#x4EE5;&#x53CA;&#x6DD8;&#x5B9D;&#x7684; APP &#x6765;&#x7684;&#xFF0C;&#x5177;<br>
&#x4F53;&#x4F5C;&#x7528;&#x8FD9;&#x91CC;&#x5C31;&#x4E0D;&#x5206;&#x6790;&#xFF0C;&#x6709;&#x5174;&#x8DA3;&#x7684;&#x53EF;&#x4EE5;&#x53BB;&#x7814;&#x7A76;&#x4E0B;&#x3002;</p>
<p>&#x4ECE;&#x56FE;&#x4E2D;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x8FD9;&#x4E09;&#x4E2A;&#x94FE;&#x63A5;&#x90FD;&#x662F;&#x7531; JS <code>https://c.sl.chenshengyu.cn/test/aw193.js</code> (<code>whois chenshengyu.cn</code>&#xFF09;&#x8C03;&#x7528;&#x8BF7;&#x6C42;&#x7684;&#x3002;<br>
&#x627E;&#x5230;&#x8FD9;&#x4E2A; JS &#x5E76;&#x67E5;&#x770B;&#x91CC;&#x9762;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x53D1;&#x73B0;&#x4E0A;&#x9762;&#x7684;&#x4E09;&#x4E2A;&#x94FE;&#x63A5;&#x662F;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x914D;&#x7F6E;&#x5206;&#x53D1;&#x7684;&#xFF0C;&#x7531;&#x63A5;&#x53E3; <code>https://api.sl.chenshengyu.cn/api/ip/get4?cid=zhihu1</code><br>
&#x8FD4;&#x56DE;&#x3002;&#x8FD9;&#x91CC;&#x8FD8;&#x201C;&#x4EBA;&#x6027;&#x5316;&#x201D;&#x5730;&#x8BBE;&#x7F6E;&#x4E86;&#x65F6;&#x95F4;&#x63A7;&#x5236;&#xFF0C;&#x5728; 12 &#x5C0F;&#x65F6;&#x5185;&#xFF0C;&#x53EA;&#x8C03;&#x7528;&#x4E00;&#x6B21;&#xFF0C;&#x6211;&#x731C;&#x8FD9;&#x6837;&#x53EF;&#x80FD;&#x5C31;<br>
&#x4E0D;&#x4F1A;&#x5F15;&#x7528;&#x7528;&#x6237;&#x7684;&#x8B66;&#x89C9;&#x5427;&#x3002;</p>
<p>&#x6309;&#x7406;&#x8BF4;&#xFF0C;&#x5230;&#x8FD9;&#x91CC;&#x7B97;&#x662F;&#x5206;&#x6790;&#x5B8C;&#x6210;&#x4E86;&#xFF0C;&#x4F46;&#x56DE;&#x5934;&#x770B;&#x4E0B;&#xFF0C;&#x597D;&#x50CF;&#x8FD8;&#x6CA1;&#x627E;&#x5230;&#x524D;&#x9762;&#x6240;&#x8BF4;&#x7684;&#x90A3;&#x4E2A;&#x5F39;&#x7A97;&#x7684;&#x51FA;&#x5904;&#x5440;&#x3002;</p>
<p>&#x7EE7;&#x7EED;&#x5206;&#x6790;&#x3002;</p>
<p>&#x56DE;&#x5230;&#x524D;&#x9762;&#x90A3;&#x5F20;&#x56FE;&#x91CC;&#xFF0C;&#x9664;&#x4E86; <code>https://c.sl.chenshengyu.cn/test/aw193.js</code> &#x4E4B;&#x5916;&#xFF0C;&#x770B;&#x8D77;&#x6765;&#x6BD4;&#x8F83;<br>
&#x5F02;&#x5E38;&#x7684; JS &#x8FD8;&#x6709;&#xFF08;&#x5176;&#x4ED6;&#x7684;&#x51E0;&#x4E2A;&#x5176;&#x4E2D;&#x4E00;&#x4E2A;&#x662F;&#x5F15;&#x5165; JQuery &#x5E93;&#xFF0C;&#x4EE5;&#x53CA; cnzz &#x7684;&#x7EDF;&#x8BA1;&#x4EE3;&#x7801;&#xFF09;&#xFF1A;</p>
<ul>
<li><a href="https://ad.scjcgj.top/wap/script/md/md-1000193/ad/2/index.js">https://ad.scjcgj.top/wap/script/md/md-1000193/ad/2/index.js</a></li>
<li><a href="https://ad.scjcgj.top/wap/script/md/md-1000193/b/?v=410fd1c92f660cfc4adb84b9928ac22a">https://ad.scjcgj.top/wap/script/md/md-1000193/b/?v=410fd1c92f660cfc4adb84b9928ac22a</a></li>
<li><a href="https://ad.scjcgj.top/wap/script/md/md-1000193/e/">https://ad.scjcgj.top/wap/script/md/md-1000193/e/</a></li>
</ul>
<p>&#x6211;&#x4EEC;&#x4E00;&#x4E2A;&#x4E00;&#x4E2A;&#x6765;&#x770B;&#xFF1A;</p>
<p><code>https://ad.scjcgj.top/wap/script/md/md-1000193/ad/2/index.js</code> &#x8FD9;&#x4E2A; JS &#x4E5F;&#x521B;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A; iframe&#x3002;<br>
&#x52A0;&#x8F7D;&#x7684;&#x94FE;&#x63A5;&#x4E3A; <code>https://ad.scjcgj.top/wap/script/md/md-1000193/ad/2/ad.html</code>&#xFF0C;&#x67E5;<br>
&#x770B;&#x4E86;&#x91CC;&#x9762;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x770B;&#x8D77;&#x6765;&#x6BD4;&#x8F83;&#x6B63;&#x5E38;&#x3002;</p>
<p><code>https://ad.scjcgj.top/wap/script/md/md-1000193/b/?v=410fd1c92f660cfc4adb84b9928ac22a</code> &#x8FD9;&#x4E2A; JS &#x7684;<br>
&#x5185;&#x5BB9;&#x770B;&#x8D77;&#x6765;&#x5C31;&#x6BD4;&#x8F83;&#x6D41;&#x6C13;&#x4E86;&#xFF1A;</p>
<p><img src="https://raw.githubusercontent.com/zbinlin/blog/master/res/zhihu-ad-popup-analysis/p6.png" alt loading="lazy"></p>
<p>&#x8FD9;&#x91CC;&#x4EE3;&#x7801;&#x7684;&#x610F;&#x601D;&#x662F;&#x5F53;&#x4F60;&#x6309;&#x56DE;&#x9000;&#x952E;&#x65F6;&#xFF0C;&#x5B83;&#x4F1A;&#x963B;&#x6B62;&#x4F60;&#x56DE;&#x9000;&#x5230;&#x4E0A;&#x4E00;&#x9875;&#xFF0C;&#x76F4;&#x63A5;&#x5C06;&#x4F60;&#x5E26;&#x5230;&#x5B83;&#x6307;&#x5B9A;&#x7684;&#x9875;&#x9762;&#x91CC;&#x53BB;&#x3002;</p>
<p><code>https://ad.scjcgj.top/wap/script/md/md-1000193/e/</code> &#x7EC8;&#x4E8E;&#x4ECE;&#x8FD9;&#x4E2A; JS &#x91CC;&#x627E;&#x5230;&#x5F00;&#x5934;&#x8BF4;&#x7684;<br>
&#x90A3;&#x4E2A;&#x5F39;&#x7A97;&#x81EA;&#x52A8;&#x8C03;&#x7528;&#x7684;&#x4EE3;&#x7801;&#x4E86;&#xFF1A;</p>
<p><img src="https://raw.githubusercontent.com/zbinlin/blog/master/res/zhihu-ad-popup-analysis/p7.png" alt loading="lazy"></p>
<p>&#x73B0;&#x5728;&#x56DE;&#x8FC7;&#x5934;&#x6765;&#x770B;&#x4E0B;&#xFF0C;&#x53D1;&#x73B0;&#x8FD9;&#x4E9B;&#x7F51;&#x7AD9;&#x800D;&#x8D77;&#x6D41;&#x6C13;&#x6765;&#x624B;&#x6BB5;&#x65E0;&#x6240;&#x4E0D;&#x7528;&#x5176;&#x6781;&#x5440;&#x3002;&#x4E0D;&#x8FC7;&#xFF0C;&#x8FD9;&#x4E2A;&#x7F51;&#x7AD9;&#x80FD;&#x4E58;<br>
&#x4E0A;&#x77E5;&#x4E4E;&#x8FD9;&#x8F86;&#x6D41;&#x91CF;&#x5927;&#x5DF4;&#xFF0C;&#x6211;&#x89C9;&#x5F97;&#x8FD8;&#x662F;&#x77E5;&#x4E4E;&#x5B89;&#x5168;&#x65B9;&#x9762;&#x505A;&#x5F97;&#x8FD8;&#x4E0D;&#x591F;&#x597D;&#xFF0C;&#x8BA9;&#x5B83;&#x80FD;&#x591F;&#x6709;&#x53EF;&#x4E58;&#x4E4B;&#x673A;&#x3002;&#x5F88;<br>
&#x660E;&#x663E;&#x7684;&#xFF0C;&#x4F60;&#x5728;&#x4E00;&#x4E2A;&#x4E3B;&#x57DF;&#x540D;&#x7684;&#x9875;&#x9762;&#x91CC;&#xFF08;<code>https://www.zhihu.com/natsume/ruoying_m_banner.html</code>&#xFF09;&#x5F15;&#x5165;<br>
&#x4E00;&#x4E2A;&#x8FD9;&#x6837;&#x7684;&#x4E0D;&#x53D7;&#x63A7;&#x3001;&#x770B;&#x8D77;&#x6765;&#x660E;&#x663E;&#x4E0D;&#x6B63;&#x5E38;&#x7684;&#x7B2C;&#x4E09;&#x65B9;&#x57DF;&#x540D;&#x7684; JS&#xFF0C;&#x8FD9;&#x76F8;&#x5F53;&#x4E8E;&#x7528;&#x6237;&#x5BF9;&#x4E8E;&#x5B83;&#x6765;&#x8BF4;&#x662F;&#x5B8C;<br>
&#x5168;&#x900F;&#x660E;&#x7684;&#x3002;&#x8FD9;&#x6B21;&#x5B83;&#x7528;&#x5728;&#x6076;&#x610F;&#x5F39;&#x7A97;&#x65B9;&#x9762;&#x53EF;&#x80FD;&#x5BF9;&#x7528;&#x6237;&#x9020;&#x6210;&#x4E0D;&#x4E86;&#x4EC0;&#x4E48;&#x635F;&#x5931;&#xFF0C;&#x4F46;&#x5982;&#x679C;&#x54EA;&#x5929;&#x5B83;&#x7528;&#x8FD9;&#x4E2A;<br>
&#x6765;&#x7A83;&#x53D6;&#x7528;&#x6237;&#x4FE1;&#x606F;&#xFF0C;&#x9020;&#x6210;&#x7684;&#x635F;&#x5931;&#x8C01;&#x6765;&#x4E70;&#x5355;&#x5462;&#xFF1F;&#xFF08;PS&#xFF1A;&#x8FD9;&#x8BA9;&#x6211;&#x60F3;&#x8D77;&#x4E4B;&#x524D;&#x770B;&#x5230;&#x8FC7;&#x4E0D;&#x5C11;&#x65B0;&#x6D6A;&#x5FAE;&#x535A;&#x7684;<br>
&#x7528;&#x6237;&#x65E0;&#x7F18;&#x65E0;&#x6545;&#x591A;&#x4E86;&#x5F88;&#x591A;&#x672A;&#x77E5;&#x7684;&#x5173;&#x6CE8;&#xFF0C;&#x8FD9;&#x91CC;&#x9762;&#x662F;&#x5426;&#x6709;&#x7C7B;&#x4F3C;&#x7684;&#x95EE;&#x9898;&#x5462;&#xFF1F;&#xFF09;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[通过 ssh 命令临时地使用 Android 作为 SOCKS 4/5 服务器]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x6700;&#x8FD1;&#x9700;&#x8981;&#x5728;&#x4E00;&#x53F0; Linux &#x7684; PC &#x4E0A;&#x8BBF;&#x95EE; Wikipedia&#xFF0C;&#x4F46;&#x4E0D;&#x597D;&#x5728;&#x8FD9;&#x53F0;&#x7535;&#x8111;&#x4E0A;&#x5B89;&#x88C5;&#x4E00;&#x4E9B;&#x8F6F;&#x4EF6;&#x3002;&#x521A;<br>
&#x597D;&#x81EA;&#x5DF1;&#x7684;&#x624B;&#x673A;&#x5F00;&#x542F;&#x4E86; VPN &#x53EF;&#x4EE5;&#x6B63;&#x5E38;&#x8BBF;&#x95EE;&#x5230; Wikipedia&</p>]]></description><link>https://blog.mozcp.com/android-as-socks5-server-by-ssh-temporary/</link><guid isPermaLink="false">5e08b2aa22efe60001bf78f0</guid><category><![CDATA[android]]></category><category><![CDATA[socks]]></category><category><![CDATA[socks5]]></category><category><![CDATA[ssh]]></category><dc:creator><![CDATA[Colin Cheng]]></dc:creator><pubDate>Mon, 29 Jul 2019 14:07:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x6700;&#x8FD1;&#x9700;&#x8981;&#x5728;&#x4E00;&#x53F0; Linux &#x7684; PC &#x4E0A;&#x8BBF;&#x95EE; Wikipedia&#xFF0C;&#x4F46;&#x4E0D;&#x597D;&#x5728;&#x8FD9;&#x53F0;&#x7535;&#x8111;&#x4E0A;&#x5B89;&#x88C5;&#x4E00;&#x4E9B;&#x8F6F;&#x4EF6;&#x3002;&#x521A;<br>
&#x597D;&#x81EA;&#x5DF1;&#x7684;&#x624B;&#x673A;&#x5F00;&#x542F;&#x4E86; VPN &#x53EF;&#x4EE5;&#x6B63;&#x5E38;&#x8BBF;&#x95EE;&#x5230; Wikipedia&#x3002;&#x7136;&#x540E;&#x65E0;&#x610F;&#x95F4;&#x5728;&#x6D4F;&#x89C8; ssh man page<br>
&#x65F6;&#xFF0C;&#x770B;&#x5230;&#x53EF;&#x4EE5;&#x5728; Android &#x673A;&#x4E0A;&#x4F7F;&#x7528; ssh &#x7684; <code>-R [bind_address:]port</code> &#x9009;&#x9879;&#x6765;&#x5F00;&#x542F;&#x4E00;&#x4E2A;<br>
SOCKS5&#x3002;&#x8FD9;&#x6837;&#x4E00;&#x6765;&#xFF0C;&#x4F3C;&#x4E4E;&#x5C31;&#x53EF;&#x4EE5;&#x5728; PC &#x4E0A;&#x901A;&#x8FC7; SOCKS5 &#x8F6C;&#x53D1;&#x8BF7;&#x6C42;&#x5230; Android &#x673A;&#x4E0A;&#xFF0C;&#x7136;&#x540E;<br>
&#x518D;&#x901A;&#x8FC7; Android &#x5F00;&#x542F; VPN &#x6765;&#x8BBF;&#x95EE; Wikipedia &#x4E86;&#x3002;&#x7ECF;&#x8FC7;&#x6D4B;&#x8BD5;&#xFF0C;&#x53EF;&#x4EE5;&#x6B63;&#x5E38;&#x5DE5;&#x4F5C;&#xFF0C;&#x4EE5;&#x4E0B;&#x662F;&#x6298;&#x817E;<br>
&#x8FC7;&#x7A0B;&#x3002;</p>
<p>PC &#x4E0A;&#x786E;&#x4FDD;&#x5DF2;&#x7ECF;&#x5F00;&#x542F;&#x4E86; sshd &#x4E86;&#xFF1A;</p>
<pre><code class="language-bash">systemctl status sshd.service
</code></pre>
<p>Android &#x4E0A;&#xFF0C;&#x9996;&#x5148;&#x9700;&#x8981;&#x5728; Android &#x5B89;&#x88C5;&#x4E00;&#x4E2A; <code>termux</code> &#x7684;&#x7EC8;&#x7AEF;&#x6A21;&#x62DF;&#x5668;&#xFF0C;&#x8FD9;&#x4E2A;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;<br>
F-droid &#x6216; Google Play Store &#x6765;&#x5B89;&#x88C5;&#x3002;</p>
<p>&#x7136;&#x540E;&#x6253;&#x5F00; <code>Termux</code> &#x8FDB;&#x5165; Termux &#x547D;&#x4EE4;&#x884C;&#x5185;&#xFF0C;&#x8F93;&#x5165;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x6765;&#x5B89;&#x88C5; <code>ssh</code> &#x5BA2;&#x6237;&#x7AEF;&#xFF1A;</p>
<pre><code class="language-bash">pkg install openssh
</code></pre>
<p>&#x5B89;&#x88C5;&#x6210;&#x529F;&#x540E;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x6765;&#x8FDE;&#x63A5;&#x5230; Linux &#x7684; PC &#x673A;&#x4E0A;&#xFF0C;&#x5E76;&#x4E3A; PC &#x673A;&#x5F00;&#x542F;&#x4E00;&#x4E2A;<br>
SOCKS5 &#x670D;&#x52A1;&#x5668;&#xFF0C;&#x8FD9;&#x6837;&#x5728; PC &#x673A;&#x4E0A;&#x5C31;&#x53EF;&#x4EE5;&#x8FDE;&#x63A5;&#x8FD9;&#x4E2A; SOCKS5 &#x670D;&#x52A1;&#x5668;&#x4E86;&#xFF1A;</p>
<pre><code class="language-bash">ssh -CNTR localhost:8080 {USER}@{HOST}
</code></pre>
<p>&#x5176;&#x4E2D; <code>{USER}</code> &#x4E3A; PC &#x673A;&#x4E0A;&#x7684;&#x7528;&#x6237;&#x540D;&#xFF0C;<code>{HOST}</code> &#x4E3A; PC &#x673A;&#x7684; IP &#x5730;&#x5740;&#x3002;</p>
<p>&#x8FDE;&#x63A5;&#x4E0A;&#x540E;&#xFF0C;&#x5F00;&#x542F; Android &#x7684; VPN&#xFF0C;&#x7136;&#x540E;&#x5C31;&#x53EF;&#x4EE5;&#x5728; PC &#x673A;&#x4E0A;&#x4F7F;&#x7528; <code>socks5://localhost:8080</code> &#x4E86;&#x3002;</p>
<p><em>NOTES:</em></p>
<ul>
<li>&#x5982;&#x679C; Android &#x673A;&#x4E0A;&#x5B89;&#x88C5;&#x4E86; <code>AFWall+</code> &#x7B49;&#x9632;&#x706B;&#x5899;&#x5E94;&#x7528;&#xFF0C;&#x9700;&#x8981;&#x5F00;&#x542F; Termux &#x53EF;&#x4EE5;&#x901A;&#x8FC7; VPN&#x3002;</li>
<li>&#x5982;&#x679C;&#x60F3;&#x4F7F;&#x7528;&#x968F;&#x673A;&#x7AEF;&#x53E3;&#xFF0C;&#x53EF;&#x4EE5;&#x628A; <code>8080</code> &#x6539;&#x6210; <code>0</code>&#xFF0C;&#x8FDE;&#x63A5;&#x540E;&#x4F1A;&#x5728;&#x7EC8;&#x7AEF;&#x663E;&#x793A;&#x5206;&#x914D;&#x7684;&#x7AEF;&#x53E3;&#x53F7;&#x3002;</li>
<li>&#x9ED8;&#x8BA4;&#x7ED1;&#x5B9A;&#x5230; <code>127.0.0.1</code> &#x548C; <code>[::1]</code>&#xFF0C;&#x5982;&#x679C;&#x60F3;&#x7ED1;&#x5B9A;&#x5176;&#x4ED6;&#x5730;&#x5740;&#xFF0C;&#x53EF;&#x4EE5;&#x52A0;&#x4E0A;&#x6307;&#x5B9A;&#x7684; IP &#x5730;&#x5740;&#x3002;</li>
<li>&#x53EF;&#x80FD;&#x4F1A;&#x7531;&#x4E8E;&#x624B;&#x673A;&#x7184;&#x5C4F;&#x800C;&#x5BFC;&#x81F4;&#x8FDE;&#x63A5;&#x4E2D;&#x65AD;&#xFF0C;&#x8FD9;&#x65F6;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x624B;&#x673A;&#x7684;&#x901A;&#x77E5;&#x680F; <code>Termux</code> &#x4E0B;&#x70B9;&#x51FB; <code>ACQUIRE WAKE LOCK</code>&#x3002;</li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[使用 GnuPG(OpenPGP) ECC(ed25519/ecc25519) 密钥作为 ssh 登录密钥]]></title><description><![CDATA[<!--kg-card-begin: markdown--><blockquote>
<p>&#x672C;&#x6587;&#x7684;&#x64CD;&#x4F5C;&#x5728; Arch Linux &#x4E0B;&#x8FDB;&#x884C;&#xFF0C;&#x6CA1;&#x6709;&#x5728;&#x5176;&#x4ED6; Linux &#x53D1;&#x884C;&#x7248;&#x4E0B;&#x6D4B;&#x8BD5;&#x8FC7;&#xFF0C;&#x56E0;&#x6B64;&#x65E0;&#x6CD5;&#x4FDD;&#x8BC1;&#x5176;&#x4ED6;&#x7684; Linux &#x53D1;&#x884C;&#x7248;&#x4E5F;&#x53EF;&#x4EE5;&#x6B63;&#x5E38;&#x5DE5;&#x4F5C;&#x3002;</p>
</blockquote>
<h2 id>&#x9996;&#x5148;&#x751F;</h2>]]></description><link>https://blog.mozcp.com/use-gnupg-agent-as-ssh-agent/</link><guid isPermaLink="false">5cbc150133e5690001365e7e</guid><dc:creator><![CDATA[Colin Cheng]]></dc:creator><pubDate>Sun, 21 Apr 2019 07:02:09 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><blockquote>
<p>&#x672C;&#x6587;&#x7684;&#x64CD;&#x4F5C;&#x5728; Arch Linux &#x4E0B;&#x8FDB;&#x884C;&#xFF0C;&#x6CA1;&#x6709;&#x5728;&#x5176;&#x4ED6; Linux &#x53D1;&#x884C;&#x7248;&#x4E0B;&#x6D4B;&#x8BD5;&#x8FC7;&#xFF0C;&#x56E0;&#x6B64;&#x65E0;&#x6CD5;&#x4FDD;&#x8BC1;&#x5176;&#x4ED6;&#x7684; Linux &#x53D1;&#x884C;&#x7248;&#x4E5F;&#x53EF;&#x4EE5;&#x6B63;&#x5E38;&#x5DE5;&#x4F5C;&#x3002;</p>
</blockquote>
<h2 id>&#x9996;&#x5148;&#x751F;&#x6210;&#x76F8;&#x5E94;&#x7684;&#x516C;&#x79C1;&#x94A5;</h2>
<h3 id>&#x751F;&#x6210;&#x4E3B;&#x5BC6;&#x94A5;</h3>
<pre><code class="language-shell">gpg --full-gen-key --expert
</code></pre>
<p>PS: &#x8FD9;&#x91CC;&#x56E0;&#x4E3A;&#x8981;&#x751F;&#x6210; ECC &#x7C7B;&#x578B;&#x7684;&#x5BC6;&#x94A5;&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x4F7F;&#x7528; <code>expert</code> &#x6A21;&#x5F0F;&#x624D;&#x53EF;&#x4EE5;</p>
<blockquote>
<p>Please select what kind of key you want:<br>
(1) RSA and RSA (default)<br>
(2) DSA and Elgamal<br>
(3) DSA (sign only)<br>
(4) RSA (sign only)<br>
(7) DSA (set your own capabilities)<br>
(8) RSA (set your own capabilities)<br>
(9) ECC and ECC<br>
(10) ECC (sign only)<br>
(11) ECC (set your own capabilities)<br>
(13) Existing key<br>
Your selection? 10</p>
</blockquote>
<p>&#x4E3B;&#x5BC6;&#x94A5;&#xFF0C;&#x8FD9;&#x91CC;&#x9009;&#x62E9; <code>(10) ECC (sign only)</code>&#x3002;</p>
<blockquote>
<p>Please select which elliptic curve you want:<br>
(1) Curve 25519<br>
(3) NIST P-256<br>
(4) NIST P-384<br>
(5) NIST P-521<br>
(6) Brainpool P-256<br>
(7) Brainpool P-384<br>
(8) Brainpool P-512<br>
(9) secp256k1<br>
Your selection? 1</p>
</blockquote>
<p>&#x9009;&#x62E9; EC &#x66F2;&#x7EBF;&#xFF0C;&#x8FD9;&#x91CC;&#x9009;&#x62E9; <code>(1) Curve 25519</code>&#x3002;</p>
<blockquote>
<p>Please specify how long the key should be valid.<br>
0 = key does not expire<br>
<n>  = key expires in n days<br>
<n>w = key expires in n weeks<br>
<n>m = key expires in n months<br>
<n>y = key expires in n years<br>
Key is valid for? (0)</n></n></n></n></p>
</blockquote>
<p>&#x9009;&#x62E9;&#x6709;&#x6548;&#x671F;&#xFF0C;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x5B9E;&#x9645;&#x60C5;&#x51B5;&#x6765;&#x9009;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A;&#x6C38;&#x4E0D;&#x8FC7;&#x671F;&#x3002;</p>
<blockquote>
<p>Real name:<br>
Email address:<br>
Comment:</p>
</blockquote>
<p>&#x8FD9;&#x91CC;&#x662F;&#x4E00;&#x4E9B;&#x4E2A;&#x4EBA;&#x4FE1;&#x606F;&#xFF0C;&#x6839;&#x636E;&#x5B9E;&#x9645;&#x60C5;&#x51B5;&#x6765;&#x5199;&#x3002;</p>
<blockquote>
<p>Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O</p>
</blockquote>
<p>&#x8F93;&#x5165;&#x5B8C;&#x540E;&#xFF0C;&#x786E;&#x5B9A;&#x6CA1;&#x95EE;&#x9898;&#x540E;&#xFF0C;&#x952E;&#x5165; <code>O</code> &#x6765;&#x5B8C;&#x6210;&#x3002;</p>
<p>&#x4E4B;&#x540E;&#x4F1A;&#x63D0;&#x793A;&#x4F60;&#x521B;&#x5EFA; passphrase&#x3002;</p>
<p>&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>gpg --list-keys</code> &#x6765;&#x67E5;&#x770B;&#x4E0A;&#x9762;&#x521B;&#x5EFA;&#x7684;&#x5BC6;&#x94A5;&#xFF1A;</p>
<blockquote>
<h2 id="homeexamplegnupgpubringgpg">/home/example/.gnupg/pubring.gpg</h2>
<p>pub   ed25519 2019-03-13 [SC]<br>
4C531B4CE9A26E80BECE72EC3453101C9E098A57<br>
uid           [ultimate] Colin Cheng <a href="mailto:zbinlin@outlook.com">zbinlin@outlook.com</a></p>
</blockquote>
<p>&#x53EF;&#x4EE5;&#x52A0;&#x4E0A;&#x53C2;&#x6570; <code>--keyid-format &lt;FORMAT&gt;</code> &#x6765;&#x67E5;&#x770B;&#x5BC6;&#x94A5; ID&#xFF0C;&#x8FD9;&#x4F1A;&#x5728;&#x4E0B;&#x9762;&#x7684;&#x6B65;&#x9AA4;&#x91CC;&#x7528;&#x5F97;&#x5230;&#x3002;</p>
<h3 id="ssh">&#x521B;&#x5EFA; ssh &#x767B;&#x5F55;&#x5BC6;&#x94A5;</h3>
<p>&#x4E0A;&#x9762;&#x64CD;&#x4F5C;&#x521B;&#x5EFA;&#x4E86;&#x4E3B;&#x5BC6;&#x94A5;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5728;&#x4E3B;&#x5BC6;&#x94A5;&#x4E0B;&#x521B;&#x5EFA;&#x7528;&#x4E8E; ssh &#x767B;&#x5F55;&#x7684;&#x5B50;&#x5BC6;&#x94A5;&#x3002;</p>
<p>&#x4ECE;&#x4E0A;&#x9762;&#x7684; <code>gpg --list-keys</code> &#x5217;&#x51FA;&#x4E86;&#x521A;&#x521B;&#x5EFA;&#x7684;&#x4E3B;&#x94A5;&#x5BC6;&#x7684; fingerprint &#x4E3A; <code>4C531B4CE9A26E80BECE72EC3453101C9E098A57</code>&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x8FDB;&#x5165;&#x4EA4;&#x4E92;&#x6A21;&#x5F0F;&#x6765;&#x6DFB;&#x52A0;&#x5B50;&#x5BC6;&#x94A5;&#xFF1A;</p>
<pre><code class="language-shell">gpg --expert --edit-key 4C531B4CE9A26E80BECE72EC3453101C9E098A57
</code></pre>
<p><strong>NOTE: <code>--expert</code> &#x5FC5;&#x987B;&#x653E;&#x5728; <code>--edit-key</code> &#x524D;&#x9762;&#x624D;&#x53EF;&#x4EE5;&#x751F;&#x6548;</strong></p>
<p>&#x6267;&#x884C;&#x4E0A;&#x9762;&#x7684;&#x547D;&#x4EE4;&#x540E;&#xFF0C;&#x5C06;&#x8FDB;&#x5165;&#x4EA4;&#x4E92;&#x6A21;&#x5F0F;&#xFF1A;</p>
<blockquote>
<p>gpg&gt;</p>
</blockquote>
<p>&#x952E;&#x5165; <code>addkey</code> &#x56DE;&#x8F66;&#xFF0C;&#x6765;&#x521B;&#x5EFA;&#x5B50;&#x5BC6;&#x94A5;&#xFF1A;</p>
<blockquote>
<p>Please select what kind of key you want:<br>
(3) DSA (sign only)<br>
(4) RSA (sign only)<br>
(5) Elgamal (encrypt only)<br>
(6) RSA (encrypt only)<br>
(7) DSA (set your own capabilities)<br>
(8) RSA (set your own capabilities)<br>
(10) ECC (sign only)<br>
(11) ECC (set your own capabilities)<br>
(12) ECC (encrypt only)<br>
(13) Existing key<br>
Your selection? 11</p>
</blockquote>
<p>&#x7531;&#x4E8E;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x521B;&#x5EFA;&#x7684;&#x662F;&#x7528;&#x4E8E; ssh &#x767B;&#x5F55;&#x7684;&#x5BC6;&#x94A5;&#xFF0C;&#x56E0;&#x6B64;&#x8FD9;&#x91CC;&#x9009;&#x62E9; <code>11</code>&#xFF0C;&#x6765;&#x521B;&#x5EFA;&#x5177;&#x6709; <code>Authenticate</code> &#x529F;&#x80FD;&#x7684;&#x5BC6;&#x94A5;&#xFF1A;</p>
<blockquote>
<p>Possible actions for a ECDSA/EdDSA key: Sign Authenticate<br>
Current allowed actions: Sign</p>
<p>(S) Toggle the sign capability<br>
(A) Toggle the authenticate capability<br>
(Q) Finished</p>
<p>Your selection? S</p>
</blockquote>
<p>&#x8FD9;&#x91CC;&#x6211;&#x4EEC;&#x4E0D;&#x9700;&#x8981;&#x8FD9;&#x4E2A;&#x5BC6;&#x94A5;&#x7528;&#x4E8E; <code>Sign</code>&#xFF0C;&#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x952E;&#x5165; <code>S</code> &#x53D6;&#x6D88; <code>Sign</code>&#xFF0C;&#x7136;&#x540E;&#x518D;&#x952E;&#x5165; <code>A</code> &#x6DFB;&#x52A0; <code>Authenticate</code>&#xFF0C;&#x6700;&#x540E;&#x952E;&#x5165; <code>Q</code> &#x8FDB;&#x5165;&#x4E0B;&#x4E00;&#x6B65;&#x3002;</p>
<blockquote>
<p>Please select which elliptic curve you want:<br>
(1) Curve 25519<br>
(3) NIST P-256<br>
(4) NIST P-384<br>
(5) NIST P-521<br>
(6) Brainpool P-256<br>
(7) Brainpool P-384<br>
(8) Brainpool P-512<br>
(9) secp256k1<br>
Your selection? 1</p>
</blockquote>
<p>&#x8FD9;&#x91CC;&#x540C;&#x6837;&#x9009;&#x62E9; <code>Curve 25519</code> &#x66F2;&#x7EBF;&#x3002;</p>
<blockquote>
<p>Please specify how long the key should be valid.<br>
0 = key does not expire<br>
<n>  = key expires in n days<br>
<n>w = key expires in n weeks<br>
<n>m = key expires in n months<br>
<n>y = key expires in n years<br>
Key is valid for? (0)</n></n></n></n></p>
</blockquote>
<p>&#x7136;&#x540E;&#x662F;&#x9009;&#x62E9;&#x6709;&#x6548;&#x671F;&#x3002;</p>
<blockquote>
<p>Is this correct? (y/N) y<br>
Really create? (y/N) y</p>
</blockquote>
<p>&#x4E0D;&#x65AD;&#x786E;&#x8BA4;&#xFF0C;&#x6700;&#x540E;&#x56DE;&#x5230;</p>
<blockquote>
<p>gpg&gt;</p>
</blockquote>
<p>&#x8FD9;&#x91CC;&#xFF0C;&#x9700;&#x8981;&#x952E;&#x5165; <code>save</code> &#x4FDD;&#x5B58;&#x5E76;&#x9000;&#x51FA;&#x3002;</p>
<p>&#x8FD9;&#x65F6;&#xFF0C;&#x5982;&#x679C;&#x4F7F;&#x7528; <code>gpg --list-keys</code> &#x547D;&#x4EE4;&#xFF1A;</p>
<blockquote>
<h2 id="homeexamplegnupgpubringgpg">/home/example/.gnupg/pubring.gpg</h2>
<p>pub   ed25519 2019-03-13 [SC]<br>
4C531B4CE9A26E80BECE72EC3453101C9E098A57<br>
uid           [ultimate] Colin Cheng <a href="mailto:zbinlin@outlook.com">zbinlin@outlook.com</a><br>
sub   ed25519 2019-03-13 [A]</p>
</blockquote>
<p>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x591A;&#x4E86;&#x6700;&#x540E;&#x4E00;&#x884C;</p>
<blockquote>
<p>sub   ed25519 2019-03-13 [A]</p>
</blockquote>
<p>&#x8FD9;&#x5C31;&#x662F;&#x7528;&#x4E8E; ssh &#x7684;&#x767B;&#x5F55;&#x7684;&#x5B50;&#x5BC6;&#x94A5;&#xFF0C;&#x5176;&#x4E2D; <code>sub</code> &#x8868;&#x793A;&#x662F; <code>subkey</code>&#xFF0C;<code>A</code> &#x8868;&#x793A;&#x662F; <code>Authenticate</code>&#x3002;</p>
<p>&#x7C7B;&#x4F3C;&#x7684;&#x6807;&#x5FD7;&#xFF1A;</p>
<pre><code>C: Certify
S: Sign
A: Authenticate
E: Encrypt
</code></pre>
<h2 id>&#x8BBE;&#x7F6E;</h2>
<p>&#x5728;&#x751F;&#x6210;&#x7528;&#x4E8E; ssh &#x767B;&#x5F55;&#x7684;&#x5BC6;&#x94A5;&#x540E;&#xFF0C;&#x8FD8;&#x4E0D;&#x80FD;&#x76F4;&#x63A5;&#x4F7F;&#x7528;&#xFF0C;&#x9700;&#x8981;&#x5148;&#x8FDB;&#x884C;&#x4E00;&#x4E9B;&#x8BBE;&#x7F6E;&#x3002;</p>
<p>&#x9996;&#x5148;&#x8BBE;&#x7F6E; <code>SSH_AUTH_SOCK</code> &#x73AF;&#x5883;&#x53D8;&#x91CF;&#x3002;</p>
<p>&#x5728; <code>~/.pam_environment</code> &#x6587;&#x4EF6;&#x91CC;&#x52A0;&#x5165;&#x4EE5;&#x4E0B;&#x5185;&#x5BB9;&#xFF1A;</p>
<pre><code>SSH_AGENT_PID DEFAULT=
SSH_AUTH_SOCK DEFAULT=&quot;${XDG_RUNTIME_DIR}/gnupg/S.gpg-agent.ssh&quot;
</code></pre>
<p>&#x53E6;&#x5916;&#x9700;&#x8981;&#x5728; <code>~/.bashrc</code> &#x6216; <code>~/.zshrc</code> &#x4E2D;&#x52A0;&#x5165;&#xFF1A;</p>
<pre><code class="language-shell">export GPG_TTY=$(tty)
gpg-connect-agent updatestartuptty /bye &gt;/dev/null
</code></pre>
<p>&#x5982;&#x679C;&#x4F7F;&#x7528; xfce4 &#x4F5C;&#x4E3A;&#x56FE;&#x5F62;&#x754C;&#x9762;&#x7684;&#xFF0C;&#x7531;&#x4E8E; xfce session &#x4F1A;&#x81EA;&#x52A8;&#x8BBE;&#x7F6E; <code>ssh-agent</code>&#xFF0C;&#x4F1A;&#x5BFC;&#x81F4;&#x4E0A;&#x9762;&#x8BBE;&#x7F6E;&#x7684; <code>SSH_AGENT_PID</code> &#x548C; <code>SSH_AUTH_SOCK</code> &#x5728;&#x8FDB;&#x5165; X &#x540E;&#x88AB;&#x91CD;&#x7F6E;&#xFF08;&#x88AB;&#x91CD;&#x65B0;&#x8BBE;&#x7F6E;&#x6210; ssh-agent &#x4E86;&#xFF09;&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x5728; xfce &#x91CC;&#x7981;&#x7528;&#x81EA;&#x52A8;&#x8BBE;&#x7F6E; <code>ssh-agent</code> &#x8FD9;&#x4E2A;&#x529F;&#x80FD;&#xFF1A;</p>
<pre><code>xfconf-query -c xfce4-session -p /startup/ssh-agent/enabled -n -t bool -s false
</code></pre>
<p>&#x4EE5;&#x4E0A;&#x90FD;&#x8BBE;&#x7F6E;&#x5B8C;&#x540E;&#xFF0C;&#x9700;&#x8981;&#x5C06;&#x4E0A;&#x4E00;&#x6B65;&#x521B;&#x5EFA;&#x7684; ssh &#x5BC6;&#x94A5;&#x6DFB;&#x52A0;&#x5230; GnuPG &#x7684; <code>$GNUPGHOME/sshcontrol</code> &#x6587;&#x4EF6;&#x91CC;&#x3002;</p>
<p>&#x9996;&#x5148;&#x901A;&#x8FC7; <code>gpg --list-keys --with-keygrip 4C531B4CE9A26E80BECE72EC3453101C9E098A57</code> &#x67E5;&#x770B;&#x521A;&#x624D;&#x521B;&#x5EFA;&#x7684;&#x5BC6;&#x94A5;&#x7684; keygrip&#xFF1A;</p>
<blockquote>
<p>pub   ed25519 2019-03-13 [SC]<br>
4C531B4CE9A26E80BECE72EC3453101C9E098A57<br>
Keygrip = 7344328D1A4D5CDA50C6FA8B16133F744CD23FBA<br>
uid           [ultimate] Colin Cheng <a href="mailto:zbinlin@outlook.com">zbinlin@outlook.com</a><br>
sub   ed25519 2019-03-13 [A]<br>
Keygrip = 35FD15CAE509225DDDACF98301526EB300415765</p>
</blockquote>
<p>&#x5176;&#x4E2D;&#x5728;&#x5B50;&#x5BC6;&#x94A5;&#x4E0B;&#x9762;&#x7684; <code>35FD15CAE509225DDDACF98301526EB300415765</code> &#x5C31;&#x662F; ssh &#x5BC6;&#x94A5;&#x7684; keygrip &#x4E86;&#x3002;</p>
<p>&#x5C06;&#x5176;&#x52A0;&#x5165;&#x5230; <code>$GNUPGHOME/sshcontrol</code> &#x91CC;&#x5C31;&#x53EF;&#x4EE5;&#x4E86;&#x3002;</p>
<p>&#x52A0;&#x597D;&#x4E86;&#x4E4B;&#x540E;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x628A;&#x516C;&#x94A5;&#x5BFC;&#x51FA;&#x6765;&#x653E;&#x5230;&#x670D;&#x52A1;&#x5668;&#x4E0A;&#x4E86;&#xFF1A;</p>
<pre><code># &#x627E;&#x5230; ssh subkey &#x7684; id
gpg --list-keys --keyid-format long
# &#x5BFC;&#x51FA;&#x516C;&#x94A5;
gpg --armor --export-ssh-key 7FC2C4F53913F8FD
</code></pre>
<p>&#x53E6;&#x5916;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x7528;&#x7C7B;&#x4F3C;&#x521B;&#x5EFA; ssh &#x5BC6;&#x94A5;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x7528;&#x4E8E; git &#x4EE3;&#x7801;&#x7B7E;&#x540D;&#x7684; <code>Sign</code> &#x5B50;&#x5BC6;&#x94A5;&#x3002;</p>
<h2 id>&#x53C2;&#x8003;</h2>
<ul>
<li><a href="https://wiki.archlinux.org/index.php/GnuPG">https://wiki.archlinux.org/index.php/GnuPG</a></li>
<li><a href="https://docs.xfce.org/xfce/xfce4-session/advanced">https://docs.xfce.org/xfce/xfce4-session/advanced</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[WireGuard 配置和上网流量优化]]></title><description><![CDATA[<p>&#x672C;&#x6587;&#x6D89;&#x53CA;&#x5230; WireGuard &#x7684;&#x4F7F;&#x7528;&#x4ECB;&#x7ECD;&#x3001;&#x56FD;&#x5185;&#x5916;&#x6D41;&#x91CF;&#x7684;&#x5206;&#x6D41;&#x7B49;&#x5185;&#x5BB9;</p><h2 id="wireguard-">WireGuard &#x5B89;&#x88C5;</h2><p>&#x5728;&#x4F7F;&#x7528; WireGuard &#x4E4B;&#x524D;&#xFF0C;&#x9700;&#x8981;&#x5206;&#x522B;&#x5728;&#x670D;&#x52A1;&#x5668;&#x548C;&#x672C;&#x5730;&#x5B89;&#x88C5;&#x3002;</p><p>&#x7531;&#x4E8E;&#x672C;</p>]]></description><link>https://blog.mozcp.com/wireguard-usage/</link><guid isPermaLink="false">5b83b63fa9dd3f000142ade3</guid><category><![CDATA[WireGuard]]></category><dc:creator><![CDATA[Colin Cheng]]></dc:creator><pubDate>Mon, 27 Aug 2018 08:29:33 GMT</pubDate><content:encoded><![CDATA[<p>&#x672C;&#x6587;&#x6D89;&#x53CA;&#x5230; WireGuard &#x7684;&#x4F7F;&#x7528;&#x4ECB;&#x7ECD;&#x3001;&#x56FD;&#x5185;&#x5916;&#x6D41;&#x91CF;&#x7684;&#x5206;&#x6D41;&#x7B49;&#x5185;&#x5BB9;</p><h2 id="wireguard-">WireGuard &#x5B89;&#x88C5;</h2><p>&#x5728;&#x4F7F;&#x7528; WireGuard &#x4E4B;&#x524D;&#xFF0C;&#x9700;&#x8981;&#x5206;&#x522B;&#x5728;&#x670D;&#x52A1;&#x5668;&#x548C;&#x672C;&#x5730;&#x5B89;&#x88C5;&#x3002;</p><p>&#x7531;&#x4E8E;&#x672C;&#x4EBA;&#x7684;&#x670D;&#x52A1;&#x5668;&#x4E0A;&#x4F7F;&#x7528; debian 9&#x3001;&#x672C;&#x5730;&#x4F7F;&#x7528; Arch Linux&#xFF0C;&#x56E0;&#x6B64;&#x8FD9;&#x91CC;&#x53EA;&#x7ED9;&#x51FA;&#x8FD9;&#x4E24;&#x79CD;&#x7CFB;&#x7EDF;&#x4E0A;&#x7684;&#x5B89;&#x88C5;&#x65B9;&#x5F0F;&#xFF0C;&#x5176;&#x4ED6;&#x7CFB;&#x7EDF;&#x4E0A;&#x7684;&#x5B89;&#x88C5;&#x53EF;&#x4EE5;&#x5728;<a href="https://www.wireguard.com/install/">&#x5B98;&#x7F51;</a>&#x627E;&#x5230;&#x3002;</p><h3 id="debian">Debian</h3><pre><code>echo &quot;deb http://deb.debian.org/debian/ unstable main&quot; &gt; /etc/apt/sources.list.d/unstable.list
printf &apos;Package: *\nPin: release a=unstable\nPin-Priority: 150\n&apos; &gt; /etc/apt/preferences.d/limit-unstable
apt update
apt install wireguard
</code></pre><h3 id="arch-linux">Arch Linux</h3><pre><code>pacman -S wireguard-dkms wireguard-tools
</code></pre><h2 id="wireguard--1">WireGuard &#x914D;&#x7F6E;</h2><p>WireGuard &#x7684;&#x914D;&#x7F6E;&#x5206;&#x4E3A; Interface &#x548C; Peer&#xFF0C;&#x5176;&#x4E2D; Interface &#x53EF;&#x4EE5;&#x8BA4;&#x4E3A;&#x662F;&#x5BF9;&#x672C;&#x5730;&#x673A;&#x5668;&#x7684;&#x914D;&#x7F6E;&#xFF0C;&#x800C; Peer &#x662F;&#x914D;&#x7F6E;&#x8FDE;&#x8FDB;&#x6765;&#x7684;&#x673A;&#x5668;&#x7684;</p><p>&#x5728;&#x670D;&#x52A1;&#x5668;&#x548C;&#x672C;&#x5730;&#x7684;&#x5927;&#x90E8;&#x5206;&#x914D;&#x7F6E;&#x662F;&#x4E00;&#x6837;&#x7684;&#xFF0C;&#x5148;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;&#x63A5;&#x53E3;&#xFF1A;</p><pre><code>ip link add wg0 type wireguard
</code></pre><p>&#x5982;&#x679C;&#x62A5;&#x9519;&#xFF0C;&#x5E76;&#x63D0;&#x793A; <strong>RTNETLINK answers: Operation not supported</strong>&#xFF0C;&#x5148;&#x68C0;&#x67E5;&#x4E0B; wireguard &#x6A21;&#x5757;&#x662F;&#x5426;&#x5DF2;&#x7ECF;&#x52A0;&#x8F7D;&#xFF1A;</p><pre><code>lsmod | grep wireguard
</code></pre><p>&#x5982;&#x679C;&#x6CA1;&#x6709;&#x52A0;&#x8F7D;&#xFF0C;&#x8BD5;&#x4E0B;&#x6267;&#x884C; <code>modprobe wireguard</code>&#xFF0C;&#x5982;&#x679C;&#x62A5;&#x9519;&#xFF0C;&#x91CD;&#x542F;&#x4E0B;&#x673A;&#x5668;&#x3002;</p><p>&#x5728;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x4E3A; wg0 &#x6DFB;&#x52A0;&#x4E00;&#x4E2A;&#x5730;&#x5740; <code>192.168.128.1/24</code></p><pre><code>ip addr add 192.168.128.1/24 dev wg0
</code></pre><p>&#x540C;&#x6837;&#x5728;&#x672C;&#x5730;&#x4E3A; wg0 &#x6DFB;&#x52A0;&#x53E6;&#x4E00;&#x4E2A;&#x5730;&#x5740; <code>192.168.128.254/24</code></p><pre><code>ip addr add 192.168.128.254/24 dev wg0
</code></pre><p>&#x7136;&#x540E;&#x5206;&#x522B;&#x5728;&#x670D;&#x52A1;&#x5668;&#x548C;&#x672C;&#x5730;&#x6DFB;&#x52A0; private key</p><pre><code>wg set wg0 private-key &lt;(wg genkey)
</code></pre><p>&#x5982;&#x679C;&#x662F;&#x8981;&#x7528; <code>sudo</code> &#x6765;&#x6267;&#x884C;&#x7684;&#xFF0C;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#xFF1A;</p><pre><code>sudo bash -c &apos;wg set wg0 private-key &lt;(wg genkey)&apos;
</code></pre><p>&#x4E3A;&#x670D;&#x52A1;&#x5668;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;&#x76D1;&#x542C;&#x7AEF;&#x53E3;&#xFF0C;&#x672C;&#x5730;&#x4F7F;&#x7528;&#x968F;&#x673A;&#x7AEF;&#x53E3;&#x5C31;&#x884C;&#x4E86;&#xFF0C;&#x4E0D;&#x9700;&#x8981;&#x56FA;&#x5B9A;&#x7AEF;&#x53E3;&#xFF1A;</p><pre><code>wg set wg0 listen-port 12345
</code></pre><p>&#x4EE5;&#x4E0A;&#x662F; Interface &#x7684;&#x8BBE;&#x7F6E;&#xFF0C;&#x4E0B;&#x9762;&#x914D;&#x7F6E; Peer&#x3002;</p><p>&#x9996;&#x5148;&#x5728;&#x670D;&#x52A1;&#x5668;&#x4E0A;&#x52A0;&#x5165;&#x672C;&#x5730;&#x7684; Peer&#xFF1A;</p><p>&#x9700;&#x8981;&#x6DFB;&#x52A0;&#x672C;&#x5730;&#x7684;&#x516C;&#x94A5;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x672C;&#x5730;&#x901A;&#x8FC7;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x83B7;&#x53D6;&#xFF1A;</p><pre><code>wg show wg0 public-key
</code></pre><p>&#x83B7;&#x53D6;&#x5230;&#x516C;&#x94A5;&#x540E;&#xFF0C;&#x8FD8;&#x8981;&#x83B7;&#x53D6;&#x672C;&#x5730; wg0 &#x4E0A;&#x7684; IP &#x5730;&#x5740;&#xFF08;192.168.128.254&#xFF09;&#x52A0;&#x5165;&#x5230; perr &#x7684; AllowIPs &#x91CC;&#xFF1A;</p><pre><code>wg set wg0 peer &apos;&lt;&#x672C;&#x5730;&#x7684;&#x516C;&#x94A5;&gt;&apos; allowed-ips &lt;&#x672C;&#x5730; wg0 &#x4E0A;&#x8BBE;&#x7F6E;&#x7684; IP &#x5730;&#x5740;&#xFF0C;&#x5982; 192.168.128.254/32&gt;
</code></pre><p>&#x540C;&#x6837;&#xFF0C;&#x628A;&#x670D;&#x52A1;&#x5668;&#x4E0A;&#x7684;&#x516C;&#x94A5;&#x52A0;&#x5165;&#x672C;&#x5730;&#xFF0C;&#x8FD9;&#x91CC;&#x8981;&#x628A;&#x670D;&#x52A1;&#x5668;&#x7684;&#x5916;&#x7F51; ip &#x4F5C;&#x4E3A; endpoint&#xFF0C;&#x8FD9;&#x91CC;&#x4EE5; <code>wireguard.example.org</code> &#x4E3A;&#x4F8B;&#xFF0C;&#x8981;&#x4E0D;&#x672C;&#x5730;&#x5C31;&#x4E0D;&#x77E5;&#x9053;&#x8FDE;&#x90A3;&#x53F0;&#x670D;&#x52A1;&#x5668;&#x4E86;&#xFF1A;</p><pre><code>wg set wg0 peer &apos;&lt;&#x670D;&#x52A1;&#x5668;&#x4E0A;&#x7684;&#x516C;&#x94A5;&gt;&apos; allowed-ips 0.0.0.0/0 endpoint wireguard.example.org:12345
</code></pre><p>&#x6CE8;&#xFF1A;&#x8FD9;&#x91CC; allowed-ips &#x4F7F;&#x7528; 0.0.0.0/0&#xFF0C;&#x8FD9;&#x6837;&#x76F8;&#x5F53;&#x4E8E; wireguard &#x5168;&#x5C40;&#x751F;&#x6548;&#x3002;</p><p>&#x73B0;&#x5728; wireguard &#x7684;&#x914D;&#x7F6E;&#x57FA;&#x672C;&#x914D;&#x597D;&#x4E86;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x6765;&#x542F;&#x52A8;&#xFF1A;</p><pre><code>ip link set dev wg0 up
</code></pre><p>&#x542F;&#x52A8; wg0 &#x63A5;&#x53E3;&#xFF0C;&#x8FD9;&#x65F6;&#x53EF;&#x4EE5; ping &#x4E0B;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x7684;&#x5730;&#x5740; <code>ping 192.168.128.1</code>&#xFF0C;&#x5982;&#x679C; ping &#x901A;&#x8BF4;&#x660E; wireguard &#x6B63;&#x5E38;&#x5DE5;&#x4F5C;&#x4E86;&#x3002;<br>&#x5982;&#x679C; ping &#x4E0D;&#x901A;&#xFF0C;&#x68C0;&#x67E5;&#x4E0B;&#x5BF9;&#x65B9;&#x7684;&#x516C;&#x94A5;&#x53CA; ip &#x5730;&#x5740;&#x662F;&#x5426;&#x6B63;&#x786E;&#x4E86;&#x3002;</p><p>&#x73B0;&#x5728;&#x672C;&#x5730;&#x8DDF;&#x670D;&#x52A1;&#x5668;&#x5DF2;&#x7ECF;&#x5728;&#x540C;&#x4E00;&#x4E2A;&#x5185;&#x7F51;&#x4E0A;&#xFF0C;&#x53EF;&#x4EE5;&#x5F7C;&#x6B64;&#x901A;&#x4FE1;&#x4E86;&#x3002;<br>&#x4F46;&#x672C;&#x5730;&#x73B0;&#x5728;&#x662F;&#x65E0;&#x6CD5;&#x901A;&#x8FC7;&#x670D;&#x52A1;&#x5668;&#x8FDE;&#x63A5;&#x5230;&#x5916;&#x9762;&#x7684;&#x7F51;&#x7EDC;&#xFF0C;&#x5982;&#x679C;&#x9700;&#x8981;&#x901A;&#x8FC7;&#x670D;&#x52A1;&#x5668;&#x8FDE;&#x63A5;&#x5230;&#x5916;&#x9762;&#x7684;&#x7F51;&#x7EDC;&#xFF0C;&#x8981;&#x5728;&#x670D;&#x52A1;&#x5668;&#x4E0A;&#x8BBE;&#x7F6E;&#x6D41;&#x91CF;&#x8F6C;&#x53D1;&#x548C; NAT &#x624D;&#x53EF;&#x4EE5;&#x3002;</p><h3 id="-nat">&#x8F6C;&#x53D1;&#x4E0E; NAT</h3><p>&#x9996;&#x5148;&#xFF0C;&#x68C0;&#x67E5;&#x4E0B; ip &#x8F6C;&#x53D1;&#x662F;&#x5426;&#x5DF2;&#x5F00;&#x542F;&#xFF1A;</p><pre><code>sysctl net.ipv4.ip_forward
</code></pre><p>&#x5982;&#x679C;&#x7B49;&#x4E8E; 1 &#x8BF4;&#x660E;&#x5DF2;&#x7ECF;&#x5F00;&#x542F;&#xFF0C;&#x5426;&#x5219;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#xFF1A;</p><pre><code>sysctl net.ipv4.ip_forward=1
</code></pre><p>&#x6765;&#x4E34;&#x65F6;&#x5F00;&#x542F;&#xFF0C;&#x5982;&#x679C;&#x60F3;&#x6C38;&#x4E45;&#x751F;&#x6548;&#xFF0C;&#x9700;&#x8981;&#x7F16;&#x8F91; <code>/etc/sysctl.conf</code> &#x6587;&#x4EF6;&#xFF0C;&#x67E5;&#x627E;&#x5230; <code>net.ipv4.ip_forward</code> &#x8FD9;&#x4E00;&#x884C;&#xFF0C;&#x628A;&#x6700;&#x524D;&#x7AEF;&#x7684; <strong>#</strong> &#x53F7;&#xFF08;&#x6CE8;&#x91CA;&#xFF09;&#x53BB;&#x6389;&#xFF0C;&#x5982;&#x679C;&#x5176;&#x503C;&#x4E0D;&#x4E3A; 1 &#x7684;&#xFF0C;&#x6539;&#x6210; 1&#x3002;&#x5982;&#x679C;&#x627E;&#x4E0D;&#x5230;&#xFF0C;&#x5C31;&#x628A; <code>net.ipv4.ip_forward=1</code> &#x52A0;&#x5728;&#x6587;&#x4EF6;&#x6700;&#x4E0B;&#x9762;&#x3002;</p><p>&#x7136;&#x540E;&#x4F7F;&#x7528;&#x547D;&#x4EE4; <code>sysctl -p</code> &#x6765;&#x4F7F;&#x5176;&#x751F;&#x6548;&#x3002;</p><p>&#x63A5;&#x4E0B;&#x6765;&#x68C0;&#x67E5;&#x4E0B; iptables &#x91CC; <em>filter</em> &#x8868;&#x7684; <em>FORWARD</em> &#x94FE;&#x7684; policy &#x662F;&#x5426;&#x4E3A; <em>ACCEPT</em>&#xFF1A;</p><pre><code>iptables -t filter -L FORWARD
</code></pre><p>&#x5982;&#x679C; policy &#x4E3A; <em>DROP</em>&#xFF0C;&#x9700;&#x8981;&#x5141;&#x8BB8; <code>wg0</code> &#x63A5;&#x53E3;&#x624D;&#x884C;&#xFF1A;</p><pre><code>iptables -t filter -A FORWARD -i wg0 -j ACCEPT
iptables -t filter -A FORWARD -o wg0 -m state --state RELATED,ESTABLISHED -j ACCEPT
</code></pre><p>&#x7136;&#x540E;&#x770B;&#x4E0B; <em>nat</em> &#x8868;&#x7684; <em>POSTROUTING</em> &#x94FE;&#x91CC;&#x662F;&#x5426;&#x5DF2;&#x7ECF;&#x505A;&#x4E86;&#x51FA;&#x53E3;&#x7684; NAT &#x4E86;&#xFF08;&#x8FD9;&#x91CC;&#x5047;&#x8BBE;&#x670D;&#x52A1;&#x5668;&#x4E0A;&#x8FDE;&#x63A5;&#x5916;&#x7F51;&#x7684;&#x63A5;&#x53E3;&#x662F; <em>eth0</em>&#xFF09;&#xFF1A;</p><pre><code>iptables -t nat -L POSTROUTING -v
</code></pre><p>&#x5982;&#x679C;&#x8FD8;&#x6CA1;&#x6709;&#xFF0C;&#x4F7F;&#x7528;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x52A0;&#x4E0A;&#xFF1A;</p><pre><code>iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
</code></pre><p>PS&#xFF1A;&#x5982;&#x679C;&#x51FA;&#x53E3;&#x4E0D;&#x662F; <em>eth0</em> &#x63A5;&#x53E3;&#x7684;&#xFF0C;&#x628A; <em>eth0</em> &#x6362;&#x6210;&#x6B63;&#x771F;&#x7684;&#x51FA;&#x53E3;&#x63A5;&#x53E3;</p><p>&#x5728;&#x670D;&#x52A1;&#x5668;&#x8BBE;&#x7F6E;&#x597D;&#x540E;&#xFF0C;&#x8FD8;&#x8981;&#x5728;&#x672C;&#x5730;&#x52A0;&#x4E0A;&#x8DEF;&#x7531;&#xFF0C;&#x628A;&#x6D41;&#x91CF;&#x8F6C;&#x53D1;&#x5230; wg0 &#x63A5;&#x53E3;&#x4E0A;&#x3002;</p><h3 id="-">&#x672C;&#x5730;&#x8DEF;&#x7531;</h3><pre><code>ip route add &lt;endpoint&gt;/32 via &lt;&#x51FA;&#x53E3;&#x63A5;&#x53E3;&#x7684;&#x7F51;&#x5173;IP&gt; dev &lt;&#x51FA;&#x53E3;&#x63A5;&#x53E3;&gt;
ip route add default via 192.168.128.1 dev wg0 src 192.168.128.254
</code></pre><p>&#x914D;&#x7F6E;&#x597D;&#x540E;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x672C;&#x5730; ping &#x4E0B; <em>8.8.8.8</em>&#xFF0C;&#x5982;&#x679C; ping &#x7684;&#x901A;&#xFF0C;&#x5E76;&#x4E14; <code>tracepath 8.8.8.8</code> &#x7684;&#x8DEF;&#x7531;&#x91CC;&#x6709; <em>192.168.128.1</em>&#xFF0C;&#x8BF4;&#x660E;&#x5DF2;&#x7ECF;&#x901A;&#x4E86;&#x3002;</p><h2 id="wg-quick">wg-quick</h2><p>&#x901A;&#x8FC7;&#x8FD9;&#x6837;&#x914D;&#x7F6E;&#x540E;&#x5C31;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; WireGuard &#x4F5C;&#x4E3A; VPN &#x4E0A;&#x7F51;&#x4E86;&#xFF0C;&#x4F46;&#x5F53;&#x524D;&#x914D;&#x7F6E;&#x4F1A;&#x5728;&#x91CD;&#x542F;&#x540E;&#x5931;&#x6548;&#x3002;</p><p>&#x5982;&#x679C;&#x6BCF;&#x6B21;&#x91CD;&#x542F;&#x90FD;&#x624B;&#x52A8;&#x914D;&#x7F6E;&#x7684;&#x8BDD;&#xFF0C;&#x6BD4;&#x8F83;&#x9EBB;&#x70E6;&#x3002;&#x8FD8;&#x597D;&#xFF0C;WireGuard &#x63D0;&#x4F9B;&#x4E86; <code>wg-quick</code> &#x547D;&#x4EE4;&#xFF0C;&#x8BE5;&#x547D;&#x4EE4;&#x53EF;&#x4EE5;&#x8BFB;&#x53D6;&#x548C;&#x4FDD;&#x5B58;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x3002;</p><p>&#x5E76;&#x4E14; <code>wg-quick</code> &#x4E5F;&#x63D0;&#x4F9B;&#x4E5F; systemctl &#x7684;&#x670D;&#x52A1;&#x914D;&#x7F6E;&#xFF0C;&#x8FD9;&#x6837;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E;&#x5F00;&#x673A;&#x81EA;&#x542F;&#x52A8;&#x3002;</p><p><code>wg-quick</code> &#x9ED8;&#x8BA4;&#x7684;&#x914D;&#x7F6E;&#x76EE;&#x5F55;&#x4E3A; <code>/etc/wireguard</code>&#xFF0C;&#x6587;&#x4EF6;&#x4EE5; wireguard &#x7684;&#x63A5;&#x53E3;&#x540D;&#xFF08;&#x5982;&#x4E0A;&#x6587;&#x4E2D;&#x7684; <em>wg0</em>&#xFF09;&#x4E3A;&#x6587;&#x4EF6;&#x540D;&#xFF0C;&#x6587;&#x4EF6;&#x540D;&#x540E;&#x7F00;&#x4E3A; <code>.conf</code>&#x3002;</p><p>&#x4EE5;&#x4E0B;&#x5206;&#x522B;&#x662F;&#x670D;&#x52A1;&#x5668;&#x548C;&#x672C;&#x5730;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF0C;&#x4FDD;&#x5B58;&#x5230; <code>/ett/wireguard/wg0.conf</code>&#xFF1A;</p><p>&#x670D;&#x52A1;&#x5668;&#xFF1A;</p><pre><code>[Interface]
Address = &lt;&#x670D;&#x52A1;&#x5668;&#x4E0A;&#x8BBE;&#x5B9A; wg0 &#x63A5;&#x53E3;&#x7684;&#x5730;&#x5740;&#xFF0C;&#x5982;&#xFF1A;192.168.128.1/24&gt;
PrivateKey = &lt;&#x4F7F;&#x7528; `wg-genkey` &#x751F;&#x6210;&#x7684;&#x79C1;&#x94A5;&gt;
ListenPort = &lt;&#x670D;&#x52A1;&#x5668;&#x4E0A; wg0 &#x76D1;&#x542C;&#x7684;&#x7AEF;&#x53E3;&#xFF0C;&#x5982;&#xFF1A;1234&gt;

[Peer]
PublicKey = &lt;&#x672C;&#x5730;&#x7684;&#x516C;&#x94A5;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; `echo &lt;&#x672C;&#x5730;&#x79C1;&#x94A5;&gt; | wg-pubkey` &#x751F;&#x6210;&gt;
AllowedIPs = &lt;&#x672C;&#x5730; wg0 &#x63A5;&#x53E3;&#x4E0A;&#x7684;&#x5730;&#x5740;&#xFF0C;&#x5982;&#xFF1A;192.168.128.254/32&gt;
</code></pre><p>&#x672C;&#x5730;&#xFF1A;</p><pre><code>[Interface]
Address = &lt;&#x672C;&#x5730;&#x8BBE;&#x5B9A; wg0 &#x63A5;&#x53E3;&#x7684;&#x5730;&#x5740;&#xFF0C;&#x5982;&#xFF1A;192.168.128.254/24&gt;
PrivateKey = &lt;&#x4F7F;&#x7528; `wg-genkey` &#x751F;&#x6210;&#x7684;&#x79C1;&#x94A5;&gt;

[Peer]
PublicKey = &lt;&#x670D;&#x52A1;&#x5668;&#x7684;&#x516C;&#x94A5;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; `echo &lt;&#x670D;&#x52A1;&#x5668;&#x79C1;&#x94A5;&gt; | wg-pubkey` &#x751F;&#x6210;&gt;
AllowedIPs = 0.0.0.0/0
Endpoint = &lt;&#x670D;&#x52A1;&#x5668;&#x5916;&#x7F51;&#x5730;&#x5740;:&#x670D;&#x52A1;&#x5668;&#x4E0A; wg0 &#x76D1;&#x542C;&#x7684;&#x7AEF;&#x53E3;&#xFF0C;&#x5982;&#xFF1A;0.1.2.3:1234&gt;
</code></pre><p>&#x914D;&#x7F6E;&#x597D;&#x540E;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>wg-quick up wg0</code> &#x6765;&#x542F;&#x52A8;&#xFF08;&#x6CE8;&#x610F;&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x6309;&#x7167;&#x4E86;&#x4E0A;&#x9762; [WireGuard &#x914D;&#x7F6E;](#WireGuard &#x914D;&#x7F6E;) &#x547D;&#x4EE4;&#x624B;&#x52A8;&#x914D;&#x7F6E;&#x8FC7;&#xFF0C;&#x9700;&#x8981;&#x5148;&#x5220;&#x9664; wg0 &#x63A5;&#x53E3;&#x548C;&#x5BF9;&#x5E94;&#x7684;&#x8DEF;&#x7531;&#x624D;&#x884C;&#xFF09;&#x3002;<br>&#x5982;&#x679C;&#x6D4B;&#x8BD5;&#x6CA1;&#x95EE;&#x9898;&#x540E;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>systemctl enable wg-quick@wg0.service</code> &#x6765;&#x8BBE;&#x7F6E;&#x5F00;&#x673A;&#x81EA;&#x542F;&#x52A8;&#x3002;</p><h2 id="--1">&#x4F18;&#x5316;&#x56FD;&#x5185;&#x5916;&#x6D41;&#x91CF;</h2><p>&#x901A;&#x8FC7;&#x4E0A;&#x9762;&#x8BBE;&#x7F6E;&#x597D;&#x540E;&#xFF0C;&#x867D;&#x7136;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; WireGuard VPN &#x4E0A;&#x7F51;&#x4E86;&#xFF0C;&#x4F46;&#x6709;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x8FD9;&#x4E2A; VPN &#x662F;&#x5168;&#x5C40;&#x6027;&#x7684;&#xFF0C;&#x5373;&#x6240;&#x6709;&#x7684;&#x6D41;&#x91CF;&#x90FD;&#x4F1A;&#x4ECE; VPN &#x91CC;&#x51FA;&#x53BB;&#x3002;<br>&#x5982;&#x679C;&#x670D;&#x52A1;&#x5668;&#x5728;&#x7F8E;&#x56FD;&#x7684;&#x8BDD;&#xFF0C;&#x5728;&#x4E0A;&#x56FD;&#x5185;&#x7684;&#x7F51;&#x7AD9;&#x65F6;&#xFF0C;&#x4F1A;&#x7ED5;&#x4E86;&#x4E00;&#x5708;&#xFF0C;&#x5EF6;&#x65F6;&#x975E;&#x5E38;&#x5927;&#x3002;&#x8FD9;&#x65F6;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x7B56;&#x7565;&#x8DEF;&#x7531;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x5206;&#x6D41;&#x56FD;&#x5185;&#x5916;&#x7684;&#x6D41;&#x91CF;&#xFF0C;&#x4F7F;&#x56FD;&#x5185;&#x7684;&#x6D41;&#x91CF;&#x4E0D;&#x7528;&#x8D70; VPN&#x3002;</p><p>&#x5728;&#x4E0A;&#x9762;&#x901A;&#x8FC7; <code>wg-quick</code> &#x542F;&#x52A8;&#x8FC7;&#xFF0C;&#x5982;&#x679C;&#x672C;&#x5730;&#x914D;&#x7F6E;&#x91CC; <code>AllowedIPs</code> &#x8BBE;&#x7F6E;&#x4E86; <code>0.0.0.0/0</code>&#xFF0C;&#x610F;&#x601D;&#x662F;&#x5168;&#x5C40;&#x751F;&#x6548;&#xFF0C;&#x5176;&#x4E3B;&#x8981;&#x4E5F;&#x662F;&#x901A;&#x8FC7;&#x7B56;&#x7565;&#x8DEF;&#x7531;&#x6765;&#x5B9E;&#x73B0;&#x7684;&#x3002;</p><p>&#x4E0B;&#x9762;&#x662F; <code>wg-quick</code> &#x542F;&#x52A8;&#x65F6;&#x7684;&#x65E5;&#x5FD7;&#xFF1A;</p><pre><code>[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip address add 192.168.128.254/24 dev wg0
[#] ip link set mtu 1420 dev wg0
[#] ip link set wg0 up
[#] wg set wg0 fwmark 51820
[#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0
</code></pre><p>&#x4EE5;&#x4E0A;&#x7684;&#x65E5;&#x5FD7;&#x4FE1;&#x606F;&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#x662F;&#x6761;&#x6761;&#x547D;&#x4EE4;&#x6765;&#x7684;&#xFF0C;&#x901A;&#x8FC7;&#x8FD9;&#x4E9B;&#x547D;&#x4EE4;&#xFF0C;&#x5927;&#x6982;&#x53EF;&#x4EE5;&#x731C;&#x5F97;&#x51FA; <code>wg-quick</code> &#x662F;&#x5982;&#x4F55;&#x542F;&#x52A8;&#x7684;&#xFF1A;</p><p>&#x9996;&#x5148;&#x4F7F;&#x7528; <code>ip link add wg0 type wireguard</code> &#x6DFB;&#x52A0;&#x4E00;&#x4E2A;&#x540D;&#x4E3A; <code>wg0</code>&#x3001;&#x7C7B;&#x578B;&#x4E3A; <code>wireguard</code> &#x7684;&#x865A;&#x62DF;&#x63A5;&#x53E3;&#xFF1B;</p><p>&#x7136;&#x540E;&#x901A;&#x8FC7; <code>wg setconf wg0 /dev/fd/63</code> &#x52A0;&#x8F7D;&#x914D;&#x7F6E;&#xFF0C;&#x4ECE; <code>/dev/fd/63</code> &#x53EF;&#x4EE5;&#x770B;&#x5230;&#xFF0C;&#x914D;&#x7F6E;&#x5E94;&#x8BE5;&#x662F;&#x901A;&#x8FC7; process substitution &#x7684;&#x65B9;&#x5F0F;&#x52A0;&#x8F7D;&#x8FDB;&#x6765;&#x7684;&#xFF1B;</p><p><code>ip address add 192.168.128.254/24 dev wg0</code> &#x8FD9;&#x6761;&#x547D;&#x4EE4;&#x4E0A;&#x9762;&#x4E5F;&#x63D0;&#x5230;&#x8FC7;&#xFF0C;&#x5C31;&#x662F;&#x4E3A; <code>wg0</code> &#x63A5;&#x53E3;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A; IP &#x5730;&#x5740;&#x7684;&#xFF1B;</p><p><code>ip link set mtu 1420 dev wg0</code> &#x8BBE;&#x7F6E; <code>wg0</code> &#x63A5;&#x53E3;&#x4E0A;&#x7684; IP &#x5305;&#x7684; mtu &#x503C;&#xFF1B;</p><p><code>ip link set wg0 up</code> &#x542F;&#x52A8; <code>wg0</code> &#x63A5;&#x53E3;</p><p><code>wg set wg0 fwmark 51820</code> &#x4E3A; <code>wg0</code> &#x63A5;&#x53E3;&#x4E0A;&#x7684;&#x5305;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A; fwmark &#x503C;&#xFF0C;&#x4E3B;&#x8981;&#x4E3A;&#x4E86;&#x4E0B;&#x9762;&#x547D;&#x4EE4;&#x91CC;&#x7B56;&#x7565;&#x8DEF;&#x7531;&#x7528;&#x7684;&#xFF1B;</p><p><code>ip -4 route add 0.0.0.0/0 dev wg0 table 51820</code> &#x4E3A;&#x4E00;&#x4E2A; id &#x4E3A; <code>51820</code> &#x8868;&#x6DFB;&#x52A0;&#x9ED8;&#x8BA4;&#x7684;&#x8DEF;&#x7531;&#xFF0C;&#x8BE5;&#x8DEF;&#x7531;&#x7684;&#x901A;&#x8FC7; <code>wg0</code> &#x63A5;&#x53E3;</p><p><code>ip -4 rule add not fwmark 51820 table 51820</code> &#x8FD9;&#x6761;&#x547D;&#x4EE4;&#x5C31;&#x662F;&#x4E3B;&#x8981;&#x7684;&#x7B56;&#x7565;&#x8DEF;&#x7531;&#xFF0C;&#x901A;&#x8FC7;&#x4EE5;&#x4E0A;&#x4E09;&#x6761;&#x547D;&#x4EE4;&#x5C31;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x5168;&#x5C40;&#x7684;&#x6D41;&#x91CF;&#x8F6C;&#x53D1;&#x4E86;&#x3002;</p><p>&#x7531;&#x4E8E;&#x7B56;&#x7565;&#x8DEF;&#x7531;&#x662F;&#x6709;&#x4F18;&#x5148;&#x7EA7;&#x7684;&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5728;&#x628A;&#x6240;&#x6709;&#x56FD;&#x5185;&#x7684; IP &#x6BB5;&#x6DFB;&#x52A0;&#x5230;&#x4F18;&#x5148;&#x4E8E;&#x4E0A;&#x9762;&#x7684;&#x8FD9;&#x6761;&#x7B56;&#x7565;&#x8DEF;&#x7531;&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x53EF;&#x4EE5;&#x4E0D;&#x7528;&#x7ECF;&#x8FC7; <code>wg0</code> &#x63A5;&#x53E3;&#x4E86;&#x3002;</p><p>&#x9996;&#x5148;&#x8981;&#x83B7;&#x53D6;&#x5230;&#x56FD;&#x5185;&#x7684; IP &#x6BB5;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5230; <a href="http://ftp.apnic.net/stats/apnic/delegated-apnic-latest">apnic</a> &#x67E5;&#x8BE2;&#x5230;&#x56FD;&#x5185;&#x7684; IPv4 &#x5730;&#x5740;&#x6BB5;&#x3002;</p><p>&#x8BE5;&#x9875;&#x9762;&#x91CC;&#x7684; IPv4 &#x683C;&#x5F0F;&#x662F;&#xFF1A;&#x8D77;&#x59CB;&#x5730;&#x5740;|&#x5730;&#x5740;&#x6570;&#x91CF;&#xFF0C;&#x4F46; <code>ip rule</code> &#x8981;&#x6C42; CIDR &#x683C;&#x5F0F;&#x683C;&#x5F0F;&#xFF0C;&#x6240;&#x4EE5;&#x9700;&#x8981;&#x8F6C;&#x6362;&#x4E0B;&#x3002;&#x8F6C;&#x6362;&#x8D77;&#x6765;&#x4E5F;&#x633A;&#x7B80;&#x5355;&#xFF0C;&#x8FD9;&#x91CC;&#x5730;&#x5740;&#x6570;&#x91CF;&#x90FD;&#x662F; 2 &#x7684; n &#x6B21;&#x65B9;&#xFF0C;&#x56E0;&#x6B64;&#x5BF9;&#x5176;&#x4EE5; 2 &#x4E3A;&#x5E95;&#x6C42;&#x5730;&#x5740;&#x6570;&#x91CF;&#x7684;&#x5BF9;&#x6570;&#xFF0C;&#x7136;&#x540E;&#x7528; 32 &#x51CF;&#x53BB;&#x5176;&#x5BF9;&#x6570;&#x5C31;&#x53EF;&#x4EE5;&#x4E86;&#x3002;</p><p>&#x4F8B;&#x5982;&#xFF1A;</p><blockquote>apnic|CN|ipv4|45.249.112.0|1024|20160511|allocated</blockquote><p>&#x8D77;&#x59CB;&#x5730;&#x5740;&#x662F; <em>45.249.112.0</em>&#xFF0C;&#x6570;&#x91CF;&#x662F; 1024&#xFF0C;&#x5373; 2^10&#xFF0C;&#x56E0;&#x6B64;&#x53EF;&#x8F6C;&#x6362;&#x6210; CIDR &#x683C;&#x5F0F;&#x662F;&#xFF1A;<em>45.249.112.0/22</em>&#xFF0C;&#x52A0;&#x5165;&#x5230;&#x7B56;&#x7565;&#x8DEF;&#x7531;&#x5C31;&#x662F;&#xFF1A;</p><pre><code>ip rule add to 45.249.112.0/22 priority 1024
</code></pre><p><strong>priority 1024</strong> &#x5C31;&#x662F;&#x8BBE;&#x7F6E;&#x4F18;&#x5148;&#x7EA7;&#x7684;&#xFF0C;&#x6570;&#x5B57;&#x5C0F;&#x7684;&#x4F18;&#x5148;&#x7EA7;&#x9AD8;</p><p>apnic &#x91CC;&#x7684;&#x5206;&#x914D;&#x7ED9;&#x56FD;&#x5185;&#x7684; IP &#x6BB5;&#x6BD4;&#x8F83;&#x5206;&#x6563;&#xFF0C;&#x6211;&#x7EDF;&#x8BA1;&#x4E86;&#x4E0B;&#xFF0C;&#x5927;&#x6982;&#x6709; 8 &#x5343;&#x591A;&#x884C;&#x3002;&#x6211;&#x4EEC;&#x4E0D;&#x53EF;&#x80FD;&#x624B;&#x52A8;&#x6DFB;&#x52A0;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#x6211;&#x5199;&#x4E86;&#x4E00;&#x4E2A; <a href="https://github.com/zbinlin/wireguard-configuration/blob/master/cn.js">Node.js &#x811A;&#x672C;</a> &#x6765;&#x4E0B;&#x8F7D; apnic &#x7684;&#x6700;&#x65B0;&#x5206;&#x914D;&#x7248;&#xFF0C;&#x7136;&#x540E;&#x8F6C;&#x6362;&#x4E0B;&#xFF0C;&#x53EF;&#x4EE5;&#x5BFC;&#x51FA;&#x6210;&#x4E00;&#x4E2A; shell &#x811A;&#x672C;&#x6765;&#x8FD0;&#x884C;&#xFF0C; shell &#x811A;&#x672C;&#x91CC;&#x5C31;&#x662F;&#x4E00;&#x6761;&#x6761;&#x4E0A;&#x9762;&#x7684;&#x90A3;&#x79CD;&#x547D;&#x4EE4;&#x4E86;&#x3002;</p><p>&#x867D;&#x7136;&#x8FD0;&#x884C; shell &#x811A;&#x672C;&#x540E;&#xFF0C;&#x628A;&#x89C4;&#x5219;&#x6DFB;&#x52A0;&#x5230;&#x7B56;&#x7565;&#x8DEF;&#x7531;&#x91CC;&#x4E86;&#xFF0C;&#x4F46;&#x8FD9;&#x4E9B;&#x8DEF;&#x7531;&#x89C4;&#x5219;&#x4E5F;&#x662F;&#x8FD0;&#x884C;&#x65F6;&#x751F;&#x6548;&#x7684;&#xFF0C;&#x4E0B;&#x6B21;&#x91CD;&#x542F;&#x7535;&#x8111;&#x540E;&#x9700;&#x8981;&#x91CD;&#x65B0;&#x52A0;&#x8F7D;&#x3002;&#x8FD9;&#x91CC;&#x53EF;&#x6CA1;&#x6709;&#x73B0;&#x6210;&#x7684;&#x81EA;&#x542F;&#x52A8;&#x811A;&#x672C;&#xFF0C;&#x96BE;&#x9053;&#x8FD8;&#x8981;&#x5199;&#x4E2A;&#x81EA;&#x542F;&#x52A8;&#x811A;&#x672C;&#x5417;&#xFF1F;</p><p>&#x8FD8;&#x597D; <code>wg-quick</code> &#x91CC;&#x63D0;&#x4F9B;&#x4E86;&#x76F8;&#x5E94;&#x7684;&#x94A9;&#x5B50;&#xFF0C;&#x53EF;&#x4EE5;&#x5728; <code>wg-quick</code> &#x542F;&#x52A8;&#x3001;&#x5173;&#x95ED;&#x65F6;&#x6267;&#x884C;&#x4E00;&#x6761; shell &#x547D;&#x4EE4;&#xFF0C;&#x8FD9;&#x6837;&#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x628A;&#x4E0A;&#x9762;&#x7684; shell &#x811A;&#x672C;&#x6DFB;&#x52A0;&#x5230; <code>wg-quick</code> &#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x91CC;&#x53BB;&#x4E86;&#x3002;&#x8FD9;&#x6837;&#x5C31;&#x4E0D;&#x8BE6;&#x7EC6;&#x5199;&#x4E86;&#xFF0C;&#x5177;&#x4F53;&#x53EF;&#x4EE5;&#x770B;<a href="https://github.com/zbinlin/wireguard-configuration/blob/master/wg0.conf">&#x8FD9;&#x91CC;</a>&#x7684;&#x793A;&#x4F8B;&#x3002;</p><p>&#x8FD9;&#x91CC;&#x6709;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x7531;&#x4E8E; shell &#x811A;&#x672C;&#x91CC;&#x7684;&#x547D;&#x4EE4;&#x592A;&#x591A;&#x4E86;&#xFF0C;&#x6267;&#x884C;&#x8D77;&#x6765;&#x9700;&#x8981;&#x51E0;&#x79D2;&#x7684;&#x65F6;&#x95F4;&#x3002;</p><p>&#x8FD9;&#x91CC;&#x6709;&#x4E2A;&#x65B9;&#x6848;&#xFF0C;&#x5C31;&#x662F;&#x5148;&#x5BFC;&#x5165; shell &#x811A;&#x672C;&#x4E00;&#x904D;&#xFF0C;&#x7136;&#x540E;&#x4F7F;&#x7528; <code>ip rule save</code> &#x5BFC;&#x51FA;&#x4FDD;&#x5B58;&#xFF0C;&#x5728; <code>wg-quick</code> &#x91CC;&#x901A;&#x8FC7; <code>ip rule restore</code> &#x8FD8;&#x539F;&#x914D;&#x7F6E;&#x5C31;&#x53EF;&#x4EE5;&#x4E86;&#xFF0C;&#x8FD9;&#x6837;&#x901F;&#x5EA6;&#x5F88;&#x591A;&#xFF0C;&#x57FA;&#x672C;&#x4E0D;&#x7528; 1 &#x79D2;&#x5C31;&#x53EF;&#x4EE5;&#x4E86;&#x3002;</p><p>&#x4F46;&#x662F;&#x5728;&#x7528; <code>ip rule save</code> &#x5BFC;&#x51FA;&#x65F6;&#xFF0C;&#x4F1A;&#x628A;&#x6240;&#x6709;&#x7684;&#x89C4;&#x5219;&#x90FD;&#x5BFC;&#x51FA;&#x6765;&#x4E86;&#xFF0C;&#x5305;&#x542B;&#x4E86;&#x7CFB;&#x7EDF;&#x9ED8;&#x8BA4;&#x7684;&#x548C; <code>wg-quick</code> &#x6DFB;&#x52A0;&#x7684;&#x3002;&#x518D;&#x5BFC;&#x5165;&#x65F6;&#xFF0C;&#x4F1A;&#x51FA;&#x73B0;&#x89C4;&#x5219;&#x91CD;&#x590D;&#x6216;&#x6DF7;&#x4E71;&#x7684;&#x60C5;&#x51B5;&#x3002;&#x81F3;&#x4E8E;&#x600E;&#x4E48;&#x89E3;&#x51B3;&#xFF0C;&#x8FD9;&#x91CC;&#x5C31;&#x4E0D;&#x5C55;&#x5F00;&#x8BF4;&#x4E86;&#xFF0C;&#x6709;&#x5174;&#x8DA3;&#x7684;&#x53EF;&#x4EE5;&#x53BB;&#x7814;&#x7A76;&#x4E0B;&#x3002;</p><h2 id="-dns">&#x201C;&#x667A;&#x80FD;&#x201D; DNS</h2><p>&#x4E0B;&#x9762;&#x8BF4;&#x4E0B;&#x53E6;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#x3002;</p><p>&#x4F17;&#x6240;&#x5468;&#x77E5;&#xFF0C;&#x5728;&#x56FD;&#x5185;&#xFF0C;&#x6709;&#x4E9B;&#x57DF;&#x540D;&#x5DF2;&#x7ECF;&#x88AB;&#x6C61;&#x67D3;&#x4E86;&#xFF0C;&#x4F7F;&#x7528;&#x8FD0;&#x8425;&#x5546;&#x63D0;&#x793A;&#x7684; DNS &#x670D;&#x52A1;&#x5668;&#x89E3;&#x6790;&#x51FA;&#x6765;&#x7684;&#x662F;&#x4E0D;&#x5BF9;&#x7684; IP&#x3002;&#x56E0;&#x6B64;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x4E00;&#x4E2A;&#x5B89;&#x5168;&#x7684; DNS &#x670D;&#x52A1;&#x5668;&#xFF0C;CloudFlare &#x5C31;&#x63D0;&#x4F9B;&#x8FD9;&#x4E48;&#x4E00;&#x7EC4; DNS &#x670D;&#x52A1;&#x5668;&#xFF0C;&#x5176;&#x63D0;&#x4F9B;&#x7684; <em>1.1.1.1</em> &#x548C; <em>1.0.0.1</em> &#x652F;&#x6301; DNS-over-TLS&#xFF0C;&#x53EF;&#x4EE5;&#x6709;&#x6548;&#x7684;&#x9632;&#x6B62;&#x88AB;&#x4E2D;&#x95F4;&#x4EBA;&#x62E6;&#x51FB;&#x6C61;&#x67D3;&#x3002;</p><p>&#x4F46;&#x6709;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x5728;&#x6211;&#x8FD9;&#x91CC;&#x8BBF;&#x95EE; <code>1.1.1.1</code> &#x6BD4;&#x8F83;&#x6162;&#xFF0C;<code>ping 1.1.1.1</code> &#x663E;&#x793A;&#x6709; 150ms &#x5DE6;&#x53F3;&#xFF0C;&#x5982;&#x679C;&#x6240;&#x6709;&#x7684;&#x57DF;&#x540D;&#x90FD;&#x901A;&#x8FC7; <code>1.1.1.1</code> &#x6765;&#x89E3;&#x6790;&#x7684;&#x8BDD;&#xFF0C;&#x4E00;&#x4E9B;&#x672A;&#x88AB;&#x6C61;&#x67D3;&#x7684;&#x57DF;&#x540D;&#x8BBF;&#x95EE;&#x8D77;&#x6765;&#x4F1A;&#x53D7;&#x5230;&#x5F71;&#x54CD;&#x3002;</p><p>&#x8FD8;&#x597D;&#x6709;&#x7F51;&#x53CB;&#x7EF4;&#x62A4;&#x4E86;&#x4E00;&#x4E2A; ChinaGFW &#x7684;&#x5217;&#x8868;&#xFF0C;&#x91CC;&#x9762;&#x5305;&#x542B;&#x4E86;&#x88AB;&#x6C61;&#x67D3;&#x7684;&#x57DF;&#x540D;&#xFF0C;&#x521A;&#x597D;&#x6211;&#x672C;&#x5730;&#x5DF2;&#x7ECF;&#x642D;&#x5EFA;&#x4E86; unbound &#x57DF;&#x540D;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x800C;&#x4E14; unbound &#x652F;&#x6301; DNS-over-TLS&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x53EF;&#x4EE5;&#x628A;&#x88AB;&#x6C61;&#x67D3;&#x7684;&#x57DF;&#x540D;&#x52A0;&#x5165;&#x5230; unbound &#x7684;&#x89C4;&#x5219;&#x91CC;&#xFF0C;&#x628A;&#x8FD9;&#x4E9B;&#x57DF;&#x540D;&#x901A;&#x8FC7; <code>1.1.1.1</code> &#x6765;&#x89E3;&#x6790;&#xFF0C;&#x5176;&#x4ED6;&#x57DF;&#x540D;&#x8FD8;&#x662F;&#x8D70;&#x8FD0;&#x8425;&#x5546;&#x63D0;&#x793A;&#x7684; DNS &#x6765;&#x89E3;&#x6790;&#x3002;</p><p><a href="https://github.com/zbinlin/wireguard-configuration/blob/master/dns-over-tls.conf">&#x8FD9;&#x91CC;</a> &#x662F;&#x4E00;&#x4E2A; unbound &#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF0C;&#x91CC;&#x9762;&#x5305;&#x542B;&#x7684;&#x88AB;&#x6C61;&#x67D3;&#x7684;&#x57DF;&#x540D;&#x4ECE; ChinaGFW &#x91CC;&#x8F6C;&#x51FA;&#x6765;&#x7684;&#xFF0C;&#x91CC;&#x9762;&#x7684;&#x5185;&#x5BB9;&#x7C7B;&#x4F3C;&#xFF1A;</p><pre><code>forward-zone:
    name: &apos;google.com&apos;
	 forward-addr: 1.1.1.1@853
	 forward-addr: 1.0.0.1@853
	 forward-ssl-upstream: yes
</code></pre><p><em>name</em> &#x8868;&#x793A;&#x88AB;&#x6C61;&#x67D3;&#x7684;&#x57DF;&#x540D;&#xFF0C;<em>forward-addr</em> &#x8868;&#x793A;&#x5411;&#x4E0A;&#x4E00;&#x7EA7;&#x67E5;&#x8BE2;&#x7684; DNS &#x670D;&#x52A1;&#x5668;&#xFF0C;&#x53EF;&#x4EE5;&#x6709;&#x591A;&#x4E2A;&#xFF0C;<em>forward-ssl-upstream</em> &#x8868;&#x793A;&#x5F00;&#x542F; DNS over TLS &#x529F;&#x80FD;&#x3002;<br>&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x7684;&#x6700;&#x540E;&#x4F7F;&#x7528;</p><p>&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x72EC;&#x7ACB;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF0C;&#x53EF;&#x4EE5;&#x628A;&#x5B83;&#x653E;&#x5230; <code>/etc/unbound/</code> &#x4E0B;&#xFF0C;&#x7136;&#x540E;&#x5728; <code>/etc/unbound/unbound.conf</code> &#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x91CC;&#x52A0;&#x5165; <code>include: /etc/unbound/dns-over-tls.conf</code> &#x6765;&#x5F15;&#x5165;&#x5B83;&#x3002;</p><p>&#x52A0;&#x5165;&#x540E;&#x91CD;&#x542F; unbound &#x670D;&#x52A1;&#x5C31;&#x53EF;&#x4EE5;&#x751F;&#x6548;&#x4E86;&#x3002;</p>]]></content:encoded></item><item><title><![CDATA[使用 ssh 连接相同 ip 不同主机时的 fingerprint 冲突问题]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x6700;&#x8FD1;&#x5C06;&#x5BB6;&#x91CC;&#x7684;&#x8DEF;&#x7531;&#x5668;&#x5237;&#x4E86; openwrt&#xFF0C;&#x5F53;&#x4F7F;&#x7528; ssh &#x8FDE;&#x63A5;&#x8DEF;&#x7531;&#x5668;&#x65F6;&#xFF0C;&#x63D0;&#x793A;&#xFF1A;</p>
<pre><code>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now</code></pre>]]></description><link>https://blog.mozcp.com/shi-yong-ssh-lian-jie-xiang-tong-ip-bu-tong-zhu-ji-shi-de-fingerprint-chong-tu-wen-ti-2/</link><guid isPermaLink="false">5b83b0c0a9dd3f000142adb9</guid><category><![CDATA[ssh]]></category><dc:creator><![CDATA[Colin Cheng]]></dc:creator><pubDate>Tue, 17 Jan 2017 06:57:48 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x6700;&#x8FD1;&#x5C06;&#x5BB6;&#x91CC;&#x7684;&#x8DEF;&#x7531;&#x5668;&#x5237;&#x4E86; openwrt&#xFF0C;&#x5F53;&#x4F7F;&#x7528; ssh &#x8FDE;&#x63A5;&#x8DEF;&#x7531;&#x5668;&#x65F6;&#xFF0C;&#x63D0;&#x793A;&#xFF1A;</p>
<pre><code>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:............................................
Please contact your system administrator.
Add correct host key in /home/example/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/example/.ssh/known_hosts:1
RSA host key for 192.168.1.1 has changed and you have requested strict checking.
Host key verification failed.
</code></pre>
<p>&#x8FD9;&#x662F;&#x7531;&#x4E8E;&#x4E4B;&#x524D;&#x5728;&#x51FA;&#x79DF;&#x7684;&#x623F;&#x5B50;&#x91CC;&#x8DEF;&#x7531;&#x5668;&#x540C;&#x6837;&#x662F; openwrt&#xFF0C;&#x800C;&#x4E14;&#x5DF2;&#x7ECF;&#x767B;&#x5F55;&#x8FC7;&#x5E76;&#x4FDD;&#x5B58;&#x4E86;&#x8BE5;&#x8DEF;&#x7531;&#x5668;&#x7684; RSA key fingerprint&#xFF0C;&#x5BFC;&#x81F4;&#x4E0E;&#x73B0;&#x5728;&#x8FDE;&#x63A5;&#x7684;&#x8DEF;&#x7531;&#x5668;&#x7684; RSA key fingerprint &#x4E0D;&#x5339;&#x914D;&#x800C;&#x51B2;&#x7A81;&#x4E86;&#x3002;</p>
<p>&#x6700;&#x7B80;&#x5355;&#x7684;&#x89E3;&#x51B3;&#x65B9;&#x5F0F;&#x662F;&#x5C06;&#x4E4B;&#x524D;&#x7684; fingerprint &#x4ECE; <code>~/.ssh/known_hosts</code> &#x91CC;&#x5220;&#x9664;&#xFF0C;&#x4F46;&#x8FD9;&#x6837;&#x5982;&#x679C;&#x8FDE;&#x63A5;&#x539F;&#x6765;&#x7684;&#x8DEF;&#x7531;&#x5668;&#x53C8;&#x4F1A;&#x51FA;&#x73B0;&#x51B2;&#x7A81;&#x3002;</p>
<p>&#x8FD9;&#x91CC;&#x53EF;&#x4EE5;&#x5728;&#x4F7F;&#x7528; ssh &#x8FDE;&#x63A5;&#x65F6;&#x4F7F;&#x7528; <code>-o &apos;UserKnownHostsFile /dev/null&apos;</code> &#x4E34;&#x65F6;&#x89E3;&#x51B3;&#x3002;</p>
<p>&#x53E6;&#x5916;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5206;&#x522B;&#x4E3A;&#x4E0D;&#x540C;&#x7684; host&#xFF08;&#x8FD9;&#x91CC;&#x662F;&#x8DEF;&#x7531;&#x5668;&#xFF09;&#x8BBE;&#x7F6E; <code>HostKeyAlias</code> &#x53C2;&#x6570;&#x6765;&#x533A;&#x5206;&#x5F00;&#x6765;&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;</p>
<p>&#x5728;&#x8FDE;&#x63A5;&#x51FA;&#x79DF;&#x5C4B;&#x91CC;&#x7684;&#x8DEF;&#x7531;&#x5668;&#x65F6;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>ssh -o &apos;HostKeyAlias host1&apos; root@192.168.1.1</code> &#x8FDE;&#x63A5;&#xFF0C;</p>
<p>&#x5728;&#x8FDE;&#x63A5;&#x5BB6;&#x91CC;&#x7684;&#x8DEF;&#x7531;&#x5668;&#x65F6;&#xFF0C;&#x4F7F;&#x7528; <code>ssh -o &apos;HostKeyAlias host2&apos; root@192.168.1.1</code> &#x8FDE;&#x63A5;&#x3002;</p>
<p>&#x4F46;&#x8FD9;&#x6837;&#x6BCF;&#x6B21;&#x8FDE;&#x63A5;&#x90FD;&#x9700;&#x8981;&#x6DFB;&#x52A0;&#x8FD9;&#x4E48;&#x957F;&#x7684;&#x53C2;&#x6570;&#xFF0C;&#x663E;&#x5F97;&#x5F88;&#x9EBB;&#x70E6;&#xFF0C;&#x8FD9;&#x65F6;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5C06;&#x53C2;&#x6570;&#x6DFB;&#x52A0;&#x5230; <code>~/.ssh/config</code> &#x91CC;&#x89E3;&#x51B3;&#xFF1A;</p>
<pre><code>Host host1
    Hostname 192.168.1.1
    HostKeyAlias host1
    Port 22
    User root

Host host2
    Hostname 192.168.1.1
    HostKeyAlias host2
    Port 22
    User root
</code></pre>
<p>&#x8FD9;&#x6837;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x5206;&#x522B;&#x4F7F;&#x7528; <code>ssh host1</code> &#x548C; <code>ssh host2</code> &#x6765;&#x8FDE;&#x63A5;&#x4E86;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[在 KVM 上安装 CentOS 7 过程记录]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x6700;&#x8FD1;&#xFF0C;&#x7531;&#x4E8E; <a href="http://www.zrblog.net/15598.html">Crissic Solutions</a> &#x5173;&#x95ED;&#x4E86;&#x670D;&#x52A1;&#xFF0C;&#x5BFC;&#x81F4;&#x6211;&#x4E0D;&#x5F97;&#x4E0D;&#x53C8;&#x8981;&#x53BB;&#x5BFB;&#x627E;&#x5176;&#x4ED6;&#x4FBF;&#x5B9C;&#x70B9;&#x7684; VPS &#x4E86;&#xFF0C;&#x521A;&#x597D;<br>
<a href="http://hostodo.com/portal/aff.php?aff=271" title="&#x6CE8;&#xFF1A;&#x6B64;&#x94FE;&#x63A5;&#x5305;&#x542B;&#x6709;&#x4E86; AFF &#x7801;">hostdo</a><br>
&#x6709;&#x4F18;&#x60E0;&#xFF0C;&#x6709;&#x4E2A; KVM &#x7684;&#x5957;&#x9910;&#x4EF7;&#x683C;&#x4E0E;&#x4E4B;</p>]]></description><link>https://blog.mozcp.com/install-centos7-on-kvm/</link><guid isPermaLink="false">5b83b0c0a9dd3f000142adb8</guid><category><![CDATA[centos7]]></category><category><![CDATA[kvm]]></category><category><![CDATA[vps]]></category><category><![CDATA[迁移]]></category><dc:creator><![CDATA[Colin Cheng]]></dc:creator><pubDate>Thu, 17 Nov 2016 10:25:29 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x6700;&#x8FD1;&#xFF0C;&#x7531;&#x4E8E; <a href="http://www.zrblog.net/15598.html">Crissic Solutions</a> &#x5173;&#x95ED;&#x4E86;&#x670D;&#x52A1;&#xFF0C;&#x5BFC;&#x81F4;&#x6211;&#x4E0D;&#x5F97;&#x4E0D;&#x53C8;&#x8981;&#x53BB;&#x5BFB;&#x627E;&#x5176;&#x4ED6;&#x4FBF;&#x5B9C;&#x70B9;&#x7684; VPS &#x4E86;&#xFF0C;&#x521A;&#x597D;<br>
<a href="http://hostodo.com/portal/aff.php?aff=271" title="&#x6CE8;&#xFF1A;&#x6B64;&#x94FE;&#x63A5;&#x5305;&#x542B;&#x6709;&#x4E86; AFF &#x7801;">hostdo</a><br>
&#x6709;&#x4F18;&#x60E0;&#xFF0C;&#x6709;&#x4E2A; KVM &#x7684;&#x5957;&#x9910;&#x4EF7;&#x683C;&#x4E0E;&#x4E4B;&#x524D; Crissic &#x7684;&#x4E00;&#x6837;&#x3002;&#x56E0;&#x6B64;&#x6709;&#x4E70;&#x4E86;&#x4E00;&#x5E74;&#x3002;</p>
<p>&#x521A;&#x4E0B;&#x8BA2;&#x5355;&#x540E;&#xFF0C;&#x670D;&#x52A1;&#x6CA1;&#x7ACB;&#x5373;&#x5F00;&#x901A;&#xFF0C;&#x53EF;&#x80FD;&#x9700;&#x8981;&#x5BA1;&#x6838;&#xFF0C;&#x7B49;&#x4E86;&#x6BD4;&#x8F83;&#x4E45;&#xFF0C;&#x4E8E;&#x662F;&#x53D1;&#x4E86;&#x4E00;&#x4E2A; Ticket&#xFF0C;&#x5728;&#x7B2C; 2 &#x5929;&#x767B;&#x5F55;&#x540E;&#xFF0C;&#x53D1;&#x73B0;&#x5DF2;&#x7ECF;&#x5F00;&#x901A;&#x4E86;&#x3002;&#x8D2D;&#x4E70;&#x65F6;&#x673A;&#x623F;&#x9009;&#x6D1B;&#x6749;&#x77F6;&#x7684;&#xFF0C;&#x4ECE;&#x5E7F;&#x5DDE; ping &#x4E86;&#x4E0B; time<br>
&#x503C;&#x53EA;&#x6709; 160-180ms &#x5DE6;&#x53F3;&#xFF0C;&#x5DF2;&#x7ECF;&#x4E0D;&#x9519;&#x4E86;&#xFF0C;&#x4E4B;&#x524D;&#x7684; Crissic &#x57FA;&#x672C;&#x4E0A;&#x5728; 200ms &#x4EE5;&#x4E0A;&#x7684;&#x3002;</p>
<p>&#x7531;&#x4E8E;&#x5728;&#x4E0B;&#x8BA2;&#x5355;&#x9009;&#x62E9;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x9009;&#x62E9;&#x4E86; <code>None (More OS available after provisioned) </code>&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x5F00;&#x901A;&#x540E;&#x7684;&#x670D;&#x52A1;&#x8FD8;&#x6CA1;&#x6709;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#xFF0C;&#x9700;&#x8981;&#x767B;&#x5F55; VPS Control Panel &#x540E;&#x81EA;&#x884C;&#x5B89;&#x88C5;&#x3002;&#x4E8E;&#x662F;&#x901A;&#x8FC7;&#x5B83;&#x63D0;&#x4F9B;&#x7684; VPS Control Panel &#x767B;&#x5F55;&#x94FE;&#x63A5;&#x4EE5;&#x53CA;&#x7528;&#x6237;&#x540D;&#x548C;&#x5BC6;&#x7801;&#x6765;&#x767B;&#x5F55;&#x3002;</p>
<p>&#x767B;&#x5F55;&#x5230; Control Panel &#x540E;&#xFF0C;&#x5728;&#x754C;&#x9762;&#x4E0A;&#x6709;&#x4E2A; Reinstall &#x7684;&#x6309;&#x94AE;&#xFF0C;&#x70B9;&#x51FB;&#x4E4B;&#x540E;&#x53EF;&#x4EE5;&#x9009;&#x62E9;&#x4F60;&#x60F3;&#x8981;<br>
&#x5B89;&#x88C5;&#x7684;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x3002;</p>
<p>&#x7531;&#x4E8E;&#x4E4B;&#x524D;&#x5728; Crissic &#x4E0A;&#x7684;&#x7CFB;&#x7EDF;&#x662F; CentOS 6 32bit&#xFF0C;&#x5185;&#x6838;&#x6BD4;&#x8F83;&#x65E7;&#xFF0C;&#x800C;&#x4E14;&#x662F; 32 &#x4F4D;&#x7684;&#xFF0C;&#x4F7F;&#x7528;&#x8D77;&#x6765;&#x975E;&#x5E38;&#x4E0D;&#x4FBF;&#xFF0C;&#x56E0;&#x6B64;&#x8FD9;&#x6B21;&#x6253;&#x7B97;&#x5B89;&#x88C5; CentOS 7 64bit&#x3002;</p>
<p>&#x7531;&#x4E8E;&#x8BE5;&#x5957;&#x9910;&#x7684; VPS &#x7684;&#x5185;&#x5B58;&#x53EA;&#x6709; 512M&#xFF0C;&#x5F00;&#x59CB;&#x65F6;&#x8FD8;&#x62C5;&#x5FC3; 64 &#x4F4D;&#x7684;&#x7CFB;&#x7EDF;&#x5360;&#x7528;&#x5185;&#x5B58;&#x6BD4;&#x8F83;&#x5927;&#x7684;&#xFF0C;&#x4F46;&#x5B89;&#x88C5;&#x6210;&#x529F;&#x540E;&#x8FDB;&#x5165;&#x7CFB;&#x7EDF;&#x540E;&#x770B;&#x4E86;&#x4E0B;&#xFF0C;&#x53D1;&#x73B0;&#x53EA;&#x5360;&#x7528; 60 &#x591A; M&#xFF0C;&#x8FD9;&#x8FD8;&#x53EF;&#x4EE5;&#x63A5;&#x53D7;&#x3002;</p>
<p>&#x5728;&#x5B89;&#x88C5;&#x540E;&#x53D1;&#x73B0;&#x4E86;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x6574;&#x4E2A;&#x5206;&#x533A;&#x53EA;&#x6709; 2G&#xFF0C;&#x8FD9;&#x8FD8;&#x9700;&#x8981;&#x5BF9;&#x5269;&#x4F59;&#x7684;&#x7A7A;&#x95F4;&#x8FDB;&#x884C;&#x5206;&#x533A;&#x3002;&#x4F46;&#x7531;&#x4E8E;&#x6574;&#x4E2A; <code>/</code> &#x5206;&#x533A;&#x592A;&#x5C0F;&#x4E86;&#xFF0C;&#x800C;&#x4E14; VPS &#x7684;&#x78C1;&#x76D8;&#x7A7A;&#x95F4;&#x53EA;&#x6709; 15G&#xFF0C;&#x56E0;&#x6B64;&#x6253;&#x7B97;&#x53EA;&#x5206;&#x4E00;&#x4E2A;&#x533A;&#x5C31;&#x884C;&#x4E86;&#x3002;</p>
<p>&#x65E2;&#x7136;&#x53EA;&#x5206;&#x4E00;&#x4E2A;&#x533A;&#x5C31;&#x53EA;&#x80FD;&#x91CD;&#x88C5;&#x7CFB;&#x7EDF;&#x4E86;&#xFF0C;&#x56DE;&#x5230; Control Panel &#x7684;&#x4E3B;&#x754C;&#x9762;&#xFF0C;&#x5728;&#x754C;&#x9762;&#x7684;&#x4E0B;&#x9762;&#x6709;&#x4E00;&#x4E2A;<br>
CDRom &#x7684; tab &#x9875;&#xFF0C;&#x70B9;&#x51FB;&#x5207;&#x6362;&#x8FC7;&#x53BB;&#x540E;&#xFF0C;&#x5728; Select &#x4E0B;&#x9762;&#x9009;&#x62E9;&#x91CD;&#x88C5;&#x7684;&#x7CFB;&#x7EDF; ISO&#xFF08;&#x8FD9;&#x91CC;&#x56E0;&#x4E3A;&#x5B89;&#x88C5;&#x7684;&#x662F; CentOS 7&#xFF0C;&#x6240;&#x4EE5;&#x9009;&#x62E9;&#x4E86; CentOS 7 x86_64 Minimal ISO&#xFF09;&#xFF0C;&#x7136;&#x540E;&#x70B9;&#x51FB; Mount &#x6309;&#x94AE;&#xFF0C;&#x5728;&#x63D0;&#x793A; mount &#x6210;&#x529F;&#x540E;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x5728;&#x672C;&#x5730;&#x4F7F;&#x7528; VNC &#x5BA2;&#x6237;&#x7AEF;&#x8FDE;&#x63A5;&#x8FDC;&#x7A0B;&#x7684; VPS&#xFF0C;&#x7136;&#x540E;&#x91CD;&#x542F; VPS&#xFF0C;VPS &#x4F1A;&#x5F15;&#x5BFC;&#x542F;&#x52A8;&#x521A;&#x624D; mount &#x7684; ISO&#xFF08;&#x5982;&#x679C;&#x91CD;&#x542F;&#x540E;&#x53D1;&#x73B0;&#x4F9D;&#x7136;&#x662F;&#x5F15;&#x5BFC;&#x5230;&#x65E7;&#x7684;&#x7CFB;&#x7EDF;&#x7684;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;<br>
Control Panel &#x7684;&#x4E3B;&#x754C;&#x9762;&#x4E0B;&#x8FB9;&#x7684; Settings &#x6807;&#x7B7E;&#x9875;&#x91CC;&#xFF0C;&#x5728; Boot Order &#x91CC;&#x9009;&#x62E9; CDROM &#x4F18;&#x5148;&#x7684;&#x9009;&#x9879;&#xFF0C;&#x7136;&#x540E;&#x91CD;&#x542F; VPS&#xFF09;&#x3002;</p>
<p>&#x91CD;&#x88C5;&#x7684;&#x8FC7;&#x7A0B;&#x975E;&#x5E38;&#x7F13;&#x6162;&#xFF0C;&#x4E3B;&#x8981;&#x662F;&#x7531;&#x4E8E;&#x7F51;&#x7EDC;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x4EE5;&#x53CA;&#x5B89;&#x88C5;&#x7684;&#x754C;&#x9762;&#x662F;&#x4E00;&#x4E2A; GUI &#x754C;&#x9762;&#xFF0C;&#x5BFC;&#x81F4;<br>
&#x754C;&#x9762;&#x54CD;&#x5E94;&#x975E;&#x5E38;&#x6162;&#x3002;&#x6BD4;&#x8F83;&#x641E;&#x7B11;&#x7684;&#x662F;&#xFF0C;&#x5728;&#x771F;&#x6B63;&#x5F00;&#x59CB;&#x5B89;&#x88C5;&#x65F6;&#xFF0C;&#x754C;&#x9762;&#x4E0A;&#x6709;&#x4E2A;&#x8BBE;&#x7F6E;&#x65B0;&#x8D26;&#x53F7;&#x7684;&#x9009;&#x9879;&#xFF0C;<br>
&#x5728;&#x6211;&#x8FD8;&#x672A;&#x8BBE;&#x7F6E;&#x597D;&#x8D26;&#x53F7;&#xFF0C;&#x5B89;&#x88C5;&#x5C31;&#x5DF2;&#x7ECF;&#x5B8C;&#x6210;&#x4E86;&#x3002;</p>
<p>&#x5B89;&#x88C5;&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x7531;&#x4E8E;&#x5728;&#x5B89;&#x88C5;&#x65F6;&#x672A;&#x8BBE;&#x7F6E; hostname&#xFF0C;&#x56E0;&#x6B64;&#x5B89;&#x88C5;&#x540E;&#x4F7F;&#x7528;&#xFF1A;</p>
<pre><code>hostnamectl set-hostname &lt;your hostname&gt;
</code></pre>
<p>&#x6765;&#x8BBE;&#x7F6E; hostname&#x3002;</p>
<p>&#x4E4B;&#x540E;&#x4F7F;&#x7528; <code>yum update</code> &#x6765;&#x66F4;&#x65B0;&#x7CFB;&#x7EDF;&#xFF0C;&#x4F46;&#x53D1;&#x73B0;&#x7F51;&#x7EDC;&#x8FD8;&#x672A;&#x914D;&#x7F6E;&#x597D;&#xFF08;&#x5728;&#x5B89;&#x88C5;&#x65F6;&#x5FD8;&#x4E86;&#x914D;&#x7F6E;&#x4E86;&#xFF09;&#xFF0C;&#x4E8E;&#x662F;&#x4F7F;&#x7528; <code>nmtui</code> &#x547D;&#x4EE4;&#x6765;&#x914D;&#x7F6E;&#xFF0C;&#x8BE5;&#x547D;&#x4EE4;&#x662F;&#x4E00;&#x4E2A; text GUI &#x754C;&#x9762;&#xFF0C;&#x4F7F;&#x7528;&#x8D77;&#x6765;&#x6BD4;&#x8F83;&#x7B80;&#x5355;&#xFF0C;&#x56E0;&#x6B64;&#x8FD9;&#x91CC;&#x5C31;&#x7565;&#x8FC7;&#x4E86;&#x3002;</p>
<p>&#x66F4;&#x65B0;&#x6210;&#x529F;&#x540E;&#xFF0C;&#x5B89;&#x88C5; EPEL &#x548C; SCL &#x6E90;&#xFF1A;</p>
<pre><code>yum install epel-release centos-release-scl
</code></pre>
<p>&#x63A5;&#x7740;&#x5B89;&#x88C5; <code>yum-utils</code>&#xFF0C;&#x56E0;&#x4E3A;&#x91CC;&#x9762;&#x6709;&#x4E2A;&#x547D;&#x4EE4; <code>yum-complete-transaction</code> &#x53EF;&#x4EE5;&#x4FEE;&#x590D;&#x5728;&#x5B89;&#x88C5;&#x5305;&#x7684;&#x8FC7;&#x7A0B;&#x53D1;&#x73B0;&#x4E2D;&#x65AD;&#xFF08;&#x6BD4;&#x5982;&#x5B89;&#x88C5;&#x8F6F;&#x4EF6;&#x65F6;&#x7A81;&#x7136;&#x5173;&#x673A;&#x3001;&#x6B7B;&#x673A;&#x4E86;&#xFF09;&#x65F6;&#x7684; transaction &#x672A;&#x5B8C;&#x6210;&#x7684;&#x95EE;&#x9898;&#xFF1A;</p>
<pre><code>yum install yum-utils
</code></pre>
<p>&#x7531;&#x4E8E;&#x9700;&#x8981;&#x4F7F;&#x7528; GCC &#x6765;&#x7F16;&#x8BD1;&#x4E00;&#x4E2A; nodejs &#x7684;&#x539F;&#x751F;&#x6A21;&#x5757;&#xFF0C;&#x56E0;&#x6B64;&#x5B89;&#x88C5;&#x4E86; <code>Development Tools</code>&#xFF1A;</p>
<pre><code>yum groupinstall &quot;development tools&quot;
</code></pre>
<p>&#x5B89;&#x88C5; <code>iptables-service</code> &#x6765;&#x63A7;&#x5236; <code>iptables</code> &#x542F;&#x7528;&#x3001;&#x542F;&#x52A8;&#x3001;&#x5173;&#x95ED;&#x7B49;&#x63A7;&#x5236;&#xFF1A;</p>
<pre><code>yum install iptables-services
</code></pre>
<p>&#x7136;&#x540E;&#x5F00;&#x542F;&#x4EE5;&#x53CA;&#x542F;&#x52A8;&#xFF1A;</p>
<pre><code>systemctl enable iptables.service
systemctl enable ip6tables.service
systemctl start iptables.service
systemctl start ip6tables.service
systemctl status iptables.service
systemctl status ip6tables.service
</code></pre>
<p>&#x73B0;&#x5728;&#x9700;&#x8981;&#x5BFC;&#x5165;&#x65B0;&#x7684; iptables &#x89C4;&#x5219;&#xFF0C;&#x5982;&#x679C;&#x4E0D;&#x9700;&#x8981;&#x65E7;&#x7684;&#x89C4;&#x5219;&#xFF0C;&#x53EF;&#x4EE5;&#x5148;&#x6E05;&#x9664;&#x6389;&#xFF1A;</p>
<pre><code>iptables -t filter -F
</code></pre>
<p>&#x7136;&#x540E;&#x5BFC;&#x5165;&#xFF1A;</p>
<pre><code>iptables -t filter -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A INPUT -p tcp -m tcp --dport 8822 -j ACCEPT
iptables -t filter -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
iptables -t filter -P INPUT DROP
</code></pre>
<p>&#x5BF9;&#x4E8E; ip6tables&#xFF0C;&#x4E5F;&#x540C;&#x6837;&#x5730;&#x5904;&#x7406;&#xFF1A;</p>
<pre><code>ip6tables -t filter -F
ip6tables -t filter -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
ip6tables -t filter -A INPUT -i lo -j ACCEPT
ip6tables -t filter -A INPUT -p tcp -m tcp --dport 8822 -j ACCEPT
ip6tables -t filter -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
ip6tables -t filter -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
ip6tables -t filter -P INPUT DROP
</code></pre>
<p>&#xFF08;&#x6CE8;&#xFF1A;&#x4E0A;&#x9762;&#x7684; 8822 &#x7AEF;&#x53E3;&#x662F;&#x7528;&#x4E8E; ssh &#x670D;&#x52A1;&#x7684;&#xFF09;</p>
<p>&#x6DFB;&#x52A0;&#x597D;&#x540E;&#x9700;&#x8981;&#x5BFC;&#x51FA;&#x5230; <code>/etc/sysconfig/iptables</code> &#x548C; <code>/etc/sysconfig/ip6tables</code>&#xFF0C;&#x4EE5;<br>
&#x4FBF;&#x91CD;&#x542F;&#x540E;&#x53EF;&#x4EE5;&#x52A0;&#x8F7D;&#x8FDB;&#x6765;&#xFF1A;</p>
<pre><code>iptables-save &gt; /etc/sysconfig/iptables
ip6tables-save &gt; /etc/sysconfig/ip6tables
</code></pre>
<p>&#x4E0A;&#x9762;&#x7684;&#x64CD;&#x4F5C;&#x90FD;&#x662F;&#x5728; VNC &#x4E0A;&#x8FDB;&#x884C;&#x4E86;&#xFF0C;&#x4E0B;&#x9762;&#x914D;&#x7F6E;&#x4E00;&#x4E0B; sshd &#x670D;&#x52A1;&#xFF0C;&#x914D;&#x597D;&#x540E;&#x5C31;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; ssh &#x6765;&#x767B;&#x5F55;&#x64CD;&#x4F5C;&#x4E86;&#x3002;</p>
<p>&#x9996;&#x5148;&#xFF0C;&#x4FEE;&#x6539; <code>/etc/ssh/sshd_config</code> &#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF0C;&#x4FEE;&#x6539;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code># &#x4FEE;&#x6539;&#x7AEF;&#x53E3;
Port 8822
# &#x542F;&#x7528;&#x516C;&#x94A5;&#x767B;&#x5F55;
PubkeyAuthentication yes
# &#x7981;&#x6B62;&#x7A7A;&#x5BC6;&#x7801;&#x767B;&#x5F55;
PermitEmptyPasswords no
# &#x7981;&#x6B62;&#x5BC6;&#x7801;&#x767B;&#x5F55;&#xFF08;&#x8FD9;&#x4E00;&#x884C;&#x73B0;&#x5728;&#x5148;&#x4E0D;&#x6539;&#xFF0C;&#x5728;&#x5C06;&#x516C;&#x94A5;&#x4E0A;&#x4F20;&#x540E;&#x518D;&#x6765;&#x4FEE;&#x6539;
# PasswordAuthentication no
</code></pre>
<p>&#x7136;&#x540E;&#x4F7F;&#x7528; <code>systemctl restart sshd</code>&#xFF0C;&#x4F46;&#x53D1;&#x73B0;&#x91CD;&#x542F;&#x5931;&#x8D25;&#xFF0C;&#x539F;&#x56E0;&#x662F;&#x7531;&#x4E8E; selinux &#x4E0D;&#x5141;&#x8BB8; sshd &#x4F7F;&#x7528; 8822 &#x7AEF;&#x53E3;&#xFF1A;</p>
<pre><code>grep sshd /var/log/audit/audit.log | audit2why
</code></pre>
<p>&#x4E8E;&#x662F;&#x4F7F;&#x7528; semanage &#x4E3A; sshd &#x6DFB;&#x52A0; 8822 &#x7AEF;&#x53E3;&#xFF1A;</p>
<pre><code>semanage port -a -t ssh_port_t -p tcp 8822
</code></pre>
<p>&#xFF08;&#x6CE8;&#xFF1A;&#x5982;&#x679C;&#x63D0;&#x793A;&#x8BE5;&#x547D;&#x4EE4;&#x4E0D;&#x5B58;&#x5728;&#xFF0C;&#x53EF;&#x4EE5;&#x5B89;&#x88C5; <code>policycoreutils-python</code> &#x5305;&#xFF09;</p>
<p>&#x914D;&#x597D;&#x540E;&#xFF0C;&#x91CD;&#x65B0;&#x542F;&#x52A8;&#x670D;&#x52A1;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; ssh &#x6765;&#x767B;&#x5F55;&#x4E86;&#x3002;</p>
<p>&#x5728;&#x672C;&#x5730;&#x4F7F;&#x7528; <code>ssh-keygen -t ed25519 -C vps -f ~/.ssh/&lt;filename&gt;</code> &#x751F;&#x6210;&#x5BC6;&#x94A5;&#xFF0C;<br>
&#x7136;&#x540E;&#x4F7F;&#x7528; <code>ssh-copy-id -i ~/.ssh/&lt;filname&gt;.pub &lt;your vps ip&gt;</code> &#x5C06;&#x516C;&#x94A5;&#x4FDD;&#x5B58;&#x5230;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x3002;</p>
<p>&#x7136;&#x540E;&#x5B89;&#x88C5; nginx, rh-postgresql95&#xFF1A;</p>
<pre><code>yum install nginx rh-postgresql95
</code></pre>
<p>&#x521D;&#x59CB;&#x5316; postgresql95&#xFF0C;&#x7531;&#x4E8E;&#x4F7F;&#x7528; scl &#x4E0A;&#x7684; postgresql95&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x65B0;&#x5F00;&#x4E00;&#x4E2A; shell &#x73AF;&#x5883;&#x6765;&#x5F00;&#x542F; postgresql95&#xFF1A;</p>
<pre><code>scl enable rh-postgresql95 bash
</code></pre>
<p>&#x7136;&#x540E;&#x5728;&#x8FD9;&#x4E2A;&#x65B0;&#x7684; bash shell &#x4E2D;&#x521D;&#x59CB;&#x5316;&#xFF1A;</p>
<pre><code>postgresql-setup --initdb
</code></pre>
<p>PS: &#x4EE5;&#x4E0A;&#x4E24;&#x6761;&#x547D;&#x4EE4;&#x6700;&#x597D;&#x5728; root &#x4E0B;&#x6267;&#x884C;&#xFF0C;&#x56E0;&#x4E3A;&#x7B2C;&#x4E8C;&#x6761;&#x9700;&#x8981; root &#x6743;&#x9650;&#xFF0C;&#x800C;&#x5982;&#x679C;&#x4F7F;&#x7528;<br>
<code>sudo postgresql-setup --initdb</code> &#x4F1A;&#x62A5; <code>command not found</code> &#x7684;&#x9519;&#x8BEF;&#x3002;</p>
<p>&#x521D;&#x59CB;&#x5316;&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x5F00;&#x542F; postgresql95 &#x670D;&#x52A1;&#x4E86;&#xFF1A;</p>
<pre><code>systemctl enable rh-postgresql95-postgresql.service
</code></pre>
<p>&#x7136;&#x540E;&#x542F;&#x52A8;&#xFF0C;&#x5E76;&#x67E5;&#x770B;&#x662F;&#x5426;&#x542F;&#x52A8;&#x6210;&#x529F;&#x4E86;&#xFF1A;</p>
<pre><code>systemctl start rh-postgresql95-postgresql.service
systemctl status rh-postgresql95-postgresql.service
</code></pre>
<p>&#x5F53;&#x542F;&#x52A8;&#x6210;&#x529F;&#x540E;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>psql</code> &#x7BA1;&#x7406;&#x8FDB;&#x884C;&#x521B;&#x5EFA;&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x521B;&#x5EFA;&#x7528;&#x6237;&#xFF0C;&#x5BFC;&#x5165;&#x6570;&#x636E;&#x5E93;&#x7B49;&#x64CD;&#x4F5C;<br>
&#x4E86;&#x3002;</p>
<p>&#x5982;&#x679C;&#x9700;&#x8981;&#x5207;&#x6362;&#x5230; postgres &#x8D26;&#x53F7;&#x6765;&#x767B;&#x5F55;&#x4F7F;&#x7528; <code>psql</code>&#xFF0C;&#x4E3A;&#x4E86;&#x907F;&#x514D;&#x9891;&#x7E41;&#x8F93;&#x5165; postgres &#x7684;&#x5BC6;&#x7801;&#xFF0C;&#x53EF;&#x4EE5;&#x4FEE;&#x6539;&#x4E0B; PAM &#x914D;&#x7F6E;&#xFF0C;&#x4F7F;&#x5F97;&#x5F53;&#x524D;&#x8D26;&#x53F7;&#x53EF;&#x4EE5;&#x514D; postgresql &#x8D26;&#x6237;&#x5BC6;&#x7801;&#x5207;&#x6362;&#x5230; postgres &#x8D26;&#x53F7;&#x3002;</p>
<p>&#x7F16;&#x8F91; <code>/etc/pam.d/su</code> &#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF0C;&#x5728;</p>
<pre><code>auth		sufficient	pam_rootok.so
</code></pre>
<p>&#x4E00;&#x884C;&#x7684;&#x4E0B;&#x9762;&#x6DFB;&#x52A0;&#x4EE5;&#x4E0B;&#x914D;&#x7F6E;&#xFF1A;</p>
<pre><code>auth		[success=ignore default=1] pam_succeed_if.so user in postgres
auth		sufficient	pam_succeed_if.so user = &lt;USER&gt; use_uid
</code></pre>
<p>&#x5176;&#x4E2D;&#xFF0C;&#x628A;&#x4E0A;&#x9762;&#x7684; <code>&lt;USER&gt;</code> &#x66FF;&#x6362;&#x4E3A;&#x5F53;&#x524D;&#x767B;&#x5F55;&#x7684;&#x8D26;&#x53F7;&#x540D;&#x3002;&#x5982;&#x679C;&#x8FD8;&#x8981;&#x6DFB;&#x52A0;&#x5176;&#x4ED6;&#x7528;&#x6237;&#xFF0C;&#x7528;&#x6237;&#x540D;&#x4E4B;&#x95F4;&#x7528; <code>:</code> &#x5206;&#x9694;&#xFF0C;&#x5982;&#xFF1A;<code>postgres:other</code>&#x3002;</p>
<p>&#x7136;&#x540E;&#x5C31;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x8FDB;&#x5165; psql &#x91CC;&#x4E86;&#xFF1A;</p>
<pre><code>su - postgres -c &apos;scl enable rh-postgresql95 psql&apos;
</code></pre>
<p>&#xFF08;&#x6CE8;&#xFF1A;&#x4E0A;&#x9762;&#x7684;&#x547D;&#x4EE4;&#x662F;&#x7531;&#x4E8E;&#x9700;&#x8981;&#x5148;&#x542F;&#x7528; rh-postgresql95&#xFF0C;psql &#x547D;&#x4EE4;&#x624D;&#x53EF;&#x4EE5;&#x7528;&#xFF09;</p>
<p>postgresql &#x914D;&#x7F6E;&#x597D;&#x540E;&#xFF0C;&#x73B0;&#x5728;&#x6765;&#x5F00;&#x542F; nginx &#x670D;&#x52A1;&#xFF1A;</p>
<pre><code>systemctl enable nginx
</code></pre>
<p>&#x7136;&#x540E;&#x542F;&#x52A8;&#xFF0C;&#x5E76;&#x67E5;&#x770B;&#x542F;&#x52A8;&#x72B6;&#x6001;&#xFF1A;</p>
<pre><code>systemctl start nginx
systemctl status nginx
</code></pre>
<p>&#x542F;&#x52A8;&#x6210;&#x529F;&#x540E;&#xFF0C;&#x5C06;&#x539F; VPS &#x4E0A;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x590D;&#x5236;&#x5230; <code>/etc/nginx/conf.d/</code> &#x91CC;&#xFF0C;&#x7531;&#x4E8E;&#x5C06; SSL &#x8BC1;&#x4E66;&#x548C;&#x5BC6;&#x94A5;&#x653E;&#x5728;&#x5176;&#x4ED6;&#x76EE;&#x5F55;&#x4E0A;&#xFF0C;&#x5E76;&#x4E14; CentOS 7 &#x9ED8;&#x8BA4;&#x5F00;&#x542F;&#x4E86; selinux&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x4E3A;&#x8BE5;&#x76EE;&#x5F55;&#x4FEE;&#x6539;&#x5176; label&#xFF1A;</p>
<pre><code>chcon -v --type=httpd_sys_content_t /srv/ssl
</code></pre>
<p>&#x4E0A;&#x9762;&#x7684;&#x547D;&#x4EE4;&#x662F;&#x4E34;&#x65F6;&#x6027;&#x7684;&#xFF0C;&#x5F53;&#x4FEE;&#x6539;&#x8BE5;&#x76EE;&#x5F55;&#x540E;&#xFF0C;&#x5176; label &#x53C8;&#x4F1A;&#x88AB;&#x5220;&#x9664;&#xFF0C;&#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x6C38;&#x4E45;&#x5730;&#x4F7F;&#x5176;&#x751F;&#x6548;&#xFF1A;</p>
<pre><code>semanage fcontext -a -t httpd_sys_content_t /srv/ssl(/.*)?
restorecon -Rv /srv/ssl
</code></pre>
<p>&#x7531;&#x4E8E;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x6BD4;&#x8F83;&#x65B0;&#x7684; Nodejs &#x7248;&#x672C;&#xFF0C;&#x56E0;&#x6B64;&#x76F4;&#x63A5;&#x4F7F;&#x7528; Nodejs &#x5B98;&#x7F51;&#x63D0;&#x4F9B;&#x7684;<a href="https://nodejs.org/en/download/package-manager/">&#x5B89;&#x88C5;&#x65B9;&#x5F0F;</a>&#x6765;&#x5B89;&#x88C5; Nodejs&#xFF1A;</p>
<pre><code>curl --silent --location https://rpm.nodesource.com/setup_7.x | bash -
yum install nodejs
</code></pre>
<p>&#x7531; nginx &#x4F5C;&#x4E3A;&#x524D;&#x7AEF;&#xFF0C;&#x540E;&#x7AEF;&#x4F7F;&#x7528; nodejs &#x65F6;&#xFF0C;&#x5728; nginx &#x8FDE;&#x63A5; nodejs &#x65F6;&#x5982;&#x679C;&#x8FDE;&#x63A5;&#x5931;&#x8D25;&#xFF0C;&#x5982;&#x679C;&#x5728; <code>/var/log/nginx/error.log</code> &#x4E2D;&#x53D1;&#x73B0;&#x4EE5;&#x4E0B;&#x9519;&#x8BEF;&#xFF1A;</p>
<pre><code>2016/11/16 01:49:33 [crit] 16726#0: *26 connect() to 127.0.0.1:2368 failed (13: Permission denied) while connecting to upstream, client: x.x.x.x, server: example.org, request: &quot;GET / HTTP/1.1&quot;, upstream: &quot;http://127.0.0.1:2368/&quot;, host: &quot;example.org&quot;
</code></pre>
<p>&#x8FD9;&#x53EF;&#x80FD;&#x662F;&#x7531;&#x4E8E; selinux &#x7684; <code>httpd_can_network_connect</code> &#x7684;&#x503C;&#x4E3A; <code>off</code> &#x9020;&#x6210;&#x7684;&#xFF0C;&#x8FD9;&#x65F6;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x4FEE;&#x6539;&#x5176;&#x503C;&#x4E3A; <code>on</code>&#xFF1A;</p>
<pre><code># &#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x67E5;&#x770B; httpd_can_network_connect &#x7684;&#x503C;&#xFF1A;
getsebool -a | grep httpd_can_network_connect
# &#x5C06; httpd_can_network_connect &#x8BBE;&#x4E3A; on
setsebool -P httpd_can_network_connect on
</code></pre>
<p>&#x53C2;&#x8003;&#xFF1A;</p>
<p><a href="https://www.softwarecollections.org/en/scls/rhscl/rh-postgresql95/">https://www.softwarecollections.org/en/scls/rhscl/rh-postgresql95/</a><br>
<a href="https://www.nginx.com/blog/nginx-se-linux-changes-upgrading-rhel-6-6/">https://www.nginx.com/blog/nginx-se-linux-changes-upgrading-rhel-6-6/</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Rollup: Error parsing /tmp/example.js: The keyword 'await' is reserved (1:18) in /tmp/example.js]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h2 id>&#x89E3;&#x51B3;&#x65B9;&#x6CD5;</h2>
<p>&#x5728; rollup &#x7684;&#x914D;&#x7F6E;&#xFF08;&#x5982; <code>rollup.config.js</code>&#xFF09;&#x91CC;&#x52A0;&#x5165;&#xFF1A;</p>
<pre><code class="language-javascript">export default {
    //...,
    acorn: {
        allowReserved: true,
    },
    //...,
}
</code></pre>
<h2 id>&#x9519;&#x8BEF;&#x5206;&#x6790;</h2>
<p>&#x4E00;&#x822C;&#x51FA;&#x73B0;&#x8FD9;&#x79CD;&#x9519;&#x8BEF;&#x662F;&#x7531;&#x4E8E; js &#x91CC;&#x4F7F;&#x7528;&#x4E86;&#x4FDD;&#x7559;&#x5B57;&#xFF08;Reserved Word&</p>]]></description><link>https://blog.mozcp.com/rollup-error-parsing-keyword-is-reserved/</link><guid isPermaLink="false">5b83b0c0a9dd3f000142adb7</guid><category><![CDATA[rollup]]></category><category><![CDATA[babel]]></category><category><![CDATA[acorn]]></category><dc:creator><![CDATA[Colin Cheng]]></dc:creator><pubDate>Mon, 18 Jul 2016 14:56:03 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id>&#x89E3;&#x51B3;&#x65B9;&#x6CD5;</h2>
<p>&#x5728; rollup &#x7684;&#x914D;&#x7F6E;&#xFF08;&#x5982; <code>rollup.config.js</code>&#xFF09;&#x91CC;&#x52A0;&#x5165;&#xFF1A;</p>
<pre><code class="language-javascript">export default {
    //...,
    acorn: {
        allowReserved: true,
    },
    //...,
}
</code></pre>
<h2 id>&#x9519;&#x8BEF;&#x5206;&#x6790;</h2>
<p>&#x4E00;&#x822C;&#x51FA;&#x73B0;&#x8FD9;&#x79CD;&#x9519;&#x8BEF;&#x662F;&#x7531;&#x4E8E; js &#x91CC;&#x4F7F;&#x7528;&#x4E86;&#x4FDD;&#x7559;&#x5B57;&#xFF08;Reserved Word&#xFF09;&#x4F5C;&#x4E3A;&#x51FD;&#x6570;&#x540D;&#x6216;&#x8005;&#x53D8;&#x91CF;&#x540D;&#x5BFC;&#x81F4;&#x7684;&#xFF0C;<br>
&#x56E0;&#x4E3A; rollup &#x4F7F;&#x7528; acorn &#x5C06; js &#x89E3;&#x6790;&#x6210; AST&#xFF0C;&#x800C;&#x5728; acorn &#x4E2D;&#xFF0C;&#x53EA;&#x6709; ecmascript 3 &#x624D;&#x88AB;&#x5141;&#x8BB8;&#x4F7F;&#x7528;&#x4FDD;<br>
&#x7559;&#x5B57;&#x4F5C;&#x4E3A;&#x51FD;&#x6570;&#x540D;&#x6216;&#x53D8;&#x91CF;&#x540D;&#xFF0C;&#x66F4;&#x9AD8;&#x7248;&#x672C;&#x7684; ecmascript &#x9ED8;&#x8BA4;&#x4F1A;&#x62A5;&#x9519;&#xFF0C;&#x9664;&#x975E;&#x4F7F;&#x7528;<br>
<code>allowReserved: true</code> &#x9009;&#x9879;&#x6765;&#x660E;&#x786E;&#x5141;&#x8BB8;&#x4F7F;&#x7528;&#x3002;</p>
<p>&#x6211;&#x4EEC;&#x5199;&#x4EE3;&#x7801;&#x65F6;&#xFF0C;&#x4E5F;&#x4F1A;&#x907F;&#x514D;&#x4F7F;&#x7528;&#x4FDD;&#x7559;&#x5B57;&#x4F5C;&#x4E3A;&#x51FD;&#x6570;&#x540D;&#x6216;&#x53D8;&#x91CF;&#x540D;&#xFF0C;&#x4F46;&#x6709;&#x65F6;&#x4F1A;&#x4F7F;&#x7528;&#x5B83;&#x4EEC;&#x4F5C;&#x4E3A;&#x5BF9;&#x8C61;&#x7684; key<br>
&#x6765;&#x4F7F;&#x7528;&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;</p>
<pre><code class="language-javascript">var foo = {
    await: function () {
    },
};
</code></pre>
<p>&#x8FD9;&#x6837;&#x4F7F;&#x7528;&#x4E00;&#x822C;&#x6CA1;&#x4EC0;&#x4E48;&#x95EE;&#x9898;&#x7684;&#xFF0C;&#x4F46;&#x5982;&#x679C;&#x4EE3;&#x7801;&#x901A;&#x8FC7; babel &#x8F6C;&#x6362;&#x540E;&#x7531; acorn &#x89E3;&#x6790;&#xFF08;&#x901A;&#x5E38;&#x6211;&#x4EEC;&#x4E0D;&#x4F1A;<br>
&#x8FD9;&#x6837;&#x7528;&#x7684;&#xFF0C;&#x56E0;&#x4E3A; babel &#x672C;&#x8EAB;&#x5DF2;&#x7ECF;&#x5185;&#x7F6E;&#x4E86;&#x4E00;&#x4E2A;&#x7C7B;&#x4F3C; acorn &#x7684;&#x89E3;&#x6790;&#x5668;&#xFF0C;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x89E3;&#x6790;&#x6210; AST&#x3002;<br>
&#x4F46;&#x5982;&#x679C;&#x5728; rollup &#x4E2D;&#x4F7F;&#x7528; babel&#xFF0C;rollup &#x4F1A;&#x5C06;&#x6E90;&#x4EE3;&#x7801;&#x7ECF;&#x8FC7; babel &#x8F6C;&#x6362;&#x540E;&#x518D;&#x7531; rollup &#x9ED8;&#x8BA4;&#x7684;<br>
&#x89E3;&#x6790;&#x5668; acorn &#x5904;&#x7406;&#xFF09;&#x5C31;&#x4F1A;&#x51FA;&#x73B0;&#x4E0A;&#x9762;&#x7684;&#x90A3;&#x4E2A;&#x62A5;&#x9519;&#x4E86;&#xFF0C;&#x4E3A;&#x4EC0;&#x4E48;&#x7ECF;&#x8FC7; babel &#x5904;&#x7406;&#x540E;&#x4F1A;&#x62A5;&#x9519;&#x5462;&#xFF1F;</p>
<p>&#x6211;&#x4EEC;&#x6765;&#x770B;&#x4E0B;&#x7ECF;&#x8FC7; babel &#x5904;&#x7406;&#x540E;&#x7684;<a href="http://babeljs.io/repl/#?evaluate=false&amp;lineWrap=false&amp;presets=es2015&amp;code=var%20foo%20%3D%20%7B%0A%20%20await%3A%20function%20()%20%7B%0A%20%20%7D%0A%7D%3B">&#x4EE3;&#x7801;</a>&#x5C31;&#x6E05;&#x695A;&#x4E86;&#xFF1A;</p>
<pre><code class="language-javascript">&quot;use strict&quot;;

var foo = {
    await: function await() {}
};
</code></pre>
<p>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#xFF0C;&#x5B83;&#x5C06;&#x5C5E;&#x6027; await &#x7684;&#x503C;&#xFF08;&#x4E00;&#x4E2A;&#x533F;&#x540D;&#x51FD;&#x6570;&#xFF09;&#x7684;&#x51FD;&#x6570;&#x540D;&#x6539;&#x6210; await &#x8FD9;&#x4E2A;&#x4FDD;&#x7559;&#x5B57;&#x4E86;&#x3002;&#x8FD9;&#x65F6;&#x5982;&#x679C;&#x518D;&#x5C06;<br>
&#x8FD9;&#x4E9B;&#x4EE3;&#x7801;&#x4F20;&#x5230; acorn &#x91CC;&#x89E3;&#x6790;&#xFF0C;&#x5C31;&#x4F1A;&#x62A5;&#x9519;&#x3002;</p>
<p>&#x53C2;&#x8003;&#xFF1A;</p>
<ul>
<li>rollup: <a href="https://github.com/rollup/rollup">https://github.com/rollup/rollup</a></li>
<li>acorn: <a href="https://github.com/ternjs/acorn">https://github.com/ternjs/acorn</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[在 curl 中使用指定 ip 来进行请求 https]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x4E00;&#x822C;&#x5730;&#xFF0C;&#x5728; curl &#x4E2D;&#xFF0C;&#x5982;&#x679C;&#x60F3;&#x4EE5;&#x6307;&#x5B9A;&#x7684; ip &#x6765;&#x8BF7;&#x6C42;&#x4E00;&#x4E2A;&#x57DF;&#x540D;&#x5730;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>curl http://127.0.0.1/example -H &apos;Host: www.example.org&apos;</code><br>
&#x8FD9;&#x79CD;&#x6307;&#x5B9A; Host &#x5934;&#x7684;</p>]]></description><link>https://blog.mozcp.com/curl-request-https-specify-ip/</link><guid isPermaLink="false">5b83b0c0a9dd3f000142adb6</guid><category><![CDATA[curl]]></category><category><![CDATA[resolve]]></category><category><![CDATA[https]]></category><dc:creator><![CDATA[Colin Cheng]]></dc:creator><pubDate>Fri, 15 Jul 2016 10:37:48 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x4E00;&#x822C;&#x5730;&#xFF0C;&#x5728; curl &#x4E2D;&#xFF0C;&#x5982;&#x679C;&#x60F3;&#x4EE5;&#x6307;&#x5B9A;&#x7684; ip &#x6765;&#x8BF7;&#x6C42;&#x4E00;&#x4E2A;&#x57DF;&#x540D;&#x5730;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>curl http://127.0.0.1/example -H &apos;Host: www.example.org&apos;</code><br>
&#x8FD9;&#x79CD;&#x6307;&#x5B9A; Host &#x5934;&#x7684;&#x505A;&#x6CD5;&#xFF0C;&#x4F46;&#x8FD9;&#x5728; https &#x4E2D;&#x53EF;&#x80FD;&#x4F1A;&#x5931;&#x8D25;&#xFF0C;&#x663E;&#x793A; <code>no alternative certificate subject name matches target host name &apos;127.0.0.1</code>&#x3002;</p>
<p>&#x663E;&#x7136;&#x8FD9;&#x662F;&#x7531;&#x4E8E; curl &#x5C06; <code>https://127.0.0.1</code> &#x91CC;&#x7684; <code>127.0.0.1</code> &#x800C;&#x4E0D;&#x662F; Host &#x5934;&#x7528;&#x4E8E;&#x9A8C;&#x8BC1;&#x8BC1;&#x4E66;&#x7684; subject name&#xFF0C;&#x800C;&#x8FD9;&#x4E2A; ip &#x5982;&#x679C;&#x4E0D;&#x5728;&#x8BC1;&#x4E66;&#x7684; subject names &#x4E2D;,<br>
&#x5C06;&#x4F1A;&#x5BFC;&#x81F4;&#x8BC1;&#x4E66;&#x9A8C;&#x8BC1;&#x5931;&#x8D25;&#x3002;</p>
<p>&#x4E00;&#x822C;&#x7684;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5728; <code>/etc/hosts</code> &#x6216; dnsmasq &#x7528;&#x6307;&#x5B9A; ip &#x89E3;&#x6790;&#x8FD9;&#x4E2A;&#x57DF;&#x540D;&#xFF0C;&#x4F46;&#x8FD9;&#x6539;&#x8D77;&#x6765;&#x663E;&#x793A;&#x6BD4;&#x8F83;&#x7E41;&#x7410;&#x3002;&#x8FD8;&#x597D;&#x5728; curl 7.21.3 &#x4E2D;&#xFF0C;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E2A; <code>--resolve &lt;host:port:address&gt;&apos;</code> &#x7684;<br>
&#x53C2;&#x6570;&#xFF0C;&#x8BA9;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5F88;&#x65B9;&#x4FBF;&#x5730;&#x5C06;&#x57DF;&#x540D;&#x89E3;&#x6790;&#x5230;&#x6307;&#x5B9A;&#x7684; ip &#x4E0A;&#xFF0C;&#x4F8B;&#x5982;&#x4E0A;&#x9762;&#x7684;&#x8BF7;&#x6C42;&#x53EF;&#x4EE5;&#x6539;&#x6210; <code>curl --resolve &apos;www.example.org:443:127.0.0.1&apos; https://www.example.org</code>&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[非 root 用户安装和配置 NodeJS]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x672C;&#x6587;&#x4E3B;&#x8981;&#x9488;&#x5BF9; Linux &#x975E; root &#x7528;&#x6237;&#xFF0C;&#x5728;&#x6CA1;&#x6709; root &#x6743;&#x9650;&#x4E0B;&#x5982;&#x679C;&#x5B89;&#x88C5;&#x53CA;&#x914D;&#x7F6E; NodeJS&#xFF08;&#x6CE8;&#xFF1A;&#x8FD9;&#x91CC;&#x5B89;&#x88C5;&#x7684;&#x662F;&#x5B98;&#x7F51;&#x4E0A;&#x5DF2;&#x7ECF;&#x7F16;&#x8BD1;&#x597D;&#x7684;&#x4E8C;&#x8FDB;&#x5236;&#x5305;&#xFF09;</p>]]></description><link>https://blog.mozcp.com/non-root-install-nodejs/</link><guid isPermaLink="false">5b83b0c0a9dd3f000142adb5</guid><category><![CDATA[nodejs]]></category><category><![CDATA[npm]]></category><dc:creator><![CDATA[Colin Cheng]]></dc:creator><pubDate>Sun, 10 Apr 2016 06:37:10 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x672C;&#x6587;&#x4E3B;&#x8981;&#x9488;&#x5BF9; Linux &#x975E; root &#x7528;&#x6237;&#xFF0C;&#x5728;&#x6CA1;&#x6709; root &#x6743;&#x9650;&#x4E0B;&#x5982;&#x679C;&#x5B89;&#x88C5;&#x53CA;&#x914D;&#x7F6E; NodeJS&#xFF08;&#x6CE8;&#xFF1A;&#x8FD9;&#x91CC;&#x5B89;&#x88C5;&#x7684;&#x662F;&#x5B98;&#x7F51;&#x4E0A;&#x5DF2;&#x7ECF;&#x7F16;&#x8BD1;&#x597D;&#x7684;&#x4E8C;&#x8FDB;&#x5236;&#x5305;&#xFF09;&#x3002;</p>
<p>&#x9996;&#x5148;&#x5230; NodeJS &#x7684;&#x5B98;&#x7F51;&#xFF08;<a href>https://nodejs.org/en/download/</a>&#xFF09;&#x4E0B;&#x8F7D;&#x5BF9;&#x5E94;&#x7684;&#x5DF2;&#x7ECF;&#x7F16;&#x8BD1;&#x597D;&#x7684;<br>
&#x4E8C;&#x8FDB;&#x5236;&#x5305;&#x3002;</p>
<p>&#x8FD9;&#x91CC;&#x4EE5; CentOS 6 32bit &#x4E3A;&#x4F8B;&#xFF0C;&#x5B89;&#x88C5; NodeJS &#x7684; LTS &#x7248;&#x672C;&#xFF1A;</p>
<ol>
<li>
<p>&#x4E0B;&#x8F7D; Linux Binaries 32bit &#x7248;&#x672C;&#xFF1A;</p>
<pre><code> curl -o node-v4.4.2-linux-x86.tar.xz https://nodejs.org/dist/v4.4.2/node-v4.4.2-linux-x86.tar.xz
</code></pre>
</li>
<li>
<p>&#x5C06;&#x4E0B;&#x8F7D;&#x597D;&#x7684;&#x4E8C;&#x8FDB;&#x5236;&#x538B;&#x7F29;&#x5305;&#x89E3;&#x538B;&#x81F3;&#x6307;&#x5B9A;&#x7684;&#x5B89;&#x88C5;&#x76EE;&#x5F55;&#xFF08;&#x8FD9;&#x91CC;&#x4EE5; <code>~/apps</code> &#x4E3A;&#x4F8B;&#xFF09;&#xFF1A;</p>
<pre><code> mkdir -p ~/apps
 tar -xJf node-v4.4.2-linux-x86.tar.xz --no-wildcards-match-slash --anchored \
     --exclude */CHANGELOG.md --exclude */LICENSE --exclude */README.md \
     --strip 1 -C ~/apps
</code></pre>
<p>&#x6CE8;&#xFF1A;&#x5982;&#x679C;&#x51FA;&#x9519;&#x5E76;&#x63D0;&#x793A; <code>xz: Cannot exec: No such file or directory</code>&#xFF0C;&#x53EF;&#x80FD;&#x662F;&#x672A;&#x5B89;&#x88C5; <code>xz</code> &#x89E3;&#x538B;&#x5DE5;&#x5177;&#x3002;&#x8FD9;&#x91CC;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;<br>
&#x91CD;&#x65B0;&#x4E0B;&#x8F7D; gzip &#x683C;&#x5F0F;&#x7684;&#x538B;&#x7F29;&#x5305;&#xFF08;<a href>https://nodejs.org/dist/v4.4.2/node-v4.4.2-linux-x86.tar.gz</a>&#xFF09;&#xFF0C;&#x7136;&#x540E;&#x5C06;&#x4E0A;&#x9762;<br>
&#x547D;&#x4EE4;&#x4E2D;&#x7684; <code>-xJf</code> &#x6362;&#x6210; <code>-xzf</code>&#x3002;</p>
</li>
<li>
<p>&#x7F16;&#x8F91; <code>~/.bash_profile</code> &#x6216;&#x8005; <code>~/.profile</code>&#xFF0C;&#x5C06; <code>~/apps/bin</code> &#x6DFB;&#x52A0;&#x5230;&#x73AF;&#x5883;&#x53D8;&#x91CF; <code>PATH</code> &#x4E2D;&#xFF1A;</p>
<pre><code> export PATH=&quot;${PATH}:${HOME}/apps/bin&quot;
</code></pre>
<p>&#x6CE8;1&#xFF1A;&#x5982;&#x679C;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x4E2D;&#x5DF2;&#x7ECF;&#x6709;&#x4E86; PATH &#x53D8;&#x91CF;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x5176;&#x540E;&#x9762;&#x6DFB;&#x52A0; <code>${HOME}/apps/bin</code>&#x3002;<br>
&#x6CE8;2&#xFF1A;&#x5982;&#x679C;&#x7CFB;&#x7EDF;&#x91CC;&#x5DF2;&#x7ECF;&#x5B89;&#x88C5;&#x4E86;&#x5176;&#x4ED6;&#x7248;&#x672C;&#x7684; node&#xFF0C;&#x53EF;&#x4EE5;&#x5C06; <code>${HOME}/apps/bin</code> &#x653E;&#x5728; <code>${PATH}</code> &#x7684;&#x524D;&#x9762;&#xFF0C;&#x9632;&#x6B62;&#x4F7F;&#x7528;&#x7CFB;&#x7EDF;&#x4F7F;&#x7528;&#x7684;&#x7248;&#x672C;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x9700;&#x8981;&#x5B89;&#x88C5;&#x7684;&#x7248;&#x672C;</p>
</li>
<li>
<p>&#x73B0;&#x5728;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>source ~/.bash_profile</code> &#x6216; <code>source ~/.profile</code>&#xFF08;&#x5982;&#x679C;&#x4FEE;&#x6539;&#x7684;&#x662F;&#x8FD9;&#x4E2A;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF09;&#xFF0C;&#x4F7F;&#x4E0A;&#x9762;&#x7684;&#x4FEE;&#x6539;&#x751F;&#x6548;&#x3002;<br>
&#x8FD9;&#x65F6;&#xFF0C;&#x952E;&#x5165; <code>node -v</code> &#x5982;&#x679C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x521A;&#x521A;&#x5B89;&#x88C5;&#x7684; node &#x7684;&#x7248;&#x672C;&#x53F7;&#xFF0C;&#x8868;&#x660E;&#x5DF2;&#x7ECF;&#x5B89;&#x88C5;&#x6210;&#x529F;&#x4E86;&#x3002;</p>
</li>
<li>
<p>&#x914D;&#x7F6E; npm&#xFF0C;&#x5728; shell &#x4E2D;&#x6267;&#x884C;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#xFF08;&#x5982;&#x679C;&#x8F93;&#x5165; <code>npm -v</code> &#x53EF;&#x4EE5;&#x770B;&#x5230; npm &#x7684;&#x7248;&#x672C;&#x53F7;&#xFF0C;&#x8BE5;&#x6B65;&#x9AA4;&#x53EF;&#x5FFD;&#x7565;&#xFF09;&#xFF1A;</p>
<pre><code> mkdir -p ~/apps/etc
 echo &apos;prefix = ${HOME}/apps&apos; &gt; ~/apps/etc/npmrc
</code></pre>
</li>
</ol>
<p>&#x9898;&#x5916;&#xFF1A;</p>
<p>&#x5982;&#x679C;&#x7CFB;&#x7EDF;&#x5DF2;&#x7ECF;&#x5B89;&#x88C5;&#x4E86; NodeJS&#xFF0C;&#x5728;&#x4F7F;&#x7528; npm -g &#x65F6;&#xFF0C;&#x53C8;&#x4E0D;&#x60F3;&#x4F7F;&#x7528; root &#x6743;&#x9650;&#x5C06; package &#x5B89;&#x88C5;&#x5230; /usr &#x4E0B;&#x9762;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x914D;&#x7F6E; <code>npmrc</code> &#x5230;&#x5F53;&#x524D;&#x7528;&#x6237;&#x4E0B;&#x3002;<br>
&#x4EE5;&#x5B89;&#x88C5;&#x5230; <code>~/.npm_packages</code> &#x4E0B;&#x4E3A;&#x4F8B;&#xFF1A;</p>
<p>&#x9996;&#x5148;&#x5C06;&#x4EE5;&#x4E0B;&#x5185;&#x5BB9;&#x6DFB;&#x52A0;&#x5230; <code>~/.npmrc</code> &#x4E0B;&#xFF1A;</p>
<pre><code class="language-shell">echo &apos;prefix = ${HOME}/.npm_packages&apos; &gt; ~/.npmrc
</code></pre>
<p>&#x7136;&#x540E;&#x5C06; <code>${HOME}/.npm_packages/bin</code> &#x6DFB;&#x52A0;&#x5230;&#x73AF;&#x5883;&#x53D8;&#x91CF; <code>PATH</code> &#x91CC;&#xFF08;&#x6DFB;&#x52A0;&#x65B9;&#x6CD5;&#x89C1;&#x4E0A;&#x6587;&#xFF09;&#xFF0C;&#x5F53;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#x66F4;&#x65B0;&#x540E;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>npm -g install &lt;package&gt;</code> &#x5C06;<br>
package &#x5B89;&#x88C5;&#x5230; <code>~/.npm_packages/lib</code> &#x4E0B;&#x9762;&#x4E86;&#x3002;</p>
<p>&#x53E6;&#x5916;&#x8FD9;&#x91CC;&#x63D0;&#x4F9B;&#x4E00;&#x4E2A; bash &#x811A;&#x672C;&#xFF0C;&#x53EF;&#x7528;&#x4E8E;&#x66F4;&#x65B0; NodeJS&#xFF1A;</p>
<pre><code class="language-bash">#!/usr/bin/env bash

if [[ -z &quot;$1&quot; ]]
then
    echo &quot;Usage: ./update-node-js.sh &lt;NODE_VERSION&gt; [INSTALL_DIR]&quot;
    echo &quot;Example: ./update-node-js.sh v5.10.1 ~/apps&quot;
    exit 1
fi

if [[ -z &quot;$2&quot; ]]
then
    dir=~/apps
else
    dir=$2
fi

version=$1
arch=$(uname -m)
if [[ $arch == &apos;i686&apos; || $arch == &apos;x86_64&apos; ]]
then
    arch=&apos;x64&apos;
else
    arch=&apos;x86&apos;
fi

shasum256_file=https://nodejs.org/dist/${version}/SHASUMS256.txt
url=https://nodejs.org/dist/${version}/node-${version}-linux-${arch}.tar.gz

shasum256_filename=$(basename $shasum256_file)
nodejs_filename=$(basename $url)

function cleanup {
    cd $ori
    rm -rf $tmp
}

ori=$(pwd)
tmp=$(mktemp -d)
echo &quot;Mkdir ${tmp}...&quot;
trap cleanup EXIT
echo &quot;Enter ${tmp}...&quot;
cd $tmp

echo &quot;Downloading...&quot;
curl -L $shasum256_file -o $shasum256_filename
curl -L $url -o $nodejs_filename
echo &quot;Downloaded!&quot;

echo &quot;Verifying ${nodejs_filename}...&quot;
grep $(sha256sum $nodejs_filename) $shasum256_filename 2&gt;&amp;1 1&gt;/dev/null

if [[ $? != 0 ]]
then
    echo &quot;Verify $nodejs_filename fail!&quot;
    exit 1
fi
echo &quot;Verify $nodejs_filename success!&quot;

echo &quot;Installing...&quot;
dir=~zhcp/tmp/ff
tar -xzf $nodejs_filename --no-wildcards-match-slash --anchored \
    --exclude */CHANGELOG.md --exclude */LICENSE --exclude */README.md \
    --strip 1 -C $dir
echo &quot;Install success!&quot;
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[PostgreSQL 使用笔记]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x521D;&#x59CB;&#x5316;&#x6570;&#x636E;&#x5E93;&#xFF1A;</p>
<pre><code class="language-shell">su - postgres -c &quot;initdb --locale en_US.UTF-8 -E UTF8 -D &apos;/var/lib/postgres/data&apos;&quot;
</code></pre>
<p>&#x89E3;&#x91CA;&#xFF1A;&#x4F7F;&#x7528; postgres &#x7528;&#x6237;&#x8FDB;&#x884C;&#x767B;&#x5F55;&#x5E76;&#x5207;&#x6362;&#x5230;&#x8BE5;&#x7528;&#x6237;&#x7684;&#x76EE;&#x5F55;&#xFF0C;</p>]]></description><link>https://blog.mozcp.com/postgresql-usage/</link><guid isPermaLink="false">5b83b0c0a9dd3f000142adb2</guid><category><![CDATA[postgresql]]></category><category><![CDATA[psql]]></category><category><![CDATA[pg_dump]]></category><category><![CDATA[pg_restore]]></category><dc:creator><![CDATA[Colin Cheng]]></dc:creator><pubDate>Wed, 06 Apr 2016 15:50:54 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x521D;&#x59CB;&#x5316;&#x6570;&#x636E;&#x5E93;&#xFF1A;</p>
<pre><code class="language-shell">su - postgres -c &quot;initdb --locale en_US.UTF-8 -E UTF8 -D &apos;/var/lib/postgres/data&apos;&quot;
</code></pre>
<p>&#x89E3;&#x91CA;&#xFF1A;&#x4F7F;&#x7528; postgres &#x7528;&#x6237;&#x8FDB;&#x884C;&#x767B;&#x5F55;&#x5E76;&#x5207;&#x6362;&#x5230;&#x8BE5;&#x7528;&#x6237;&#x7684;&#x76EE;&#x5F55;&#xFF0C;&#x5E76;&#x6267;&#x884C;&#x547D;&#x4EE4;&#xFF1A;<code>initdb --locale en_US.UTF-8 -E UTF8 -D &apos;/var/lib/postgres/data&apos;</code><br>
&#x5176;&#x4E2D;&#x53C2;&#x6570; <code>-D</code> &#x6307;&#x5B9A;&#x6570;&#x636E;&#x5E93;&#x5B58;&#x653E;&#x7684;&#x76EE;&#x5F55;&#xFF08;&#x6CE8;&#xFF1A;&#x5728; Arch Linux &#x4E2D;&#xFF0C;postgresql &#x9ED8;&#x8BA4;&#x7684;&#x76EE;&#x5F55;&#x4E3A; <code>/var/lib/postgres</code>&#xFF0C;&#x800C;&#x5728; CentOS &#x4E2D;&#xFF0C;&#x662F;&#x5728; <code>/var/lib/pgsql</code>&#xFF09;</p>
<p>&#x521B;&#x5EFA;&#x7528;&#x6237;/&#x89D2;&#x8272;<br>
&#x6709;&#x4E24;&#x79CD;&#x65B9;&#x5F0F;&#x521B;&#x5EFA;&#xFF0C;&#x4E00;&#x79CD;&#x662F;&#x4F7F;&#x7528; <code>createuser</code> &#x547D;&#x4EE4;&#xFF0C;&#x4E00;&#x79CD;&#x662F;&#x4F7F;&#x7528; SQL &#x8BED;&#x53E5;&#xFF1A;</p>
<pre><code class="language-shell">createuser &lt;USERNAME&gt;
</code></pre>
<pre><code class="language-sql">CREATE USER &lt;USERNAME&gt; [WITH ...];
-- &#x6216;&#x8005;
CREATE ROLE &lt;ROLENAME&gt; [WITH ...];
</code></pre>
<p>&#x5728;&#x4E0A;&#x9762;&#x7684;&#x547D;&#x4EE4;&#x4E2D;&#xFF0C;&#x4F7F;&#x7528; <code>createuser</code> &#x6216;&#x8005; <code>CREATE USER ...</code>&#xFF0C;&#x4E0E; <code>CREATE ROLE ...</code> &#x7684;&#x533A;&#x522B;&#x662F;&#xFF1A;&#x524D;&#x8005;&#x521B;&#x5EFA;&#x7684;&#x7528;&#x6237;/&#x89D2;&#x8272;&#x6709; <code>LOGIN</code> &#x6743;&#x9650;&#xFF0C;&#x800C;&#x540E;&#x8005;&#x4E3A; <code>NOLOGIN</code> &#x5373;&#x6CA1;&#x6709;&#x767B;&#x5F55;&#x7684;&#x6743;&#x9650;&#xFF08;&#x5F53;&#x7136;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x540E;&#x9762;&#x7684; WITH &#x6DFB;&#x52A0; LOGIN &#x6743;&#x9650;&#xFF09;&#x3002;</p>
<p>&#x5220;&#x9664;&#x7528;&#x6237;/&#x89D2;&#x8272;&#xFF1A;</p>
<pre><code class="language-shell">dropuser &lt;USERNAME&gt;
</code></pre>
<pre><code class="language-sql">DROP USER [IF EXISTS] &lt;USERNAME&gt;;
-- &#x6216;&#x8005;
DROP ROLE [IF EXISTS] &lt;ROLENAME&gt;;
</code></pre>
<p>&#x521B;&#x5EFA;&#x6570;&#x636E;&#x5E93;&#xFF1A;</p>
<pre><code class="language-shell">createdb &lt;DBNAME&gt;
</code></pre>
<pre><code class="language-sql">CREATE DATABASE &lt;DBNAME&gt;
</code></pre>
<p>&#x5220;&#x9664;&#x6570;&#x636E;&#x5E93;&#xFF1A;</p>
<pre><code class="language-shell">dropdb &lt;DBNAME&gt;
</code></pre>
<pre><code class="language-sql">DROP DATABASE &lt;DBNAME&gt;
</code></pre>
<p>&#x5217;&#x51FA;&#x6240;&#x6709;&#x6570;&#x636E;&#x5E93;&#xFF1A;</p>
<p>&#x4F7F;&#x7528; psql &#x767B;&#x5165;&#x540E;&#xFF0C;&#x4F7F;&#x7528;&#xFF1A;</p>
<pre><code>\l
</code></pre>
<p>mysql &#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x4EE5;&#x4E0B; SQL &#x8BED;&#x53E5;&#xFF1A;</p>
<pre><code class="language-sql">show DATABASES;
</code></pre>
<p>&#x5728; <code>psql</code> &#x91CC;&#x4F7F;&#x7528;&#xFF08;&#x8FDE;&#x63A5;&#xFF09;&#x5176;&#x4ED6;&#x7684;&#x6570;&#x636E;&#x5E93;&#xFF08;&#x7C7B;&#x4F3C; mysql &#x91CC;&#x7684; <code>use &lt;DBNAME&gt;;</code>&#xFF09;&#xFF1A;</p>
<pre><code>\c &lt;DBNAME&gt;
</code></pre>
<p>&#x4FEE;&#x6539; user/role &#x5BC6;&#x7801;&#xFF1A;</p>
<pre><code>\password [USERNAME]
</code></pre>
<p>&#x6216;&#x8005;&#xFF1A;</p>
<pre><code>ALTER ROLE XXX WITH PASSWORD &apos;XXXXXX&apos;;
</code></pre>
<p>&#x663E;&#x793A;&#x8868;&#x7684;&#x5217;&#x540D;&#xFF08;attribute&#xFF09;&#xFF1A;</p>
<pre><code>SELECT column_name, data_type, character_maximum_length
FROM INFORMATION_SCHEMA.COLUMNS where table_name = &apos;&lt;name of table&gt;&apos;;
</code></pre>
<p>&#x6216;&#x8005;&#xFF1A;</p>
<pre><code>\d+ &lt;name of table&gt;
</code></pre>
<p>&#x5176;&#x4E2D; <code>&lt;name of table&gt;</code> &#x66FF;&#x6362;&#x4E3A;&#x5177;&#x4F53;&#x9700;&#x8981;&#x67E5;&#x8BE2;&#x7684;&#x8868;&#x540D;</p>
<p>&#x5728; psql &#x4E2D;&#xFF0C;&#x5C06;&#x67E5;&#x8BE2;&#x7ED3;&#x679C;&#x590D;&#x5236;&#x5230;&#x6587;&#x4EF6;&#x4E2D;&#xFF1A;</p>
<pre><code>\copy (SELECT * FROM foo) To &apos;/tmp/test.csv&apos; WITH FORMAT csv
</code></pre>
<p>&#x53EF;&#x4EE5;&#x5C06; <code>SELECT * FROM foo</code> &#x66FF;&#x6362;&#x6210;&#x4F60;&#x9700;&#x8981;&#x67E5;&#x8BE2;&#x7684;&#x8BED;&#x53E5;&#xFF0C;<code>/tmp/test.csv</code> &#x66FF;&#x6362;&#x6210;&#x9700;&#x8981;&#x4FDD;&#x5B58;&#x7684;&#x4F4D;&#x7F6E;&#xFF0C;FORMAT &#x652F;&#x6301;&#x4E09;&#x79CD;&#xFF1A;<code>text</code>&#x3001;<code>csv</code>&#x3001;<code>binary</code></p>
<p>&#x91CD;&#x7F6E; SERIAL &#x8BA1;&#x6570;&#xFF1A;</p>
<pre><code>SELECT setval(&apos;&lt;seqname&gt;&apos;,&lt;next_value&gt;);
</code></pre>
<p>&#x5C06; <code>&lt;seqname&gt;</code> &#x66FF;&#x6362;&#x6210;&#x5177;&#x4F53;&#x7684; sequence name&#xFF0C;<code>&lt;next_value&gt;</code> &#x66FF;&#x6362;&#x6210;&#x5177;&#x4F53;&#x7684;&#x8BA1;&#x6570;&#x503C; &#xFF08;&#x6CE8;&#xFF1A;&#x5982;&#x679C; next_value &#x4E3A; 1&#xFF0C;&#x5219;&#x65B0;&#x63D2;&#x5165;&#x7684;&#x4E0B;&#x4E00;&#x4E2A;&#x503C;&#x4E3A; 2&#xFF09;</p>
<p>&#x4E5F;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>ALTER</code> &#x8BED;&#x53E5;&#xFF1A;</p>
<pre><code>ALTER SEQUENCE &lt;seqname&gt; RESTART WITH 1
</code></pre>
<p>&#x5C06; <code>&lt;seqname&gt;</code> &#x66FF;&#x6362;&#x6210;&#x5177;&#x4F53;&#x7684; sequence name</p>
<p>&#x79FB;&#x9664;&#x67D0;&#x4E2A; constraint&#xFF1A;</p>
<pre><code>ALTER TABLE &lt;table_name&gt;
DROP CONSTRAINT &lt;constraint_name&gt;;
</code></pre>
<p>SQL SELECT &#x8BED;&#x53E5;&#x7684;&#x903B;&#x8F91;&#x6267;&#x884C;&#x987A;&#x5E8F;&#xFF1A;</p>
<pre><code>FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE or WITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP
</code></pre>
<p>&#x4ECE;&#x53E6;&#x4E00;&#x4E2A;&#x8868;&#x5BFC;&#x5165;&#x6570;&#x636E;&#xFF1A;</p>
<pre><code>INSERT INTO author(original_id, name)
SELECT author_id, author_name
FROM (
    SELECT DISTINCT author_id, author_name FROM original
) AS t
ORDER BY author_id::int ASC;
</code></pre>
<p>&#x5BFC;&#x51FA;&#x6570;&#x636E;&#x5E93;&#xFF1A;</p>
<pre><code class="language-shell">pg_dump -U {USERNAME} {DBNAME} &gt; db.pgsql
</code></pre>
<p><code>pg_dump</code> &#x5BFC;&#x51FA;&#x7684;&#x6570;&#x636E;&#x9ED8;&#x8BA4;&#x5E26;&#x6709; ownership&#xFF08;&#x5373;&#x9762;&#x91CC;&#x6709;&#x4E00;&#x4E2A; ALTER &#x8BED;&#x53E5;&#x4FEE;&#x6539; table &#x7684; owner &#x4E3A;&#x539F;&#x6765;&#x6570;&#x636E;&#x5E93;&#x91CC;&#x5BF9;&#x5E94;&#x7684; user/role&#xFF09;&#xFF0C;&#x5982;&#x679C;&#x8BE5;&#x6570;&#x636E;&#x5E93;&#x7684; owner&#xFF08;user/role&#xFF09;&#x5728;&#x5BFC;&#x5165;&#x7684; postgresql &#x4E2D;&#x4E0D;&#x5B58;&#x5728;&#x65F6;&#xFF0C;&#x53EF;&#x80FD;&#x4F1A;&#x53D1;&#x751F;&#x9519;&#x8BEF;&#x3002;&#x53EF;&#x4EE5;&#x6DFB;&#x52A0; <code>--no-owner</code> &#x9009;&#x9879;&#xFF0C;&#x4F7F;&#x5BFC;&#x51FA;&#x7684;&#x6570;&#x636E;&#x4E0D;&#x5E26;&#x6709; onwership</p>
<p>&#x5BFC;&#x5165;&#x6570;&#x636E;&#x5E93;&#xFF1A;</p>
<pre><code class="language-shell">psql -U {USERNAME} {DBNAME} &lt; db.pgsql
</code></pre>
<p>&#x9ED8;&#x8BA4;&#x65F6;&#xFF0C;&#x5F53;&#x5BFC;&#x5165;&#x6570;&#x636E;&#x5E93;&#x6709;&#x9519;&#x8BEF;&#x65F6;&#xFF0C;psql &#x4F1A;&#x5FFD;&#x7565;&#x5B83;&#x5E76;&#x7EE7;&#x7EED;&#x5BFC;&#x5165;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>--set ON_ERROR_STOP=on</code> &#x9009;&#x9879;&#x6765;&#x963B;&#x6B62;&#xFF1A;</p>
<pre><code class="language-shell">psql --set ON_ERROR_STOP=on -U {USERNAME} {DBNAME} &lt; db.pgsql
</code></pre>
<p>&#x5982;&#x679C;&#x9700;&#x8981;&#x5BFC;&#x51FA;&#x6307;&#x5B9A;&#x7684;&#x8868;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>-t {TABLE_NAME}</code>&#xFF0C;&#x591A;&#x4E2A;&#x8868;&#x5C31;&#x52A0;&#x4E0A;&#x591A;&#x4E2A;&#x7684; <code>-t {TABLE_NAME}</code>&#x3002;&#x5982;&#x679C;&#x591A;&#x4E2A;&#x8868;&#x7684;&#x6570;&#x636E;&#x592A;&#x5927;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>-j N</code>&#xFF08;&#x5176;&#x4E2D; N &#x4E3A;&#x5177;&#x4F53;&#x5E76;&#x884C;&#x7684;&#x6570;&#x5B57;&#xFF09;&#x6765;&#x8FDB;&#x884C;&#x5E76;&#x884C;&#x5BFC;&#x51FA;&#xFF0C;&#x4F46;&#x8BE5;&#x53C2;&#x6570;&#x53EA;&#x80FD;&#x7528;&#x4E8E; <code>-F d</code>&#xFF0C;&#x5373;&#x5BFC;&#x51FA;&#x4E3A;&#x4E3A;&#x76EE;&#x5F55;&#xFF08;&#x91CC;&#x9762;&#x6BCF;&#x4E2A;&#x6587;&#x4EF6;&#x5BF9;&#x5E94;&#x76F8;&#x5E94;&#x7684;&#x8868;&#xFF09;&#x3002;&#x901A;&#x8FC7;&#x8BE5;&#x65B9;&#x5F0F;&#x5BFC;&#x51FA;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x9700;&#x8981;&#x4F7F;&#x7528; <code>pg_restore</code> &#x6765;&#x5BFC;&#x5165;&#x5230;&#x65B0;&#x7684;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x3002;</p>
<pre><code class="language-shell">pg_dump -t account -t author -t book_category  -t book_category_mobile -t book_img -t book_info -t book_volume -t book_chapter -U postgres -O -h localhost -p 15432 -d novel -j 8 -Fd -f db
</code></pre>
<p>&#x5BFC;&#x5165;&#xFF1A;</p>
<pre><code class="language-shell">pg_restore -U postgres -O -h localhost --role {ROLE} -p 15432 -d novel -j8 -Fd db
</code></pre>
<p>&#x5176;&#x4E2D; <code>--role {ROLE}</code> &#x53EF;&#x4EE5;&#x5728;&#x6062;&#x590D;&#x6570;&#x636E;&#x524D;&#x4F7F;&#x7528; <code>SET ROLE {ROLE}</code> &#x5C06; <code>{ROLE}</code> &#x8BBE;&#x7F6E;&#x5F53;&#x524D; session &#x7684; user id&#x3002;&#x8FD9;&#x6837;&#xFF0C;&#x5728;&#x6062;&#x590D;&#x6570;&#x636E;&#x65F6;&#x5C06;&#x4F7F;&#x7528; <code>{ROLE}</code> &#x800C;&#x4E0D;&#x662F; <code>postgres</code>&#xFF08;&#x767B;&#x5F55;&#x7528;&#x6237;&#xFF09;&#x6765;&#x64CD;&#x4F5C;&#xFF08;&#x5176;&#x6743;&#x9650;&#x4E3A; <code>{ROLE}</code> &#x6240;&#x62E5;&#x6709;&#x7684;&#xFF09;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[pg_restore: [directory archiver] could not open input file "xxx/xxx.dat": Value too large for defined data type]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x6700;&#x8FD1;&#x5C06;&#x672C;&#x5730;&#x7684;&#x4E00;&#x4E2A;&#x6570;&#x636E;&#x5E93;&#x642C;&#x5230; VPS &#x4E0A;&#xFF0C;&#x5728;&#x5BFC;&#x5165;&#x65F6;&#x51FA;&#x73B0;&#x4E86;&#x4E00;&#x4E2A;&#x201D;Value too large for defined data type&#x201C;&#x7684;&#x9519;&#x8BEF;&#x3002;&#x901A;&#x8FC7; Google &#x641C;&#x7D22;&#x540E;&#x53D1;&#x73B0;&#x6CA1;&#x6709;&#x5B9E;&#x9645;</p>]]></description><link>https://blog.mozcp.com/pg_restore-directory-archiver-could-not-open-input-file-xxx-xxx-dat-value-too-large-for-defined-data-type/</link><guid isPermaLink="false">5b83b0c0a9dd3f000142adb0</guid><category><![CDATA[postgresql]]></category><category><![CDATA[pg_restore]]></category><category><![CDATA[psql]]></category><category><![CDATA[pg_dump]]></category><category><![CDATA[centos7]]></category><dc:creator><![CDATA[Colin Cheng]]></dc:creator><pubDate>Wed, 06 Apr 2016 05:54:34 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x6700;&#x8FD1;&#x5C06;&#x672C;&#x5730;&#x7684;&#x4E00;&#x4E2A;&#x6570;&#x636E;&#x5E93;&#x642C;&#x5230; VPS &#x4E0A;&#xFF0C;&#x5728;&#x5BFC;&#x5165;&#x65F6;&#x51FA;&#x73B0;&#x4E86;&#x4E00;&#x4E2A;&#x201D;Value too large for defined data type&#x201C;&#x7684;&#x9519;&#x8BEF;&#x3002;&#x901A;&#x8FC7; Google &#x641C;&#x7D22;&#x540E;&#x53D1;&#x73B0;&#x6CA1;&#x6709;&#x5B9E;&#x9645;&#x7684;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#xFF0C;&#x4F46;&#x5927;&#x81F4;&#x4E86;&#x89E3;&#x4E86;&#x4E0B;&#xFF08;<a href>http://www.gnu.org/software/coreutils/faq/coreutils-faq.html#Value-too-large-for-defined-data-type</a>&#xFF09;&#x51FA;&#x9519;&#x7684;&#x539F;&#x56E0;&#xFF0C;&#x53EF;&#x80FD;&#x662F;&#x56E0;&#x4E3A; VPS &#x7684;&#x7CFB;&#x7EDF;&#x662F; 32bit&#xFF0C;&#x800C;&#x5176;&#x4E2D;&#x9700;&#x8981;&#x5BFC;&#x5165;&#x7684;&#x4E00;&#x4E2A; xxx.dat.gz &#x6587;&#x4EF6;&#x7684;&#x592A;&#x5927;&#x5BFC;&#x81F4;&#x7684;&#x3002;</p>
<p>&#x7531;&#x4E8E;&#x5728;&#x672C;&#x5730;&#x4F7F;&#x7528; <code>pg_dump -Fd</code> &#x6765;&#x5BFC;&#x51FA;&#xFF0C;&#x8BE5;&#x9009;&#x9879;&#x5BFC;&#x51FA;&#x4E3A;&#x6587;&#x4EF6;&#x5939;&#xFF0C;&#x5176;&#x4E2D;&#x6570;&#x636E;&#x5E93;&#x7684;&#x6BCF;&#x4E2A;&#x8868;&#x7684;&#x6570;&#x636E;&#x4E3A;&#x4E00;&#x4E2A;&#x7ECF;&#x8FC7; gzip &#x538B;&#x7F29;&#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x540E;&#x7F00;&#x4E3A; <em>.dat.gz</em>&#x3002;&#x8BE5;&#x5BFC;&#x51FA;&#x65B9;&#x5F0F;&#x4E0D;&#x80FD;&#x76F4;&#x63A5;&#x901A;&#x8FC7; <code>psql</code> &#x6765;&#x5BFC;&#x51FA;&#xFF0C;&#x800C;&#x9700;&#x8981;&#x4F7F;&#x7528; <code>pg_restore</code> &#x6765;&#x5BFC;&#x5165;&#x3002;</p>
<p>&#x7531;&#x4E8E;&#x6570;&#x636E;&#x5E93;&#x6587;&#x4EF6;&#x592A;&#x5927;&#xFF0C;&#x800C;&#x672C;&#x5730;&#x4E0A;&#x4F20;&#x5230; VPS &#x7684;&#x5E26;&#x5BBD;&#x592A;&#x5C0F;&#x4E86;&#xFF0C;&#x5982;&#x679C;&#x8981;&#x91CD;&#x65B0;&#x5BFC;&#x51FA;&#x4E3A; plain text &#x683C;&#x5F0F;&#x518D;&#x4E0A;&#x4F20;&#x6BD4;&#x8F83;&#x9EBB;&#x70E6;&#x3002;&#x4E8E;&#x662F;&#x60F3;&#x4E86;&#x4E0B;&#x53D1;&#x73B0;&#x9519;&#x8BEF;&#x7684;&#x539F;&#x56E0;&#xFF0C;&#x53EF;&#x80FD;&#x5728;&#x4E8E; <code>pg_restore</code> &#x5BFC;&#x5165;&#x65F6;&#xFF0C;&#x9700;&#x8981;&#x5BF9; gzip &#x6587;&#x4EF6;&#x8FDB;&#x884C;&#x89E3;&#x538B;&#x64CD;&#x4F5C;&#xFF0C;&#x800C;&#x7531;&#x4E8E;&#x53D7;&#x7CFB;&#x7EDF;&#xFF08;32bit&#xFF09;&#x7684;&#x9650;&#x5236;&#x800C;&#x9020;&#x6210;&#x7684;&#x3002;</p>
<p>&#x90A3;&#x80FD;&#x4E0D;&#x80FD;&#x5728;&#x5916;&#x9762;&#x4F7F;&#x7528;&#x5148;&#x89E3;&#x538B;&#x51FA;&#x6765;&#xFF0C;&#x800C; <code>pg_restore</code> &#x53C8;&#x652F;&#x6301;&#x5BFC;&#x5165;&#x5DF2;&#x89E3;&#x538B;&#x7684;&#x6587;&#x4EF6;&#xFF08;&#x6839;&#x636E;&#x5B83;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x8BFB;&#x53D6; toc.dat &#x6587;&#x4EF6;&#x63A8;&#x6D4B;&#x7684;&#xFF09;&#x5462;&#xFF1F;</p>
<p>&#x6839;&#x636E;&#x8FD9;&#x4E2A;&#x731C;&#x6D4B;&#xFF0C;&#x5148;&#x5C1D;&#x8BD5;&#x4E0B;&#x4F7F;&#x7528;&#x7CFB;&#x7EDF;&#x81EA;&#x5E26;&#x7684; <code>gnuzip</code> &#x5BF9;&#x5176;&#x8FDB;&#x884C;&#x89E3;&#x538B;&#xFF0C;&#x7136;&#x540E;&#x518D;&#x5C06;&#x89E3;&#x538B;&#x51FA;&#x6765;&#x7684;&#x6587;&#x4EF6;&#x66FF;&#x6362;&#x539F;&#x6765;&#x672A;&#x89E3;&#x538B;&#x7684;&#x6587;&#x4EF6;&#x3002;</p>
<p>&#x7ECF;&#x8FC7;&#x6D4B;&#x8BD5;&#xFF0C;&#x53D1;&#x73B0;&#x53EF;&#x4EE5;&#x6B63;&#x5E38;&#x89E3;&#x538B;&#x51FA;&#x6765;&#xFF0C;&#x5E76;&#x4E14; <code>pg_restore</code> &#x4E5F;&#x53EF;&#x4EE5;&#x8BC6;&#x522B;&#xFF08;&#x652F;&#x6301;&#xFF09;&#x89E3;&#x538B;&#x51FA;&#x6765;&#x7684;&#x6587;&#x4EF6;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[在 CentOS 中安装 postgresql]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h2 id>&#x5B89;&#x88C5;</h2>
<ol>
<li>
<p>&#x914D;&#x7F6E; YUM &#x4ED3;&#x5E93;&#xFF0C;&#x7F16;&#x8F91; <code>/etc/yum.repos.d/Centos-Base.repo</code> &#x4E2D;&#x7684; <code>[base]</code> &#x548C; <code>[updates]</code> &#x90E8;&#x5206;&#xFF0C;&#x5728;&#x8FD9;&#x4E24;&#x90E8;&#x5206;&#x4E2D;&#x6DFB;&#x52A0;&#x4EE5;&#x4E0B;&#x884C;&#xFF1A;</p>
<pre><code> exclude=postgresql*
</code></pre>
</li>
<li>
<p>&#x5B89;&#x88C5; PGDG RPM &#x6587;&#x4EF6;&#xFF0C;&#x5728; <a href>http://yum.postgresql.org</a></p></li></ol>]]></description><link>https://blog.mozcp.com/centos-install-postgresql/</link><guid isPermaLink="false">5b83b0c0a9dd3f000142adb4</guid><category><![CDATA[postgresql]]></category><category><![CDATA[centos]]></category><dc:creator><![CDATA[Colin Cheng]]></dc:creator><pubDate>Wed, 06 Apr 2016 05:51:42 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id>&#x5B89;&#x88C5;</h2>
<ol>
<li>
<p>&#x914D;&#x7F6E; YUM &#x4ED3;&#x5E93;&#xFF0C;&#x7F16;&#x8F91; <code>/etc/yum.repos.d/Centos-Base.repo</code> &#x4E2D;&#x7684; <code>[base]</code> &#x548C; <code>[updates]</code> &#x90E8;&#x5206;&#xFF0C;&#x5728;&#x8FD9;&#x4E24;&#x90E8;&#x5206;&#x4E2D;&#x6DFB;&#x52A0;&#x4EE5;&#x4E0B;&#x884C;&#xFF1A;</p>
<pre><code> exclude=postgresql*
</code></pre>
</li>
<li>
<p>&#x5B89;&#x88C5; PGDG RPM &#x6587;&#x4EF6;&#xFF0C;&#x5728; <a href>http://yum.postgresql.org</a> &#x4E2D;&#x67E5;&#x627E;&#x4F60;&#x9700;&#x8981;&#x5B89;&#x88C5;&#x7684;&#x76F8;&#x5E94;&#x7248;&#x672C;&#x7684;&#x94FE;&#x63A5;&#xFF0C;&#x7136;&#x540E;&#x8FD0;&#x884C;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x5B89;&#x88C5;&#xFF1A;</p>
<pre><code> yum localinstall https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-6-i386/pgdg-centos95-9.5-2.noarch.rpm
</code></pre>
</li>
<li>
<p>&#x5B89;&#x88C5; Postgresql</p>
<p>&#x5217;&#x51FA;&#x53EF;&#x7528;&#x7684;&#x5305;&#xFF1A;</p>
<pre><code> yum list postgres*
</code></pre>
<p>&#x5B89;&#x88C5;&#xFF1A;</p>
<pre><code> yum install postgresql95-server postgresql95
</code></pre>
</li>
</ol>
<h2 id>&#x914D;&#x7F6E;</h2>
<h3 id>&#x6570;&#x636E;&#x6587;&#x4EF6;&#x5939;</h3>
<p>PostgreSQL &#x6570;&#x636E;&#x6587;&#x4EF6;&#x5939;&#x5305;&#x542B;&#x4E86;&#x6570;&#x636E;&#x5E93;&#x6240;&#x9700;&#x7684;&#x6240;&#x6709;&#x6570;&#x636E;&#x6587;&#x4EF6;&#x3002;&#x53D8;&#x91CF; PGDATA &#x6307;&#x5411;&#x8BE5;&#x6587;&#x4EF6;&#x5939;&#x3002;<br>
&#x5728; PostgreSQL 9.0 &#x53CA;&#x4EE5;&#x4E0A;&#x7248;&#x672C;&#xFF0C;&#x9ED8;&#x8BA4;&#x7684;&#x6570;&#x636E;&#x6587;&#x4EF6;&#x5939;&#x5728;&#xFF1A;</p>
<pre><code>/var/lib/pgsql/&lt;name&gt;/data
</code></pre>
<p>&#x5982; PostgreSQL 9.5 &#x4E2D;&#xFF1A;</p>
<pre><code>/var/lib/pgsql/9.5/data
</code></pre>
<p>&#x5176;&#x4ED6;&#x7248;&#x672C;&#xFF08;7.x&#x3001;8.x&#xFF09;&#x4E2D;&#xFF0C;&#x9ED8;&#x8BA4;&#x5728;&#xFF1A;</p>
<pre><code>/var/lib/pgsql/data/
</code></pre>
<h3 id>&#x521D;&#x59CB;&#x5316;</h3>
<p>&#x4F7F;&#x7528;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#xFF08;&#x53EA;&#x9700;&#x6267;&#x884C;&#x4E00;&#x6B21;&#xFF09;&#x521D;&#x59CB;&#x5316;&#x6570;&#x636E;&#x5E93;&#xFF1A;</p>
<pre><code class="language-shell">service &lt;name&gt; initdb
</code></pre>
<p>&#x4F8B;&#x5982;&#xFF08;v9.5&#xFF09;&#xFF1A;</p>
<pre><code class="language-shell">service postgresql-9.5 initdb
</code></pre>
<p>&#x5982;&#x679C;&#x4E0A;&#x9762;&#x7684;&#x547D;&#x4EE4;&#x65E0;&#x6CD5;&#x5DE5;&#x4F5C;&#xFF0C;&#x53EF;&#x4EE5;&#x5C1D;&#x8BD5;&#x76F4;&#x63A5;&#x6267;&#x884C;&#x5B89;&#x88C5;&#x7A0B;&#x5E8F;&#xFF1A;</p>
<pre><code class="language-shell">/usr/pgsql-y.x/bin/postgresqlyx-setup initdb
</code></pre>
<p>&#x4F8B;&#x5982;&#xFF08;v9.4&#xFF09;&#xFF1A;</p>
<pre><code class="language-shell">/usr/pgsql-9.4/bin/postgresql94-setup initdb
</code></pre>
<p>&#x6CE8;&#xFF1A;postgresql 9.5 &#x7684; bin &#x76EE;&#x5F55;&#x91CC;&#x6CA1;&#x6709; postgresql95-setup&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#xFF1A;</p>
<pre><code class="language-shell">su - postgres -c &apos;/usr/pgsql-9.5/bin/initdb -D /var/lib/pgsql/9.5/data&apos;
</code></pre>
<p>&#x5982;&#x679C;&#x9700;&#x8981;&#x6307;&#x5B9A;&#x7F16;&#x7801;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;</p>
<pre><code class="language-shell">su - postgres -c &apos;/usr/pgsql-9.5/bin/initdb -D /var/lib/pgsql/9.5/data -E UTF8 --locale=en_US.UTF8&apos;
</code></pre>
<p>&#x6216;&#x6839;&#x636E; LANG &#x6765;&#x8BBE;&#x7F6E;</p>
<pre><code class="language-shell">su - postgres -c &apos;LANG=en_US.UTF8 /usr/pgsql-9.5/bin/initdb -D /var/lib/pgsql/9.5/data&apos;
</code></pre>
<h3 id>&#x542F;&#x52A8;</h3>
<p>&#x5982;&#x679C;&#x4F60;&#x60F3;&#x5728;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x542F;&#x52A8;&#x65F6;&#x81EA;&#x52A8;&#x542F;&#x52A8;&#xFF0C;&#x53EF;&#x4EE5;&#x8FD0;&#x884C;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#xFF1A;</p>
<pre><code class="language-shell">chkconfig &lt;name&gt; on
</code></pre>
<p>&#x4F8B;&#x5982;&#xFF08;v9.5&#xFF09;&#xFF1A;</p>
<pre><code>chkconfig postgresql-9.5 on
</code></pre>
<p>PS&#xFF1A;&#x5982;&#x679C;&#x4F60;&#x7684;&#x7CFB;&#x7EDF;&#x91CC;&#x6709; systemd&#xFF0C;&#x9700;&#x8981;&#x4F7F;&#x7528; <code>systemctl</code> &#x6765;&#x5F00;&#x542F;&#xFF1A;</p>
<pre><code>systemctl enable postgresql
</code></pre>
<h3 id>&#x63A7;&#x5236;&#x670D;&#x52A1;</h3>
<p>&#x5982;&#x679C;&#x9700;&#x8981;&#x63A7;&#x5236;&#x6570;&#x636E;&#x5E93;&#x670D;&#x52A1;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#xFF1A;</p>
<pre><code class="language-shell">service &lt;name&gt; &lt;command&gt;
</code></pre>
<p>&#x5176;&#x4E2D;&#xFF0C;<em><command></em>&#xFF1A;</p>
<ul>
<li>start: &#x542F;&#x52A8;&#x8BE5;&#x6570;&#x636E;&#x5E93;</li>
<li>stop: &#x505C;&#x6B62;&#x8BE5;&#x6570;&#x636E;&#x5E93;</li>
<li>restart: &#x91CD;&#x542F;&#x8BE5;&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x4E00;&#x822C;&#x7528;&#x4E8E;&#x4F7F;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x6539;&#x53D8;&#x540E;&#x91CD;&#x65B0;&#x751F;&#x6548;</li>
<li>reload: &#x91CD;&#x65B0;&#x8BFB;&#x53D6; pg_hba.conf &#x6587;&#x4EF6;&#xFF08;&#x4E0D;&#x505C;&#x6B62;&#x8BE5;&#x6570;&#x636E;&#x5E93;&#x7684;&#x8FD0;&#x884C;&#xFF09;</li>
</ul>
<p>&#x4F8B;&#x5982;&#xFF0C;&#x542F;&#x52A8; v9.5&#xFF1A;</p>
<pre><code class="language-shell">service postgresql-9.5 start
</code></pre>
<p>&#x5982;&#x679C;&#x4F7F;&#x7528; systemd&#xFF0C;&#x4F7F;&#x7528;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x66FF;&#x4EE3;&#xFF1A;</p>
<pre><code class="language-shell">systemctl enable postgresql-9.5.service
systemctl start postgresql-9.5.service
systemctl reload postgresql-9.5.service
systemctl reload-or-restart postgresql-9.5.service
systemctl restart postgresql-9.5.service
</code></pre>
<h2 id>&#x5378;&#x8F7D;</h2>
<p>&#x5168;&#x90E8;&#x5378;&#x8F7D;&#xFF1A;</p>
<pre><code class="language-shell">yum erase postgresql95*
</code></pre>
<p>&#x7FFB;&#x8BD1;(&#x4E0D;&#x5B8C;&#x6574;&#xFF09;&#x81EA;&#xFF1A;<a href>https://wiki.postgresql.org/wiki/YUM_Installation</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[获取鼠标在 canvas 中的位置]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h2 id>&#x4E00;&#x822C;&#x60C5;&#x51B5;</h2>
<p>&#x4E00;&#x822C;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x5982;&#x679C;&#x9700;&#x8981;&#x5728; canvas &#x4E2D;&#x83B7;&#x53D6;&#x9F20;&#x6807;&#x6307;&#x9488;&#x5750;&#x6807;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x76D1;&#x542C;&#x9F20;&#x6807;&#x7684; <code>mousemove</code>&#xFF08;&#x5982;&#x679C;&#x53EA;&#x9700;&#x5355;&#x51FB;&#x65F6;&#x7684;&#x5750;&#x6807;&#xFF0C;&#x53EF;&#x4EE5;</p>]]></description><link>https://blog.mozcp.com/get-mouse-position-in-canvas/</link><guid isPermaLink="false">5b83b0c0a9dd3f000142adae</guid><category><![CDATA[canvas]]></category><dc:creator><![CDATA[Colin Cheng]]></dc:creator><pubDate>Wed, 06 Apr 2016 05:36:33 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id>&#x4E00;&#x822C;&#x60C5;&#x51B5;</h2>
<p>&#x4E00;&#x822C;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x5982;&#x679C;&#x9700;&#x8981;&#x5728; canvas &#x4E2D;&#x83B7;&#x53D6;&#x9F20;&#x6807;&#x6307;&#x9488;&#x5750;&#x6807;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x76D1;&#x542C;&#x9F20;&#x6807;&#x7684; <code>mousemove</code>&#xFF08;&#x5982;&#x679C;&#x53EA;&#x9700;&#x5355;&#x51FB;&#x65F6;&#x7684;&#x5750;&#x6807;&#xFF0C;&#x53EF;&#x4EE5;&#x7528; <code>click</code>&#xFF09;&#x4E8B;&#x4EF6;&#x3002;<br>
&#x5F53;&#x4E8B;&#x4EF6;&#x88AB;&#x89E6;&#x53D1;&#x65F6;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x83B7;&#x53D6;&#x9F20;&#x6807;&#x76F8;&#x5BF9;&#x4E8E; viewport &#x7684;&#x5750;&#x6807;&#xFF08;<code>event.clientX</code>, <code>event.clientY</code>&#xFF09;&#x3002;<br>
&#x540C;&#x65F6;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; canvas.getBoundingClientRect() &#x6765;&#x83B7;&#x53D6; canvas &#x76F8;&#x5BF9;&#x4E8E; viewport &#x7684;&#x5750;&#x6807;&#xFF0C;&#x8FD9;&#x6837;&#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x8BA1;&#x7B97;&#x51FA;&#x9F20;&#x6807;&#x5728; canvas &#x4E2D;&#x7684;&#x5750;&#x6807;&#x3002;</p>
<pre><code class="language-javascript">canvas.addEventListener(&quot;click&quot;, function __handler__(evt) {
    var x = evt.clientX;
    var y = evt.clientY;
    var rect = canvas.getBoundingClientRect();
    x -= rect.left;
    y -= rect.top;
    console.log(x, y); // (x, y) &#x5C31;&#x662F;&#x9F20;&#x6807;&#x5728; canvas &#x5355;&#x51FB;&#x65F6;&#x7684;&#x5750;&#x6807;
});
</code></pre>
<p>** <a href="https://live-demo.github.io/getting-mouse-position-in-canvas/t1.html">DEMO-1</a> **</p>
<h2 id="borderpadding">&#x8BBE;&#x7F6E;&#x4E86; border/padding</h2>
<p>&#x4E00;&#x822C;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x6211;&#x4EEC;&#x6839;&#x636E;&#x4E0A;&#x9762;&#x7684;&#x65B9;&#x6CD5;&#x83B7;&#x53D6;&#x51FA;&#x6765;&#x7684;&#x5750;&#x6807;&#x662F;&#x51C6;&#x786E;&#x7684;&#xFF0C;&#x4F46;&#x5F53;&#x6211;&#x4EEC;&#x5728; canvas &#x4E0A;&#x6DFB;&#x52A0;&#x4E86; border &#x6216; padding &#x540E;&#xFF0C;&#x5750;&#x6807;&#x5C31;&#x51FA;&#x73B0;&#x4E86;&#x504F;&#x79FB;&#x3002;</p>
<p>** <a href="res/getting-mouse-position-in-canvas/t2-0.html">DEMO-2-0</a> **</p>
<p>&#x8FD9;&#x662F;&#x56E0;&#x4E3A;&#x5728; canvas &#x4E2D;&#xFF0C;&#x5750;&#x6807;&#x533A;&#x57DF;&#x662F; canvas &#x5143;&#x7D20;&#x7684; content &#x533A;&#x57DF;&#xFF0C;&#x4E0D;&#x5305;&#x62EC; border &#x548C; padding&#xFF0C;&#x800C;&#x901A;&#x8FC7;&#x4E0A;&#x9762;&#x5F97;&#x5230;&#x7684;&#x5750;&#x6807;&#x539F;&#x70B9;&#x5728; canvas &#x7684; border &#x5F00;&#x59CB;&#x7684;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x8FD9;&#x91CC;&#x8FD8;&#x9700;&#x8981;&#x51CF;&#x53BB; border &#x548C; padding&#x3002;</p>
<pre><code class="language-javascript">var style = window.getComputedStyle(canvas, null);
var borderLeft = parseFloat(style[&quot;border-left-width&quot;]);
var borderTop = parseFloat(style[&quot;border-top-width&quot;]);
var paddingLeft = parseFloat(style[&quot;padding-left&quot;]);
var paddingTop = parseFloat(style[&quot;padding-top&quot;]);
canvas.addEventListener(&quot;click&quot;, function __handler__(evt) {
    var x = evt.clientX;
    var y = evt.clientY;
    var rect = canvas.getBoundingClientRect();
    x -= rect.left - borderLeft - paddingLeft; // &#x53BB;&#x9664; borderLeft paddingLeft &#x540E;&#x7684;&#x5750;&#x6807;
    y -= rect.top - borderTop - paddingTop; // &#x53BB;&#x9664; borderLeft paddingLeft &#x540E;&#x7684;&#x5750;&#x6807;
    console.log(x, y); // (x, y) &#x5C31;&#x662F;&#x9F20;&#x6807;&#x5728; canvas &#x5355;&#x51FB;&#x65F6;&#x7684;&#x5750;&#x6807;
});
</code></pre>
<p>** <a href="https://live-demo.github.io/getting-mouse-position-in-canvas/t2-1.html">DEMO-2-1</a> **</p>
<h2 id="csswidthheight">&#x8BBE;&#x7F6E;&#x4E86; css width/height</h2>
<p>&#x5F53;&#x5728; canvas &#x4E0A;&#x8BBE;&#x7F6E;&#x4E86; css &#x7684; width&#x3001;height&#xFF0C;&#x5E76;&#x4E14;&#x4E0E; canvas &#x7684; width&#x3001;height &#x5C5E;&#x6027;&#x4E0D;&#x540C;&#x65F6;&#xFF08;&#x53EF;&#x4EE5;&#x975E;&#x5E38;&#x7B80;&#x5355;&#x5BF9; canvas &#x8FDB;&#x884C;&#x653E;&#x5927;&#x6216;&#x7F29;&#x5C0F;&#xFF0C;&#x5728;&#x79FB;&#x52A8;&#x9875;&#x9762;&#x4E0A;&#x5E38;&#x5E38;&#x4F1A;&#x4F7F;&#x7528;&#xFF09;&#x3002;&#x4ECE;&#x4E0A;&#x9762;&#x8BA1;&#x7B97;&#x51FA;&#x6765;&#x7684;&#x5750;&#x6807;&#x5728; canvas &#x91CC;&#x4F7F;&#x7528;&#x53C8;&#x4F1A;&#x51FA;&#x73B0;&#x504F;&#x79FB;&#x3002;</p>
<p>** <a href="https://live-demo.github.io/getting-mouse-position-in-canvas/t3-0.html">DEMO-3-0</a> **</p>
<p>&#x8FD9;&#x91CC;&#x5C31;&#x9700;&#x8981;&#x5BF9;&#x5750;&#x6807;&#x8FDB;&#x884C;&#x4FEE;&#x6B63;&#xFF1A;</p>
<pre><code class="language-javascript">var style = window.getComputedStyle(canvas, null);
var cssWidth = parseFloat(style[&quot;width&quot;]);
var cssHeight = parseFloat(style[&quot;height&quot;]);
var scaleX = canvas.width / cssWidth; // &#x6C34;&#x5E73;&#x65B9;&#x5411;&#x7684;&#x7F29;&#x653E;&#x56E0;&#x5B50;
var scaleY = canvas.height / cssHeight; // &#x5782;&#x76F4;&#x65B9;&#x5411;&#x7684;&#x7F29;&#x653E;&#x56E0;&#x5B50;
canvas.addEventListener(&quot;click&quot;, function __handler__(evt) {
    var x = evt.clientX;
    var y = evt.clientY;
    var rect = canvas.getBoundingClientRect();
    x -= rect.left;
    y -= rect.top;
    x *= scaleX; // &#x4FEE;&#x6B63;&#x6C34;&#x5E73;&#x65B9;&#x5411;&#x7684;&#x5750;&#x6807;
    y *= scaleY; // &#x4FEE;&#x6B63;&#x5782;&#x76F4;&#x65B9;&#x5411;&#x7684;&#x5750;&#x6807;
    console.log(x, y); // (x, y) canvas &#x91CC;&#x7684;&#x5750;&#x6807;
});
</code></pre>
<p>** <a href="https://live-demo.github.io/getting-mouse-position-in-canvas/t3-1.html">DEMO-3-1</a> **</p>
<h2 id="transform">&#x8BBE;&#x7F6E;&#x4E86; transform</h2>
<p>&#x5982;&#x679C;&#x6211;&#x4EEC;&#x5728; canvas &#x7684; style &#x4E0A;&#x6DFB;&#x52A0;&#x4E86; transform&#xFF0C;&#x53C8;&#x6709;&#x53EF;&#x80FD;&#x4F1A;&#x5BFC;&#x81F4;&#x4E0A;&#x9762;&#x8BA1;&#x7B97;&#x51FA;&#x6765;&#x7684;&#x5750;&#x6807;&#x51FA;&#x73B0;&#x504F;&#x79FB;&#x3002;</p>
<p>** <a href="https://live-demo.github.io/getting-mouse-position-in-canvas/t4-0.html">DEMO-4-0</a> **</p>
<p>&#x800C;&#x4E14;&#x7ECF;&#x8FC7; transform &#x540E;&#x5F88;&#x96BE;&#x901A;&#x8FC7;&#x5DF2;&#x7ECF;&#x7684; API &#x6765;&#x8BA1;&#x7B97;&#x51FA;&#x51C6;&#x786E;&#x7684;&#x5750;&#x6807;&#xFF1F;w3c &#x4E3A;&#x4E86;&#x89E3;&#x51B3;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x5728; CSSOM-View &#x4E2D;&#x6DFB;&#x52A0;&#x4E86;&#x4E00;&#x4E2A;&#x540D;&#x4E3A; <a href="http://dev.w3.org/csswg/cssom-view/#the-geometryutils-interface">GeometryUtils</a> &#x7684;&#x63A5;&#x53E3;&#xFF0C;&#x8BE5;&#x63A5;&#x53E3;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x7CFB;&#x5217;&#x7684; api &#x5E2E;&#x52A9;&#x6211;&#x4EEC;&#x5BF9;&#x9875;&#x9762;&#x4E0A;&#x7684;&#x70B9;&#x3001;&#x77E9;&#x5F62;&#x3001;&#x56DB;&#x8FB9;&#x5F62;&#x7B49;&#x7684;&#x5750;&#x6807;&#x8FDB;&#x884C;&#x8F6C;&#x6362;&#xFF08;&#x76EE;&#x524D;&#x53EA;&#x6709; Firefox &#x652F;&#x6301;&#xFF09;&#x3002;<br>
&#x8FD9;&#x91CC;&#x6211;&#x4EEC;&#x4F7F;&#x7528;&#x5176;&#x4E2D;&#x7684; <code>convertPointFromNode</code> &#x65B9;&#x6CD5;&#xFF0C;&#x76F4;&#x63A5;&#x628A;&#x5728; viewport &#x7684;&#x5750;&#x6807; <code>(evt.clientX, evt.clientY)</code> &#x8F6C;&#x6362;&#x6210;&#x76F8;&#x5BF9;&#x4E8E; canvas &#x5143;&#x7D20;&#x7684;&#x5750;&#x6807;&#x3002;<br>
&#x5982;&#x679C; canvas &#x540C;&#x65F6;&#x8BBE;&#x7F6E;&#x4E86;&#x6837;&#x5F0F; <code>width&#x3001;height&#x3001;box-sizing</code>&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>getBoxQuads</code> &#x65B9;&#x6CD5;&#x6765;&#x83B7;&#x53D6; canvas &#x7ECF;&#x8FC7; transform &#x4E4B;&#x524D;&#x7684;&#x5143;&#x7D20;&#x7684; <code>width</code> &#x548C; <code>height</code>&#xFF08;&#x867D;&#x7136;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x901A;&#x8FC7;&#x83B7;&#x53D6; style &#x7684;&#x76F8;&#x5173;&#x5C5E;&#x6027;&#x6765;&#x8BA1;&#x7B97;&#xFF0C;&#x4F46;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x592A;&#x9EBB;&#x70E6;&#x4E86;&#xFF09;&#x6765;&#x8BA1;&#x7B97;&#x51FA;&#x7ECF;&#x8FC7; css &#x7F29;&#x653E;&#x7684;&#x56E0;&#x5B50;&#x3002;</p>
<pre><code class="language-javascript">var quads = canvas.getBoxQuads({
    box: &quot;content&quot;,
    relativeTo: canvas
});
var bounds = quads[0];
var scaleX = canvas.width / bounds.width;
var scaleY = canvas.height / bounds.height;
canvas.addEventListener(&quot;click&quot;, function __handler__(evt) {
    var {x, y} = canvas.convertPointFromNode({
        x: evt.clientX,
        y: evt.clientY
    }, document, {
        toBox: &quot;content&quot;
    });
    x *= scaleX;
    y *= scaleY;
    console.log(x, y);
});
</code></pre>
<p>** <a href="https://live-demo.github.io/getting-mouse-position-in-canvas/t4-1.html">DEMO-4-1</a> **</p>
<p>&#x5728;&#x6587;&#x7AE0;&#x7684;&#x6700;&#x540E;&#xFF0C;&#x8D34;&#x4E0A;&#x53E6;&#x4E00;&#x79CD;&#x65B9;&#x6CD5;&#x7684;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#xFF1A;</p>
<p>** <a href="https://live-demo.github.io/getting-mouse-position-in-canvas/t4-2.html">DEMO-4-2</a> **</p>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>