使用Caddy搭建TLS1.3+HTTP2代理
目前Caddy的官方版本还不支持TLS1.3,不过我们也可以自己编译然后魔改一下尝尝鲜。据说今年2月份左右应该就会支持TLS1.3了,之前一直不支持的原因是GO标准库里不支持,而Caddy是基于这个标准库的。
虽然最后测试使用TLS1.3+HTTP2代理的效果并不理想,Caddy日志里面一堆Reset,只能说GFW是真的牛批,但是通过这篇文章可以学到如何从源头构建一个GO程序以及为Caddy添加插件的方法,还是挺不错的~
先安装一下基本组件:
yum -y install git wget nano patch
下载GO的预构建包,前几天Golang刚发布了Go1.12beta2这个版本,这个版本里面就是带有TLS1.3支持的了:
wget https://dl.google.com/go/go1.12beta2.linux-amd64.tar.gz
tar -xzvf go1.12beta2.linux-amd64.tar.gz -C /usr/bin
编辑账户配置文件:
nano ~/.bash_profile
加入GO的PATH:
export PATH=$PATH:/usr/bin/go/bin
使其生效:
source ~/.bash_profile
新建一个文件夹命名为caddy并导入GOPATH为当前这个文件夹:
mkdir caddy && export GOPATH=$PWD/caddy
拉取项目源码:
go get github.com/mholt/caddy
go get github.com/caddyserver/builds
这个是用于配置HTTP代理的插件,如果你需要就拉取,不需要可以省略:
go get github.com/caddyserver/forwardproxy
进入到caddy源码目录:
cd $GOPATH/src/github.com/mholt/caddy
下载TLS1.3补丁:
wget https://www.hnrk.io/md/caddy.patch
把补丁打上去:
patch -p1 < caddy.patch
编辑如下源码,添加HTTP代理插件:
nano $GOPATH/src/github.com/mholt/caddy/caddy/caddymain/run.go
将如下内容插入到这个文件内:
_ "github.com/caddyserver/forwardproxy"
位置如图所示:
这里不局限于这个代理插件,只要是Caddy官方支持的插件都可以通过这个方式添加。
进入到构建目录:
cd $GOPATH/src/github.com/mholt/caddy/caddy
编译:
go run build.go
完成之后在当前目录下就会有caddy的二进制文件了,我们移动到/usr/local/bin:
mv caddy /usr/local/bin
新建两个目录,一个用于存放caddy的配置文件,一个用于存放caddy自动申请的ssl证书:
mkdir -p /etc/caddy && mkdir -p /etc/ssl/caddy
新建Caddyfile配置文件:
vi /etc/caddy/Caddyfile
写入:
tls.koko.cat {
tls 1062951199@qq.com
log stdout
forwardproxy {
basicauth user password
hide_ip
hide_via
}
}
注:
1.tls后面修改为你自己的邮箱,caddy自动申请ssl证书需要。
2.basicauth设置一个你的账号和密码,一定要设置,否则你搭建完的代理可能一瞬就被扫描,变成公开代理。。。
然后我们配置systemd服务:
vi /etc/systemd/system/caddy.service
写入:
[Unit]
Description=Caddy HTTP/2 web server
Documentation=https://caddyserver.com/docs
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service
[Service]
Restart=on-abnormal
User=root
Group=root
Environment=CADDYPATH=/etc/ssl/caddy
ExecStart=/usr/local/bin/caddy -log stdout -agree=true -conf=/etc/caddy/Caddyfile
ExecReload=/bin/kill -USR1 $MAINPID
KillMode=mixed
KillSignal=SIGQUIT
TimeoutStopSec=5s
[Install]
WantedBy=multi-user.target
启动caddy以及设置开机启动:
systemctl start caddy
systemctl enable caddy
如有报错或运行出错,可以执行下面的命令查看日志:
journalctl --boot -u caddy.service
接着我们打开这个网站测试一下我们配置的站点是否支持TLS1.3:
经测试正常:
TLS1.3目前属于测试/实验阶段,服务端支持了还要客户端浏览器支持才行,下面是Chrome70开启TLS1.3的方法:
chrome://flags/
搜索TLS1.3,然后这里选择Enable(Final):
访问一下我们的域名看看是否正常:
代理的话,Chrome这里使用SwitchyOmega按如图设置即可:
- 探秘Tomcat——连接器和容器的优雅启动
- 谈谈分布式事务之三: System.Transactions事务详解[上篇]
- WCF技术剖析之十九:深度剖析消息编码(Encoding)实现(上篇)
- 谈谈分布式事务之二:基于DTC的分布式事务管理模型[下篇]
- 孙明俊:人工智能之算力演进
- 探秘Tomcat——一个简易的Servlet容器
- 2017年与机器学习相关的10大Python开源库
- 控制并发访问的三道屏障: WCF限流(Throttling)体系探秘[上篇]
- 探秘Tomcat——从一个简陋的Web服务器开始
- EnterLib PIAB又一个BUG?[续]——这是一个致命的BUG
- Google工程师:谷歌翻译在几个月内效果明显提升的秘诀
- 回调与并发: 通过实例剖析WCF基于ConcurrencyMode.Reentrant模式下的并发控制机制
- EnterLib PIAB又一个BUG?[续]——这是一个致命的BUG
- 年终盘点2017年发生在上海的科技大新闻
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 明知 | TypeScript 结合 egg.js 基本使用
- 入门 | egg.js 入门之egg-jwt
- 3大利器推荐,帮你写出规范漂亮的python代码
- 【Docker】修改docker镜像存储的路径
- conda报错
- docker安装和使用
- JAVA-常量及常量池
- 解决哈希冲突的常用方法分析
- 03 Confluent_Kafka权威指南 第三章: Kafka 生产者:向kafka写消息
- kafka生产者和消费者的基本操作
- 05 Confluent_Kafka权威指南 第五章: kafka内部实现原理
- 关于leetcode第718题求长度最长的公共子数组的解析
- JAVA类加载过程&主动引用和被动引用
- 关于leetcode第56题合并重复区间的解析
- java-覆盖equals和hashcode方法