<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>服务器 on Colinx Blog</title>
    
    
    
    <link>/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/</link>
    <description>Recent content in 服务器 on Colinx Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 22 Feb 2021 00:00:00 +0000</lastBuildDate>
    
	<atom:link href="/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Minecraft 上云笔记 - MC 自定义皮肤并支持联机</title>
      <link>/posts/minecraft%E4%B8%8A%E4%BA%91%E7%AC%94%E8%AE%B0-mc%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%AE%E8%82%A4%E5%B9%B6%E6%94%AF%E6%8C%81%E8%81%94%E6%9C%BA/</link>
      <pubDate>Mon, 22 Feb 2021 00:00:00 +0000</pubDate>
      
      <guid>/posts/minecraft%E4%B8%8A%E4%BA%91%E7%AC%94%E8%AE%B0-mc%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%AE%E8%82%A4%E5%B9%B6%E6%94%AF%E6%8C%81%E8%81%94%E6%9C%BA/</guid>
      <description>
        
          
          
          
        
        
        &lt;!-- # Minecraft 上云笔记 - MC 自定义皮肤并支持联机 --&gt;

&lt;p&gt;方案概述：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;仪表盘 - 红石皮肤站
&lt;a href=&#34;https://mcskin.cn/user&#34;&gt;https://mcskin.cn/user&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[CSL] 万用皮肤补丁 (CustomSkinLoader) - MC 百科 | 最大的 Minecraft 中文 MOD 百科
&lt;a href=&#34;https://www.mcmod.cn/class/883.html&#34;&gt;https://www.mcmod.cn/class/883.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;全员安装皮肤 mod，即可保证所有人都可以看见对方的皮肤&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;使用：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;安装好 forge&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;安装好皮肤补丁的 mod&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;启动一次 MC，让他自动生成配置文件&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;在皮肤站注册，并建立与游戏中角色名字相同的角色并设定皮肤&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;修改&lt;code&gt;&amp;quot;.minecraft\CustomSkinLoader\CustomSkinLoader.json&amp;quot;&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-json&#34;&gt;{
 &amp;quot;version&amp;quot;: &amp;quot;14.12&amp;quot;,
 &amp;quot;loadlist&amp;quot;: [
   {
     &amp;quot;name&amp;quot;: &amp;quot;红石皮肤站&amp;quot;,
     &amp;quot;root&amp;quot;: &amp;quot;https://mcskin.cn/csl/&amp;quot;,
     &amp;quot;type&amp;quot;: &amp;quot;CustomSkinAPI&amp;quot;
   },
   {
     &amp;quot;name&amp;quot;: &amp;quot;Mojang&amp;quot;,
     &amp;quot;type&amp;quot;: &amp;quot;MojangAPI&amp;quot;
   },
......
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：&lt;/p&gt;

&lt;p&gt;自定义皮肤站最好排在 Mojang API 的前面，不然的话如果有正版用户起的角色名字和你的一样，就会默认载入他的皮肤（巨坑 +1）&lt;/p&gt;
&lt;/blockquote&gt;

        
        </description>
    </item>
    
    <item>
      <title>Minecraft 上云笔记 - MC 服务器快速搭建&amp;MOD 推荐&amp;性能优化</title>
      <link>/posts/minecraft%E4%B8%8A%E4%BA%91%E7%AC%94%E8%AE%B0-mc%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BAmod%E6%8E%A8%E8%8D%90%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/</link>
      <pubDate>Sun, 07 Feb 2021 00:00:00 +0000</pubDate>
      
      <guid>/posts/minecraft%E4%B8%8A%E4%BA%91%E7%AC%94%E8%AE%B0-mc%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BAmod%E6%8E%A8%E8%8D%90%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/</guid>
      <description>
        
          
          
          
        
        
        

&lt;!-- # Minecraft 上云笔记 - MC 服务器快速搭建&amp;MOD 推荐&amp;性能优化 --&gt;

&lt;blockquote&gt;
&lt;p&gt;MC 快速上云，学生机轻松带动，三五好友，畅快联机&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#34;前言-踩坑&#34;&gt;前言&amp;amp;踩坑&lt;/h2&gt;

&lt;p&gt;距离上一次玩 MC 已有四年之久，上次玩的时候还用的是家里的老爷机，连独显都没有，玩个整合包都费劲。如今设备早已更新换代，B 站不少做 MC 的 UP 主的内容挺有趣，于是尝试重新拾起 MC。&lt;/p&gt;

&lt;p&gt;手机端国内只有网易代理，APP 卡顿严重，生态封闭，体验奇差。安卓下载的国际服倒是还不错，不过身为基岩版，与 Java 版的生态并不相通。Github 上找到了可以让基岩版进 Java 版服务器的轮子，不过手机端连接服务器又是一个麻烦事。连接远程服务器又需要登录 Xbox，但是登上了连接的时候又出现奇怪的问题。&lt;/p&gt;

&lt;p&gt;贴吧有人给出解决方案，搭建 VPN，形成局域网，那样服务器会被视为局域网内开放的 MC 服务端。但天朝政策收紧，搭建 PPTP、L2TP 等隧道均未果，严重怀疑云服务商干扰了对应服务的端口。几番权衡决定投归 PC 端的 Java 版，生态丰富而且可以充分利用好硬件性能。&lt;/p&gt;

&lt;h2 id=&#34;mc-服务器快速搭建&#34;&gt;MC 服务器快速搭建&lt;/h2&gt;

&lt;h3 id=&#34;mc-服务端选择&#34;&gt;MC 服务端选择&lt;/h3&gt;

&lt;p&gt;物色了很多 MC 服务端，但看了下主要可用且被应用广泛的就两类，&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Spigot、PaperSpigot 这类加装插件的&lt;/li&gt;
&lt;li&gt;SpongeForge 这类可以加装 Mod 的&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;前者生态目测更丰富些，MCBBS 上的开服板块大部分都是 PaperSpigot 搭建的。但是好像都是那种几十上百人的公用服务器，什么权限控制、小游戏、防作弊的插件居多，而我只是想要一个能够装 Mod 的可以供三五好友方便联机的服务器。我的选择是后者&lt;/p&gt;

&lt;h3 id=&#34;mc-服务器快速搭建-1&#34;&gt;MC 服务器快速搭建&lt;/h3&gt;

&lt;p&gt;搭建方案千千万，不过 Docker 来的最实在。Github 找到一个非常方便的镜像，&lt;a href=&#34;https://github.com/itzg/docker-minecraft-server&#34;&gt;itzg/minecraft-server&lt;/a&gt;。这个镜像是运行时构建的，会根据指定的环境变量下载和安装对应的 MC 服务端程序。支持的服务端有 Bukkit、Spigot、PaperSpigot、SpongeForge 等等，MC 的版本和各项参数均支持通过环境变量自定义，非常方便。而且可以通过更换不同的 Tag 来使用不同的 JDK 版本，从 8 到 15，Hotspot 和 OpenJ9 都有，可以按需选用。有 arm 版本，树莓派也可食用。&lt;/p&gt;

&lt;p&gt;安装 Docker 和 docker-compose 后，可以方便地编写脚本来快速启动一个 MC 服务器。这里放上我的&lt;code&gt;docker-compose.yml&lt;/code&gt;文件&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;version: &amp;quot;3&amp;quot;
# Forge with Sponge API support. THIS REQUIRES DOWNLOADING SPONGEFORGE.
# Place the SpongeForge jar file in /data/mods. Other Forge mods go here as well.
# Place Sponge mods in /data/mods/plugins. Yes, this is a directory inside the Forge mod directory. Do NOT use /data/plugins.

services:
  minecraft:
    image: itzg/minecraft-server
    container_name: &amp;quot;MCServer&amp;quot;
    ports:
      - &amp;quot;25565:25565&amp;quot;
    volumes:
      - &amp;quot;mc:/data&amp;quot; # 主要数据，包括存档数据等
      - &amp;quot;~/.minecraft/forgemods/:/data/mods/&amp;quot; #Forge Mod 位置
      # - &amp;quot;~/.minecraft/sponegemods/:/data/mods/plugins&amp;quot;
      - &amp;quot;~/.minecraft/tmp/:/tmp&amp;quot; # Forge 下载失败可以自己放进去
      - /etc/timezone:/etc/timezone:ro #绑定本机的时区，方便看日志
    environment:
      SERVER_NAME: &amp;quot;MCServer&amp;quot;
      EULA: &amp;quot;TRUE&amp;quot;
      VERSION: &amp;quot;1.12.2&amp;quot; #(Ensure this is compatbile with the version of SpongeForge you are using!)
      TYPE: &amp;quot;FORGE&amp;quot; # 这里以 SpongeForge 的服务端为例，其他服务端也支持
      FORGEVERSION: &amp;quot;RECOMMENDED&amp;quot;
      # FORGEVERSION: &amp;quot;14.23.5.2854&amp;quot;
      CONSOLE: &amp;quot;false&amp;quot;
      ENABLE_RCON: &amp;quot;true&amp;quot;
      RCON_PASSWORD: &amp;quot;mcserver&amp;quot;
      RCON_PORT: 28016
      INIT_MEMORY: 512M
      MAX_MEMORY: 1536M # 内存根据实际需要修改
      OVERRIDE_SERVER_PROPERTIES: &amp;quot;true&amp;quot; 
      SNOOPER_ENABLED: &amp;quot;false&amp;quot; # 统计数据
      VIEW_DISTANCE: 8 #加载区块范围，默认 10，建议 4~8
      SEED: &amp;quot;-505794890&amp;quot; # 初始生成世界的种子
      PVP: &amp;quot;true&amp;quot;
      ONLINE_MODE: &amp;quot;FALSE&amp;quot; #正版校验开关
      ALLOW_FLIGHT: &amp;quot;FALSE&amp;quot; 
      USE_AIKAR_FLAGS: &amp;quot;false&amp;quot; # 一些优化
      RESOURCE_PACK: &amp;quot;https://blog-1301127393.file.myqcloud.com/MC/Distribution/VNR-1.0.1.zip&amp;quot; # 我自己会用的资源包，这里填 url
      NETWORK_COMPRESSION_THRESHOLD: 512 # 网络优化
    restart: unless-stopped
  rcon:
    image: itzg/rcon  # 服务器远程管理面板，具体使用自行百度
    container_name: &amp;quot;RCON&amp;quot;
    depends_on:
      - minecraft
    ports: #这两个端口都需要防火墙放行
      - &amp;quot;3000:4326&amp;quot; # Web UI
      - &amp;quot;4327:4327&amp;quot; # Connection from Web UI
    volumes:
      - &amp;quot;rcon:/opt/rcon-web-admin/db&amp;quot;
      - /etc/timezone:/etc/timezone:ro
    environment:
      RWA_ENV: &amp;quot;TRUE&amp;quot;
      RWA_ADMIN: &amp;quot;TRUE&amp;quot;
      RWA_PASSWORD: &amp;quot;mcadmin&amp;quot;
      RWA_RCON_HOST: &amp;quot;MCServer&amp;quot;
      RWA_RCON_PASSWORD: &amp;quot;mcserver&amp;quot; # RCON server to control
      RWA_RCON_PORT: 28016
    restart: unless-stopped

volumes:
  mc:
  rcon:

&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;环境变量可以设置的地方非常多，可以到项目主页的 README 查看。&lt;a href=&#34;https://github.com/itzg/docker-minecraft-server&#34;&gt;https://github.com/itzg/docker-minecraft-server&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker-compose up -d&lt;/code&gt; 启动，第一次启动他会下载 MC、下载 MC 服务端、初始化世界。之后就可以在 MC 客户端连接了。（启动完毕就测试一下，测试没问题再进行后面安装 mod、服务器调优（按需）的步骤！）&lt;/p&gt;

&lt;h2 id=&#34;mc-客户端安装&#34;&gt;MC 客户端安装&lt;/h2&gt;

&lt;h3 id=&#34;mc-启动器选择&#34;&gt;MC 启动器选择&lt;/h3&gt;

&lt;p&gt;（正版玩家略过，现在貌似正版购买的只支持官方启动器）&lt;/p&gt;

&lt;p&gt;对于服务器选择，MCBBS 有一篇讲的挺详细，可以到这里挑选：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;我的世界 Minecraft Java 版 下载指南 | 文件结构说明 | 推荐启动器 - 软件资源 - Minecraft(我的世界) 中文论坛 -
&lt;a href=&#34;https://www.mcbbs.net/forum.php?mod=viewthread&amp;amp;tid=38297&amp;amp;page=1#pid547821&#34;&gt;https://www.mcbbs.net/forum.php?mod=viewthread&amp;amp;tid=38297&amp;amp;page=1#pid547821&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;我推荐的启动器：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HMCL&lt;/strong&gt;（力荐！跨平台、颜值高、功能完备，不过需要先装 Java)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BMCL&lt;/strong&gt;（次推荐，颜值略低，基于.Net，功能完备）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;我不推荐的启动器：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nsiso&lt;/strong&gt; （页面倒是做的漂亮，但是我装完 mod 启动竟然启动不了，兼容性或者说功能完备性欠缺，不知道后续版本如何。当时出问题之后我换 HMCL 就可以完美启动）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;上一张 HMCL 的主页的图：&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205913.png&#34; alt=&#34;image-20210129172401421&#34; /&gt;&lt;/p&gt;

&lt;p&gt;其他没有使用过的启动器暂时不予评价。&lt;/p&gt;

&lt;h3 id=&#34;mc-本体安装&#34;&gt;MC 本体安装&lt;/h3&gt;

&lt;p&gt;（正版玩家略过、整合包玩家略过）&lt;/p&gt;

&lt;p&gt;推荐方式为启动器内安装，还可以顺带把 Forge 和 OptiFine 也安装了。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Forge：安装第三方 Mod 需要&lt;/li&gt;
&lt;li&gt;OptiFine：游戏显示调优，有些光影会需要。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;版本选择的话，我的选择是 1.12.2。目前 Mod 支持比较完备，生态也很丰富。很多 Mod 最高只支持 1.12.2，目测是后面官方更新了 API 啥的。当然倾向于原版的同学可以选择更新的 1.16，后面的版本有很多有意思的更新。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;踩坑笔记&lt;/strong&gt;：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;这些启动器大多带有三个下载源：官方服务器、MCBBS 镜像和 BMCL 镜像。不过我当时安装的时候 BMCL 的镜像抽风了，下载一直没进度。建议选择 MCBBS 的源（虽然可能部分内容更新没有很勤）&lt;/li&gt;
&lt;li&gt;通过启动器自动安装 OptiFine 的时候一直报错，换版本也是一样。后来的解决方案是选择窗口上方的【从本地文件安装/升级】&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#34;mod-推荐&#34;&gt;Mod 推荐&lt;/h2&gt;

&lt;p&gt;针对我实际使用和测试的情况做一些推荐。下文所有 Mod 均在 1.12.2 下测试并实际使用过，兼容性良好。&lt;/p&gt;

&lt;h3 id=&#34;功能增强型-mod-客户端必装&#34;&gt;功能增强型 Mod（客户端必装）&lt;/h3&gt;

&lt;p&gt;这部分 Mod 主要是部分音效和部分不涉及多人游戏的功能的增强，可以随意安装，装不装都不影响好友联机与进服务器。&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mod 名称&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DynamicSurroundings&lt;/td&gt;
&lt;td&gt;动态环境音效，比如草地有蟋蟀的声音，夜晚有狼的声音，使游戏很有沉浸感&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;SoundFilters&lt;/td&gt;
&lt;td&gt;环绕音效，使得 MC 里所有的声音更真实，比如矿洞里的脚步声会有回音，房子里面听外面的声音会更小等等&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;BetterHUD&lt;/td&gt;
&lt;td&gt;加强版的 HUD 信息显示，比如方位信息、坐标信息、时间信息、人物护甲、健康状态信息等等很多功能，而且可自定义程度也很高。&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;JEI&lt;/td&gt;
&lt;td&gt;可以方便地查看物品的合成表，一般整合包必备的插件&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;JustEnoughCharacters&lt;/td&gt;
&lt;td&gt;JEI 的扩展，支持按拼音、简拼搜索物品&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;Journeymap&lt;/td&gt;
&lt;td&gt;旅行地图，貌似已经停更，但是功能上没有什么欠缺。支持小地图显示、快速传送等。也是一般整合包必备的插件&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;InventoryTweaks&lt;/td&gt;
&lt;td&gt;按 R 键整理背包&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&#34;功能增强型-mod-服务端-客户端都必装&#34;&gt;功能增强型 Mod（服务端&amp;amp;客户端都必装）&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mod 名称&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FTB-Ultimine&lt;/td&gt;
&lt;td&gt;超级挖掘，挖矿、清理场地好帮手&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;Doubledoors&lt;/td&gt;
&lt;td&gt;双开门可以一键开关，不用挨个点击开关啦&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;OpenGlider&lt;/td&gt;
&lt;td&gt;滑翔翼，经济实用的交通工具&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;Quark&lt;/td&gt;
&lt;td&gt;对原版 MC 的很多地方进行了一些加强，我最喜欢的是他增加了纸墙和纸灯笼这类物品，可以建造一些日系的建筑（文末有图）&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;KeepingInventory&lt;/td&gt;
&lt;td&gt;死亡不掉落，不解释，小白福音&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&#34;内容增强型-mod-服务端-客户端都必装&#34;&gt;内容增强型 Mod（服务端&amp;amp;客户端都必装）&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mod 名称&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Natura&lt;/td&gt;
&lt;td&gt;添加了很多有意思的植物，整个世界变得生机勃勃，可以种樱花树，初期没食物还可以野外采蓝莓吃&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;MrCrayfish`s Vehicle Mod&lt;/td&gt;
&lt;td&gt;载具 Mod，可以在 MC 开车哦&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;Animania&lt;/td&gt;
&lt;td&gt;动物谷，更多的小动物、更加真实的动物喂养与繁殖&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;Twilightforest&lt;/td&gt;
&lt;td&gt;鼎鼎有名的暮色森林，不解释&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&#34;谨慎选用的-mod&#34;&gt;谨慎选用的 Mod&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mod 名称&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LootBags&lt;/td&gt;
&lt;td&gt;击杀怪物得到战利品带，随机开出各种物品。不过你的箱子很快就会被一堆奇奇怪怪的东西堆满（比如我有一大箱无用的钻石马铠）&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;Cuisine&lt;/td&gt;
&lt;td&gt;中文名烹饪工艺，国人作者开发的 Mod，挺有趣，很好地还原了做菜的过程，做完之后的菜会获得药水一样的效果。不过目测已经停更，而且没有很好的教程&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：上面列举的所有 Mod 都是 Mod 本体，有些 Mod 的功能还依赖于其他 Mod，在安装时必须同时安装 Mod 本体和他依赖的 Mod。具体的依赖关系可以参考 mcmod.cn 上对 Mod 介绍页的 Mod 关系选项卡，CurseForge 的 Mod 介绍页的 Relation 选项卡。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;踩坑笔记&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;R 键整理的快捷键与 JEI 的部分功能冲突，可自行修改快捷键&lt;/li&gt;
&lt;li&gt;R 键整理对烹饪工艺中生产出来的菜品没辙&lt;/li&gt;
&lt;li&gt;推荐仅将 FTB-Ultimine 用于挖泥巴和挖沙，实际使用时可能会出现挖了矿不掉东西的情况┭┮﹏┭┮&lt;/li&gt;
&lt;li&gt;不要用铁镐、钻石镐开 FTB-Ultimine 挖东西！耐久掉的飞快&lt;/li&gt;
&lt;li&gt;DynamicSurroundings 可以在设置里按需屏蔽特定的声音，比如装上后发现我家所在的地形会有乌鸦叫，就很烦。屏蔽之后整个世界都好起来了&lt;/li&gt;
&lt;li&gt;DynamicSurroundings 与 Animania 有 bug，对 Animania 的某些特有生物进行交互时会触发找不到特定媒体资源的 bug，导致游戏崩溃，重新进入又会触发这个 bug，只有在进去的一瞬间用指令将玩家杀死才能勉强逃离这个无尽的循环（血泪的教训）（最新版本已修复）&lt;/li&gt;
&lt;li&gt;Animania 会对每个维度的世界进行注入，比较耗费资源。在同时安装虚无世界 AoA 的情况下，每次服务器启动 Animania 需要对其包含的二十多的世界维度进行注入，严重拖慢启动速度&lt;/li&gt;
&lt;li&gt;Quark 模组对 1.12 的 MC 只有 1.6 版本而没有后续版本的内容更新和 bug 修复。实际使用中有点吃性能&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#34;mc-服务器优化&#34;&gt;MC 服务器优化&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;我使用的是 SpongeForge，因此只对一些通用的优化手段和原版服务器的一些参数做介绍。使用 Spigot 等的可以参考 MCBBS 的帖子进行更加深入的调优：&lt;/p&gt;

&lt;p&gt;Minecraft 服务器优化教程 —— 让多带 50% 的玩家不再是梦 - 联机教程 - Minecraft(我的世界) 中文论坛
&lt;a href=&#34;https://www.mcbbs.net/forum.php?mod=viewthread&amp;amp;tid=478126&#34;&gt;https://www.mcbbs.net/forum.php?mod=viewthread&amp;amp;tid=478126&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;对于一台长期运行的 MC 服务器，我们需要关注的主要是下面几点&lt;/p&gt;

&lt;h3 id=&#34;1-稳定性&#34;&gt;1. 稳定性&lt;/h3&gt;

&lt;p&gt;要保证服务的稳定，我们需要防范的是&lt;strong&gt;内在的崩溃&lt;/strong&gt;和&lt;strong&gt;外在的影响&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;防止服务端程序自己崩溃&lt;/strong&gt;的方法有：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;尽量使用稳定版的 MC 和稳定版的 Forge&lt;/li&gt;
&lt;li&gt;避免使用评分较低的 Mod&lt;/li&gt;
&lt;li&gt;加载大量 Mod 前先在本地做好测试，避免冲突，同时保障所有依赖项已安装好&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;避免外在影响致 MC 服务器崩溃&lt;/strong&gt;的方法有：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;为 JVM 设置合适的内存限制，避免因&lt;code&gt;OutOfMemory&lt;/code&gt;导致 MC 服务端进程被系统杀掉&lt;/li&gt;
&lt;li&gt;开放的服务器最好限制下权限并封堵一些游戏内的漏洞，避免熊孩子炸服&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;2-可维护性&#34;&gt;2. 可维护性&lt;/h3&gt;

&lt;p&gt;这一项的话其实见仁见智，有些人可能只会开个服务器玩几个星期，有些人会开几年。如果只是短期玩的话麻烦点就麻烦点咯，但是要长期玩的话，注意一下服务器的可维护性后面可以减少很多时间和精力。&lt;/p&gt;

&lt;p&gt;我的建议有以下几点：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;使用 Docker&lt;/strong&gt;。这样可以方便地进行服务的停启与迁移、升级。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用 Docker-Compose&lt;/strong&gt;并保存&lt;code&gt;docker-coompose.yml&lt;/code&gt;文件，这样你可以方便地更改一些参数而不用每次都输入一串长长的&lt;code&gt;docker run&lt;/code&gt;指令。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;经常备份&lt;/strong&gt;。数据无价。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;尽量避免使用已经停止维护的 Mod&lt;/strong&gt;。到时候要是出了奇怪的 Bug，你就只能含泪把这个 Mod 所有相关的内容从你的世界剥离。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;3-响应及时性&#34;&gt;3. 响应及时性&lt;/h3&gt;

&lt;p&gt;响应及时性也体现在几个方面：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU 运算能力够强，复杂的时间（战斗、爆炸）等能很快地处理过来&lt;/li&gt;
&lt;li&gt;存储设备 IO 速度快，服务启动、区块加载可以非常迅速&lt;/li&gt;
&lt;li&gt;网络连接稳定、延迟低，波动小&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;上面三点可以通过堆硬件来实现。不过有没有不辛苦钱包又能提高游戏体验的方法呢？&lt;/p&gt;

&lt;p&gt;自然是有的。我们可以通过修改服务端程序的部分配置来实现。不过本质上是牺牲一小部分游戏体验换取一大部分游戏体验，就看你能忍受的牺牲的部分能有多少咯。&lt;/p&gt;

&lt;p&gt;MC 服务器的优化主要聚焦在两个地方&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;MC 服务端程序的参数优化&lt;/li&gt;
&lt;li&gt;JVM 参数调优&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id=&#34;mc-服务端优化&#34;&gt;MC 服务端优化&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;VIEW_DISTANCE: 8&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这一项可以更改加载的&lt;strong&gt;区块&lt;/strong&gt;的数量。这个数值越大，就会加载更多的区块，占用的内存和 CPU 就会更多。这个数值过小可能会导致你家的作物不长以及怪物刷不出来，会显著影响游戏体验。减小这一项的数值可以显著减少内存和 CPU 占用。&lt;/p&gt;

&lt;p&gt;默认值 10，建议值 4~8。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：1 个&lt;strong&gt;&lt;em&gt;区块&lt;/em&gt;&lt;/strong&gt;并不是指一个方块，而是指一个&lt;code&gt;16*16&lt;/code&gt;的区域。这个数值对可视区域的影响并不会很大，你可以放心地减小这个数值。这一项的值每减小 1，你的服务器每次就可以少计算​&lt;code&gt;16*16*256&lt;/code&gt;个方块&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;NETWORK_COMPRESSION_THRESHOLD: 512&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这一项的含义是对大于特定大小的数据包进行压缩。压缩会消耗一定量的 CPU 资源，不过可以减缓网络的压力。如果你的网络条件较差，可以减小这一项的数值。&lt;/p&gt;

&lt;p&gt;默认值：256&lt;/p&gt;

&lt;h4 id=&#34;jvm-调优&#34;&gt;JVM 调优&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;首先需要声明的是，我不是 JVM 调参专业户，下文的数据也并不是严格的评测。结论并不严谨，仅仅从一个技术人员的视角出发，结合我实际的使用体验，给出的一些建议，供大家参考。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h5 id=&#34;当我们在讨论-jvm-调优时-我们在谈论什么&#34;&gt;当我们在讨论 JVM 调优时，我们在谈论什么？&lt;/h5&gt;

&lt;p&gt;&lt;strong&gt;垃圾回收&lt;/strong&gt;（&lt;strong&gt;G&lt;/strong&gt;arbage &lt;strong&gt;C&lt;/strong&gt;ollection）一直以来都是众多 JVM 调优教程的核心所在。Java 运行于 VM 上，运行过程中不可避免的垃圾回收是最影响应用整体性能的存在。&lt;/p&gt;

&lt;p&gt;这里我们不去纠结那些新生代、老年代的划分、各种比率、各种单元的大小，我们只需要明白几点：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;不要觉得你比 JVM 的开发人员牛 X&lt;/li&gt;
&lt;li&gt;不要觉得网上各路 JVM 调参大神的方法就适用于你&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;众多顶级公司都在使用 Java，其母公司 Oracle 自然会招聘全球最优秀的一批开发人员去开发，所以&lt;strong&gt;JVM 的大部分设置都是开箱即用的，默认最佳的。&lt;/strong&gt;在你不了解某一项参数的含义、不知道更改某一项配置的目的时，最好是不要做改动。&lt;/p&gt;

&lt;p&gt;其次，网络上大部分 JVM 的调优教程都是应对“面试造火箭”的，即便是以实际应用为主的 JVM 优化教程，人家那都是几十核几百 G 内存的机器，一秒钟要承担几百万的访问量，他们做优化的出发点、目标都&lt;strong&gt;不一定适用于你。&lt;/strong&gt;&lt;/p&gt;

&lt;h5 id=&#34;明确优化目标&#34;&gt;明确优化目标&lt;/h5&gt;

&lt;p&gt;明确了上面两点我们可以开始着手进行优化了。&lt;/p&gt;

&lt;p&gt;首先需要明确你开 MC 服务器的机器是什么配置。以我的为例，我使用的是腾讯云的&lt;strong&gt;1 核 2G 的云服务器&lt;/strong&gt;，&lt;strong&gt;带宽 2M&lt;/strong&gt;，即峰值速度为 256k/s。&lt;/p&gt;

&lt;p&gt;其次需要知道你的优化目标。网络上大多数 JVM 的优化教程都是追求更低的响应时间，以便能够承载更多的并发访问。&lt;/p&gt;

&lt;p&gt;以我的情况为例：我开这个 MC 服务器的目的，只是希望能够与&lt;strong&gt;不超过 5 个好友&lt;/strong&gt;联机，玩带一些暮色森林这样的&lt;strong&gt;Mod&lt;/strong&gt;的 MC。&lt;/p&gt;

&lt;p&gt;搭建完服务器后，观察了了一段时间后发现，&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;只有在 MC 服务器刚启动的时候 CPU 占用率会达到 100%，空载（没有玩家在线，后台没有高负荷任务）只有 2% 左右，两人联机时 CPU 平均负载在 30% 左右。&lt;/li&gt;
&lt;li&gt;加装了十几个 Mod 的情况下，空载占用 CPU 资源在 1G 左右，两人联机 1.4G 左右。&lt;/li&gt;
&lt;li&gt;只有在客户端刚进入的时候会跑满带宽，之后正常游戏时，每台客户端需要占用 10K/s 左右的带宽。&lt;/li&gt;
&lt;li&gt;联机游戏间或卡顿，但很快恢复&lt;/li&gt;
&lt;li&gt;查看日志发现空载时时竟然仍会&lt;code&gt;can&#39;t keep up&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205922.png&#34; alt=&#34;服务器在空载&#34; /&gt;&lt;/p&gt;

&lt;p&gt;那么以我的情况来看&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU 性能富余&lt;/li&gt;
&lt;li&gt;内存吃紧&lt;/li&gt;
&lt;li&gt;带宽够用&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;那么&lt;strong&gt;我的优化目标&lt;/strong&gt;就是：利用好 CPU 资源，尽力减少内存占用，以便为其他程序让路，并且为未来可能要添加的新 Mod 留出空间。&lt;/p&gt;

&lt;h5 id=&#34;优化&#34;&gt;优化&lt;/h5&gt;

&lt;p&gt;JVM 优化的大头是 GC。网上吹的漫天飞的 G1GC 的确有他的可取之处，一些腐竹的测试数据也表明其实际效果优秀。但是在我的案例中，使用 G1GC 是有问题的：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;G1GC 天生是为了现代互联网应用环境而设计的&lt;/strong&gt;，需要开很多个线程协同来完成垃圾回收工作。他适用于多核处理器 + 大内存机器上的高负荷运算。而我的服务器是单核，内存也并不富裕。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多线程的 GC 模式跑在单核机器上&lt;/strong&gt;时出现的问题就是：单核机器无法并行处理多个任务，其本质上只是在多个任务之间快速切换，来实现各个任务基本“实时”“并行”运行。但是线程之间的切换是有代价的，&lt;strong&gt;性能损耗积少成多&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;G1GC 追求在延迟可控的情况下达到更高的吞吐量&lt;/strong&gt;。但他的&lt;strong&gt;代价是&lt;a href=&#34;https://segmentfault.com/q/1010000021658061&#34;&gt;更多的内存占用&lt;/a&gt;。&lt;/strong&gt;小内存机器并不适合使用 G1GC。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;物色了一番，我最终选择换用 Serial GC 代替原本的 G1GC。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Serial（-XX:+UseSerialGC）&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;从名字我们可以看出，这是一个串行收集器。&lt;/p&gt;

&lt;p&gt;Serial 收集器是 Java 虚拟机中最基本、历史最悠久的收集器。在 JDK1.3 之前是 Java 虚拟机新生代收集器的唯一选择。目前也是 ClientVM、ServerVM 4 核 4GB 以下机器默认垃圾回收器。Serial 收集器并不是只能使用一个 CPU 进行收集，而是当 JVM 需要进行垃圾回收的时候，需暂停所有的用户线程，直到回收结束。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h5 id=&#34;优化前后对比&#34;&gt;优化前后对比&lt;/h5&gt;

&lt;ol&gt;
&lt;li&gt;优化前 MC 服务器的资源占用情况&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205932.jpg&#34; alt=&#34;360 截图 20210129163301881&#34; /&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;SERIAL GC (1 ONLINE)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205936.png&#34; alt=&#34;image-20210202194034351&#34; /&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;进一步对 mod 优化后，2 online&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205939.png&#34; alt=&#34;image-20210202221554906&#34; /&gt;&lt;/p&gt;

&lt;h5 id=&#34;其他优化方法&#34;&gt;其他优化方法&lt;/h5&gt;

&lt;p&gt;更换 GC 只是众多优化方法中的一种，其他的诸如换用 OpenJ9 虚拟机也可以有不错的效果，可惜的是 Forge 对其的支持并不友好，只得作罢。还有启用指针压缩也可以获得不错的性能提升，不过 JDK6_u23 之后 &lt;code&gt;UseCompressedOops&lt;/code&gt; 就已经被默认启用了，使用新版本 Java 基本不用关注这方面的优化了。&lt;/p&gt;

&lt;h2 id=&#34;写在最后&#34;&gt;写在最后&lt;/h2&gt;

&lt;p&gt;晒几张图&lt;/p&gt;

&lt;p&gt;我家：&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205942.png&#34; alt=&#34;屏幕截图 (13)&#34; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205946.png&#34; alt=&#34;屏幕截图 (16)&#34; /&gt;&lt;/p&gt;

&lt;p&gt;我安装的光影 Sildurs Vibrant Shaders v1.281 High 效果图&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205949.png&#34; alt=&#34;屏幕截图 (12)&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Better HUD + 旅行地图效果图&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205953.png&#34; alt=&#34;屏幕截图 (17)&#34; /&gt;&lt;/p&gt;

&lt;h2 id=&#34;参考-推荐阅读&#34;&gt;参考&amp;amp;推荐阅读&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;大家最推荐用哪种联机方式玩 Minecraft？ - 知乎
&lt;a href=&#34;https://www.zhihu.com/question/54048310&#34;&gt;https://www.zhihu.com/question/54048310&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;View Distance: optimize your Minecraft server
&lt;a href=&#34;https://mtxserv.com/article/12535/view_distance_optimize_your_minecraft_server&#34;&gt;https://mtxserv.com/article/12535/view_distance_optimize_your_minecraft_server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Minecraft 服务器优化教程 —— 让多带 50% 的玩家不再是梦 - 联机教程 - Minecraft(我的世界) 中文论坛
&lt;a href=&#34;https://www.mcbbs.net/forum.php?mod=viewthread&amp;amp;tid=478126&#34;&gt;https://www.mcbbs.net/forum.php?mod=viewthread&amp;amp;tid=478126&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;itzg/docker-minecraft-server: Docker image that provides a Minecraft Server that will automatically download selected version at startup
&lt;a href=&#34;https://github.com/itzg/docker-minecraft-server&#34;&gt;https://github.com/itzg/docker-minecraft-server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;jvm G1 垃圾收集器有什么缺点？ - SegmentFault 思否
&lt;a href=&#34;https://segmentfault.com/q/1010000021658061&#34;&gt;https://segmentfault.com/q/1010000021658061&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

        
        </description>
    </item>
    
    <item>
      <title>云服务器入门指南</title>
      <link>/posts/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/</link>
      <pubDate>Sun, 15 Mar 2020 00:00:00 +0000</pubDate>
      
      <guid>/posts/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/</guid>
      <description>
        
          
          
          
        
        
        

&lt;!-- # 云服务器入门指南 --&gt;

&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;

&lt;p&gt;各大厂商持续发力云计算，上云的门槛也越来越低。获取云服务器的门槛越来越低，但是真正使用好云服务器的难度一直都很高。本文旨在为新上云的小白提供方向性的指引并引导入坑  : )&lt;/p&gt;

&lt;h2 id=&#34;云服务器相关的几个概念&#34;&gt;云服务器相关的几个概念&lt;/h2&gt;

&lt;h3 id=&#34;服务器的操作系统&#34;&gt;服务器的操作系统&lt;/h3&gt;

&lt;p&gt;主要分为两大阵营：Windows Server 和 Linux Server。前者一般自带可视化界面，基本兼容平时使用的 exe 程序，某种程度上也可以作为“云电脑”使用。后者一般不自带图形化界面，操作都通过特定命令完成，上手难度较高，但配置各种开发环境、安装各类高级工具比 win 平台更容易。没有 Linux 基础的用户建议先在本地建立虚拟机练习。&lt;/p&gt;

&lt;p&gt;Linux Server 主要的两个阵营为 Debian 系、RedHat 系。主要的发行版&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Debian 系：Debian, Ubuntu&lt;/li&gt;
&lt;li&gt;RedHat 系：RedHat, CentOS, Fedora&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;对于初学者来说，最明显的区别在于前者使用 &lt;code&gt;apt install xxx&lt;/code&gt;  来安装软件，而后者是通过 &lt;code&gt;yum install xxx&lt;/code&gt;  来安装。&lt;/p&gt;

&lt;h3 id=&#34;公网-ip&#34;&gt;公网 IP&lt;/h3&gt;

&lt;p&gt;IP 可以理解为一台设备在互联网世界中的门牌号和地址，相当于知道某个具体的地址就能发快递包裹。IP 分为公网 IP 和内网 IP。顾名思义，内网 IP 一般用于公司或学校内部。一般来说，只知道一台设备的内网 IP 的情况下并不能准确定位这台设备，就类似于只知道你的朋友的名字，并不能直接给他寄快递，你必须要知道他学校/单位/家的地址才行。&lt;/p&gt;

&lt;p&gt;服务器拥有公网 IP 的好处在于，你可以直接通过这个 IP 定位到你的服务器，相当于你的服务器在互联网世界中拥有了响当当的名号，只要说出这个名号，互联网世界的公民都能知道他，给他发消息。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;*此处公网内网 IP 的叙述仅适用于 IPv4 地址。更多关于 IPv4 地址和 IPv6 地址的相关信息参见文末扩展阅读。&lt;/em&gt;&lt;/p&gt;

&lt;h3 id=&#34;端口&#34;&gt;端口 &lt;/h3&gt;

&lt;p&gt;端口的英文为 port，有港口的意思。一般来说，一台设备不同的端口运行着不同的服务，我们可以很好的控制特定端口的开放与关闭，从而控制不同的服务是否对外开放，正如开放一个通商口岸。常见的服务端口有 &lt;code&gt;HTTP  80&lt;/code&gt;   &lt;code&gt;HTTPS  443&lt;/code&gt;   &lt;code&gt;DNS  53&lt;/code&gt;   &lt;code&gt;SSH 22&lt;/code&gt;  &lt;/p&gt;

&lt;p&gt;一个服务也可能不是仅仅通过一个端口提供服务，他可能会将一个大的功能拆分为几个子功能，通过不同的端口与外界通讯。如 FTP，SMB 等。你可以通过关闭指定端口来详细控制特定服务。当然如果你想想外面提供像 FTP 这样通过多个端口与外界通讯的端口，就要注意要确保他使用的所有端口都要设置为开放才能保证外界的正常访问。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;*FTP 是一种文件传输协议，你可以在某些电影资源的下载链接里看见以 &lt;code&gt;ftp://&lt;/code&gt;  开头的链接。这说明这个电影资源是存放在某个 FTP 服务器上。&lt;/em&gt;
&lt;em&gt;*关于 FTP、SMB 的端口使用及配置参见文末扩展阅读&lt;/em&gt;&lt;/p&gt;

&lt;h3 id=&#34;防火墙&#34;&gt;防火墙&lt;/h3&gt;

&lt;p&gt;防火墙（Firewall）某种程度上是控制本机与外界通讯的工具。下面以几个具体的实例来介绍下防火墙：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;你的服务器建了个网站，需要向外提供 HTTP 服务，那么你需要在防火墙中设置开放 80 端口，允许其他所有 IP 访问。&lt;/li&gt;
&lt;li&gt;公司有一台服务器搭载了一个仅面向公司员工的网站，希望仅允许公司内的员工访问。而公司内员工的内网 IP 个格式为 192.168.*.&lt;em&gt;，那么就可以在防火墙中设置，仅允许来自 IP 为 192.168.&lt;/em&gt;.*的设备访问这台服务器的 80 端口，其他一律禁止&lt;/li&gt;
&lt;li&gt;近期互联网上流行一种病毒 X 通过计算机的 1234 端口感染其他机器。那么为了保护本机不受病毒影响，你可以在防火墙中设置关闭 1234 端口，禁止任何来源访问 1234 端口，从而将病毒 X 阻挡在防火墙外。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;注意：对于云服务器来说，可能会存在多重防火墙。一般 Linux 系统自身会有一套防火墙（firewalld/ufw 等），云服务商会有一套网络防火墙（一般为网络安全组/网络访问控制等）&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&#34;几种远程连接方式对比&#34;&gt;几种远程连接方式对比&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&#34;center&#34;&gt;&lt;strong&gt;连接方式&lt;/strong&gt;&lt;/th&gt;
&lt;th align=&#34;center&#34;&gt;SSH&lt;/th&gt;
&lt;th align=&#34;center&#34;&gt;VNC&lt;/th&gt;
&lt;th align=&#34;center&#34;&gt;RDP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&#34;center&#34;&gt;&lt;strong&gt;支援平台&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;Linux，Mac OS，BSD&amp;hellip;，Win 需额外安装软件&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;Linux,Win,Mac OS,iOS,Android 等，基本所有都需额外软件 *&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;Win 自带，其他需额外安装软件&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td align=&#34;center&#34;&gt;&lt;strong&gt;易用性&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;★&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;★★★&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;★★★*&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td align=&#34;center&#34;&gt;&lt;strong&gt;可视化界面&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;否&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;是&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;是&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td align=&#34;center&#34;&gt;&lt;strong&gt;网络要求&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;极低&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;高&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;较高&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td align=&#34;center&#34;&gt;&lt;strong&gt;配置难度&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;★&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;★★★&lt;/td&gt;
&lt;td align=&#34;center&#34;&gt;★★&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;ul&gt;
&lt;li&gt;1 部分 Linux 发行版自带 VNC 连接，不过大部分需手动启用&lt;/li&gt;
&lt;li&gt;2 RDP 连接对于同为 Win 的机器更为容易，对于平台不一样的情况，配置比较麻烦&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;快速入门须知&#34;&gt;快速入门须知&lt;/h2&gt;

&lt;p&gt;当你拥有了一台属于自己的云服务器，你发现面对复杂的控制台手足无措，不知道怎么连接，不知道能拿来干什么。那么你可以参考一下的步骤。&lt;strong&gt;下文仅适用于 Linux Server &amp;amp; 有一点点 Linux 操作经验的选手&lt;/strong&gt;。&lt;/p&gt;

&lt;h3 id=&#34;开启-ssh-远程连接&#34;&gt;开启 SSH 远程连接&lt;/h3&gt;

&lt;h4 id=&#34;服务器端设置&#34;&gt;服务器端设置&lt;/h4&gt;

&lt;p&gt;1.首先，登陆你的账户，打开云服务器的控制台，开机（不解释）  
2.定位到你的云服务器，一般新的账户只有一台云服务器实例，点击其菜单，找到远程连接选项  
3.接下来会打开一个网页端的黑框，根据其提示，设置实例密码等等。这里记录你的系统用户名和密码。
4.一般网页端会有提示，根据具体情况开启 SSH 服务，设置允许 root 权限远程登录。具体的操作因平台和操作系统不同而不同，此处不再赘述。
5.现在到服务器菜单里找到网络设置/防火墙设置/网络安全组设置，点击进入，&lt;strong&gt;开启服务器 22 端口的访问权限&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;接下来在你的电脑上配置 SSH 远程访问。 &lt;/p&gt;

&lt;h4 id=&#34;本地电脑设置&#34;&gt;本地电脑设置&lt;/h4&gt;

&lt;p&gt;1.1 Win10 用户和 Linux 用户、Mac OS 用户一般系统会预装 ssh 客户端。打开 CMD 命令控制符/PowerShell，输入 ssh 回车看是否有反应。&lt;strong&gt;如果没有提示 xxx 找不到，可以直接到步骤 2.1&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;1.2 如果没有反应，你需要到 设置 - 应用 - 可选功能 中，安装 SSH 客户端。&lt;/p&gt;

&lt;p&gt;1.3 Windows 其他版本用户需要安装第三方 SSH 客户端。这里推荐使用 Putty。&lt;/p&gt;

&lt;p&gt;2.1 接下来使用 &lt;code&gt;ssh 你的用户名@你的服务器IP&lt;/code&gt; 来连接到你的服务器。注意&lt;strong&gt;At 符号@前后没有空格，输完回车确认&lt;/strong&gt;。正常情况下可以成功连接到。&lt;/p&gt;

&lt;p&gt;2.2 如果出现 Permission denied，可能的原因有&lt;code&gt;用户名密码错误&lt;/code&gt; / &lt;code&gt;未开启root账户远程登录&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;2.3 如果出现 Connection time out，则大概率是你&lt;code&gt;IP地址填写错误&lt;/code&gt;，也有可能是你的&lt;code&gt;服务器没开机&lt;/code&gt;/ &lt;code&gt;你的服务器系统没有默认开启ssh服务&lt;/code&gt;/ &lt;code&gt;防火墙未放行22端口&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;排查相关问题请带上相关关键字去搜索引擎搜索。&lt;/p&gt;

&lt;h3 id=&#34;安装软件&#34;&gt;安装软件&lt;/h3&gt;

&lt;h4 id=&#34;安装软件的命令及常见问题&#34;&gt;安装软件的命令及常见问题&lt;/h4&gt;

&lt;p&gt;参见上文介绍操作系统的部分。不过具体安装的时候，经常会遇到的问题为安装需要 root 权限。一般来说，日常使用时为了安全期间，我们不会直接用 root 账户进行操作。通常的做法为创建一个普通的账户，当执行需要高权限的指令时在命令前加上 sudo，或是使用 &lt;code&gt;su root&lt;/code&gt;  来临时切换为 root 用户*，并输入密码来进行二次确认，以确保安全性。此处涉及到的操作有：  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;添加一个普通用户 ( &lt;code&gt;useradd NEWUSERNAME&lt;/code&gt;  /  &lt;code&gt;adduser NEWUSERNAME&lt;/code&gt;  )&lt;/li&gt;
&lt;li&gt;设置新用户的密码  ( &lt;code&gt;passwd USERNAME&lt;/code&gt;  )&lt;/li&gt;
&lt;li&gt;将新用户添加到 sudoers 的列表中  ( 修改 &lt;code&gt;/etc/sudoers&lt;/code&gt;  ) &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;具体操作可以以  &lt;code&gt;操作系统名称+操作关键字&lt;/code&gt;  为关键字在搜索引擎中自行搜索详细教程。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;*临时切换为 root 用户，执行完命令后，记得用 exit 命令退出 root 账户&lt;/em&gt;&lt;/p&gt;

&lt;h4 id=&#34;镜像源的设置&#34;&gt;镜像源的设置&lt;/h4&gt;

&lt;p&gt;执行完上述命令，当你尝试安装一个软件时，如果你云服务器提供商没有为你的系统进行“优化”的话，你会发现安装软件的速度非常慢。这是因为这些 Linux 系统基本都是由国外的厂商/组织进行开发，安装软件时需要到位于国外的服务器获取数据，你的网络请求可能会跨越大半个地球，网络速度也随着传输距离的增加不断减小*。国内有很多组织建立了公益性质的镜像站点，我们可以将安装程序的软件源设置为位于国内的镜像站点以大大提高软件安装下载的速度。
国内的镜像站点有&lt;strong&gt;阿里云镜像站&lt;/strong&gt;、&lt;strong&gt;清华大学 tuna 镜像站&lt;/strong&gt;、&lt;strong&gt;中国科学技术大学开源镜像站&lt;/strong&gt;等。这些站点提供多种主流 Linux 发行版的软件安装源的镜像。不同操作系统更换软件源的操作有所不同，可以到以上镜像站点中查找特定系统更换软件源的详细步骤。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;*请注意此处叙述并不准确，与一个站点通信的速度取决于很多因素。&lt;/em&gt;&lt;/p&gt;

&lt;h4 id=&#34;常用工具的安装&#34;&gt;常用工具的安装&lt;/h4&gt;

&lt;p&gt;更换好了软件源后，我们就可以愉快的安装软件了。你可以尝试安装一下 &lt;code&gt;screenfetch&lt;/code&gt;  的软件包进行测试，安装完成后输入 &lt;code&gt;screenfetch&lt;/code&gt;  命令，他会在你的屏幕上输出字符画形式的系统图标和系统配置信息。&lt;/p&gt;

&lt;p&gt;部分 Linux 发行版可能并没有预置很多的软件包，你可以根据自己的需要进行安装，如文本编辑工具 &lt;code&gt;nano&lt;/code&gt;  &lt;code&gt;vim&lt;/code&gt;  等*。C 编译工具 &lt;code&gt;gcc&lt;/code&gt;  ,C++ 编译工具 &lt;code&gt;g++&lt;/code&gt;  ，Java 开发组件 &lt;code&gt;openjdk&lt;/code&gt;  等。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;*推荐初学者使用易于上手的 &lt;code&gt;nano&lt;/code&gt;  文本编辑器。大部分 Linux 发行版都有预置。&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&#34;初级玩法&#34;&gt;初级玩法&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;搭建 Wordpress 网站&lt;/strong&gt;：为服务器安装好基础设施，部署 wordpress 服务。参见 &lt;a href=&#34;https://help.aliyun.com/document_detail/50774.html?spm=a2c4g.11186623.6.1134.26fc7ed9zbIv5a&#34;&gt;服务器 LAMP 部署&lt;/a&gt;，&lt;a href=&#34;https://segmentfault.com/a/1190000013035065&#34;&gt;Wordpress 搭建&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作为远程开发环境&lt;/strong&gt;：  &lt;a href=&#34;https://www.jianshu.com/p/0f2fb935a9a1&#34;&gt;VSCode 进行远程开发&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;其他高级玩法&#34;&gt;其他高级玩法&lt;/h2&gt;

&lt;p&gt;参见：&lt;a href=&#34;https://www.zhihu.com/question/40854395&#34;&gt;知乎问答：自己拥有一台服务器可以做哪些很酷的事情？&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&#34;扩展阅读&#34;&gt;扩展阅读&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://zhuanlan.zhihu.com/p/36542469&#34;&gt;IPv6 是什么？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.jianshu.com/p/016ee3b7ff97&#34;&gt;CentOS7 firewall 开放服务 / 端口&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://linux.cn/article-8087-1.html&#34;&gt;在 Ubuntu 中用 UFW 配置防火墙&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.wpdaxue.com/make-your-wordpress-site-faster.html&#34;&gt;让你的 WordPress 网站更快的 16 条建议&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cnblogs.com/xiaohh/p/4789813.html&#34;&gt;FTP 主动模式和被动模式的区别&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.5yun.org/15466.html&#34;&gt;Samba 服务使用的端口和协议&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

        
        </description>
    </item>
    
    <item>
      <title>坑爹的阿里云 &amp; Swap 的重要性</title>
      <link>/posts/%E6%A0%91%E8%8E%93%E6%B4%BE-apache2-%E8%AE%BE%E7%BD%AE%E7%89%B9%E5%AE%9A%E5%9F%9F%E5%90%8D%E8%BD%AC%E5%8F%91%E5%88%B0%E7%89%B9%E5%AE%9A%E7%AB%AF%E5%8F%A3/</link>
      <pubDate>Tue, 10 Mar 2020 00:00:00 +0000</pubDate>
      
      <guid>/posts/%E6%A0%91%E8%8E%93%E6%B4%BE-apache2-%E8%AE%BE%E7%BD%AE%E7%89%B9%E5%AE%9A%E5%9F%9F%E5%90%8D%E8%BD%AC%E5%8F%91%E5%88%B0%E7%89%B9%E5%AE%9A%E7%AB%AF%E5%8F%A3/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;随着树莓派上部署的项目越来越多，每次使用 &lt;strong&gt;IP + 端口&lt;/strong&gt;访问也越来越不方便。考虑使用 Apache 来特定子域名跳转到不同端口对应的不同应用。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;树莓派 3B+  Raspbian 系统&lt;/li&gt;
&lt;li&gt;Apache2&lt;/li&gt;
&lt;li&gt;自己的域名&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;在 Apache2 的配置文件（路径 /etc/Apache2/Apache2.conf ) 文件末尾加上以下配置：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
  ServerName YOUR_DOMAIN.COM #此处为本条规则绑定的域名，下同
  ServerAlias YOUR_DOMAIN.COM
  ProxyPreserveHost On
  ProxyRequests Off
  ProxyPass / http://localhost:8080/ #修改此处的端口号为实际所需，下同
  ProxyPassReverse / http://localhost:8080/
&amp;lt;/VirtualHost&amp;gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;之后开启 Apache2 的相关模块&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;a2enmod rewrite
a2enmod proxy
a2enmod proxy_http


&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;最后重启 Apache2 即可 sudo systemctl restart Apache2&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>从一次异常断网谈防火墙配置</title>
      <link>/posts/%E4%BB%8E%E4%B8%80%E6%AC%A1%E5%BC%82%E5%B8%B8%E6%96%AD%E7%BD%91%E8%B0%88%E9%98%B2%E7%81%AB%E5%A2%99%E9%85%8D%E7%BD%AE/</link>
      <pubDate>Sat, 08 Feb 2020 00:00:00 +0000</pubDate>
      
      <guid>/posts/%E4%BB%8E%E4%B8%80%E6%AC%A1%E5%BC%82%E5%B8%B8%E6%96%AD%E7%BD%91%E8%B0%88%E9%98%B2%E7%81%AB%E5%A2%99%E9%85%8D%E7%BD%AE/</guid>
      <description>
        
          
          
          
        
        
        

&lt;h2 id=&#34;序&#34;&gt;序&lt;/h2&gt;

&lt;p&gt;十分钟前，突然发现手边的电脑上的 QQ 突然变灰，多次重新登陆均失败。而当前打开几个百度的网页均未出现异常。但点击几个搜索结果均显示打不开网页。一分钟后，iPad 播放的音乐也突然停止。尝试 Ping 局域网的网关和树莓派均失败。而路由器仍然显示网络连接正常，手机端仍可以正常上网，断网前半个小时内我是没有对路由器和承载着众多服务的树莓派进行任何改动的。初步查看，发现电脑网卡的 ip 变为&lt;code&gt;169.254&lt;/code&gt;开头的 IP，而内网 IP 之前一直用的是&lt;code&gt;192.168.1.\*&lt;/code&gt;。现在电脑和路由器&lt;code&gt;192.168.1.1&lt;/code&gt;以及绑定了这个网段静态 IP 的树莓派都不在同一个网段内，自然是无法访问的。那么为什么会分配到这样的 IP 地址呢？&lt;br /&gt;
简单查询得知，这样的 IP 属于保留的 IP 地址段，用于在无法 DHCP 获取 IP 时自己给自己分配一个 IP。这样分配得来的 IP 自然是不能正常使用的。而此前局域网的 DHCP 被我的树莓派承包了，那么首要任务是查看树莓派的 DHCP 服务是否正常运行。&lt;/p&gt;

&lt;h2 id=&#34;排错三步走&#34;&gt;排错三步走&lt;/h2&gt;

&lt;p&gt;虽然树莓派之前绑定的 IP 地址无法 ping 通，但庆幸的是，通过主机名依然可以访问到局域网内树莓派，不过此时链接的是 IPv6。IPv6 作为 IPv4 的升级版，在很多方面都有所不同，局域网 IP 地址的分配和 IPv4 的 DHCP 走的并不是同一个路子。之前为了将树莓派的 DNS 用于家庭局域网，而家里的移动光猫上并不能修改 IPv4 DHCP 的 DNS 信息，无奈只能禁用路由器的 IPv4 DHCP 转而使用 AdGuardHome 内置的 DHCP 服务器。而 IPv6 的 DHCP 分为两个部分：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;内网的，分配的 IPv6 地址一般以&lt;code&gt;fe80&lt;/code&gt;开头，这种地址仅用于内网访问。&lt;/li&gt;
&lt;li&gt;公网的，IPv6 的地址容量之大足以为地球上的每一粒沙子分配一个独一无二的 IPv6 地址，而这对于现今地址池即将枯竭的 IPv4 是根本无法想象的。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;由于要分配的公网 IPv6 地址是要由路由器从公网获取一个前缀然后再为局域网的每个支持 IPv6 的设备分配地址，这一项任务不能由内网的树莓派代劳，所以当时就没有改动，没想到现在竟然成了救命稻草。&lt;br /&gt;
通过 IPv6 的方式，成功连接上了树莓派。查看了 AdGuardHome 的 DNS 服务以及 DHCP 服务，并没有发现任何异常。&lt;br /&gt;
例行 SSH 连上查看日志。&lt;code&gt;sudo systemctl status AdGuardHome.service&lt;/code&gt;，果然，发现了端倪。&lt;br /&gt;
&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs/20200121221431.png&#34; alt=&#34;&#34; /&gt;&lt;br /&gt;
原来！DHCP 服务！是要单独监听 67 端口的！&lt;br /&gt;
而一个小时之前，为了防止暴露在公网上的树莓派遭到攻击，我特地启用了防火墙，并设置规则为，除了放行的 DNS 53 等端口，其他默认屏蔽。想来应该是误伤了 DHCP 的 67 端口。而之前 DHCP 设置每个 IP 地址的租约为一个小时，即，每间隔一个小时才会重新进行一次 DHCP 请求。于是&lt;code&gt;sudo ufw allow 67/tcp&lt;/code&gt;端口放行 DHCP 服务信息。win10 断网重连以令其重新获取 IP 地址。&lt;br /&gt;
没想到还是不成功。AdGuardHome 的 DHCP 租约面板，依然显示没有任何设备连接。依据以往的经验，乖乖去查了 DHCP 所使用的端口信息，发现 DHCP 需要&lt;code&gt;67/udp&lt;/code&gt;和&lt;code&gt;68/udp&lt;/code&gt;两个端口，且还是使用 udp 连接。&lt;br /&gt;
接下来问题就好办了，重复上面的操作。查看本机的 IP 地址已经恢复正常。&lt;/p&gt;

&lt;h2 id=&#34;谈防火墙&#34;&gt;谈防火墙&lt;/h2&gt;

&lt;p&gt;在树莓派未暴露在公网上之前，我对防火墙的理解仅限于早些年 360 卫士花里胡哨的网络安全服务。在这次事件之前，我也只是以为防火墙只是防范来自公网的不友善的访问的工具。今天才发现，防火墙除了字面上的意思，防范风险之外，他也是网络数据进出主机的安检。什么样的请求是允许的，什么样的是屏蔽的，这些都需要认真考虑，仔细配置。对于我那配置了众多服务的树莓派来说，我应当在没添加一个新的服务时，查询其使用的端口信息，并更新防火墙配置，我之前却大大忽视了这一点，直到出了事故才意识到。也希望给后来者提供一个减少犯错的机会，毕竟要是实际生产环境出了事故，可就不是十几分钟断网的事了。&lt;/p&gt;

&lt;h2 id=&#34;防火墙设置&#34;&gt;防火墙设置&lt;/h2&gt;

&lt;p&gt;防火墙抵挡了来自外部的威胁，也会对现有的服务造成影响。除了网页访问的 80 和 443 端口，其他有固定端口的特定服务要手动在防火墙中添加规则。对于像 BT 下载这种没有固定端口的，需要根据实际设定来更新防火墙规则。&lt;br /&gt;
&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs/20200122140951.png&#34; alt=&#34;&#34; /&gt;&lt;br /&gt;
图中为 Aria2 的默认监听端口，为了保证正常的 BT 下载，需要保证这个范围的端口也添加进防火墙允许通过的规则。&lt;br /&gt;
最简单有效的办法是，将所有出站的请求默认允许，对于外部传入的请求，除了必要的几个服务，其他一概默认禁止。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo ufw default allow outgoing
sudo ufw default deny incoming


&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这样设置可以保证我们能够正常访问互联网上的绝大多数服务，且阻挡大部分外部的攻击。不过这种情况下，如果你的系统被植入了后门，那么这台机器依然可以向外发送请求。如之前爆发的“永恒之蓝”，如果你的机器被感染了，那么他依然可以经由特定的端口，向外传送数据，从而感染局域网中的其他设备。防火墙的规则就要根据实际的情况来进行设置了。&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>一次成功的网络优化 &amp; 吐槽国内糟糕的网络环境</title>
      <link>/posts/%E4%B8%80%E6%AC%A1%E6%88%90%E5%8A%9F%E7%9A%84%E7%BD%91%E7%BB%9C%E4%BC%98%E5%8C%96-%E5%90%90%E6%A7%BD%E5%9B%BD%E5%86%85%E7%B3%9F%E7%B3%95%E7%9A%84%E7%BD%91%E7%BB%9C%E7%8E%AF%E5%A2%83/</link>
      <pubDate>Thu, 10 Oct 2019 00:00:00 +0000</pubDate>
      
      <guid>/posts/%E4%B8%80%E6%AC%A1%E6%88%90%E5%8A%9F%E7%9A%84%E7%BD%91%E7%BB%9C%E4%BC%98%E5%8C%96-%E5%90%90%E6%A7%BD%E5%9B%BD%E5%86%85%E7%B3%9F%E7%B3%95%E7%9A%84%E7%BD%91%E7%BB%9C%E7%8E%AF%E5%A2%83/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;在内网的树莓派上部署了 AdGuardHome，做 DNS 服务器的同时，也可以为内网所有设备过滤广告。本来嘛拦截了广告理应网络加载会更快，然而实际体验却很糟糕。网页加载要比之前慢得多。AdGuardHome 的面板显示的平均反应时间一度达到了 1000ms。1s 的延时还是会非常影响网络体验的。用 dig 命令看了下 DNS 查询的情况。不看不知道一看吓一跳，随便查询一个域名竟然废了四秒多！这怎么能忍受！&lt;/p&gt;

&lt;p&gt;[图片已丢失]
&lt;!-- ![](http://192.168.1.200/wp-content/uploads/2019/12/image-1-1280x784.png) --&gt;&lt;/p&gt;

&lt;p&gt;看网上其他人的评价，并没有我这种龟速的情况。况且我的上游 DNS 已经更换为了国内几个大厂的 DNS 比如阿里的腾讯的，测试查询一般反应时间也才 50ms。本地这个结果肯定是不能接受的。最开始还想过要根据常用域名手动制作 hosts 直接重定向。但是 dnspython 这个库不好直接指定 dns 查询，adguardhome 的 query 日志又经过特殊加密，这条路困难重重。决定将其作为备用方案。接下来进入漫长的排雷环节。&lt;/p&gt;

&lt;p&gt;首先考虑上游 DNS 中设置了谷歌等国外的 DNS，某些情况下会比国内的 DNS 慢。但是即便只留了一个阿里的 DNS，反应速度还是在秒级。&lt;/p&gt;

&lt;p&gt;接下来定位过滤器，开了五六个过滤器，按理说查询 DNS 前会先读取本地的过滤器以寻找匹配项，过滤规则一多自然会反应迟钝。禁用了一个默认的 30k 条规则的配置，速度有那么一点提升，但还是在 1s 以上，完全不能接收。这跟平时用阿里 DNS 差了几个数量级啊。&lt;/p&gt;

&lt;p&gt;后来发现了这货：&lt;/p&gt;

&lt;p&gt;[图片已丢失]&lt;/p&gt;

&lt;!-- ![](http://192.168.1.200/wp-content/uploads/2019/12/image-1280x191.png) --&gt;

&lt;p&gt;原来，他会把每次查询的域名先交给他服务器做安全性检查，这在国内的互联网环境中完全是鸡肋，而且因为每次都要连接境外服务器，其延迟可想而知。果然禁用了这一项，速度嗖嗖的就起来了：&lt;/p&gt;

&lt;!-- ![](http://192.168.1.200/wp-content/uploads/2019/12/image-2-1280x708.png) --&gt;

&lt;p&gt;[图片已丢失]&lt;/p&gt;

&lt;p&gt;即便是冷门的实验室官网的域名，也在 100ms 内解决了，对于常见的热门网站由于多设备频繁访问，会直接查询本地缓存。虽然基本只有可怜的差不多 60s 的缓存时间，但是一旦命中，就可以在 &amp;lt; 10ms 的时间响应。如果是过滤器中的域名，更是可以达到 &amp;lt; 5ms。终于，这个 AdGuard Home DNS 可以正式投入使用了。&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>坑爹的阿里云 &amp; Swap 的重要性</title>
      <link>/posts/%E5%9D%91%E7%88%B9%E7%9A%84%E9%98%BF%E9%87%8C%E4%BA%91-swap-%E7%9A%84%E9%87%8D%E8%A6%81%E6%80%A7/</link>
      <pubDate>Thu, 12 Sep 2019 00:00:00 +0000</pubDate>
      
      <guid>/posts/%E5%9D%91%E7%88%B9%E7%9A%84%E9%98%BF%E9%87%8C%E4%BA%91-swap-%E7%9A%84%E9%87%8D%E8%A6%81%E6%80%A7/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;在一次编译 VSCode 的项目中，跨越千山万水，解决重重依赖后，终于来到了编译环节。然而才开始没多久，就出现了一个匪夷所思的报错。&lt;/p&gt;

&lt;p&gt;谷歌一番，又到 /var/log/message 里查看了一番系统日志，竟然说是内存爆满，进程被 kill 了。想来我阿里云的那台服务器内存的统计曲线基本就没超过一半，今儿个怎么会出现内存爆掉的情况。又是一顿折腾发现这台阿里云的机子 Swap 大小竟然为 0？？Swap 为物理内存达到一定临界值之后，系统将磁盘的一部分空间作内存使用，一般在 Windows 系统上都是由系统自动管控，新安装的 Linux 桌面发行版也会在安装时提醒用户设置，这坑爹的阿里云在安装的时候没给我分配 Swap 分区？&lt;/p&gt;

&lt;p&gt;吐槽归吐槽，问题还是要自己解决。网上各种 swap 分区的设置教程大部分都比较模糊，代码的参数及命令都没有解释清楚，给人一种看不懂的感觉～对于操作磁盘这种敏感操作，还是要尽量避免在半懂不懂的情况下进行这种高危操作，毕竟数据无价嘛。最后找到了一篇靠谱的教程，并在服务器端和树莓派端进行实践。&lt;/p&gt;

&lt;p&gt;参考：&lt;em&gt;&lt;a href=&#34;https://linux.cn/article-9238-1.html&#34;&gt;https://linux.cn/article-9238-1.html&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;使用 fallocate 创建交换空间，我们首先在 / 目录下创建一个名为 swap_space 的文件。然后分配 4GB 到 swap_space 文件：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;fallocate -l 4G /swap_space
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;我们运行下面命令来验证文件大小：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ls -lh /swap_space
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;然后更改文件权限，让 /swap_space 更安全：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;chmod 600 /swap_space
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这样只有 root 可以读写该文件了。我们再来格式化交换分区（LCTT 译注：虽然这个 swap_space 是个文件，但是我们把它当成是分区来挂载）：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mkswap /swap_space
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;然后启用交换空间：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;swapon -s
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;每次重启后都要重新挂载磁盘分区。因此为了使之持久化，就像上面一样，我们编辑 /etc/fstab 并输入下面行：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/swap_space swap swap defaults 0 0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;保存并退出文件。现在我们的交换分区会一直被挂载了。我们重启后可以在终端运行 &lt;code&gt;free -m&lt;/code&gt;来检查交换分区是否生效。&lt;/p&gt;

&lt;p&gt;修改后 Swap 分区大小变为 4G，编译终于可以跑起来了～&lt;/p&gt;

        
        </description>
    </item>
    
  </channel>
</rss>