Secured HTTP/2 Forward Proxy (nghttpx)

2015-02-11 00:56:48 +08:00
 i8s301a
看到Chrome即将正式加入HTTP/2支持的消息,首先想到的是能不能用来x墙,于是开始折腾Chrome (client) <---{secured HTTP/2 proxy}---> nghttpx (server frontend) <---> Squid (server backend)的组合。

这个组合先前在v2上已经有人提到,可以参见 http://www.v2ex.com/t/143614

本人小白,直接在Ubuntu下用apt-get抓了nghttp2 (0.4.1-1)的包,貌似版本相对比较旧不过一切正常,喜欢折腾的可以自行编译最新版本,目测也不会很复杂。官方的文档写得不错,该有的应该都有了: https://nghttp2.org/documentation/index.html; https://nghttp2.org/documentation/nghttpx-howto.html#http-2-proxy-mode; https://github.com/tatsuhiro-t/nghttp2

通过chrome://net-internals可以发现,目前在Stable分支下的Chrome (40.0.2214.111)仍旧通过spdy/3.1连接,而Canary (42.0.2300.2)已经能够使用HTTP/2 (h2-14)。

试用了一段时间,相对于此前Stunnel+Squid的组合,暂时没有特别明显的差异。

顺便提一下,nghttpx支持使用证书验证(参见 https://nghttp2.org/documentation/nghttpx.1.html#cmdoption--verify-client ),于是可以自建PKI签发证书实现访问控制,安全方便(推荐下XCA,作为小白,再也不用折腾openssl的各种命令了)。

第一次在v2ex发帖,如有任何不足欢迎拍砖,谢谢。
6199 次点击
所在节点    分享发现
14 条回复
msg7086
2015-02-11 01:06:23 +08:00
手动点赞
LazyZhu
2015-02-11 02:17:47 +08:00
现在也就firefox和chrome支持吧, 目前没有sock/http转nghttp2-client的工具
freewizard
2015-02-11 02:59:11 +08:00
目测
Chrome<->Stunnel (client)<->Stunnel (server)<->Squid
这个组合里面的 Stunnel (server)<->Squid 貌似可以合并由Squid完成?
i8s301a
2015-02-11 03:51:38 +08:00
@freewizard 没记错的话Debian/Ubuntu官方源里的Squid没有加入https功能,需要自己重新编译,重新编译后Chrome可以直接加密连接到Squid,理论上两端的Stunnel都可以省去,但是Firefox不支持这种形式的代理(至少以前不可以,现在未知,当然如楼上所说的仅仅合并服务端的Stunnel+Squid应该是没问题的)。

保留Stunnel更多是为了方便给其他不支持https proxy的程序(很显然绝大部分程序不支持)提供代理。
freewizard
2015-02-11 04:38:32 +08:00
我记得squid有个bug,导致客户端这个stunnel是怎么都省不了的
squid 3.2时候我看了一次bug还在,后来没关注。
KyonLi
2015-02-11 07:26:18 +08:00
两台Ubuntu 14.04 VPS,编译安装github上最新master和最新release运行nghttpx时均都会提示 nghttpx: error while loading shared libraries: libnghttp2.so.5: cannot open shared object file: No such file or directory ,而 /usr/local/lib/ 下是有 libnghttp2.so.5 的并且指向 libnghttp2.so.5.4.0 ,不知道怎么解决这个问题
zjgood
2015-02-11 07:44:07 +08:00
@KyonLi 我当初也碰到过这个问题,好像参照spdylay修改了一下安装路径就解决了。
这货就是spdylay衍生的吧,配置文件什么的都可以通用。我配置好之后fronted默认没有启动SSL,导致被检测而不可翻?
KyonLi
2015-02-11 08:13:29 +08:00
@zjgood 多谢,改为安装到 /usr 就好了
KyonLi
2015-02-11 09:02:32 +08:00
@zjgood 这个不太清楚,我一直是启用SSL的。另外nghttp2 v0.7.3 + Chrome Canary (42.0.2301.0)启用http/2后https网站无法打开,spdy模式则正常。
Tink
2015-02-11 09:38:57 +08:00
啥是http2?
zjgood
2015-02-11 09:55:47 +08:00
@KyonLi 我用chacha20重新编译了spdylay,今天晚上测测速度 :)
jefby
2015-02-11 23:19:22 +08:00
good
facat
2015-02-11 23:50:31 +08:00
感觉有点复杂,谁能整合一下就好了。
i8s301a
2015-02-12 01:02:35 +08:00
更正,nghttp2旧版(0.4.1)配合Chrome并不能实现HTTP/2(原因不明,可能是因为旧版支持的HTTP/2草案版本过低),此前在chrome://net-internals中所看到的只是和目标网站连接所使用的协议,而非和代理服务器之间的协议。正确检测的姿势应当是在不开启代理的情况下访问代理服务器的地址https://proxy.example.com/,随后应当能够在chrome://net-internals/#spdy看到和proxy.example.com所使用的协议为h2-14。

补充1,在Ubuntu 14.10下根据官方github说明中的方式编译最新版(0.7.4-DEV)后,需要运行一次ldconfig,否则会出现楼上"nghttpx: error while loading shared libraries: libnghttp2.so.5: cannot open shared object file: No such file or directory"的报错。 @KyonLi @zjgood

补充2,0.7.4-DEV版配合squid/polipo无法访问https网站,暂时没找到解决的方法。 @KyonLi

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/170000

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX