作者归档:CD

Online 独服IPv6失联的几种解决办法

上一篇文章记录了为Online独服开启额外IPv6的过程,几乎与此同时发现了一个问题,额外添加的IPv6总是在数小时(具体不详)后失联,查看路由又没有问题,但ping6是不通的。系统默认开启的IPv6是没有问题的。网络上抱怨Online IPv6不稳定的帖子很多,有建议使用Dibbler开启IPv6的,但是这种方法已不被官方推荐。

IPv6失联或者失效,总之就是不通,原因不详。以下方法仅供尝试,不一定有效:

1 修改内核参数

早在2015年有一篇文章描述了类似的情况,分析就不赘述了,记录下操作的过程。

sudo vi /etc/sysctl.conf

添加如下两行:

net.ipv6.conf.all.forwarding=1
net.ipv6.conf.eth0.accept_ra=2

保存生效:

sudo sysctl -p

可惜的是,虽然看上去分析和处理都很有道理,但是实测后仍然会失联。

2 开启防火墙端口

Online官方教程有个提示:

You will need to allow in your firewall 546/UDP Incoming & 547/UDP Outgoing.

DHCPv6需要开放相应端口才能正常工作。

在Ubuntu下使用UFW防火墙的话,一般是允许出站,禁止进站,比如这样的默认设置:

sudo ufw default deny incoming
sudo ufw default allow outgoing

则运行如下命令:

sudo ufw allow 546/udp
sudo ufw allow 547/udp

看上去很有道理,但是观察后发现这种方法貌似也无效。

3 修改dhclient.service运行参数

有篇不起眼的文章提到,为dhclient.service添加ExecStartPost参数。

在上篇文章编写dhclient服务时:

sudo vi /etc/systemd/system/dhclient.service

添加两行参数,按如下修改:

[Unit]
Description=dhclient for sending DUID IPv6
Wants=network.target
Before=network.target

[Service]
Type=forking
ExecStart=/sbin/dhclient -cf /etc/dhcp/dhclient6.conf -6 -P -v enp1s0
ExecStartPost=/bin/sleep 5
ExecStartPost=/usr/sbin/netplan apply

[Install]
WantedBy=multi-user.target

观察一天,暂时有效,还需继续观察。

Online 独服 Ubuntu 18.04 关闭默认IPV6并额外配置静态IPV6

更新

29191222

qbittorrent在201912更新的4.2.1版本中,在“设置”中添加了“高级”选项卡,可以自定义“网络接口”和“绑定可选的IPv6地址”,解决了问题场景的“新申请配置的ipv6并没有替代默认开通的ipv6”的问题。

20191213

如果参照如下方式配置成功,但出现IPv6失联或失效的情况,请参考这篇文章

问题场景

2019年2月8日起,Online新开通的独服默认开启了IPV6。使用Ubuntu 18.04通过IPV6刷PT,因为这个作业系统可以使用最新版的qbittorrent软体。但是由于qbittorrent有限速缺陷,有一天发现这个IPV6被标记了。于是申请一个新的IPV6,通过目前网络上现有的教程,可以配置成功新的IPV6。问题来了,新申请配置的ipv6并没有替代默认开通的ipv6,而是两者共存。qbittorrent仍然使用系统默认开通的IPV6。

解决思路

官网教程说配置新的IPV6,需要开启SLAAC,否则服务器无法识别默认路由(If disabled, a server will not be able to learn its IPv6 default route)。但是实际上,目前,不管在网页控制台中是否启用“ACTIVATE IPV6 SLAAC”,Online 后台都已经默认开启了SLAAC,并通过路由通告Router Advertisement(RA)配置一个128位的IPV6。

经过多次尝试,解决思路是获取默认路由,申请新IP,配置新IP和路由,具体步骤:

  • 获取默认开启的IPV6路由,实际上只要获取IPV6网关地址即可;
  • 申请新的IPV6地址,先申请/48段,再继续划分为一个/56,并记录/56 IPV6的DUID,用/48的也行;
  • 配置dhclient、dhclient-netplan服务,内容完全照搬大佬的教程
  • 配置netplan:关闭RA,自定义IPV6地址和网关。

操作过程

获取网卡和IPV6路由

系统安装好后,通过以下命令查看IPV6路由,类似如下:

ip -6 route show
2001:1234:5678:1234::/64 dev enp1s0 proto ra metric 100 pref medium

fe80::/64 dev enp1s0 proto kernel metric 256 pref medium

default via fe80::1234:5678:1234:5678 dev enp1s0 proto ra metric 100 mtu 1500 pref medium

获取网卡名称:enp1s0;获得IPV6网关:fe80::1234:5678:1234:5678

申请新的IPV6地址

登录网页控制界面,申请/48段IPV6地址,然后再获取/56段地址,并记录其DUID。比如:

2001:1234:2345:500::/5612:34:56:78:90:ab:cd:ef:12:34

获取IPV6地址:2001:1234:2345:500::/56,在后续使用时,不存在空格;获取DUID:12:34:56:78:90:ab:cd:ef:12:34。

配置dhclient服务

编写dhclient配置文件

sudo vi /etc/dhcp/dhclient6.conf

内容如下:

interface "enp1s0" {
  send dhcp6.client-id 12:34:56:78:90:ab:cd:ef:12:34;
  request;
}

将enp1s0和12:34:56:78:90:ab:cd:ef:12:34改为自己获取的网卡名称和DUID。

编写dhclient服务

sudo vi /etc/systemd/system/dhclient.service

内容为:

[Unit]
Description=dhclient for sending DUID IPv6
Wants=network.target
Before=network.target

[Service]
Type=forking
ExecStart=/sbin/dhclient -cf /etc/dhcp/dhclient6.conf -6 -P -v enp1s0

[Install]
WantedBy=multi-user.target

将enp1s0替换为自己的网卡名称

设置开机启动:

sudo systemctl enable dhclient.service

编写dhclient-netplan服务

sudo vi /etc/systemd/system/dhclient-netplan.service

内容如下:

[Unit]
Description=redo netplan apply after dhclient
Wants=dhclient.service
After=dhclient.service
Before=network.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/netplan apply

[Install]
WantedBy=dhclient.service

设置开机启动:

sudo systemctl enable dhclient-netplan.service

修改netplan配置文件

自定义ipv6地址、网关,并关闭路由通告(RA)。

sudo vi /etc/netplan/01-netcfg.yaml

修改后,最终样式如下:

# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    enp1s0:
      dhcp4: yes
      accept-ra: no
      dhcp6: no
      addresses:
      - 2001:1234:2345:500::/56
      gateway6: fe80::1234:5678:1234:5678

将2001:1234:2345:500::/56修改为获取的IPV6地址;将fe80::1234:5678:1234:5678修改为获取的IPV6网关;accept-ra: no的作用是不接受RA通告的IPV6,也就是不获得默认的/128位的IPV6。

重启系统,此时应该就可以了。

在Chromebook上使用SSH 密钥登录VPS

方法如下:

生成SSH 密钥对

下载并使用Windosw版的 PuTTYgen生成RSA格式的密钥对。

转换私钥(private key)

导入ppk格式的私钥,在PuTTYgen的菜单栏选择Conversions,选择Export OpenSSH key 或者Export OpenSSH key(force new format)。获得pem格式的私钥,文件名随意。

注:两种格式的pem密钥区别在这里。两种都可以选。想新一点就第二种。

上传公钥(public key)到VPS

教程很多,不细说了。

使用Secure Shell 连接VPS

打开Chromebook上的SSH工具Secure Shell App,填入用户名,ip地址和端口,点击Identity:后面的Import…,选择刚才转换好的PEM格式的私钥,无需导入公钥(public key)。登录就可以了。

如果想删除私钥,方法是:选中要删除的私钥,同时按“搜索键+backspace”。

在Oracle Cloud免费VPS CentOS 7 系统上开启SELinux和防火墙(firewalld和iptables)情况下安装Web服务器Caddy

参考:

https://src.fedoraproject.org/rpms/caddy/blob/master/f/caddy.spec
https://github.com/caddyserver/caddy/tree/master/dist/init/linux-systemd

本文的亮点在于开启SELinux、防火墙(Firewalld和iptables)情况下,配置caddy。 本文不限于Oracle Cloud云服务,同样适用于其他类似的情况下。

按照以上教程,默认路径为:

  • /usr/local/bin/caddy #caddy程序所在目录
  • /etc/caddy/Caddyfile #caddy配置文件所作目录
  • /etc/ssl/caddy #ssl证书所在目录
  • /var/www/ #网页所在目录

建立www-data用户

caddy服务默认使用www-data用户运行,因此需要建立该用户。教程中为建立用户组为33,但Oracle CentOS 7系统中GID 33被tape占用:

grep '33' /etc/group

使用GID 36建立www-data用户

sudo groupadd -g 36 www-data
sudo useradd \
  -g www-data --no-user-group \
  --home-dir /var/www --no-create-home \
  --shell /usr/sbin/nologin \
  --system --uid 36 www-data

下载并安装caddy

sudo mkdir ~/caddy && cd ~/caddy
sudo wget https://github.com/caddyserver/caddy/releases/download/v1.0.3/caddy_v1.0.3_linux_amd64.tar.gz
sudo tar xvf caddy_v1.0.3_linux_amd64.tar.gz
sudo cp caddy /usr/local/bin

sudo chown root:root /usr/local/bin/caddy

sudo chmod 755 /usr/local/bin/caddy

使caddy能监听443,80端口

sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

安装systemd服务

sudo cp init/linux-systemd/caddy.service /etc/systemd/system/

sudo chown root:root /etc/systemd/system/caddy.service

sudo chmod 644 /etc/systemd/system/caddy.service

修改servicen内容

sudo vi /etc/systemd/system/caddy.service

需要修改为以下三行:

  1. ExecStart=/usr/local/bin/caddy -quic -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp
  2. ReadWriteDirectories=/etc/ssl/caddy
  3. AmbientCapabilities=CAP_NET_BIND_SERVICE

说明:

第一行,加入-quic,使caddy开启QUIC协议;

第二行,默认为ReadWritePaths=/etc/ssl/caddy,此时启动caddy服务,会出现如下错误:[ERROR] Making new certificate manager: could not save user: mkdir /etc/ssl/caddy/acme: read-only file system。

第三行,注释掉AmbientCapabilities=CAP_NET_BIND_SERVICE前的#,不用注释应该页没问题。因前面已经setcap过了。

建立caddy配置文件和ssl相关文件夹

sudo mkdir /etc/caddy
sudo touch /etc/caddy/Caddyfile
sudo chown -R www-data:www-data /etc/caddy
sudo chmod 644 /etc/caddy/Caddyfile
sudo mkdir /etc/ssl/caddy
sudo chown www-data:www-data /etc/ssl/caddy
sudo chown -R root:www-data /etc/ssl/caddy
sudo chmod 0770 /etc/ssl/caddy

修改VPS系统内SELinux和防火墙相关设置

将caddy定义为httpd服务

sudo semanage fcontext -a -t httpd_exec_t /usr/local/bin/caddy
sudo restorecon /usr/local/bin/caddy

设置caddy配置文件和ssl相关文件夹SELinux权限

sudo semanage fcontext -a -t httpd_config_t /etc/caddy
sudo semanage fcontext -a -t httpd_config_t /etc/caddy/Caddyfile
sudo semanage fcontext -a -t httpd_sys_rw_content_t /etc/ssl/caddy
sudo restorecon -r /etc/caddy
sudo restorecon -r /etc/ssl/caddy

开启http和https服务,即开启80和443端口,默认为tcp

sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https

允许ACME进行连接以获取证书

sudo setsebool -P httpd_can_network_connect 1

HTTP challenge 端口的SELinux权限

sudo semanage port -a -t http_port_t -p tcp 5033

开启QUIC,需开放udp端口

sudo semanage port --add --type http_port_t --proto udp 80
sudo semanage port --add --type http_port_t --proto udp 443

QUIC-firewalld设置

sudo firewall-cmd --zone=public --add-port=80/udp --permanent
sudo firewall-cmd --zone=public --add-port=443/udp --permanent

保存设置,重启防火墙,以使配置生效

sudo firewall-cmd --reload

在Oracle Cloud后台网页开放端口

进入“实例”,点击“实例信息”下的“虚拟云网络”右侧类似“VirtualCloudNetwork-2019****-****”的按钮并进入;

在“(根)区间中的子网”下,如果存在多个类似“公共子网 pbOp:***-**-1 ”的项目列表,就随便点进去一个

在“安全列表”下,点击并进入“Default Security List for VirtualCloudNetwork-2019****-****”。

编辑“入站规则”下“目的地端口范围”为22那条规则,或者参照这条规则新建也可以。
将“目的地端口范围”下的“22”改为“22,80,443,5033”,然后“保存更改”即可。 系统会自动根据添加的IP生成新的三条规则。

注意:每个端口或范围间隔需要英文逗号。

开启QUIC,需要开放80和443的UDP端口,参照刚才设置的80和433端口新建规则即可,注意在“IP 协议 ”下选择“UDP”。

web站点文件相关设置

建立web站点文件夹

sudo mkdir /var/www
sudo chown -R www-data:www-data /var/www
sudo chmod 555 /var/www
sudo mkdir -p /var/www/example.com

sudo chown -R www-data:www-data /var/www/example.com

sudo chmod -R 555 /var/www/example.com

设置网站文件夹SELinux权限

sudo restorecon -r /var/www

建立web测试页

sudo vi /var/www/example.com/index.html

写入如下内容

<h1>Hello world!</h1>

测试web页

修改Caddyfile,添加站点

sudo vi /etc/caddy/Caddyfile

添加如下内容:

example.com {
     root /var/www/example.com
}

启动caddy服务

sudo systemctl daemon-reload
sudo systemctl start caddy.service
systemctl status caddy

访问example.com,看是否能见到网站页面

如能成功访问,设置开机启动

sudo systemctl enable caddy.service

完毕。

Oracle Cloud免费VPS CentOS 7 系统防火墙(firewalld和iptables)的正确配置方法

不少人不会配置Oracle的防火墙,导致无法访问80或443端口。本文记录为Oracle Cloud的VPS CentOS 7系统正确配置防火墙的步骤,理论上适用于其他系统,如Debian等。

VPS系统的SELinux为开启状态

sestatus

Firewalld为开启状态

sudo firewall-cmd --state

Iptables为开启状态,查看iptables规则

sudo iptables -L -n

一些人的做法是彻底停用防火墙(firewalld),并清除iptables规则,如:

sudo systemctl stop firewalld

sudo systemctl disable firewalld
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -F

但是端口仍然可能不能正常访问,同时我们都知道这肯定不是正确的解决方式。那正确的做法是什么呢?

正确的配置方法为:

  1. 登陆VPS的CentOS 7 系统,配置防火墙(firewalld),开放相关服务和端口;
  2. 登陆Oracle Cloud网页后台,进入实例,在“安全列表”中,修改“入站规则”;
  3. 不要手动修改iptables。

例,要建立一个小网站,需要开放80和443端口,步骤为:

第一步,登陆VPS的CentOS 7系统,修改防火墙设置,增加http和https服务,即开启80和443端口

sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https

重启防火墙以生效

sudo firewall-cmd --reload

第二步,登陆Oracle Cloud网页后台,进行设置

进入“实例”,点击“实例信息”下的“虚拟云网络”右侧类似“VirtualCloudNetwork-2019****-****”的按钮并进入;

在“(根)区间中的子网”下,如果存在多个类似“公共子网 pbOp:***-**-1 ”的项目列表,就随便点进去一个

在“安全列表”下,点击并进入“Default Security List for VirtualCloudNetwork-2019****-****”。

编辑“入站规则”下“目的地端口范围”为22那条规则,或者参照这条规则新建也可以。
将“目的地端口范围”下的“22”改为“22,80,443”,然后“保存更改”即可。 系统会自动根据添加的IP生成新的两条规则。

注意:每个端口或范围间隔需要英文逗号;如果需要增加UDP端口,就在“IP 协议 ”下选择“UDP”。

至此设置完毕,赶紧访问下你的网页吧。

为Oracle Cloud申请的免费VPS CentOS 7 系统升级内核并开启官方原版BBR加速

Oracle 云申请的CentOS 7 系统,自带3.1内核,且为EFI引导,并默认开启SELinux,升级内核开启BBR易出现错误导致无法开机。开启原版BBR需要4.9以上内核,以下内容记录升级内核并开启BBR的过程。

更新系统

sudo yum update -y

查看内核

uname -r

3.10.0-1062.1.1.el7.x86_64

改SELinux为permissive模式

查看SELinux状态,默认开启:

sestatus

将enforcing改为permissive,如下:

sudo vi /etc/sysconfig/selinux

SELINUX=permissive

重启vps:

sudo reboot

开启elrepo源

sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

sudo yum install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm

查看可安装内核

yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

安装内核

sudo yum --enablerepo=elrepo-kernel install kernel-ml

查看新内核是否安装成功

rpm -qa | grep kernel

更新引导

这是一个容易出错的地方,以前碰到的启动配置文件,大多是在/boot/grub2/grub.cfg,而该系统为EFI引导,配置文件位置不同。

sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

列出系统开机的所有启动项

sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /boot/efi/EFI/centos/grub.cfg

设置默认启动项

sudo grub2-set-default 0

重启VPS

sudo reboot

查看内核

uname -r
5.3.1-1.el7.elrepo.x86_64

开启bbr(直接抄袭大佬的全部内容)

执行 lsmod | grep bbr,如果结果中没有 tcp_bbr 的话就先执行:

sudo modprobe tcp_bbr
echo "tcp_bbr" | sudo tee --append /etc/modules-load.d/modules.conf

执行

echo "net.core.default_qdisc=fq" | sudo tee --append /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee --append /etc/sysctl.conf

保存生效

sudo sysctl -p

执行

sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control

如果结果都有 bbr,则证明你的内核已开启 BBR。

执行 lsmod | grep bbr,看到有 tcp_bbr 模块即说明 BBR 已启动。

重新开启SELinux

检查有无SELinux相关错误:

sudo cat /var/log/messages | grep "SELinux is preventing"

确保无错误后,再启用SELinux Enforcing 模式

sudo vi /etc/sysconfig/selinux

将permissive改回enforcing,如下修改:

SELINUX=enforcing

重启VPS

sudo reboot

解决Oracle Cloud免费服务申请的VPS无法登陆问题

现象描述

使用puttygen(0.71)生成RSA格式的公钥和私钥,粘贴在“创建计算实例”的“添加SSH密钥”下的“粘贴SSH密钥”中,申请免费的CentOS 7系统的VPS。

当使用命令行登陆VPS时,如:

ssh opc@12.34.56.78 -i .\key.ppk

出现 Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

改用putty在SSH-AUTh中选择私钥,登陆VPS,则提示:

No supported authentication methods available(server sent: publickey,gssapi-keyex,gssapi-with-mic)

原因

经多次尝试发现,Oracle的CentOS7 sshd_config 模板中未定义SSH的Protocol,因此登陆时默认使用Protocol 1模式,但命令行和putty默认使用Protocol 2,因此导致无法登陆。

解决方法

使用putty登陆,在putty的设置中,依次点击“Connection”-“SSH”-“Auth”,选中“Attempt TIS or CryptoCard auth (SSH-1)”,登陆即可。

(可选)登陆后可以修改SSH协议为2.

sudo vi /etc/ssh/sshd_config

添加一行

Protocol 2

重启SSH服务即可。

为caddy启用tls 1.3

更新日志

20190918

在20190305的更新中,caddy默认支持了tls 1.3,因此以下内容已过时从官网或者github下载使用即可。

nginx启用tls1.3已多时,这里记录下在caddy中启用tls1.3的过程。

安装依赖:

sudo yum -y install docker
service docker start

下载源码:

cd ~
git clone https://github.com/cloudflare/tls-tris.git
go get github.com/mholt/caddy
go get github.com/caddyserver/builds

编译go,使之支持tls1.3:

cd tls-tris; cp _dev/utils/pre-commit .git/hooks/
sudo make -f _dev/Makefile build-all

编译成功,运行如下命令确认:

GOROOT=”/home/$USER/tls-tris/_dev/GOROOT/linux_amd64/” go version
-> go version go1.11.1 linux/amd64

下载并应用caddy补丁:

cd $GOPATH/src/github.com/mholt/caddy
wget https://www.hnrk.io/md/caddy.patch
patch -p1 < caddy.patch

编译caddy:

cd $GOPATH/src/github.com/mholt/caddy/caddy
GOROOT=”/home/$USER/tls-tris/_dev/GOROOT/linux_amd64/” go run build.go

编译成功的caddy在当前目录下。直接替换原caddy后运行即已支持tls 1.3。

使用caddy反向代理deluge的webui

20191007更新

最近用下面的老方法遇到了问题,表现为打开coldawn.com/deluge一片空白,chrome错误代码为:

because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled. 
net::ERR_ABORTED 404 

经过多次尝试,仍然失败。解决办法使使用二级域名反代deluge,如下:

deluge.coldawn.com {
    proxy / http://127.0.0.1:8112 {
      transparent
      websocket
    }
}

访问deluge.coldawn.com即可。

注意将:deluge.coldawn.com改成你自己的二级域名。

老方法

方法很简单,一行搞定,代码如下:

proxy /deluge http://127.0.0.1:8112/ { transparent without /deluge header_upstream X-Deluge-Base "/deluge" }

然后访问自己的域名+/deluge即可,如:

coldawn.com/deluge

为网站开启QUIC的几点注意事项

QUIC的文章比较多了,但是开启起来仍然是件困扰人的事。本文简要记录一下为网站开启QUIC的几点注意事项。

一 QUIC对比现有HTTP2的主要优势:

  • 显著减少连接建立时间
  • 改进的拥塞控制
  • 无对头阻塞的多路复用
  • 前向纠错
  • 连接迁移

二 开启QUIC的注意事项主要有以下几点:

Caddy的13f9c34已经支持QUIC 44、43、39,运行参数中加入-quic

编译caddy时,需要为主分支的quic-go打一个补丁:
cd $GOPATH/src/github.com/mholt/caddy/vendor/github.com/lucas-clemente/quic-go/

vi quic.patch

quic.pathch的内容如下:

From 20719a7c50c1f97ff0f2272010cda5710794c1d0 Mon Sep 17 00:00:00 2001
From: Marten Seemann <martenseemann@gmail.com>
Date: Thu, 29 Nov 2018 20:33:02 +0700
Subject: [PATCH] use the original tls.Config if tls.Config.GetConfigForClient
 returns nil

---
 internal/crypto/cert_chain.go      | 15 ++++++++++-----
 2 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/internal/crypto/cert_chain.go b/internal/crypto/cert_chain.go
index 0c728fd25..45af2952d 100644
--- a/internal/crypto/cert_chain.go
+++ b/internal/crypto/cert_chain.go
@@ -56,8 +56,7 @@ func (c *certChain) GetLeafCert(sni string) ([]byte, error) {
 }
 
 func (c *certChain) getCertForSNI(sni string) (*tls.Certificate, error) {
-	conf := c.config
-	conf, err := maybeGetConfigForClient(conf, sni)
+	conf, err := maybeGetConfigForClient(c.config, sni)
 	if err != nil {
 		return nil, err
 	}
@@ -107,7 +106,13 @@ func maybeGetConfigForClient(c *tls.Config, sni string) (*tls.Config, error) {
 	if c.GetConfigForClient == nil {
 		return c, nil
 	}
-	return c.GetConfigForClient(&tls.ClientHelloInfo{
-		ServerName: sni,
-	})
+	confForClient, err := c.GetConfigForClient(&tls.ClientHelloInfo{ServerName: sni})
+	if err != nil {
+		return nil, err
+	}
+	// if GetConfigForClient returns nil, use the original config
+	if confForClient == nil {
+		return c, nil
+	}
+	return confForClient, nil
 }

patch -p1 < quic.patch

之后再进入caddy目录进行下一步的编译:

cd $GOPATH/src/github.com/mholt/caddy

请升级到目前的最新版 1.11。

  • 在防火墙中为443端口开启udp

          Firewalld:

sudo firewall-cmd --zone=public --add-port=443/udp --permanent

          iptables:

sudo iptables -A INPUT -p udp --dport 443 -j ACCEPT
  • 将Chrome升级到最新版

在chrome://flags/#enable-quic中启用QUIC支持。

三 一个查看QUIC支持情况的命令

curl -I https://www.coldawn.com we get
HTTP/1.1 200 OK
Alt-Svc: quic=":443"; ma=2592000; v="44,43,39"
Cache-Control: max-age=8640000
Content-Type: text/html; charset=UTF-8
Link: <https://www.coldawn.com/wp-json/>; rel="https://api.w.org/"
Server: Caddy
Strict-Transport-Security: max-age=31536000;
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-Powered-By: PHP/7.2.10
X-Xss-Protection: 1; mode=block
Date: Fri, 28 Sep 2018 04:29:41 GMT