0%

overture是一个用Go开发的DNS服务器,我个人觉得这是个神器,配置简单,使用方便。就是比较小众,用的人不多。。

以下部署步骤请在国内服务器或者本地进行。我这边就在本地的PVE开了一台Debian9部署。

首先在这里下载最新版本的压缩包:

https://github.com/shawn1m/overture/releases

用ROOT权限登录进去安装一些需要用到的工具:

apt -y install dnsutils lrzsz unzip supervisor

新建目录然后用rz命令把下载好的压缩包传到Debian内:

mkdir -p /opt/overture && cd /opt/overture && rz

解压/重命名:

unzip overture-linux-amd64.zip
cp overture-linux-amd64 overture

下载GFWLIST/CHNROUTER列表:

wget https://cokebar.github.io/gfwlist2dnsmasq/gfwlist\_domain.txt wget https://raw.githubusercontent.com/17mon/china\_ip\_list/master/china\_ip\_list.txt

编辑OVERTURE的配置文件:

nano /opt/overture/config.json

下面是我的配置:

{
“BindAddress”: “:53”,
“DebugHTTPAddress”: “127.0.0.1:5555”,
“PrimaryDNS”: [
{
“Name”: “DNSPod”,
“Address”: “119.29.29.29:53”,
“Protocol”: “udp”,
“SOCKS5Address”: “”,
“Timeout”: 6,
“EDNSClientSubnet”: {
“Policy”: “disable”,
“ExternalIP”: “”,
“NoCookie”: true
}
},
{
“Name”: “AliDNS”,
“Address”: “223.5.5.5:53”,
“Protocol”: “udp”,
“SOCKS5Address”: “”,
“Timeout”: 6,
“EDNSClientSubnet”: {
“Policy”: “disable”,
“ExternalIP”: “”,
“NoCookie”: true
}
}
],
“AlternativeDNS”: [
{
“Name”: “CloudFlareDNS”,
“Address”: “one.one.one.one:853”,
“Protocol”: “tcp-tls”,
“SOCKS5Address”: “”,
“Timeout”: 6,
“EDNSClientSubnet”: {
“Policy”: “disable”,
“ExternalIP”: “”,
“NoCookie”: true
}
},
{
“Name”: “GoogleDNS”,
“Address”: “dns.google:853”,
“Protocol”: “tcp-tls”,
“SOCKS5Address”: “”,
“Timeout”: 6,
“EDNSClientSubnet”: {
“Policy”: “disable”,
“ExternalIP”: “”,
“NoCookie”: true
}
}
],
“OnlyPrimaryDNS”: false,
“IPv6UseAlternativeDNS”: false,
“WhenPrimaryDNSAnswerNoneUse”: “PrimaryDNS”,
“IPNetworkFile”: {
“Primary”: “./china_ip_list.txt”,
“Alternative”: “”
},
“DomainFile”: {
“Primary”: “”,
“Alternative”: “./gfwlist_domain.txt”,
“Matcher”: “regex-list”
},
“HostsFile”: “./hosts_sample”,
“MinimumTTL”: 0,
“DomainTTLFile” : “./domain_ttl_sample”,
“CacheSize” : 0,
“RejectQType”: [255]
}

新建supervisor配置文件:

nano /etc/supervisor/conf.d/overture.conf

写入如下配置:

[program:overture] priority=1 directory=/opt/overture
command=/opt/overture/overture -c /opt/overture/config.json
autostart=true autorestart=true redirect_stderr=true stdout_logfile=/var/log/supervisor/overture.log

更新supervisor配置,然后查看overture的运行状态:

supervisorctl update
supervisorctl status overture

是RUNNING状态就OK了,接下来使用dig命令进行测试,正好就拿我这个破博客测试吧,我这个域名就是被污染的,如果能够解析出正确的IP那么就说明overture工作是正常的:

dig @127.0.0.1 lala.im

OK没问题:

那么现在局域网内的其他机器修改DNS地址为这台Debian的IP即可享用无污染DNS服务了:

更新

1
apt-get update && apt-get upgrade

备份一份

1
cp /etc/apt/sources.list /etc/apt/sources.list.orig

将/etc/apt/sources.list里所有“stretch”替换为“buster”

1
sed -i 's/stretch/buster/g' /etc/apt/sources.list

再更新一下

1
apt-get update && apt-get upgrade

执行升级命令

1
apt-get dist-upgrade

提示完成后重启

1
reboot

查看下当前debian版本

1
lsb_release -a

前言

前两天,TG群里的一个逗比提出让我写个关闭 QUIC 功能的教程,我去了解了一下,发现说是写教程,实际是也就是给大家提个醒,毕竟太短啦。

注意:QUIC适用于一切基于 Chromium 的浏览器,如果不是这个内核的浏览器就没必要看了。

QUIC是什么

QUIC(Quick UDP Internet Connection)是谷歌制定的一种基于 UDP 的低时延互联网传输层协议。

我们知道,TCP/IP 协议族是互联网的基础。其中传输层协议包括 TCP 和 UDP 协议。与 TCP 协议相比,UDP 更为轻量,但是错误校验也要少得多。这意味着 UDP 往往效率更高(不经常跟服务器端通信查看数据包是否送达或者按序),但是可靠性比不上 TCP。通常游戏、流媒体等应用均采用 UDP,而网页、邮件、远程登录等大部分的应用均采用 TCP。

—— 截取自 http://geek.csdn.net

而谷歌就是结合这两种协议的优势,做出了 QUIC,好吧,其实说这么多也没用,我们只需要知道 QUIC 是谷歌开发出来更好的协议就行了。

为什么要关闭

那既然更好,为什么要关闭呢?这就是因为 QUIC 为了实现 UDP 的高效,会把一些 TCP 转为 UDP,但是在国内部分地区的运营商都会针对 UDP 协议QOS限速或者丢包,这就导致 UDP 效率低下,或许速度会比正常使用TCP协议还慢很多。

而谷歌的服务器,例如 Google搜索、优土鳖视频等,都部署了 QUIC 服务,这意味着当你使用已开启 QUIC 功能的基于Chromium内核浏览器访问谷歌网站的时候,会尝试使用 QUIC 方式传输数据。而碰巧你当地运营商对 UDP协议歧视,然后疯狂限速或丢包,这时候你的速度就会很感人。

注意:各地区的运营商对 UDP协议的态度不一样,有的地区QOS严重,有的地区则很轻,所以关闭 QUIC 只对部分地区用户会有加速效果!

又或者你使用酸(5)酸(5)乳(R)代理,而**服务端没有开启 UDP 转发功能(或者防火墙没开放 UDP)**,那么你可能会遇到打开 优土鳖视频后,视频会一直缓冲无法加载,或者是首次打开总是慢很多(因为浏览器在尝试)。

目前看来,QUIC 未普及开,并且运营商也依然我行我素的歧视 UDP 协议,所以还是先关闭的好。

如何关闭QUIC

首先打开你基于Chromium内核的浏览器,地址栏输入:chrome://flags/#enable-quic

然后就会看到如下图(分别是英文和中文两种语言),在下拉框中可以选择 默认/已启用/已禁用 (Default/Enabled/Disabled) 三个选项,我们只需要把选项改为 已禁用(Disabled) 即可。

Chrome浏览器关闭 QUIC,避免部分地区运营商UDP QOS对速度的影响Chrome浏览器关闭 QUIC,避免部分地区运营商UDP QOS对速度的影响

修改后,需要重启浏览器生效。

重启后再试一下访问谷歌网站,例如优土鳖视频,看一看是否有速度提升(看当地运营商UDP协议QOS情况)。

本篇主要记录一些自己github博客搭建的过程。

1、配置 Node.js 和配置 Node.js 环境

2、安装Git和配置Git环境

注:本篇主要写搭建博客,工具类的不再赘述

3、github配置

  • 我们假设你已经有了一个 github 账号,你需要添加一个新的 new repository。点击创建一个新的 repository ,你需要将你的 Repository name 设置为 ** 账户名.github.io ** ,这一步至关重要。

  • 在建好的项目右侧有个settings按钮,点击它,向下拉到GitHub Pages,你会看到一个 http://账户名.github.io 的网址,这样,你已经有一个属于自己的博客啦。

    4、hexo 配置

  • 首先找一个合适的位置创建一个文件夹,通过 git 进入到该文件夹下

  • 输入 npm install hexo -g,开始安装Hexo

  • 输入 hexo -v,检查hexo是否安装成功

  • 输入 hexo init,初始化该文件夹。看到 ** “Start blogging with Hexo!” ** 即成功

  • 输入 npm install,安装所需组件

  • 输入 hexo g,对文件进行编译

  • 输入 hexo s,输入hexo s,开启服务器,访问该网址,正式体验Hexo。 我的默认端口是4000,如果你的页面一直无法跳转,可能是端口号被占用,可以通过 hexo server -p 端口号 进行修改。

    5、将Hexo与Github page联系起来

  • 设置Git的user name和email(对于第一次设置的童鞋)

1
2
git config --global user.name "xxx"
git config --global user.email "xxx@gmail.com"
  • 输入cd ~/.ssh,检查是否有.ssh的文件夹,输入ls,列出该文件下的内容。如果有id_rsa,id_rsa_pub,known_hosts,则说明存在。
  • 输入 ssh-keygen -t rsa -C "你的github邮箱地址",连续三个回车,生成密钥,也会自动生成两个文件:id_rsa和id_rsa.pub(默认存储路径是:C:\Users\Administrator\.ssh
  • 输入eval "$(ssh-agent -s)",添加密钥到 ssh-agent
  • 输入ssh-add ~/.ssh/id_rsa,添加生成的 SSH key 到 ssh-agent
  • 登录Github,点击头像下的settings,点击 SSH and GPG keys,点击 右侧的 new SSH key,用VS Code打开id_rsa,ctrl + A 全部复制粘贴到新建的 SSH key 中。
  • 输入ssh -T git@github.com,测试添加ssh是否成功。如果看到Hi后面是你的用户名,就说明成功了。
  • 配置Deployment,在其文件夹中,找到_config.yml文件,修改repo值(在末尾),配置成如下效果。
1
2
3
4
deploy:
type: git
repo: git@github.com:limoon7/limoon7.github.io.git
branch: master
  • 新建一篇博客,在git下执行命令:hexo new post “博客名”,这时候在文件夹_posts目录下将会看到已经创建的文件。
  • 在生成以及部署文章之前,需要安装一个扩展:npm install hexo-deployer-git --save
  • 使用编辑器编好文章,那么就可以使用命令:hexo d -g,生成以及部署了
  • 部署成功后访问你的地址:http://用户名.github.io,就可以看到你的文章啦
  • 在实际的使用中,可以修改过文件后可以先在本地预览预览,通过hexo -s 命令
  • 个人一般使用的顺序为: hexo clean ,hexo -g ,hexo -shexo -d

6、配置 yilia 主题

是不是觉得配置好的不是很美观,那就来一个优雅大方的主题吧!

参考资料:一个简洁优雅的hexo主题 A simple and elegant theme for hexo.

7、遇到的一些问题

-hexo d 出现ssh连接问题,如下所示

1
ssh: connect to host github.com port 22: Connection timed out

解决方法:git 连接 github 超时问题

引言

acme.sh 是一个 ACME(自动化证书管理环境) 脚本,可以从 letsencrypt 生成免费的证书。

本来这个教程是写在 编译Nginx支持TLS1.3 那篇帖子里的,后来感觉还是单独拿出来比较好,即能让那篇教程更简洁,也能更方便的让需要的人看到这个教程。

安装工具

1
apt-get install cron socat -y

获取 acme.sh

1
curl  https://get.acme.sh  sh

重启终端,如果你使用 zsh 可以这样 source ~/.zshrc

生成证书

使用 http 方式验证域名,需要先搭建 HTTP 站点,这里使用 acme.sh 自带的 webserver,所以先把 nginx 停掉

1
service nginx stop

接下来指定域名,开始签发

1
2
3
acme.sh --issue -d onmp.ooo \
--keylength ec-256 \
--standalone

如果是多域名,可以使用 -d 参数添加,如:-d www.onmp.ooo --keylength ec-256 是签发 ECC 类型的证书,它的安全性更高,删除则使用默认的 RSA 证书

复制证书

证书已经签发了,不过默认是保存在 ~/.acme.sh/ 里

1
2
3
4
acme.sh --ecc --installcert -d onmp.ooo \
--key-file /usr/local/nginx/conf/ssl/onmp.ooo.key \
--fullchain-file /usr/local/nginx/conf/ssl/onmp.ooo.cer \
--reloadcmd "service nginx restart"

指定域名,指定证书保存目录,我这里设置在 /usr/local/nginx/conf/ssl/,指定 Nginx 重载命令,如果签发的不是 ECC 证书,把 --ecc 参数去掉

这样使用 acme.sh 就完成了证书的签发,如果证书快要过期了,脚本会自动更新证书

脚本自动更新,可以使用以下命令

1
acme.sh --upgrade --auto-upgrade

 

证书安装

证书已经获取并且可以自动更新了,具体安装方法看 编译Nginx支持TLS1.3

前言

有时候需要在外边访问家里的设备,而众所周知一般家里都没有固定 IP 的,这时候就要内网穿透了,说到穿透的时候,大家都会提到 DDNS(动态域名解析),或者使用反向代理的方式如 FRP、Ngrok。

首先说说 DDNS,这种方式使用起来很方便,只要设置好相应的服务提供商的 API,就能做到每次 IP 变化后自动解析,这样不管家里 IP 怎么变,用域名都能访问回家。这里最大的硬伤就是公网IP,有些朋友的带宽就是个大局域网,路由器只能获取到上一级内网的 IP,这时就 GG 了。

然后是 FRP、Ngrok 这样的反向代理程序,通过服务器转发数据来达到外网访问的目的,这样就需要自己有个 VPS,或者使用他人搭建的服务,据我所知的免费服务都是限速的,要是自己搭建的话,体验就要看服务器的网络质量了。

现在我们就来看看,不需要公网 IP,不依赖服务端网络性能的 ZeroTier

简介

ZeroTier 官网上说

ZeroTier is a smart Ethernet switch for planet Earth.

!!! 适用于地球的智能网络交换机 …

它是一个分布式网络虚拟机管理程序,建立在加密安全的全球对等网络之上。它提供与企业 SDN 交换机同等的高级网络虚拟化和管理功能,而且可以跨本地和广域网并连接几乎任何类型的应用程序或设备。

好吧?,有点牛逼

而说到主要功能,就是可以把多个不同网络的设备连接在一起,用来就像在一个局域网下

例如,我在路由器上装了 ZeroTier,路由器挂了一个硬盘,而现在我在外边想要访问这个硬盘,那么只需要运行电脑上的 ZeroTier,就能通过 Samba、FTP 等方式访问硬盘,而且看起来就像我就在家里一样。

基本原理介绍

说白了就是 P2P(Peer to Peer),而且组织方式很像 DNS(关于 DNS 可以看这里)

根服务器 R 记录了路径信息,设备 A 能通过ZeroTier唯一地址标识找到需要连接的设备 B

这个过程如下:

  1. A 想要将数据包发送到 B,但由于它没有直接路径,因此将其向上发送到 R。
  2. 如果 R 有直接链接到 B,它会转发数据包给 B。否则它会继续向上游发送数据包,直到达到行星根(planet)。行星根知道所有节点,所以如果 B 在线,最终数据包将到达 B。
  3. R 还向 A 发送一个名为会和的消息,包含有关它如何到达 B 的提示。同时,将会和发给 B,通知 B 它如何到达 A。
  4. A 和 B 获取它们的会合消息并尝试相互发送测试消息,可能会对 NAT 或状态防火墙进行穿透。如果这样可以建立直接链路,则不再需要中继。
  5. 如果无法建立直接路径,则通信可以继续中继(速度慢)

ZeroTier 官方搭建了一个行星根服务器叫做地球 Earth,行星根服务器唯一的且是免费的,它记录了所有的路径信息,一般情况下大家都直接用的这个。除此之外还有 12 个遍布全球的根服务器,这些是收费的服务。所以如果使用免费套餐,连接时的延迟可能会很高,另外由于 Earth 在国外,一些不确定因素可能会影响到使用。考虑到网络的不确定性,ZeroTier 能自己创建根服务器月球 Moons,这样就能在大局域网中得到更好的体验了。

安装

ZeroTier 是跨平台的,能安装在几乎任何平台

Windows、macOS、Linux、iOS、Android、QNAP、Synology、西数 MyCloud NAS,下载地址:https://www.zerotier.com/download.shtml

路由器推荐安装 Entware 后使用 opkg install zerotier 命令安装

ZeroTier使用教程

因为我们没有自己创建 Moons 服务器,现在就先使用 ZeroTier 提供的服务

注册

地址:https://my.zerotier.com/

注册

注册之后是这样的,保持默认就好,免费套餐能连接 100 个设备,一般人够用了

账户

创建网络

创建网络

创建一个新的网络之后,我们得到一个 Network ID,这个在后面的设备连接时需要用到,点击刚刚创建的网络我们可以设置更多选项

网络设置

默认的设置就可以用了,右边 IPv4 的设置就是分配设备内网 IP 网段,其他的设置可以在 Setting help 里看到说明,不了解的不建议乱设置,如果不小心把自己的网络暴露在外部,会相当危险

连接

直接在客户端输入刚才创建的 Network ID

电脑

macOS

路由器

我这里使用的是安装了 Entware 的 LEDE

# 启动
zerotier-one -d

# 获取地址和服务状态
zerotier-cli status

# 加入、离开、列出网络
zerotier-cli join # Network ID
zerotier-cli leave # Network ID
zerotier-cli listnetworks

允许连接

后台设置默认是需要 Auth 才能连接的,在客户端申请加入网络后,需要在后台允许一下

允许加入

测试连接

为了测试不同网络访问,我添加了一台安卓手机,在移动网络下直接使用分配给路由器的 IP,连接了 ssh 和 onmp 创建的 PHP 探针页面,而且速度还算不错,宽带是电信的,手机是联通的,下文件时能有个 800k/s,不知道瓶颈在哪

安卓

结语

目前 IPv6 还没得到普及,虽然我这里已经能有 IPv6 地址并且能 IPv6 站点了,奈何不是固定 IP,也不知道哪时才能人手一个固定 IP。就目前情况来看,使用 ZeroTier 来做内网穿透还是不错的,使用门槛较低,可用性也还行,值得一试。

引言

数据无价,平时不注意备份,电脑突然翻车就追悔莫及啦。

最开始的时候,我在路由器上开启 Samba,每次编辑完项目就手动拷贝到路由器硬盘里,麻烦程度可想而知,后来又用了 Google Drive/One Drive,又因为它们的网络不理想,就又放弃使用了。

其实就是很简单的需求,自动备份、速度快,然后去找了一下,发现一堆人推荐用 Rsync,这货我只在 VPS 上用过,拿来做镜像同步,但是要做实时同步,不好配置。

我就想,这需求应该有一大堆人有吧,就去 github 搜索 sync,发现 Syncthing 这么个好东西,截止 2018-06-13 已经得到 20k+ 的 star,并且更新很活跃

介绍

logo

Syncthing 是一个文件连续同步软件

项目地址:https://github.com/syncthing/syncthing

它有以下特性:

  • 跨平台
    • 使用 Golang 开发,几乎能在所有平台上使用,包括常见的安卓手机和路由器平台
  • 易于使用
    • 只需要下载运行,打开浏览设置本地目录和远程主机,其他的不需要管
  • 安全
    • 管理页可以设置密码,可以设置 https,设置备份需要两边都确认,使用唯一设备标识进行确认

安装

Syncthing 有多种安装方式

有一定 Linux 基础的人,可以使用下面的配置来设置启动服务

Windows,Mac,Linux 和安卓手机可以在这里下载有 GUI 界面的程序使用

其他方法可以自己决定,我是直接下载安装包命令行启动的

在 macOS 上安装

我用的是 macOS,可以直接使用 homebrew 安装启动,并且可以开机自动启动,你也可以到这里 QSyncthingTray 下载 macOS 的 GUI 版

brew install syncthing

启动服务(同时设置开机启动)

brew services start syncthing

停止服务(同时关闭自启)

brew services stop syncthing

手动启动(不会开机自启)

syncthing

启动进程后,可以用浏览器打开 http://localhost:8384/ 来查看 web 管理页

在 Windows 上安装

Windows 直接在这里 SyncTrayzor 下载软件运行

在 Linux VPS 上安装

大多数发行版和不同 CPU 平台的安装包,可以在这里 Syncthing 找到,把它下载到你想要放在的目录然后设置权限,使用命令运行

文章开头有 GUI 版本的链接,不过我要装在没有 GUI 的 VPS 上,所以直接用命令行运行,系统用的是 Debian 9,然后用 supervisor 进程守护来启动的

碰巧前几天之前的一个客户,他的 VPS 做迁移,阿里云送了张代金券,然后客户就送给我了

aff

然后续费 9 个月的阿里云学生机,美滋滋?

虽然带宽比较低,但是对于这种连续同步的备份来说,在第一次备份之后,后面都是增量备份了,除非你都是备份大文件,要不对带宽的要求不是很高,另外 40G 的盘,完全够我备份用了,阿里云最主要就是稳定,很适合做我的备份机

下载 Syncthing

下载最新的包,解压,移动到 /bin/ 里,改权限

wget https://github.com/syncthing/syncthing/releases/download/v0.14.49-rc.1/syncthing-linux-amd64-v0.14.49-rc.1.tar.gz

tar xzvf ./syncthing-linux-amd64-v0.14.49-rc.1.tar.gz

mv ./syncthing-linux-amd64-v0.14.49-rc.1/syncthing /bin/

chmod +x /bin/syncthing

进程守护

安装 supervisor

apt-get install supervisor

配置守护

vi /etc/supervisor/conf.d/syncthing.conf

填入以下内容

[program:syncthing]
command = /bin/syncthing -no-browser -home=“/root/.config/syncthing”
directory = /root
autorestart = True
user = root
environment = STNORESTART=“1”, HOME=“/root”

注意,我例子里使用的是 root 用户,所以响应的目录是 /root,你要是使用其他用户,应该是 /home/用户名,就是你登录时默认所在的目录

现在就可以使用 supervisorctl 命令来管理进程了

  • 启动

supervisorctl start syncthing

  • 重启

supervisorctl restart syncthing

  • 停止

supervisorctl stop syncthing

启动进程后,可以用浏览器打开 http://你的IP:8384/ 来查看 web 管理页

如果无法打开页面,需要修改 /.config/syncthing/config.xml 里的 127.0.0.1:8384 字段为 0.0.0.0:8384,或者你可以和我一样使用 nginx 做反向代理,前提是你知道怎么做

在路由器上安装

目前 Entware 源里已经有这个包了,但是我发现它是个旧版本,并且有问题,所以这里我选择手动安装

这里的例子是 LEDE x64 但是也适合一切安装了 Entware 的路由器

在这里 Syncthing 下载对应 CPU 平台的安装包,可以用 uname -m 查看,我这里是 x86_64 所以选择 amd64

下载 syncthing

下载最新的包,解压,移动到 /opt/bin/ 里,改权限

wget https://github.com/syncthing/syncthing/releases/download/v0.14.49-rc.1/syncthing-linux-amd64-v0.14.49-rc.1.tar.gz

tar xzvf ./syncthing-linux-amd64-v0.14.49-rc.1.tar.gz

mv ./syncthing-linux-amd64-v0.14.49-rc.1/syncthing /opt/bin/

chmod +x /opt/bin/syncthing

添加启动命令

创建并编辑 /opt/etc/init.d/S92syncthing

vi /opt/etc/init.d/S92syncthing

在里面填上下面所有字段

#!/bin/sh
ENABLED=yes
PROCS=syncthing
ARGS=”-home=/opt/etc/syncthing”
PREARGS=””
DESC=$PROCS
PATH=/opt/sbin:/opt/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

if [ ! -d /opt/etc/syncthing ]; then
/opt/bin/syncthing -generate=”/opt/etc/syncthing”
sed -i ‘s127.0.0.1:83840.0.0.0:8384’ /opt/etc/syncthing/config.xml
elif [[ -f /opt/etc/syncthing/config.xml -a “127.0.0.1:8384”==”127.0.0.1:8384” ]]; then
sed -i ‘s127.0.0.1:83840.0.0.0:8384’ /opt/etc/syncthing/config.xml
fi

. /opt/etc/init.d/rc.func

然后给权限

chmod +x /opt/etc/init.d/S92syncthing

用法: /opt/etc/init.d/S92syncthing (startstoprestartcheck)

启动服务就能在浏览器打开 路由器IP:8384 例如 192.168.1.1:8384 打开管理页了

使用方法

易于使用是 Syncthing 的一个重要特性,打开管理页,一目了然

首次打开管理页,所有平台上都是一样的

syncthing

然后你需要做的就是

设置用户名、密码

setpass

设置文件夹

删除默认的同步文件夹,添加新同步文件夹

addlocal

添加远程设备

addremote

然后稍微等一分钟,两边就能连接上了

最终效果

end

结语

Syncthing 作为一款跨平台同步软件,它简单易用、功能完善强大,具有很高的稳定性,很容易让人想出各种使用场景,而且它还是开源的,感谢那上百位贡献者

本文简单介绍了初级使用方法,还未提及其他的诸如版本控制等功能,其他功能应用,如果以后我觉得值得一说,再更新了

本文章发表于底噪博客 https://zhih.me , 转载请注明

引言

TLS1.2 发布于 2008 年 8 月,至今正好有 10 年,随着互联网安全越来越受到重视,新协议 TLS1.3 呼之欲出。值得一提的是,从第一份草案编写至今,已经有几年时间了,截止这篇文章编写,已经是第 28 份草案。在最近的 Chrome 版本更新中也逐步对 TLS1.3 进行支持,Chrome 65 开始默认开启 draft 23、Chrome 68 开始支持 draft 28

更新:TLS 1.3 标准已于 2018 年 8 月正式发布为 RFC 8446 ,距 TLS1.2 发布正好 10 周年

TLS1.3 对于 TLS1.2 有重大改写,既提高了安全性又提高了速度,以至于有争议称,应该把它叫做 TLS2.0

关于 TLS1.3 的科普可以看下面的页面

https://wiki.openssl.org/index.php/TLS1.3 https://zhuanlan.zhihu.com/p/28850798

之前我也写过 Nginx 的 https 的配置 https://zhih.me/nginx-http2-https/ ,当时是使用 TLS1.2 的

碰巧前几天发现 .ooo 可以免费用 1 年,就撸了一个 onmp.ooo 来做为我 onmp 项目的页面,把它搭在 4 刀年付的 virmach 上,顺便测试 TLS1.3

一键安装

最近更新支持防火墙功能,详情可以看 https://zhih.me/ngx-lua-waf/

sh -c “$(curl -kfsSl https://raw.githubusercontent.com/xzhih/nginx-compile/master/install.sh)"

安装

我这里用的系统是 Debian 8

安装依赖

apt-get install git gcc make build-essential -y

下载源码

我们把源码全都放在一个地方,方便使用,创建 nginx 的运行用户 www-data

rm -rf /usr/src/
mkdir -p /usr/src/
mkdir -p /var/log/nginx/
useradd -s /sbin/nologin -M www-data

克隆 OpenSSL

这里用的是 1.1.1 稳定版的源码

cd /usr/src
wget https://github.com/openssl/openssl/archive/OpenSSL\_1\_1\_1.tar.gz
tar xzvf OpenSSL_1_1_1.tar.gz
mv openssl-OpenSSL_1_1_1 openssl

下载 Nginx 的源码

cd /usr/src/
wget https://nginx.org/download/nginx-1.15.6.tar.gz
tar zxf ./nginx-1.15.6.tar.gz
mv nginx-1.15.6 nginx

克隆 zlib

开启 gzip 要用到 zlib 库,这里使用的是 Cloudflare 优化的版本,比原版具有更高的压缩性能

cd /usr/src/
git clone https://github.com/cloudflare/zlib.git zlib
cd zlib
make -f Makefile.in distclean

克隆 Brotli

就像 gzip 一样,Brotli 也是一种压缩算法,它是由谷歌开发的一个更适合文本压缩的算法,因为它使用了字典,所以有更好的压缩比。

现在主流浏览器都已经支持 Brotli 了,而且也能与 gzip 共存,如果浏览器支持 Brotli 就会优先使用,所以可以放心兼容性,可以在这里看到支持的数据 https://caniuse.com/#search=Brotli

cd /usr/src/
git clone –recursive https://github.com/google/ngx\_brotli.git

我给 nginx 默认配置的 Brotli 压缩等级为 6 级,这对于动态内容比较友好,如果你是像我现在这个博客一样是静态化的,那么建议开启 11 级压缩,这样可以获得最好的体验

下载 PCRE

nginx rewrite 模块需要 pcre 库

cd /usr/src/
wget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz
tar zxf ./pcre-8.42.tar.gz

给 OpenSSL 打补丁

补丁来自:https://github.com/hakasenyang/openssl-patch

此补丁的目的是让 OpenSSL 支持 TLS1.3 的 23,26,28 草案,以及 Final 版标准

cd /usr/src/
git clone https://github.com/hakasenyang/openssl-patch.git
cd /usr/src/openssl
patch -p1 < ../openssl-patch/openssl-equal-1.1.1_ciphers.patch
patch -p1 < ../openssl-patch/openssl-1.1.1-chacha_draft.patch

给 Nginx 打补丁

补丁来自:https://github.com/kn007/patch

nginx 补丁

  • 添加SPDY支持。
  • 添加HTTP2 HPACK编码支持。
  • 添加动态TLS记录支持。

nginx_auto_using_PRIORITIZE_CHACHA 补丁

  • 支持时使用 SSL_OP_PRIORITIZE_CHACHA

cd /usr/src/
git clone https://github.com/kn007/patch.git nginx-patch
cd /usr/src/nginx
patch -p1 < ../nginx-patch/nginx.patch
patch -p1 < ../nginx-patch/nginx_auto_using_PRIORITIZE_CHACHA.patch

使用 jemalloc 作为内存管理

cd /usr/src/
wget https://github.com/jemalloc/jemalloc/releases/download/5.1.0/jemalloc-5.1.0.tar.bz2
tar xjvf jemalloc-5.1.0.tar.bz2
cd jemalloc-5.1.0
./configure
make && make install
echo ‘/usr/local/lib’ >> /etc/ld.so.conf.d/local.conf
ldconfig

其他编译配置

Nginx 默认会以 debug 模式编译,我们需要注释掉 /usr/src/nginx/auto/cc/gcc 中 CFLAGS="$CFLAGS -g" 这行,这样可以减少生成文件的大小

sed -i ‘s@CFLAGS=”$CFLAGS -g”@#CFLAGS=”$CFLAGS -g”@’ /usr/src/nginx/auto/cc/gcc

编译安装

cd /usr/src/nginx
./configure \
--user=www-data –group=www-data \
--prefix=/usr/local/nginx \
--sbin-path=/usr/sbin/nginx \
--with-compat –with-file-aio –with-threads \
--with-http_v2_module –with-http_v2_hpack_enc \
--with-http_spdy_module –with-http_realip_module \
--with-http_flv_module –with-http_mp4_module \
--with-openssl=../openssl –with-http_ssl_module \
--with-pcre=../pcre-8.42 –with-pcre-jit \
--with-zlib=../zlib –with-http_gzip_static_module \
--add-module=../ngx_brotli \
--with-ld-opt=-ljemalloc

make
make install

Nginx 的可执行文件安装在 /usr/sbin/nginx ,Nginx 配置在 /usr/local/nginx/conf/ 里

配置

Nginx 已经安装上了,现在我们来配置网站,让它跑起来

Nginx 全局配置

把以下内容覆盖填入 /usr/local/nginx/conf/nginx.conf

user www-data;
pid /var/run/nginx.pid;
worker_processes auto;
worker_rlimit_nofile 65535;

events {
use epoll;
multi_accept on;
worker_connections 65535;
}

http {
charset utf-8;
sendfile on;
aio threads;
directio 512k;
tcp_nopush on;
tcp_nodelay on;
server_tokens off;
log_not_found off;
types_hash_max_size 2048;
client_max_body_size 16M;

# MIME
include mime.types;
default_type application/octet-stream;

# Logging
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log warn;

# Gzip
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript application/xml+rss application/atom+xml image/svg+xml;
gzip_disable “MSIE [1-6]\.(?!.*SV1)”;

# Brotli
brotli on;
brotli_comp_level 6;
brotli_static on;
brotli_types text/plain text/css text/xml application/json application/javascript application/xml+rss application/atom+xml image/svg+xml;

include vhost/*.conf;
}

Nginx 站点配置

我们已经在全局配置里设置了包含 /usr/local/nginx/conf/vhost/ 目录下的 conf 文件

mkdir -p /usr/local/nginx/conf/vhost/

然后在 /usr/local/nginx/conf/vhost/ 里创建站点配置,比如我的是 onmp.ooo.conf

server {
listen 80;
server_name onmp.ooo;
root /wwwroot/onmp.ooo;
location / {
index index.html;
}
}

这样 HTTP 的站点配置就弄好了,不过还站点还没页面,我们把 Nginx 的欢迎也面给放进去

mkdir -p /wwwroot
cp -r /usr/local/nginx/html /wwwroot/onmp.ooo

# 配置站点目录权限
chown -R www-data:www-data /wwwroot/
find /wwwroot/ -type d -exec chmod 755 {} \;
find /wwwroot/ -type f -exec chmod 644 {} \;

service 配置

service 命令用于对系统服务进行管理,比如启动(start)、停止(stop)、重启(restart)、查看状态(status)等,我们是编译安装的,所以要手动创建服务文件。

mkdir -p /usr/lib/systemd/system/

编辑 /usr/lib/systemd/system/nginx.service 写入以下内容

[Unit]
Description=nginx - high performance web server
After=network.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPost=/bin/sleep 0.1
ExecStartPre=/usr/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/usr/sbin/nginx -s stop

[Install]
WantedBy=multi-user.target

启动服务

systemctl daemon-reload #重载
systemctl enable nginx #开机启动
systemctl start nginx #运行

我们现在可以用 service 或 systemctl 管理 nginx 了

启动 Nginx 后 HTTP 页面就正常了,打开 onmp.ooo 就能看到 Welcome to nginx!

签发证书

配置 HTTPS 首先要有证书,我这里是使用 acme.sh 自动颁发 Let’s Encrypt 的证书

具体使用教程看我的另一篇教程 使用acme.sh获取免费SSL证书

当然,你要是已经有了 SSL 证书,直接看下面配置文件里证书存放的目录,直接放到里面去就行,其他操作一样的

HTTPS 站点配置

因为我给 OpenSSL 打的是 equal-1.1.1_ciphers 补丁,所以 ssl_ciphers 配置文件如下,如果你打的是别的补丁,则需要查看 https://github.com/hakasenyang/openssl-patch 给的配置

server {
listen 80;
server_name onmp.ooo;
return 301 https://onmp.ooo$request\_uri;
}

server {
listen 443 ssl http2;
server_name onmp.ooo;
root /wwwroot/onmp.ooo;

# SSL
ssl_certificate /usr/local/nginx/conf/ssl/onmp.ooo.cer;
ssl_certificate_key /usr/local/nginx/conf/ssl/onmp.ooo.key;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ‘[TLS13+AESGCM+AES128TLS13+AESGCM+AES256TLS13+CHACHA20]:[EECDH+ECDSA+AESGCM+AES128EECDH+ECDSA+CHACHA20]:EECDH+ECDSA+AESGCM+AES256:EECDH+ECDSA+AES128+SHA:EECDH+ECDSA+AES256+SHA:[EECDH+aRSA+AESGCM+AES128EECDH+aRSA+CHACHA20]:EECDH+aRSA+AESGCM+AES256:EECDH+aRSA+AES128+SHA:EECDH+aRSA+AES256+SHA:RSA+AES128+SHA:RSA+AES256+SHA:RSA+3DES’;
ssl_ecdh_curve X25519:P-256:P-384;
ssl_prefer_server_ciphers on;

ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_session_tickets on;

# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 119.29.29.29 8.8.8.8 valid=300s;
resolver_timeout 10s;

# Security headers
add_header X-Frame-Options “SAMEORIGIN” always;
add_header X-XSS-Protection “1; mode=block” always;
add_header X-Content-Type-Options “nosniff” always;
add_header Referrer-Policy “no-referrer-when-downgrade” always;
add_header Strict-Transport-Security “max-age=31536000; includeSubDomains; preload” always;

location / {
index index.html;
http2_push /style.css;
}

location ~ .*\.(gifjpgjpegpngbmpswfico)$ {
expires 30d;
}

location ~ .*\.(jscss)?$ {
expires 15d;
}
}

以上就是完整的站点配置文件,覆盖 /usr/local/nginx/conf/vhost/onmp.ooo.conf 后,使用 service nginx reload 重载 Nginx 再打开站点就能看到 HTTPS 的页面了

验证

在 Chrome 65 或更新的版本中,打开开发者工具的 Security 菜单,就能在里面看到 站点是否以 TLS1.3 连接

chrome

或者可以到 SSL Server Test:https://www.ssllabs.com/ssltest/index.html 进行测试

ssllabs

我只开启了 TLSv1.2 TLSv1.3 的支持,如果需要,你可以自己增加其他协议的支持

结语

人们的生活已经离不开网络,所以网络安全在现在和未来都至关重要,曾经很多站长都以 HTTPS 影响站点速度为由,又或者说 SSL 证书昂贵,拒绝配 HTTPS,而随着技术的迭代升级,配置 HTTPS+HTTPS2 能提高网站速度,而 SSL 不仅可以免费获取,还可以使用命令自动获取自动更新,在我看来已经没有理由不配置 HTTPS 了,所以希望各位站长,都赶紧上车吧

本文章发表于底噪博客 https://zhih.me , 转载请注明

mkcert 是由 Filippo Valsorda 使用go语言开源的一款零配置搭建本地证书服务的工具,它可以兼容Window, Linux, macOS等多种开发平台,省去了我们自签本地证书的繁琐步骤,从而让我们专注于开发。

1. 安装mkcert

1.1 Windows

Windows环境下,推荐使用Chocolatey包管理工具安装mkcert,你可以选择使用cmdpower shell安装Chocolatey

以管理员权限打开cmd窗口,输入以下命令进行安装

1

@”%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe” -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command “iex ((New-Object System.Net.WebClient).DownloadString(‘https://chocolatey.org/install.ps1'))" && SET “PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin”

以管理员权限打开power shell窗口,输入以下命令进行安装

1

Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString(‘https://chocolatey.org/install.ps1'))

Chocolatey安装完成之后,命令行窗口输入以下命令安装mkcert

1

choco install mkcert

1.2 Linux

以下假定使用的是全新的Linux系统!

首先更新软件源,防止E: Unable to locate package的错误,

1

sudo apt update

首先安装证书数据库工具certutil:

1
2

sudo apt install libnss3-tools // ubuntu
sudo yum install nss-tools // centos

然后,安装包管理工具Linuxbrew:

1
2

sudo apt install linuxbrew-wrapper // ubuntu
sudo yum install linuxbrew-wrapper // centos 待定

最后,使用brew安装mkcert

1

brew install mkcert

tips:可能需要执行两次命令,同时不要使用sudo命令,系统会提示你不要使用root权限来执行brew

mkcert安装目录下启动mkcert,推荐将mkcert加入全局命令,

1

PATH=$PATH:/home/linuxbrew/.linuxbrew/Cellar/mkcert/1.2.0/bin

1.3 macOS

使用Homebrew安装mkcert

1
2

brew install mkcert
brew install nss # if you use Firefox

2. 生成本地CA证书

2.1 生成根证书

mkcert安装完成之后就可以使用mkcert命令生成本地CA证书了,非常简单,傻瓜式安装。

首先,生成根证书,一般在C:\Users\用户名\AppData\Local\mkcert目录下会生成rootCA.pemrootCA-key.pem两个文件。

根证书用来充当第三方证书签发机构,类似于Symantec这种机构,为网站签发CA证书。因为证书也可以伪造,所以浏览器需要验证证书的有效性,证书有效之后才可以进行https连接,而第三方签发机构提供证书的可信度验证。

rootCA文件就是告诉浏览器我们自签的证书是真实有效的,接下来我们签发的本地证书都离不开rootCA

1
2
3
4

$ mkcert -install
Created a new local CA at “/Users/filippo/Library/Application Support/mkcert” ?
The local CA is now installed in the system trust store! ⚡️
The local CA is now installed in the Firefox trust store (requires restart)! ?

2.2 签发本地证书

根证书生成之后就可以签发本地证书了,命令超级简单,唯一需要注意的就是生成的证书存放路径就是命令的执行路径。

1
2
3
4
5
6
7
8
9
10
11
12

$ mkcert example.com “*.example.org” myapp.dev localhost 127.0.0.1 ::1
Using the local CA at “/Users/filippo/Library/Application Support/mkcert” ✨

Created a new certificate valid for the following names ?

  • “example.com”
  • “*.example.org”
  • “myapp.dev”
  • “localhost”
  • “127.0.0.1”
  • “::1”

The certificate is at “./example.com+5.pem” and the key at “./example.com+5-key.pem” ✅

2.3 root stores

mkcert支持以下根存储(mkcert supports the following root stores:):

  • macOS system store
  • Windows system store
  • Linux variants that provide either
    • update-ca-trust (Fedora, RHEL, CentOS) or
    • update-ca-certificates (Ubuntu, Debian) or
    • trust (Arch)
  • Firefox (macOS and Linux only)
  • Chrome and Chromium
  • Java (when JAVA_HOME is set)

这句话的意思就是说,mkcert会自动把证书加入系统认证,操作系统和浏览器可以直接识别。比如,证书安装完成之后chrome的证书信任中心会增加以下内容:

2.4 node环境验证

node不会使用root store,因此需要特殊对待,命令行手动设置NODE_EXTRA_CA_CERTS这个环境变量。

1

set NODE_EXTRA_CA_CERTS=”$(mkcert -CAROOT)/rootCA.pem”

** mkcert -CAROOT会输出本地根证书的存储路径,可以使用环境变量$CAROOT来指定寻找证书的默认路径。

使用node开启https服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

var https = require(‘https’);
var fs = require(‘fs’);

const hostname = ‘127.0.0.1’;
const port = 3000;

var options = {
key : fs.readFileSync(‘c:/证书路径’),
cert : fs.readFileSync(‘c:/证书路径’),
}

const server = https.createServer(options ,(req, res) => {
res.statusCode = 200;
res.setHeader(‘Content-Type’, ‘text/plain’);
res.end(‘Hello World\n’);
});

server.listen(port, hostname, () => {
console.log(`Server running at https://${hostname}:${port}/`);
});

https进行访问:

3. 分享

搞定了自己,接下来就要搞定别人,如何让其它用户也识别我们的本地证书呢?

mkcert同样也给我们提供了可移植的解决方案。

将自签证书(包括公钥和私钥)以及根证书的公钥拷贝给其它用户,修改$CAROOT环境变量,指定mkcert寻找根证书的路径,

linux系统下:

1

export CAROOT=”/home/…”

window系统下:

设置系统的环境变量,变量名为CAROOT

我的电脑->属性->高级系统设置->环境变量

最后执行mkcert -install即可,控制台会提示,此时我们的自签证书就可以在其它机器上运行了,根证书被导入到了浏览器的证书信任中心。

1
2

The local CA is now installed in the system trust store! ⚡️
The local CA is now installed in the Firefox and/or Chrome/Chromium trust store (requires browser restart)! ?

CentOS 7/Debian 9等新内核均已自带BBR,直接启用,安全。

一、CentOS 7启用原生Google BBR

(一)更新CentOS 7内核为支持BBR的内核

1、查看Centos内核

uname -r

2、如果低于4.10,则更新内核

rpm –import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
yum –enablerepo=elrepo-kernel install kernel-ml -y

3、安装完成后,查看已安装的内核:

rpm -qa grep kernel

如果看到 kernel-ml-5.3.5-1.el7.elrepo.x86_64 字样的,即是成功。 4、更新开机启动

egrep ^menuentry /etc/grub2.cfg cut -f 2 -d \‘

会看到类似这样的

CentOS Linux (5.3.5-1.el7.elrepo.x86_64) 7 (Core)
CentOS Linux (3.10.0-957.1.3.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-96820b9851c24560b5f942f2496b9aeb) 7 (Core)

设置CentOS Linux (5.3.5-1.el7.elrepo.x86_64) 7 (Core)为第一启动顺序(因为启动是从0开始计算)

grub2-set-default 0

5、重启系统

reboot

(二)CentOS 7启用BBR

1、执行

echo ‘net.core.default_qdisc=fq’ sudo tee -a /etc/sysctl.conf
echo ‘net.ipv4.tcp_congestion_control=bbr’ sudo tee -a /etc/sysctl.conf
sysctl -p

2、查看内核是否已开启BBR

sysctl net.ipv4.tcp_available_congestion_control

lsmod grep bbr

如果均显示BBR字样的,表示开启BBR成功。

二、Debian 9启用原生Google BBR

1、修改系统变量

1
2
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf

2、保存生效

1
sysctl -p

3、查看内核是否已开启BBR

1
sysctl net.ipv4.tcp_available_congestion_control

显示如下内容表示开启:

1
2
sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = bbr cubic reno

4、通过上面的操作应该已经启动了BBR。再看下BBR是否启动。

1
lsmod  grep bbr

显示以下即启动成功:

1
2
lsmod  grep bbr
tcp_bbr 20480 14