在Docker环境中尝试QUIC反向代理
首先
在之前的文章中,我们尝试使用goquic的反向代理来进行HTTP/3和QUIC连接,但遗憾地失败了。
这次是报仇的机会!使用curl –http3命令确认可以进行HTTP/3通信。
这次的反向代理是…
这是Nginx!
已经创建了一个用于将Web服务器支持HTTP/3的Nginx反向代理的Docker镜像。
这一次,nginx被用作代理服务器,而Ghost被用作最终访问目标,而上一次则是使用goquic作为代理服务器,并将nginx作为最终访问目标。
(基本概念) “Ghost” 是指
Ghost是一个使用JavaScript编写的自由开源博客平台。
这是一个免费的博客平台(好像)
-
- 書くことが大好きな人のためのシンプルすぎるプラットフォーム「Ghost」とは?
- Ghostで作成されたサイト例
最终选择作为最终访问目标的是Ghost,所以关于Ghost就说到这里了。之前的一段时间,提到这样的内容网站?博客网站?就会想到WordPress,但是…
在Docker上创建验证环境
和上一篇文章一样,使用docker-compose创建环境。
client
curl
コマンドを打つ役proxy
HTTP/3アクセスを受け付けるリバースプロキシghost
単なるブログサイト。HTTP/3に対応していない想定客户端 ->(这里是HTTP/3)-> 代理服务器 -> (这里是HTTP/2以下)-> 博客网站
将证书安装到客户端
与前次相同,需要在客户端上安装服务器证书,
这样就能够进行HTTPS通信了。
不管怎样,进入客户的容器进行工作。
docker compose up -d
docker compose exec client ash
由于容器无法使用软件包管理器,因此直接将.crt文件写入。
cat /nginx/server.crt >>/etc/ssl/certs/ca-certificates.crt
现在,连接吧!
尝试通过客户端以HTTP/1.1、HTTP/2和HTTP/3三种方式进行连接。
HTTP/1.1版本
HTTP连接 (HuTTP
curl http://proxy -I
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Tue, 01 Aug 2023 13:37:05 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 10255
Connection: keep-alive
X-Powered-By: Express
Cache-Control: public, max-age=0
ETag: W/"280f-LG5sPxcueSIwKUCwqdjGkQDJ338"
Vary: Accept-Encoding
HTTP/2 在中文中可以翻译为“超文本传输协议第二版”或简称为“HTTP2”。
安全的HTTP连接
curl https://proxy -I
HTTP/2 200
server: nginx/1.16.1
date: Tue, 01 Aug 2023 13:39:27 GMT
content-type: text/html; charset=utf-8
content-length: 10255
x-powered-by: Express
cache-control: public, max-age=0
etag: W/"280f-LG5sPxcueSIwKUCwqdjGkQDJ338"
vary: Accept-Encoding
alt-svc: h3-23=":443"; ma=86400
HTTP/3
超文本传输协议/3
使用HTTPS和添加HTTP3选项,可以在HTTP/3上进行连接。
curl https://proxy -I --http3
HTTP/3 200
server: nginx/1.16.1
date: Tue, 01 Aug 2023 13:40:46 GMT
content-type: text/html; charset=utf-8
content-length: 10255
x-powered-by: Express
cache-control: public, max-age=0
etag: W/"280f-LG5sPxcueSIwKUCwqdjGkQDJ338"
vary: Accept-Encoding
alt-svc: h3-23=":443"; ma=86400
不同版本的HTTP会如何改变数据包。
我知道可以使用HTTP1.1、2和3连接。Ghost的初始网站太轻巧了,看不出访问速度的差异。
试试进行端口扫描并比较数据包的总交互量。
扫描端口的准备工作
进入Nginx容器
docker compose exec proxy bash
安装tcpdump
apt update && apt install -y tcpdump
# バージョン確認
tcpdump --version
tcpdump version 4.9.3
libpcap version 1.8.1
OpenSSL 1.1.1 11 Sep 2018
# キャプチャするコマンド
tcpdum -w /mnt/out.pcap
HTTP/1.1
请提供 HTTP/1.1 的释义。
通过三方握手进行紧密的通信
HTTP/2 可以简洁地理解为超文本传输协议的第二个版本。
关于HTTP/2,在令和5年春季的网络专家考试下午第一题中进行了说明。
-
- HTTP1.1はリクエストを受けたのと同じ順序レスポンスを返す必要があるが、HTTP/2にはその制約がない
- HTTP1.1はパイプラインで多重化している。一方、HTTP/2ストリームと呼ばれる仮想の通信路で多重化している
头字段的必填字段
标题是使用HPACK算法进行二进制压缩。
必需字段包括:方法、方案和路径。
HTTP/3是一种用于互联网通信的协议。
最后
通过上一次的复仇,使用反向代理体验了QUIC。
即使是不支持HTTP/3的服务器
只要使用这个反向代理,从客户端的角度看,就好像正在运行支持HTTP/3的服务器一样。
对于抓取的HTTP/2、HTTP/3数据包的结果,似乎应该更仔细地阅读并深入学习。
由于写文章写到一半之后过了一段时间,所以先放流。
付録 (fù lù) -> 附录 (fù lù)
docker-compose.yml 文件
version: "3.8"
services:
client:
image: keioni/curl-http3
container_name: client
hostname: client
tty: true
stdin_open: true
volumes:
- './nginx/server.crt:/nginx/server.crt'
networks:
net1:
ipv4_address: 172.23.230.30
proxy:
image: nwtgck/nginx-http3
container_name: proxy
hostname: proxy
restart: always
ports:
- '80:80'
- '443:443'
- '443:443/udp'
depends_on:
- ghost
volumes:
- ./nginx/nginx.conf:/usr/local/nginx/conf/nginx.conf
- ./nginx/server.crt:/etc/ssl/certs/server.crt
- ./nginx/serverinstall.key:/etc/ssl/private/server.key
networks:
net1:
ipv4_address: 172.23.230.60
ghost:
image: ghost
restart: always
depends_on:
- ghost-db
environment:
database__client: mysql
database__connection__host: 172.23.230.80
database__connection__user: root
database__connection__password: password
database__connection__database: ghost
networks:
net1:
ipv4_address: 172.23.230.70
ghost-db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: password
networks:
net1:
ipv4_address: 172.23.230.80
networks:
net1:
ipam:
driver: default
config:
- subnet: 172.23.230.0/24
请看参考
- Ghost + MySQLを Dockerで動かす