通过 TCP 分流对 OpenVPN 进行加速 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
coolypf
V2EX    分享创造

通过 TCP 分流对 OpenVPN 进行加速

  •  
  •   coolypf
    coolypf 2013-11-25 19:31:41 +08:00 18217 次点击
    这是一个创建于 4341 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我写了一个程序实现对 TCP 连接的分流,即将一个 TCP 连接的流量分布到多个 TCP 连接上进行传输。程序的主要作用是提升通过 TCP 连接的 OpenVPN 服务的速率,使之充分利用带宽。在特定网络环境下,我测试得到了约 320% 的加速。

    详情参见 http://blog.csdn.net/coolypf
    25 条回复    1970-01-01 08:00:00 +08:00
    DreaMQ
        1
    DreaMQ  
       2013-11-25 19:56:22 +08:00 via Android
    Openvpn不是早被和谐了么,这个能避免被墙吗
    coolypf
        2
    coolypf  
    OP
       2013-11-25 20:06:49 +08:00
    @DreaMQ 在客户端,可以以 listen 方式启动我的程序,服务器端 connect 回国内,这样建立连接。
    GFW 是否有针对性措施还不清楚,我目前用的 IPv6 ,这个程序主要起加速作用。
    est
        3
    est  
       2013-11-25 20:29:07 +08:00
    tcp over tcp注定没前途的噶。。
    coolypf
        4
    coolypf  
    OP
       2013-11-25 20:32:46 +08:00
    @est 设置 TCP_NODELAY 选项优化延时,使用我这个程序提升速率就可以了。
    我这里不知道为什么 OpenVPN 没法通过 UPD/IPv6 连接, UDP/IPv4 没问题,通过 UDP/IPv6 的 DNS 也没问题,很奇怪。
    coolypf
        5
    coolypf  
    OP
       2013-11-25 20:49:00 +08:00   1
    目前,基于该程序的 OpenVPN 连接已经稳定运行 1 小时 55 分,发送 20928410 字节,接收 145074943 字节。
    客户端 CERNET ,服务器 BurstNET VPS , IPv6 连接。
    DreaMQ
        6
    DreaMQ  
       2013-11-25 21:15:46 +08:00 via Android
    @coolypf 试过的,墙外连墙内也会被封端口
    coolypf
        7
    coolypf  
    OP
       2013-11-25 21:22:52 +08:00
    @DreaMQ 我这个程序建立连接之后会关闭监听的 socket ,只保留用于分流的 TCP 连接,不知道会不会好点。
    现在不方便测试 IPv4 。
    hadoop
        8
    hadoop  
       2013-11-25 23:49:19 +08:00   1
    原来是ypf大神!失敬
    hadoop
        9
    hadoop  
       2013-11-25 23:50:16 +08:00
    @coolypf TCP_NODELAY这个是openvpn提供的参数?
    javaluo
        10
    javaluo  
       2013-11-25 23:53:02 +08:00 via Android
    赞一个
    DreaMQ
        11
    DreaMQ  
       2013-11-25 23:59:39 +08:00 via Android
    @coolypf 希望能加点混淆吧
    墙就是抓建立连线时的特征的
    coolypf
        12
    coolypf  
    OP
       2013-11-26 08:34:41 +08:00
    @hadoop openvpn --help | grep nodelay
    coolypf
        13
    coolypf  
    OP
       2013-11-26 08:37:29 +08:00
    @DreaMQ 我这个程序要混淆/加密流量相当容易,改改 Poco::BasicFIFOBuffer 就行了。
    其实,更改分流的连接数量,对 GFW 来说特征就完全不同了。
    只要 GFW 不改成白名单制,应对起来难度都不会太大。
    holmesabc
        14
    holmesabc  
       2013-11-26 09:12:31 +08:00
    不知道原理是不是和迅雷的多线程下载类似啊
    coolypf
        15
    coolypf  
    OP
       2013-11-26 09:17:29 +08:00
    @holmesabc 差不多,在延时较高的情况下,使用并发连接以充分利用带宽。
    DreaMQ
        16
    DreaMQ  
       2013-11-26 11:51:06 +08:00 via Android
    @coolypf 很好,我试试
    coolypf
        17
    coolypf  
    OP
       2013-11-26 16:41:22 +08:00
    @hadoop 你是 lgj ?
    est
        18
    est  
       2013-11-26 16:43:41 +08:00
    @hadoop 和nodelay无关。你用tcp去封装别人的tcp可以,但是mss和一些流控技术是没法便宜得到的。
    http://sites.inka.de/~W1011/devel/tcp-tcp.html
    est
        19
    est  
       2013-11-26 17:01:41 +08:00
    LZ其实思路很牛逼了。不过我觉得MPTCP加上自定定制一个parity算法可能效果更好。当年中二的时候也有个类似idea https://groups.google.com/forum/#!topic/pongba/8sLMVXGYQqE
    coolypf
        20
    coolypf  
    OP
       2013-11-26 18:41:13 +08:00
    @est MPTCP 目前只有 iOS 7 上在用吧。
    我这个程序稍加修改,配合 socat 之类的工具,就能像下面这样用,相当于把原来的一个 TCP 连接分流成 1 个直接连接和 3 个间接连接。

    client <----------------> server
    | <-------> relay1 --------> |
    | <-------> relay2 --------> |
    | <-------> relay3 --------> |
    hadoop
        21
    hadoop  
       2013-11-26 19:40:17 +08:00
    @coolypf 大神你还人肉我 ?
    coolypf
        22
    coolypf  
    OP
       2013-11-26 19:42:50 +08:00
    @hadoop 挺容易就搜到了。
    est
        23
    est  
       2013-11-26 20:05:23 +08:00
    @coolypf 对。加上parity就可以实现2+1=3个连接,其中1个做冗余。3个中断掉任意一个都可以不影响数据传输(类似RAID2)
    coolypf
        24
    coolypf  
    OP
       2013-11-26 20:09:08 +08:00
    @est 这些逻辑修改 main 函数和 divider, combiner 两个类都能比较容易地实现。
    catofes
        25
    catofes  
       2013-12-13 01:29:24 +08:00
    好赞~ TCP分包拼包程序我学长写过一份:https://npmjs.org/package/mtcp 不过我觉得c++更好。

    IPV6的udp openvpn应该是不麻烦的。我的配置文件:
    server:
    local 2001:470:f04:e0::1
    port 555
    proto udp6
    dev tun
    ca /root/openvpn/keys/ca.crt
    cert /root/openvpn/keys/server.crt
    key /root/openvpn/keys/server.key
    dh /root/openvpn/keys/dh1024.pem
    server 10.8.1.0 255.255.255.0
    client-to-client
    keepalive 10 120
    comp-lzo
    persist-key
    persist-tun
    plugin /usr/lib/openvpn/plugins/openvpn-plugin-auth-pam.so openvpn
    client-cert-not-required
    username-as-common-name
    status /root/openvpn/logs/status6.log
    log-append /root/openvpn/logs/udp6.log
    verb 3
    mute 5
    push "dhcp-option DNS 8.8.8.8"
    push "dhcp-option DNS 4.2.2.1"
    push "dhcp-option DNS 4.2.2.2"
    --script-security 3 system
    client-connect /root/openvpn/connect.sh
    client-disconnect /root/openvpn/disconnect.sh


    client:

    client
    dev tun
    proto udp6
    remote 2001:470:1f04:d39::2 555
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    ca ca.crt
    auth-user-pass
    rcvbuf 65536
    mssfix 1432
    comp-lzo
    verb 3
    redirect-gateway def1
    script-security 2 system
    up update-resolv-conf
    down update-resolv-conf

    以及openvpn over ipv6 udp 速度:http://www.speedtest.net/my-result/3161185703
    一样的burst.net 的服务器

    期待能有udp的分包版本
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2971 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 13:43 PVG 21:43 LAX 06:43 JFK 09:43
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86