V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pagxir
V2EX  ›  分享发现

一个简单实现的 tun2socks

  •  
  •   pagxir · 2015-09-13 21:46:49 +08:00 · 9863 次点击
    这是一个创建于 3344 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个实现 tun2socks 的功能,支持 IPv4/IPv6, 感觉用在 openwrt 上的话应该不错。后端 socks5 proxy 如果支持 IPv4, 那么应该就能够建立一个 IPv6 tunnel 的了。

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

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

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

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

    原理一样,只是代码构造更简单些。
    guchengyehai1
        13
    guchengyehai1  
       2017-10-18 10:56:06 +08:00
    @pagxir 非常感谢,怪不得我用 badvpn 的 tun2socks 启动的 local socks5 server 监听到的 remote host 全是 127.0.0.1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1239 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:00 · PVG 02:00 · LAX 10:00 · JFK 13:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.