1
yangyaofei 2015-09-13 22:04:00 +08:00 via Android
不是在 ss 的安卓上面有一个 tun2socks 么,为啥要做这个?
|
2
pagxir OP tun2socks 的目标不是 android ,是 linux/openwrt ,并且是一个简单的实现,不需要依赖太多东西,所以容易编译,不过在什么地方。
目的是,用来创建 IPv6 的 tunnel. |
3
uniquecolesmith 2015-09-13 22:15:29 +08:00
写个文档,讲讲原理+实现?
|
4
qping 2015-09-14 08:12:40 +08:00
同意楼上~
|
5
missdeer 2015-09-14 09:16:25 +08:00
我也想问原理, tun 是拦截网络层还是传输层的包?然后怎么封装到 socks (会话层)里呢?
|
6
yangyaofei 2015-09-14 09:44:24 +08:00
https://github.com/ambrop72/badvpn/tree/master/tun2socks
看看这个,已经有人实现的, libev 事件驱动, lwip 。就是我说等 ss-android 上的实现, ss-android 自己有改一点,但是基本上一样,这个是全平台的, windows macOS linux 什么的都支持。 @missdeer 貌似得到的是 IP 字段 |
7
pagxir OP @yangyaofei 原理不一样。从原理来将,这个实现更加简单,所以也更加稳定。不依赖 libev 也不依赖 lwip/uip ,代码总行数不会超过 1000 行。目前实现只是个雏形。 tun 配置 IP 地址为 10.3.0.1/16, 所有经由 tun 的 IPv6/IPv4 的 TCP 链接都会转换为一条到 10.3.0.1:8000 的 socks5 的会话链接。只要有标准的 socks5 服务器侦听 10.3.0.1:8000 即可实现转换工作。
跟 badvpn 的实现完全是两回事,不依赖 libev ,原理上具有更好的可移植性。 @uniquecolesmith 以后,如果有人感兴趣的话,我会把原理 /实现思路整理出来。 目前的实现不支持 UDP ,将来也不计划支持 UDP ,不过下一步会计划实现一个 dns 转发器,支持 IPv4/IPv6 分离到不同的服务器,并保证 IPv6 拿到的是干净的地址,通过 DNS64 的方式支持将国外的 IPv4 地址 wrap 到 IPv6 中(已经有了个可以工作的雏形)。 |
8
yangyaofei 2015-09-14 10:36:08 +08:00
@pagxir 额,我只是觉得,重复造轮子..... 话说 libev lwip 只要代码放在哪儿,应该基本上牵扯不到移植性的问题吧,你用 select 什么的,在 unix 和 win 上都不行吧...
|
9
yangyaofei 2015-09-14 10:37:53 +08:00
额~~说错了~unix 上可以...
|
10
uniquecolesmith 2015-09-14 11:11:31 +08:00
@pagxir 继续做吧,我支持你,客观来说, 有想法+实践总是好的, 没准哪天超过 ss. 不过你最好单独一个分支或者单独一个项目, 要想让别人看到,最好多写点文档. 重复造轮子是对别人来说,要是自己有兴趣,造轮子何妨 ?
|
11
guchengyehai1 2017-10-17 14:31:14 +08:00
@pagxir 楼主你好,我想问一下,你从 tun 设备读取的 ip 数据包,经过转换是指在 jni 层剥离 TCP 数据报的 IP header 和 TCP header,UDP 数据报剥离 IP header 和 UDP header 么
|
12
pagxir OP @guchengyehai1 不是,是指在 jni 收到报文之后,执行 NAT 转换,再回写到 tun 设备,从而达到从定向 tcp 链接的效果。
看这个实现: https://github.com/cachefiles/notbevpn 或者这个实现: https://github.com/xjdrew/kone 原理一样,只是代码构造更简单些。 |
13
guchengyehai1 2017-10-18 10:56:06 +08:00
@pagxir 非常感谢,怪不得我用 badvpn 的 tun2socks 启动的 local socks5 server 监听到的 remote host 全是 127.0.0.1
|