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

2016-08-12 00:25:23 +08:00
 s7lx

客户的某个软件是走 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 时断时续了……各位一起来分析分析


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

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

8842 次点击
所在节点    宽带症候群
22 条回复
AVC
2016-08-12 00:39:00 +08:00
尝试用 TPROXY , iptables 里面的 mangle 表可以使用这个进行在不改变包来源地址和目标地址的情况下将包重定向到某个监听端口。也许这个才有用?
s7lx
2016-08-12 01:01:18 +08:00
@AVC 转给谁处理? 47 号协议的数据包都不算 ip 协议,有端口就意味着是 ip 协议了。我之所以用 tap 而不是 tun 就是因为 tap 是二层以太 tun 是三层的。 tap 比 GRE 低,所以才能处理的了
Siril
2016-08-12 02:35:30 +08:00
@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
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
2016-08-12 02:49:26 +08:00
楼主确认下模块装对了先,

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
2016-08-12 04:12:06 +08:00
ov 被重点照顾了
pptp 这样是正常的 很大几率是网络原因
国内到国际这段网络有些问题 导致 pptp 异常
你试试同期使用直接拨 同时间测试 也会有这个问题

遇到过 设置断线重拨 和监控 pptp 是不是 up 如果不是 重播
t123yh
2016-08-12 07:45:02 +08:00
OpenVPN 也是被照顾了的。再套一层$$(你懂的)试试
t123yh
2016-08-12 07:45:26 +08:00
看错了,当我没说
21grams
2016-08-12 09:50:28 +08:00
pptp 不能直接跑在 ss 上面吗
MikuM97
2016-08-12 10:26:00 +08:00
@Siril 这种情况可以试试在 ovpn 服务器端做 gre 隧道的转发,然后客户端直接 pptp 连接 ovpn 服务器,应该会避免很多莫名其妙的问题
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
2016-08-12 14:15:56 +08:00
ovpn 走 tcp 不穩定吧,何況跨境了干擾嚴重。
s7lx
2016-08-12 15:45:52 +08:00
@21grams 对方的 pptp 程序没有挂代理的接口。而且。 pptp 属于比 ss 更底层的。所以 tap 应该是可以的
@Yien @notgod 我是 pptp->openvpn->ss ,最外边套着 ss 的壳呢,不可能是被干扰的。而且我这边也看了,应该是本机或者服务器的对应模块加载或者 iptables 的问题。而我对 Iptables 实在是有点迷糊
s7lx
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
2016-08-12 17:27:15 +08:00
tinc 吧, openvpn 被干扰了。 tinc 的隧道应该还没被干扰到。
s7lx
2016-08-12 21:46:10 +08:00
@defunct9 知道 TINC 。但 openvpn 文档多,实践多。出了问题也有充分的资料解决。干扰问题用 ss 解决了。(审题很重要
defunct9
2016-08-12 21:53:43 +08:00
@s7lx 加 ss 套了 3 层, tinc 只有 2 层。可能出现的潜在故障点少了一个。是从这个角度看的。不妥敬请忽略,另外 tinc 分配的 ip 是连续的, openvpn 不行。
s7lx
2016-08-12 23:34:51 +08:00
我的问题不在这里。用户自己是 PPTP ,我用裸 tinc 还会遇到同样的问题, GRE 协议到底能否按照我的预期处理还是不知道,因为它也是创建虚拟设备,而我测试的结果是 tcp 和 udp 已经走通了。我看到的资料, tinc 也是和 openvpn 工作在同一层,所以 tinc 并没有解决我的问题。而且 openvpn 我已经走通了没必要重新搭一套(审题很重要 again
Liqianyu
2016-08-15 11:16:06 +08:00
据 Surge 作者说 OpenVPN 套 SS 也会被干扰...
s7lx
2016-08-16 00:49:19 +08:00
@Liqianyu Yachen Liu 貌似是用 ss-redir 搞的,我是用 ss-local ,强制 openvpn 走 tcp 代理。

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

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

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

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

© 2021 V2EX