V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  cs010  ›  全部回复第 4 页 / 共 7 页
回复总数  124
1  2  3  4  5  6  7  
2019-08-13 14:18:34 +08:00
回复了 salamanderMH 创建的主题 问与答 MongoDB 复合索引的一个问题?
@salamanderMH 抱歉,我先前回答并不准确,你不妨贴一下你的执行计划和 mongo 版本
2019-08-13 10:15:37 +08:00
回复了 salamanderMH 创建的主题 问与答 MongoDB 复合索引的一个问题?
@salamanderMH 用正则应该走全表扫描,怎么还会前缀匹配。你把正则换了,肯定就走索引了啊
2019-08-13 00:27:06 +08:00
回复了 salamanderMH 创建的主题 问与答 MongoDB 复合索引的一个问题?
因为你查询的时候,nickname 是正则,没法走索引
@Srar 如果 socket 没法直接指定,libpcap 是个替代,但需要再重新把 tcp 数据封装为 ip 报文,太重了,会疯滴
@jedihy 因为你没试过
@jedihy Of course not
@gggxxxx 我已经 Google 过 n 次了,几乎能找到的方法都试过,我主题里面也提到过,都不可用,你说的随便搜,不礼貌的说法,有点想当然了,不管如何,谢谢你
@gggxxxx
我觉得我解释得应该够清楚了:)

1,我要全局代理可以用 tun 劫持全局流量对吧,我要在 Android 上全局代理,必须用 vpnservice,在 IP 层,为了平台通用性肯定选型在 IP 层,没问题吧。想改 TCP 数据,必须读取 TCP 数据,改完了,想发出去而不用再次封为 IP 报文,肯定用 socket 直接转发 TCP 数据啊

2,往外发肯定走物理网卡毫无疑问,但是我要劫持流量啊,当然要用 tun 拿到全局流量,再往外发呀

各种 socks 代理当然可以代理劫持,关键是,全局劫持,通用性,所以选 tun,在 IP 层做了呀。

其实需求不用质疑,没问题,这里唯一的问题就是怎么用 socket 指定网卡发送的问题。

你可以把问题简化为,mac 上,两个物理网卡,socket 怎么选任意网卡往外发的问题,只有这个问题
@gggxxxx 你没理解到我的意思,我这里的关键是 utun 拿到数据后,要动态路由的问题

考虑这个场景,假设我要全局劫持流量

1,设置默认路由到 utun,所有流量到 utun
2,从 utun 获取 IP 数据包,通过 lwip 获取 TCP 数据 data 后,然后不想通过 lwip 再次封装为 IP 包,而是直接通过 socket 将 data 发出去。这时问题是,默认路由是到 utun 的,如果默认路由发 data 出去,势必又会到 utun,造成死循环,为解决这个问题,可能的几种方法:

1,上面提到的 socket 选项,但只有 Linux 支持,mac 没有

2,是否可通过上面提到的 bind 等方案,我自己试验不行,如果你说可以,可否麻烦分享一下你的代码片段

3,每次发送 data 时,动态更改路由(或者用 pf 等),发送完后,再改回来。这里是重点,决定了你的方案不可用,虽然我这次发送,决定走代理出去,但下次同一个目的 IP 数据包,我可能想让它通过 en0 出去,所以我不能把路由表或者 pf 的规则写死为 en0,而是动态的,这就需要效率,如果 man pf(4)的方法效率没问题,那可以考虑动态更改。

如果不考虑需求,其实很简单可以描述,mac 上的 socket 是否有和 Linux 一样的选项,我可以指定这个 socket 发送数据时,由哪个网卡发出去,当然前提是我要动态和效率,不要写死路由表或者 pf 规则。如代码中,这样写 socket.sendto(data, 任意网卡名)

我不知道这样说,你了解了吗?
@auser 是的,分流的问题 linux 有 SO_BINDTODEVICE,Android 有 VPNService 的 protect,windows 似乎可以直接 bind,macos、ios 的无 root 通用方法似乎只有你提到的 Network Extension。

现在,我的其它部分差不多都 ok 了,不分流的情况下已经可以正常稳定的跑起来了,主要是分流的问题。协议层的处理已经用 lwip 完成。总的来说就是,由 lwip 完成 tcp 协议的事情,拿到数据后,再交由代理模块处理,代理模块决定走代理,还是直接选择 en0 发出去。另外 mac 的 tun 的操作,是借鉴 openvpn 和 github 上的 water 项目。

跨平台对我是必须要做的,不然不管 linux 的 tun/tap 还是 socket,甚至是 raw socket 都很方便,一路研究过来,坑比较少。
@gggxxxx 纠结之处在于,能动态修改但要高效,所以没有尝试去动态修改路由表(否则直接启进程调用 pf 就行了)。在 linux 中,简单的 setopt SO_BINDTODEVICE 参数就行,这也是最佳方案,简单高效,但在 mac,无法直接 bind。你提到说 bind 是可行的,我的姿势不对,不知道你是否方便分享一下你的代码片段,非常感谢!
另外,我查了 pf 应该是可编程动态修改规则的,但又担心效率,我去试试。![man pf]( https://man.openbsd.org/pf) ![EXAMPLES]( https://man.openbsd.org/pf#EXAMPLES),如果 ok,我会 append
@gggxxxx pf 只做映射当然可以,但是要动态映射,动态指定网卡,不知道可否。这里主要问题不是流量能不能走到 utun,而是走到 utun,我拿到数据,怎么再决定它由 en0 而不是 utun 发到外网
@gggxxxx 而且,你可能指的是接收数据绑定,我这里是发送数据绑定哈。
换句话说,虽然我默认把 2.2.2.2 路由到 utun,但是从 utun 拿到目的地 2.2.2.2 的数据后,我现在想指定 2.2.2.2 的数据由 en0 发送而不是 utun
@gggxxx 感谢回复,无论直接 bind IP,还是在正文中,第二个不可用方法提到过的 bind,都是反复测试后,不可用的
@auser 补充一句,路由表目前在我的需求中,只是对数据包分流进行了粗分,我想在 tun 层进行细分
@auser 谢谢大佬!潜水这么久,第一次在 v2 提问,看到这么认真的回答,很感动。

> tun 的方式建议在 Linux 下来做,转发层面可以快速出成果。

为什么说在 mac,因为我想做的是跨平台,tun 在 linux,mac,win 都有 tun 的实现,linux 已验证、mac 正在验证、win 待验证。

> 即便路由层面搞定了,复杂的规则,比如规律需要使用域名而非 IP

是的,根据域名本来也是考虑范围,但是鉴于在 tun 层只能拿到 ip,只在 tun 层是很难搞定的,遂放低优先级。

> 这些选项建议配合源码来看,只看 socket 接口层即可

谢谢,我会去尝试深入

但在此之前,我仍希望得到,像你这样热心的大佬们的指点,少走弯路 :)
@auser 感谢提醒,已 append
2019-07-09 19:37:51 +08:00
回复了 keelii 创建的主题 程序员 技术的变化根本没那么快
@lidfather 你的 native 写得有点 naive🤣
2019-07-03 13:21:28 +08:00
回复了 947211232 创建的主题 程序员 根据逻辑判断,说说令人深刻的广告词
@www5070504 不会,你光嘴炮不需要负责,毕竟网上嘴炮最简单了
2019-06-22 10:03:24 +08:00
回复了 p1094358629 创建的主题 Linux 你们 Linux 上部署的项目的日志都是怎么看的?
钓鱼贴,v2 的平均水准真是越来越低
1  2  3  4  5  6  7  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2022 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 24ms · UTC 01:06 · PVG 09:06 · LAX 18:06 · JFK 21:06
Developed with CodeLauncher
♥ Do have faith in what you're doing.