V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
coolypf
V2EX  ›  分享创造

通过 TCP 分流对 OpenVPN 进行加速

  •  
  •   coolypf ·
    coolypf · 2013-11-25 19:31:41 +08:00 · 17741 次点击
    这是一个创建于 4051 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我写了一个程序实现对 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   ·   实用小工具   ·   2815 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 14:10 · PVG 22:10 · LAX 06:10 · JFK 09:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.