一个简单实现的 tun2socks

2015-09-13 21:46:49 +08:00
 pagxir
一个实现 tun2socks 的功能,支持 IPv4/IPv6, 感觉用在 openwrt 上的话应该不错。后端 socks5 proxy 如果支持 IPv4, 那么应该就能够建立一个 IPv6 tunnel 的了。

感兴趣的话,可以自己完善一下:
https://github.com/pagxir/toy2vpn/tree/master/jni
9691 次点击
所在节点    分享发现
13 条回复
yangyaofei
2015-09-13 22:04:00 +08:00
不是在 ss 的安卓上面有一个 tun2socks 么,为啥要做这个?
pagxir
2015-09-13 22:14:11 +08:00
tun2socks 的目标不是 android ,是 linux/openwrt ,并且是一个简单的实现,不需要依赖太多东西,所以容易编译,不过在什么地方。

目的是,用来创建 IPv6 的 tunnel.
uniquecolesmith
2015-09-13 22:15:29 +08:00
写个文档,讲讲原理+实现?
qping
2015-09-14 08:12:40 +08:00
同意楼上~
missdeer
2015-09-14 09:16:25 +08:00
我也想问原理, tun 是拦截网络层还是传输层的包?然后怎么封装到 socks (会话层)里呢?
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 字段
pagxir
2015-09-14 10:23:04 +08:00
@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 中(已经有了个可以工作的雏形)。
yangyaofei
2015-09-14 10:36:08 +08:00
@pagxir 额,我只是觉得,重复造轮子..... 话说 libev lwip 只要代码放在哪儿,应该基本上牵扯不到移植性的问题吧,你用 select 什么的,在 unix 和 win 上都不行吧...
yangyaofei
2015-09-14 10:37:53 +08:00
额~~说错了~unix 上可以...
uniquecolesmith
2015-09-14 11:11:31 +08:00
@pagxir 继续做吧,我支持你,客观来说, 有想法+实践总是好的, 没准哪天超过 ss. 不过你最好单独一个分支或者单独一个项目, 要想让别人看到,最好多写点文档. 重复造轮子是对别人来说,要是自己有兴趣,造轮子何妨 ?
guchengyehai1
2017-10-17 14:31:14 +08:00
@pagxir 楼主你好,我想问一下,你从 tun 设备读取的 ip 数据包,经过转换是指在 jni 层剥离 TCP 数据报的 IP header 和 TCP header,UDP 数据报剥离 IP header 和 UDP header 么
pagxir
2017-10-17 16:32:22 +08:00
@guchengyehai1 不是,是指在 jni 收到报文之后,执行 NAT 转换,再回写到 tun 设备,从而达到从定向 tcp 链接的效果。

看这个实现:
https://github.com/cachefiles/notbevpn

或者这个实现:
https://github.com/xjdrew/kone

原理一样,只是代码构造更简单些。
guchengyehai1
2017-10-18 10:56:06 +08:00
@pagxir 非常感谢,怪不得我用 badvpn 的 tun2socks 启动的 local socks5 server 监听到的 remote host 全是 127.0.0.1

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

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

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

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

© 2021 V2EX