Treesystem - 服务器
type: channel
link: https://treesystem.cn/category/%E6%9C%8D%E5%8A%A1%E5%99%A8/
items: [译] NAT 穿透是如何工作的：技术原理及企业级实践（Tailscale, 2020）
items: Windows10 特殊开启远程连接
items: 记一次数据大迁移
items: ThinkPHP伪静态配置
items: 用yum快速搭建LAMP平台
items: 免费！申请免费Let's Encrypt泛域名SSL证书教程

[译] NAT 穿透是如何工作的：技术原理及企业级实践（Tailscale, 2020）
type: item
date: 2024-01-17T22:55:00+08:00
description: 译者序本文翻译自 2020 年的一篇英文博客： How NAT traversal works。设想这样一个问题：在北京和上海各有一台==局域网的机器==（例如一台是家里的台式机，一 台是连接到星巴克 WiFi 的笔记本），二者都是私网 IP 地址，但可以访问公网， ==如何让这两台机器通信呢？==既然二者都能访问公网，那最简单的方式当然是在公网上架设一个中继服务器： 两台机器分别连接到中继服务，后者完成双向转发。这种方式显然有很大的性能开销，而 且中继服务器很容易成为瓶颈。有没有办法不用中继，让==两台机器直接通信==呢？如果有一定的网络和协议基础，就会明白这事儿是可能的。Tailscale 的这篇==史诗级长文==由浅入深地展示了这种“可能”，如果完全实现本文所 介绍的技术，你将得到一个企业级的 NAT/防火墙穿透工具。 此外，如作者所说，==去中心化软件==领域中的许多有趣想法，简化之后其实都变成了 ==跨过公网（互联网）实现端到端直连== 这一问题，因此本文的意义并不仅限于 NAT 穿透本身。由于译者水平有限，本文不免存在遗漏或错误之处。如有疑问，请查阅原文。以下是译文。网页版目录在右侧小程序目录在底层在前一篇文章 How Tailscale Works 中， 我们已经用较长篇幅介绍了 Tailscale 是如何工作的。但其中并没有详细描述我们是 ==如何穿透 NAT 设备，从而实现终端设备直连的== —— 不管这些终端之间 有什么设备（防火墙、NAT 等），以及有多少设备。本文试图补足这一内容。1 引言1.1 背景：IPv4 地址短缺，引入 NAT全球 IPv4 地址早已不够用，因此人们发明了 NAT（网络地址转换）来缓解这个问题。简单来说，大部分机器都使用==私有 IP 地址==，如果它们需要访问公网服务，那么，出向流量：需要经过一台 NAT 设备，它会对流量进行 SNAT，将私有 srcIP+Port 转 换成 NAT 设备的公网 IP+Port（这样应答包才能回来），然后再将包发出去；应答流量（入向）：到达 NAT 设备后进行相反的转换，然后再转发给客户端。整个过程对双方透明。更多关于 NAT 的内容，可参考 (译) NAT - 网络地址转换（2016）。 译注。以上是本文所讨论问题的==基本背景==。1.2 需求：两台经过 NAT 的机器建立点对点连接在以上所描述的 NAT 背景下，我们从最简单的问题开始：如何在两台经过 NAT 的机器之间建立 ==点对点连接==（直连）。如下图所示：直接用机器的 IP 互连显然是不行的，因为它们都是私有 IP（例如 192.168.1.x）。 在 Tailscale 中，我们会建立一个 ==WireGuard® 隧道== 来解决这个问题 —— 但这并不是太重要，因为我们将==过去几代人努力==都整合到了一个工具集， ==这些技术广泛适用于各种场景==。例如，==WebRTC== 使用这些技术在浏览器之间完成 peer-to-peer 语音、视频和数据传输，==VoIP 电话和一些视频游戏==也使用类似机制，虽然不是所有情况下都很成功。接下来，本文将==在一般意义上讨论这些技术==，并在合适的地方拿 Tailscale 和其他一些东西作为例子。1.3 方案：NAT 穿透1.3.1 两个必备前提：UDP + 能直接控制 socket如果想==设计自己的协议来实现 NAT 穿透==，那必须满足以下两个条件：==协议应该基于 UDP==。理论上用 TCP 也能实现，但它会给本已相当复杂的问题再增加一层复杂性， 甚至还需要定制化内核 —— 取决于你想实现到什么程度。本文接下来都将关注在 UDP 上。如果考虑 TCP 是想在 NAT 穿透时获得==面向流的连接==（ stream-oriented connection），可以考虑用 ==QUIC== 来替代，它构 建在 UDP 之上，因此我们能将关注点放在 UDP NAT 穿透，而仍然能获得一个 很好的流协议（stream protocol）。对收发包的 ==socket 有直接控制权==。例如，从经验上来说，无法基于某个现有的网络库实现 NAT 穿透，因为我们 ==必须在使用的“主要”协议之外，发送和接收额外的数据包==。某些协议（例如 WebRTC）将 NAT 穿透与其他部分紧密集成。但如果你在构建自己的协议， ==建议将 NAT 穿透作为一个独立实体，与主协议并行运行==，二者仅 仅是共享 socket 的关系，如下图所示，这将带来很大帮助：1.3.2 保底方式：中继在某些场景中，直接访问 socket 这一条件可能很难满足。退而求其次的一个方式是设置一个 local proxy（本地代理），主协议与这个 proxy 通信 ，后…

Windows10 特殊开启远程连接
type: item
date: 2021-04-02T11:19:00+08:00
description: 前提在一次远端协助过程中，我都会比较喜欢使用Windows的远端桌面来连接远程主机，但很不巧，远程主机因安装了特殊的Windows10版本，导致远程桌面无法通过正常方式开启。故障描述Windows版本：Windows 10 企业版版本号：1809简要系统主要设置情况：Windows防火墙无法打开，Windows安全中心被删除。解决方案其实一般远程桌面无法打开，其实一般是没有开启防火墙导致，但这次Windows安全中心直接被干掉了，所以你想开启Windows安全中心这个办法无解，只能寻找其他的解决方案。策略组修改按Windows+R开启运行窗口，输入gpedit.msc打开本地策略组。依次打开计算机配置 > 管理模板 > Windows组件 > 远程桌面会话主机 > 连接，找到允许用户通过使用远程桌面服务进行远程连接，此配置项修改为已启用。服务接下来打开服务，依照下列列出的服务改成对应的启动类型，并运行服务。授权远程登录组找到本地用户和组打开组，在右侧列表中找到Remote Desktop Users双击打开，添加你需要远程登录的用户即可。重启电脑修改完成后请重启电脑使上面设置生效。校验设置系统属性依照上面设置后打开系统属性中远程选项卡，会发现远程选项虽然是不可选状态，但默认选中允许远程连接到此计算机。如果有需要直接使用网络级别身份校验可以勾选下方的选项。远程连接测试打开系统自带的远程桌面连接输入地址127.0.0.2。上面显示分别开启或未开启网络级别身份校验的连接提示，按照提示输入你授权远程的账户密码，就可完成远程桌面授权。参考来源win10专业版远程桌面无法设置 - Microsoft Community感谢头图作者 Vlada Karpovich @pexels

记一次数据大迁移
type: item
date: 2021-03-19T17:25:00+08:00
description: 大家好久不见，有一段时间没有写文了。最近刚好遇到数据迁徙，所以就有题材写了。 【真的最近给中国马克思主义灌输，所以想不出来题材了】 为什么有这次数据迁移？因为之前一直享受阿里云的优惠活动，但是最近续费发现没有优惠了，因为优惠服务器在那个时候是可以续费到2023年的，但阿里云在没有做任何公告和提示就把优惠关闭了，刚好服务器又处于等待释放期，只能被迫续费，寻找新服务器迁移了。基础服务迁移由于之前就做过完好的服务容灾备份设置，再加上有一些工具辅助，博客在新服务器开设后，下午就迁移完毕了。更新解析后 10分钟后生效[其实总的来说阿里云的延迟确实低一些（本地网络有些不稳定，样本不多，此延迟没有太大参考依据）]Docker服务迁移Docker是我最爱，很多服务或者临时测试都会在Docker上进行，也得力于Docker使得服务器环境干净，迁移Docker容器内的服务也变得十分方便，减少了很多不必要的部署麻烦。再次也建议大家尝试Docker，会给你不一样的体验。标准迁移通常如果你使用DockerHub或其他容器仓库的镜像，那么直接可以将镜像挂载卷数据复制到新服务器，重新在新服务器运行相同指令完成容器迁移就完成了。（没错，就这么简单，下面会告诉你如何做两台服务器之间如何直接传输数据）但仍需要注意执行在新服务器上的镜像需要和旧版本一致，建议大家在使用镜像时候最好可以指定镜像版本而不是latest。容器打包当如果你在原有的镜像做了处理（例如在镜像内新加服务或自定义参数），那么就需要自己打包镜像迁移。本地创建容器镜像：docker commit 容器id 要保存的镜像名称查看镜像：docker images保存镜像为文件：docker save 新镜像id -o 要保存的tar包名称.tar 将tar文件复制到新服务器：docker load -i 镜像文件名.tar镜像载入成功后，就可以正常用命令进行使用镜像创建新容器了。容器匿名挂载数据（注意）其中有些容器挂在后由于我没有做卷挂在，所有的数据在容器内部，所以需要打包镜像传输。部分Dokcer镜像是由自动做数据挂载，也就是说你可能没有做数据卷挂载，但是镜像会帮你做匿名挂载！docker inspect 容器ID "Mounts": [ { "Type": "volume", "Name": "c7fd0e66917e4cdb2b60e450bbdaa7bfd0c2069b800db4a45066a97c60dea36e", "Source": "/var/lib/docker/volumes/c7fd0e66917e4cdb2b60e450bbdaa7bfd0c2069b800db4a45066a97c60dea36e/_data", "Destination": "/data", "Driver": "local", "Mode": "z", "RW": true, "Propagation": "" } ]上面就是匿名挂载卷，需要注意也要自己手动打包挂在卷数据进行迁移。如果你只打包了容器而没有打包匿名卷数据，可以说打了个寂寞~部分特殊容器服务恢复GitLab镜像复制后运行却总报权限不足，无奈只能用原始备份命令备份命令：gitlab-rake gitlab:backup:create还原命令：gitlab-rake gitlab:backup:restore但是很神奇的事情发生了，内部读取备份又提示没权限docker exec -it gitlab update-permissions其实在第一次点对点传输的时候就使用过这个重新声明权限但没有用，神奇的是后面用还原备份的时候再用用一次居然可以了...最后就再执行了还原备份命令，GitLab就正常还原之前的数据了。额外数据迁移服务器之间数据传输 SCP那么第一步是借助工具做了基础数据服务传输，那么其他数据【容器之类的】只能用服务器相互传输。scp /hostpath user@127.0.0.1:/romtepathhostpath 本机目录user 远端用户名romtepath 远端目录依照提示输入远端认证就可以完成数据传输。多命令执行 Tmux如果细心的朋友就会发现，上面的数据传输是需要保持终端在前面运行【后台运行也是】，一旦离开终端页面传输就终止。那么我们就需要借助Tmux来为我们在服务器产生一个内部终端可供我们后台运行。yum i tmux -y新建会话：tmux new -s SESSIONNAME查看当前目前执行会话：tmux ls进入某个会话：tmux a -t SESSIONNAME让当前会话在后台运行先按住 Ctrl+B 全部松开后 按 D 就可以挂在后台运行了。服务器的小调整虚拟内存机制设置这个服务器本身就只是为了个人用（博客）且…

ThinkPHP伪静态配置
type: item
date: 2020-12-06T20:06:00+08:00
description: [scode type="yellow"]以下配置文件基于项目的二级目录Public运行[/scode]Nginxlocation / { if (!-e $request_filename){ rewrite ^(.*)$ /index.php?s=$1 last; break; } }Apache:<IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L] </IfModule>Apache还需要额外操作：httpd.conf 配置文件中需加载 mod_rewrite.so 扩展库AllowOverride None 将 None 改为 All

用yum快速搭建LAMP平台
type: item
date: 2019-10-23T08:40:00+08:00
description: 文章重写中

免费！申请免费Let's Encrypt泛域名SSL证书教程
type: item
date: 2019-04-10T12:16:00+08:00
description: [scode type="yellow"] 2020年9月10日 使用的时候发现目前办法已失效，只能每3个月重新申请[/scode]SSL是什么？SSL(Secure Sockets Layer 安全套接层 ),及其继任者 传输层安全 （Transport Layer Security，TLS）是为 网络通信 提供安全及 数据完整性 的一种安全协议。TLS与SSL在 传输层 对网络连接进行加密。为什么首先要使用HTTPS呢？它有三个主要原因：保密。这保护了双方之间的通信，使其免受诸如因特网之类的公共媒体的影响。例如，在没有HTTPS的情况下，当使用接入点的某人在线购买某物时，运行Wi-Fi接入点的某人可以看到诸如信用卡之类的私人信息。诚信。这可以确保信息完整且未经更改地到达其目标方。例如，我们的Wi-Fi好友可以在我们的网站上添加额外的广告，降低图像质量以节省带宽或更改我们阅读的文章内容。HTTPS确保无法修改网站。验证。这确保了网站安全。例如，运行Wi-Fi接入点的同一个人可以将浏览器发送到虚假网站。HTTPS确保你访问的网址是一个唯一安全网站。那为什么要生成泛域名的SSL证书呢？如果建过站的朋友一应该了解，在宝塔Linux面板中可以非常便捷的申请免费的SSL证书，但是有缺陷的是，加入我申请的是www.xxx.com证书，那么就无法适用于www2（这里是前缀）.xxx.com其他前缀的域名，所以我们借Let's Encrypt来申请泛域名证书，这样就可在七牛云等其他地方可以共用一套证书。如何申请？访问www.sslforfree.com填写泛域名和一级域名然后点击 Create Free SSL Certificate通过验证后点击Manually Verify Domain进行域名验证此时会分配需要在域名服务商填写的必要信息登入域名服务商（以阿里云为例）依照生成的验证信息设置域名解析添加TXT记录（请注意添加是要添加2个！）添加完成后点击Download SSL Certificate会进行相关验证等待验证中....证书申请成功点击Download All SSL Certificate Files可以下载生成的三个证书免费的泛域名证书到手啦！