前言

有时候需要在外边访问家里的设备,而众所周知一般家里都没有固定 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

1:查看服务器上未挂载的磁盘(磁盘有普通磁盘,高效磁盘,SSD磁盘);命令如下: fdisk –l

从上图可以看出,服务器的 /dev/vdb 42.9GB 此磁盘未挂载;

2:磁盘分区(分区有主分区,扩展 分区,逻辑分区);命令如下:

fdisk /dev/vdb n->p->1->回车->回车->w

上图的大概意思是这样的: n:添加一个分区 P:主分区 两个回车指是开始和结束的磁盘大小; w:写入磁盘 此时磁盘虽然已经分区,但是还没有文件系统,磁盘依然不能用; 博主服务器只购买了一块数据盘,所以我就全部用来做主分区了,如果你想把一个磁盘分成好几块,可以继续按此命令分区即可;你可以继续创建扩展分区……;

3:格式化磁盘并写入文件系统:命令如下:

mkfs.ext4 /dev/vdb1 //这里可以用ext3,也可以用ext4; 出现如下图这们的界面,就是格式化磁盘写入文件成功:

4:挂载新磁盘到操作系统的某个节点上,命令如下:

mkdir /mydata mount /dev/vdb1 /mydata 在系统的根创建一个mydata,把这个磁盘挂载到此目录;挂载位置可以自己随意创建;

5:查看磁盘信息,确认挂载新磁盘是否成功,命令如下:

df 如果挂载成功,会出现如下图这样的界面;

6:查看磁盘所有信息;

当我们再来查所有分区时,用fdisk -l 命令就会多了一个主分区,/dev/vdb1;如下图:

7:设置开机启动自动挂载;

新创建的分区不能开机自动挂载,每次重启机器都要手动挂载。 设置开机自动挂载需要修改/etc/fstab文件 ;命令如下: echo “/dev/vdb1 /mydata ext4 defaults 0 0” >> /etc/fstab

CFIP白名单

173.245.48.0/20
103.21.244.0/22
103.22.200.0/22
103.31.4.0/22
141.101.64.0/18
108.162.192.0/18
190.93.240.0/20
188.114.96.0/20
197.234.240.0/22
198.41.128.0/17
162.158.0.0/15
104.16.0.0/12
172.64.0.0/13
131.0.72.0/22

百度云加速与Cloudflare合作节点

162.159.211.4-103

103.21.244.0/22
103.22.200.0/22
103.31.4.0/22
104.16.0.0/12
108.162.192.0/18
131.0.72.0/22
141.101.64.0/18
162.158.0.0/15
172.64.0.0/13
173.245.48.0/20
188.114.96.0/20
190.93.240.0/20
197.234.240.0/22
198.41.128.0/17

Cloudflare节点推荐

www.moeelf.com/archives/10.html

CloudFlare 百度云合作 ip:

162.159.208.4-162.159.208.103

162.159.209.4-162.159.209.103

162.159.210.4-162.159.210.103

162.159.211.4-162.159.211.103

官方列表:CloudFlare公开的节点 https://www.cloudflare.com/zh-cn/ips/

各线路推荐列表:
电信:推荐走圣何塞,例:104.16.160.* 或者上面的百度云合作 ip。
移动:推荐走移动香港,例:172.64.32.*、141.101.115.* 或者 104.23.240.0-104.23.243.254。
联通:没发布什么好线路,可走圣何塞。例:104.16.160.* 或者 104.23.240.0-104.23.243.254。也可以试一下走亚特兰大 108.162.236.*(日前不可用。) 。

Qi推荐

108.162.236.1/24 联通 走美国
172.64.32.1/24 移动 走香港
104.16.160.1/24 电信 走美国洛杉矶
———
172.64.0.0/24 电信 美国旧金山
104.20.157.0/24 联通 走日本
104.28.14.0/24 移动 走新加坡
(联通移动推荐节点)
104.23.240.0-104.23.243.254
(电信推荐百度云合作ip)
162.159.208.4-162.159.208.103
162.159.209.4-162.159.209.103
162.159.210.4-162.159.210.103
162.159.211.4-162.159.211.103

适合电信的节点

104.23.240.* 走欧洲各国出口 英国德国荷兰等 延迟比美国高一些 适合源站在欧洲的网站 172.64.32.* 虽然去程走新加坡,但是回程线路的绕路的,实际效果不好,不推荐 104.16.160.* 圣何塞的线路,比洛杉矶要快一点,推荐 108.162.236.* 亚特兰大线路,延迟稳定,但是延迟较高

适合移动的节点

162.158.133.* 走的丹麦,这一段ip只有部分能用,可以自己试一下。绕美国。 198.41.214.* 198.41.212.* 198.41.208.* 198.41.209.* 172.64.32.* 141.101.115.* 移动走香港的IP段有很多,以上并不是全部。CF移动走香港的分直连和走ntt的效果都挺不错的,不过部分地区晚上还是会丢包。 172.64.0. 这是走圣何塞的,一般用香港的就行 172.64.16.* 欧洲线路.绕

1.0.0.1效果较好

电信部分

大多数省直接使用1.0.0.0即可,延迟低,丢包少, 少部分还是需要换ip

新加坡

172.64.32.0-172.64.47.254

移动部分

新加坡

104.18.48.0-104.18.63.255 104.24.112.0-104.24.127.255 104.27.128.0-104.27.143.255 104.28.0.0-104.28.15.255

移动部分

圣何塞 cogentco.com

104.28.16.0-31.255 104.27.144.0-243.254 104.23.240.0-243.254

香港cloudflare1-100g.hkix.net

大部分都是这个通道 1.0.0.0-254 1.1.1.0-254 66.235.200.0-254 此段为IPOWER.COM endurance.com专用,有可能被跳转到IPOWER.COM endurance.com页面 104.16.80.0-95.255 104.16.175.255-104.16.191.255

香港直连

23.227.63.0-254 此段为shopify.com专用,有可能被跳转到shopify.com页面 104.16.0.0-79.255 104.16.96.0-175.254 104.16.192.0-207.255

新加坡 ae-0.cloudflare.sngpsi07.sg.bb.gin.ntt.net

都从香港ntt转发 104.28.0.0-15.255

联通部分

伦敦 cloudflare-gw.cr10-lon1.ip4.gtt.net

172.64.19.16

CentOS安装完毕后,需要进行的优化步骤。

注意:本文所述的优化,是针对于VPS环境的,桌面环境和独立服务器的CentOS请勿使用本文中的方法进行优化,否则可能导致桌面环境不正常。独立服务器也不要使用本文中的方法去优化,否则会引起异常~

1,删除不必要的软件包

yum remove Deployment_Guide-en-US finger cups-libs cups ypbind
yum remove bluez-libs desktop-file-utils ppp rp-pppoe wireless-tools irda-utils
yum remove sendmail* samba* talk-server finger-server bind* xinetd
yum remove nfs-utils nfs-utils-lib rdate fetchmail eject ksh mkbootdisk mtools
yum remove syslinux tcsh startup-notification talk apmd rmt dump setserial portmap yp-tools
yum groupremove “Mail Server” “Games and Entertainment” “X Window System” “X Software Development” yum groupremove “Development Libraries” “Dialup Networking Support” yum groupremove “Games and Entertainment” “Sound and Video” “Graphics” “Editors” yum groupremove “Text-based Internet” “GNOME Desktop Environment” “GNOME Software Development”

2,升级整个系统

yum update #更新全部更新 yum clean all #清理全部缓存的安装文件以节省空间

3,禁用seLinux

sestatus 先执行这一句看看seLinux状态,如果不是disabled,那么执行如下步骤将其禁用 vi /etc/selinux/config
SELINUX=disabled 禁用SeLinux SELINUX=enforcing 使用SeLinux

4,停止网卡对ipv6的支持

vi /etc/modprobe.conf 添加如下行到文尾:
alias net-pf-10 off alias ipv6 off

重启后生效。

5,修改环境变量语言编码,防止出现乱码

vi /etc/profile 找到export PATH ……这一行,在其上面加上一行 LANG=en_US.UTF-8
然后在export PATH ……这一行后面补充一个LANG
source /etc/profile

6,初始化防火墙

touch /etc/sysconfig/iptables
iptables -F
iptables -X
iptables -Z
service iptables save
service iptables restart

7,来个一键优化脚本,自动禁用无用服务,且禁止其开机自启动

#! /bin/bash service acpid off
service atd stop
service auditd stop
service avahi-daemon stop
service avahi-dnsconfd stop
service bluetooth stop
service conman stop
service cpuspeed stop
service cups stop
service dnsmasq stop
service dund stop
service firstboot stop
service hidd stop
service httpd stop
service ibmasm stop
service ip6tables stop
service irda stop
service kdump stop
service lm_sensors stop
service mcstrans stop
service messagebus stop
service microcode_ctl stop
service netconsole stop
service netfs stop
service netplugd stop
service nfs stop
service nfslock stop
service nscd stop
service ntpd stop
service oddjobd stop

Rclone,Linux下,可挂载Google Drive、OneDrive、WebDAV、FTP等等,堪称神器。下面是安装和使用教程。 一、安装Rclone 下面的操作基于Centos系统 1、安装必须的应用

yum -y install wget unzip screen fuse fuse-devel

2、安装Rclone

curl https://rclone.org/install.sh sudo bash

二、挂载Google Drive 1、挂载GDrive

rclone config

选择 n ,创建新链接,并命名为 gdrive 。然后选择Google Drive client_id、client_secret 留空直接回车,SCOPE 选1,root_folder_id、service_account_file留空回车,Edit advanced config、Use auto config 选择n 这时,会出现个链接,复制到浏览器中,获取授权代码,并把授权代码粘贴到终端。 根据提示选择,一般为n、y、q 把Google Drive挂载到服务器上的一个目录。为便于以后web访问,可挂载到/www/wwwroot/下(以下演示为/www/wwwroot/gdrive.xxx.com,gdrive.xxx.com改为自己的域名)

./rclone mount gdrive: /www/wwwroot/gdrive.xxx.com –allow-other –allow-non-empty –vfs-cache-mode writes

2、设置开机启动rclone 先把rclone的可执行文件复制到/usr/bin:

cp /root/rclone-v*/rclone /usr/bin/rclone

新建一个rclone.service文件:

vi /usr/lib/systemd/system/rclone.service

粘贴:

[Unit]
Description=rclone
    
[Service]
User=root
ExecStart=/usr/bin/rclone mount gdrive: /www/wwwroot/gdrive.xxx.com –allow-other –allow-non-empty –vfs-cache-mode writes
Restart=on-abort
    
[Install]
WantedBy=multi-user.target

重载daemon,让新的服务文件生效:

systemctl daemon-reload

启动rclone:

systemctl start rclone

设置开机启动:

systemctl enable rclone

三、Rclone的操作 1、列出远程目录(gdrive为之前创建的)

rclone lsd gdrive

2、复制文件

rclone copy 源文件/目录 目标目录

源文件/目录、目标目录要绝对路径,均可以为服务器、网盘等 如要保存别人分享的Gdrive,可先保存到自己的网盘,然后复制这些文件到自己的网盘,以免共享的人删除文件。

rclone copy gdrive:gongxiang/japan gdrive:gongxiang/self

3、同步文件

rclone sync 源文件/目录 目标目录

这个只同步没有的文件。适合变化较大的文件。

CBBR:这是一个方便开启魔改bbr&&bbr的脚本。执行两步后最后输出Finish!提示,则成功。

Debian/Ubuntu(64位)开启魔改BBR

Ubuntu14.04需要提前:

1
2
3
4
sudo apt-get install -y software-properties-common
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get -y install g++-4.9

Debian9需要提前:

1
2
wget --no-check-certificate -O libssl.deb https://raw.githubusercontent.com/xratzh/CBBR/master/debkernel/libssl1.0.0_1.0.2-1_amd64.deb
dpkg -i libssl.deb

第一步:

1
apt-get install -y wget && wget --no-check-certificate -O D1.sh https://raw.githubusercontent.com/xratzh/CBBR/master/D1.sh && bash D1.sh

之后输入Y就会重启 第二步:

1
wget --no-check-certificate -O D2.sh https://raw.githubusercontent.com/xratzh/CBBR/master/D2.sh && bash D2.sh

CentOS7开启魔改BBR

第一步:

1
yum install -y wget && wget --no-check-certificate -O C71.sh https://raw.githubusercontent.com/xratzh/CBBR/master/C71.sh && bash C71.sh

之后输入Y就会重启 第二步:

1
wget --no-check-certificate -O C72.sh https://raw.githubusercontent.com/xratzh/CBBR/master/C72.sh && bash C72.sh

CentOS6开启魔改BBR

第一步:

1
yum install -y wget && wget --no-check-certificate -O C61.sh https://raw.githubusercontent.com/xratzh/CBBR/master/C61.sh && bash C61.sh

之后输入Y就会重启 第二步:

1
wget --no-check-certificate -O C62.sh https://raw.githubusercontent.com/xratzh/CBBR/master/C62.sh && bash C62.sh

Tips

存在对于其他内核的删除,只保留4.11.8内核的行为 为什么不能一键,因为Linux内核在4.0后支持不重启更换,但是CentOS和Debian/Ubuntu很多的内核都是4.0-的版本,Debian9和Ubuntu16.04则是4.0+的版本。 Xratzh压力测试,发现bbr和魔改bbr都开启时会达到最快(个人验证),本脚本默认两者都开启。 脚本里加入了对内核的锁定,之后update时不会变动内核。内核统一选择4.11.8版本。 由于这个我找到的CentOS/Ubuntu历史内核的镜像站的网速时快时慢,所以自己下载了上传到GitHub,这样能保持一个较为稳定的速度。原来的内核地址仍然在脚本里面,只是被添加注释了,如果你不信任我上传的内核,可以自己取消注释使用镜像站的内核下载方式。 部分内容借鉴了Vicer大佬Teddysun大佬的脚本,感谢hostloc的yankee大佬和nanqinlang大佬的魔改优化。 转自:https://github.com/veip007/CBBR

0%