V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
i8s301a
V2EX  ›  分享发现

Secured HTTP/2 Forward Proxy (nghttpx)

  •  
  •   i8s301a · 2015-02-11 00:56:48 +08:00 · 6181 次点击
    这是一个创建于 3577 天前的主题,其中的信息可能已经有所发展或是发生改变。
    看到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发帖,如有任何不足欢迎拍砖,谢谢。
    第 1 条附言  ·  2015-02-11 02:18:50 +08:00
    趁半夜网络勉强不抽跑个分,魔都电信50M到东京VULTR(V家白天抽到爆根本没办法用= =),服务器端除了将TCP拥堵算法切换至htcp和加大open file限制,没有其他优化。

    HTTP/2 + Squid / Polipo
    http://www.speedtest.net/result/4132191280.png (Squid)
    http://www.speedtest.net/result/4132206662.png (Polipo)

    Chrome<->Stunnel (client)<->Stunnel (server)<->Squid / Polipo
    http://www.speedtest.net/result/4132226269.png (Squid)
    http://www.speedtest.net/result/4132231417.png (Polipo)

    同场加映油管:
    http://i61.tinypic.com/2whij9w.png (HTTP/2 + Squid)
    http://i57.tinypic.com/2rc8h39.png (Stunnel + Squid)

    以上几次测速的结果差距不大,基本在同一数量级,考虑到网络的状况,各种差异可以忽略不计。
    14 条回复    2015-02-12 01:02:35 +08:00
    msg7086
        1
    msg7086  
       2015-02-11 01:06:23 +08:00 via iPhone
    手动点赞
    LazyZhu
        2
    LazyZhu  
       2015-02-11 02:17:47 +08:00
    现在也就firefox和chrome支持吧, 目前没有sock/http转nghttp2-client的工具
    freewizard
        3
    freewizard  
       2015-02-11 02:59:11 +08:00
    目测
    Chrome<->Stunnel (client)<->Stunnel (server)<->Squid
    这个组合里面的 Stunnel (server)<->Squid 貌似可以合并由Squid完成?
    i8s301a
        4
    i8s301a  
    OP
       2015-02-11 03:51:38 +08:00 via Android
    @freewizard 没记错的话Debian/Ubuntu官方源里的Squid没有加入https功能,需要自己重新编译,重新编译后Chrome可以直接加密连接到Squid,理论上两端的Stunnel都可以省去,但是Firefox不支持这种形式的代理(至少以前不可以,现在未知,当然如楼上所说的仅仅合并服务端的Stunnel+Squid应该是没问题的)。

    保留Stunnel更多是为了方便给其他不支持https proxy的程序(很显然绝大部分程序不支持)提供代理。
    freewizard
        5
    freewizard  
       2015-02-11 04:38:32 +08:00
    我记得squid有个bug,导致客户端这个stunnel是怎么都省不了的
    squid 3.2时候我看了一次bug还在,后来没关注。
    KyonLi
        6
    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
        7
    zjgood  
       2015-02-11 07:44:07 +08:00 via Android
    @KyonLi 我当初也碰到过这个问题,好像参照spdylay修改了一下安装路径就解决了。
    这货就是spdylay衍生的吧,配置文件什么的都可以通用。我配置好之后fronted默认没有启动SSL,导致被检测而不可翻?
    KyonLi
        8
    KyonLi  
       2015-02-11 08:13:29 +08:00 via Android
    @zjgood 多谢,改为安装到 /usr 就好了
    KyonLi
        9
    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
        10
    Tink  
       2015-02-11 09:38:57 +08:00
    啥是http2?
    zjgood
        11
    zjgood  
       2015-02-11 09:55:47 +08:00
    @KyonLi 我用chacha20重新编译了spdylay,今天晚上测测速度 :)
    jefby
        12
    jefby  
       2015-02-11 23:19:22 +08:00
    good
    facat
        13
    facat  
       2015-02-11 23:50:31 +08:00
    感觉有点复杂,谁能整合一下就好了。
    i8s301a
        14
    i8s301a  
    OP
       2015-02-12 01:02:35 +08:00   ❤️ 1
    更正,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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3126 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:24 · PVG 21:24 · LAX 05:24 · JFK 08:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.