V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
s7lx
V2EX  ›  宽带症候群

套娃级“跨境加速”已成为玄学,大家一起来讨论讨论

  •  
  •   s7lx · 2016-08-12 00:25:23 +08:00 · 8780 次点击
    这是一个创建于 3018 天前的主题,其中的信息可能已经有所发展或是发生改变。

    客户的某个软件是走 pptp 协议的,但由于 pptp server 在境外,所以跨境的时候几乎必然被随机的干扰几下

    我的方案是在 openwrt 里集成 openvpn 强制走 tcp ,然后给 tcp 套个 ss 的壳。然后客户用这个路由器就行了

    问题来了,每次路由器重启,都会随机的出现 pptp 可以走得通或者走不通。 现在整个人已经完全崩溃。

    具体配置如下 服务器端(openvpn)

    dev tap
    route 127.0.0.1 port
    push "route a.a.a.a"
    其他省略
    

    a.a.a.a 为客户的 pptp 服务器, openvpn 和 ss 在同一台机器上

    路由器里

    dev tap
    其他省略
    

    /etc/rc.local里写入了

    iptables -I FORWARD -o tap0 -j ACCEPT
    iptables -t nat -I POSTROUTING -o tap0 -j MASQUERADE
    

    目前 ping(traceroute)的通, tcp 和 udp 也都走得通,但就是 pptp 经常过不去。

    1  192.168.7.1 (192.168.7.1)  1.378 ms  1.237 ms  1.285 ms
    2  172.16.10.1 (172.16.10.1)  35.014 ms  15.301 ms  15.339 ms  <-这个就已经在 ss 服务器上了
    3  192.168.72.193 (192.168.72.193)  16.822 ms  32.985 ms  39.975 ms
    

    也就是说是需要实现 pptp->openvpn->ss 这么一种玩法。目前就差 pptp 时断时续了……各位一起来分析分析


    目前路由器里已经加装如下组件

    • kmod-nf-nathelper-extra
    • kmod-iptunnel
    • kmod-ipt-extra
    • kmod-ipt-nat-extra
    • kmod-gre

    应该不存在模块不全导致GRE过不去

    第 1 条附言  ·  2016-08-12 01:11:03 +08:00

    服务端配置写错了

    dev tap
    remote 127.0.0.1 port
    

    这样会直接从ss的出口过去然后落在openvpn server上,是可行的

    22 条回复    2016-08-20 14:11:25 +08:00
    AVC
        1
    AVC  
       2016-08-12 00:39:00 +08:00
    尝试用 TPROXY , iptables 里面的 mangle 表可以使用这个进行在不改变包来源地址和目标地址的情况下将包重定向到某个监听端口。也许这个才有用?
    s7lx
        2
    s7lx  
    OP
       2016-08-12 01:01:18 +08:00
    @AVC 转给谁处理? 47 号协议的数据包都不算 ip 协议,有端口就意味着是 ip 协议了。我之所以用 tap 而不是 tun 就是因为 tap 是二层以太 tun 是三层的。 tap 比 GRE 低,所以才能处理的了
    Siril
        3
    Siril  
       2016-08-12 02:35:30 +08:00   ❤️ 4
    @s7lx
    gre 协议(ip 协议号 47) 当然是 ip 数据包,只不过不是 tcp 也不是 udp ( tcp 或 udp 也有 ip 协议号);
    pptp 使用 tcp 1723 传输控制指令,使用 gre 协议传输数据。
    --------------------------
    由上推论 tun 应该也可。 对了, tun 效率高些。
    --------------------------
    linux 只要加载了对应内核模块,就可以使用 iptables 对 gre 数据包动手脚:
    -------------------------
    我玩过的一个场景,供参考:
    公司电信宽带, 远程办公必须使用 pptp 连过去(因为其他 vpn 的组播代理搞不定);
    部分员工家里联通宽带, 直接连有时会断,丢包延迟蛋疼(都懂得);
    买一台 4M 带宽的阿里云转发之,下面几行命令:

    打开 ip 转发;
    modprobe nf_conntrack_pptp (根据内核版本不同,可能是 ipt_xxxx 的模块,也可能我记错了)

    iptables -t nat -A PREROUTING -d vps 公网 ip -p 47 -j DNAT --to-destination 公司 ip
    iptables -t nat -A POSTROUTING -d 公司 ip -p 47 -j SNAT --to-source vps 公网 ip
    iptables -t nat -A PREROUTING -d vps 公网 ip -p tcp --dport 1723 -j DNAT --to-destination 公司 ip
    iptables -t nat -A POSTROUTING -d 公司 ip -p tcp --dport 1723 -j SNAT --to-source vps 公网 ip

    ---------------------
    于是客户端以 pptp 连接此 vps , 相当于连接到公司, (同城市的) 延迟从 100ms+ 降到 20ms+
    Siril
        4
    Siril  
       2016-08-12 02:46:46 +08:00
    刚才的回复有点不对题,
    就是提醒下 gre 协议属于 ip 协议, 不是 ip 同层协议( ipx 那种不用 ip 地址的才是)。

    楼主的部署方式, 也就是 openvpn over $$,
    如果 openvpn 隧道没有严重丢包,这里就可以忽略$$,仅讨论 pptp over openvpn :
    ----------------------------------------------------
    如果我没理解错的话, 数据包在两个设备上经过 2 次 nat :
    一次 在 openwrt 路由上 从 tap 口出去,
    另一次 在 vps 出口 从 tap 进来从 eth0 出去。

    两个带 nat 设备,应该都是 linux 了, 都需要加载对应内核模块 以 支持 gre 数据包 过 nat 。
    因为 gre 数据包没有端口号, 啥 conntrack 的需要特别地支持它的那啥 number 的。

    lsmod | grep conntrack 检查下。(应该是吧)

    ---------------------
    快 3 点了,有点不清醒语无伦次见谅。
    Siril
        5
    Siril  
       2016-08-12 02:49:26 +08:00   ❤️ 1
    楼主确认下模块装对了先,

    15.05 用 kmod-nf-nathelper-extra , 14.07 及之前的用 kmod-ipt-nathelper-extra

    ---------------------
    来自: https://wiki.openwrt.org/doc/howto/vpn.nat.pptp
    Installation
    See opkg for details on how to use this tool.
    For the current versions of OpenWRT (since Chaos Calmer 15.05), you should install:
    opkg install kmod-nf-nathelper-extra

    You should now be able to use multiple PPTP connections from LAN to WAN at the same time.

    Old versions until Barrier Breaker 14.07 used 'kmod-ipt-nathelper-extra' instead:
    opkg install kmod-ipt-nathelper-extra
    notgod
        6
    notgod  
       2016-08-12 04:12:06 +08:00 via iPhone
    ov 被重点照顾了
    pptp 这样是正常的 很大几率是网络原因
    国内到国际这段网络有些问题 导致 pptp 异常
    你试试同期使用直接拨 同时间测试 也会有这个问题

    遇到过 设置断线重拨 和监控 pptp 是不是 up 如果不是 重播
    t123yh
        7
    t123yh  
       2016-08-12 07:45:02 +08:00 via Android
    OpenVPN 也是被照顾了的。再套一层$$(你懂的)试试
    t123yh
        8
    t123yh  
       2016-08-12 07:45:26 +08:00 via Android
    看错了,当我没说
    21grams
        9
    21grams  
       2016-08-12 09:50:28 +08:00 via Android
    pptp 不能直接跑在 ss 上面吗
    MikuM97
        10
    MikuM97  
       2016-08-12 10:26:00 +08:00
    @Siril 这种情况可以试试在 ovpn 服务器端做 gre 隧道的转发,然后客户端直接 pptp 连接 ovpn 服务器,应该会避免很多莫名其妙的问题
    Siril
        11
    Siril  
       2016-08-12 13:51:41 +08:00
    @miaojiang22220

    确实比较推荐楼主这样做;
    ----------------------------
    至于我回复里举的例子,
    是解决跨 isp 的丢包延迟,不是解决干扰,直接转发很简单,无须套一层隧道了。
    楼主误以为 gre 协议有什么特别的魔法 :P ,其实还不是 ip 数据包嘛。

    怎么删自己的回复? 上面 3 个跑题的。
    ----------------
    请楼主出来说明 pptp server 和 ovpn server 是不是同一台。
    如果不是同一台,在 ovpn server 上参考以下两个链接检查内核模块是否安装。
    https://www.linuxquestions.org/questions/linux-networking-3/pptp-multiple-clients-behind-iptables-nat-536321/
    https://serverfault.com/questions/167485/pptp-gre-multi-forwarding-nat-iptables-example

    如果没装,则 pptp 连接可能出现:
    同时只能有 1 个客户端能连接的情形;
    重启后一段时间失效之类不稳定的情形。
    Yien
        12
    Yien  
       2016-08-12 14:15:56 +08:00
    ovpn 走 tcp 不穩定吧,何況跨境了干擾嚴重。
    s7lx
        13
    s7lx  
    OP
       2016-08-12 15:45:52 +08:00
    @21grams 对方的 pptp 程序没有挂代理的接口。而且。 pptp 属于比 ss 更底层的。所以 tap 应该是可以的
    @Yien @notgod 我是 pptp->openvpn->ss ,最外边套着 ss 的壳呢,不可能是被干扰的。而且我这边也看了,应该是本机或者服务器的对应模块加载或者 iptables 的问题。而我对 Iptables 实在是有点迷糊
    s7lx
        14
    s7lx  
    OP
       2016-08-12 15:50:47 +08:00
    @Siril 另起一楼单独表示感谢先
    已在主贴里列出了对应模块。测试结果是不但 nf-nathelper-extra 要有, kmod-gre 也要有,当时就是装了这个模块的一瞬间就连上去了

    服务器上又加载了三个模块
    ```
    modprobe ip_nat_pptp
    modprobe ip_conntrack_pptp
    modprobe ip_gre
    ```
    待我反复试验后告知结果。再次感谢
    defunct9
        15
    defunct9  
       2016-08-12 17:27:15 +08:00
    tinc 吧, openvpn 被干扰了。 tinc 的隧道应该还没被干扰到。
    s7lx
        16
    s7lx  
    OP
       2016-08-12 21:46:10 +08:00
    @defunct9 知道 TINC 。但 openvpn 文档多,实践多。出了问题也有充分的资料解决。干扰问题用 ss 解决了。(审题很重要
    defunct9
        17
    defunct9  
       2016-08-12 21:53:43 +08:00 via iPhone
    @s7lx 加 ss 套了 3 层, tinc 只有 2 层。可能出现的潜在故障点少了一个。是从这个角度看的。不妥敬请忽略,另外 tinc 分配的 ip 是连续的, openvpn 不行。
    s7lx
        18
    s7lx  
    OP
       2016-08-12 23:34:51 +08:00
    我的问题不在这里。用户自己是 PPTP ,我用裸 tinc 还会遇到同样的问题, GRE 协议到底能否按照我的预期处理还是不知道,因为它也是创建虚拟设备,而我测试的结果是 tcp 和 udp 已经走通了。我看到的资料, tinc 也是和 openvpn 工作在同一层,所以 tinc 并没有解决我的问题。而且 openvpn 我已经走通了没必要重新搭一套(审题很重要 again
    Liqianyu
        19
    Liqianyu  
       2016-08-15 11:16:06 +08:00
    据 Surge 作者说 OpenVPN 套 SS 也会被干扰...
    s7lx
        20
    s7lx  
    OP
       2016-08-16 00:49:19 +08:00
    @Liqianyu Yachen Liu 貌似是用 ss-redir 搞的,我是用 ss-local ,强制 openvpn 走 tcp 代理。
    AVC
        21
    AVC  
       2016-08-17 02:47:51 +08:00 via Android
    在 ss 里面套 openvpn 亲测下载时断时续。 LSW 香港报告。
    s7lx
        22
    s7lx  
    OP
       2016-08-20 14:11:25 +08:00
    @AVC HK aliyun B 实跑没问题。你的 OPENVPN 是 P2P 还是 DHCP
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2765 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:37 · PVG 13:37 · LAX 21:37 · JFK 00:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.