tinc安卓客户端

@Ta 2020-03-04发布,2021-02-04修改 24754点击

更多细节见评论区。


tinc(https://www.tinc-vpn.org/)是一个网状网络VPN,主要用于跨地区构建私有内网,具有如下特点:

  • 高强度加密。使用RSA/ECDH加密数据,保证私网内容不泄露。
  • 节点自动发现。新节点只要与网络中的一个节点建立连接,就可以发现并连接到网络中的其他节点。
  • NAT穿透。只要存在一个具有公网IP的节点,其他节点就可以借助它来穿透内网,建立起点对点的直接连接。
  • 自动链路选择。节点之间会尽可能的建立点对点连接。如果点对点连接过慢或者不通,则会自动通过网络中的其他节点进行中继。
  • 互联网出口。tinc除了可以承载内网流量,也可以承载互联网流量。如果某个节点具有互联网出口,则可以通过0.0.0.0/0路由来允许其他节点通过该节点访问互联网。
  • 多互联网出口。如果多个节点都具有互联网出口,还可以声明优先级(0.0.0.0/0#10.0.0.0/0#2等)。这样互联网流量会优先走#1,如果#1节点失效,则自动转换到#2

tinc具有官方的Linux/Windows客户端,现在又找到了一个半官方的安卓客户端(https://tincapp.pacien.org/ 网址在官方网站列出,但不是官方开发者开发),挺好用的,特此共享:

Tinc App-0.30.apk(8.14 MB)

注意:

  • 安卓版不支持交换机模式(Switch),只支持默认的路由器模式(Router),所以想和安卓互通的节点都不能使用Mode=switch,否则就连不上安卓。但是路由器模式其实比交换机模式更好用,而且多出口容灾只有路由器模式可以实现。
  • tinc没有服务器端,所有节点都是对等的,既是客户端又是服务器。此外,默认情况下节点会自动尝试连接hosts中的其他节点,tinc.conf中的ConnectTo也是可选的。
  • 如果tinc用于承载互联网连接,则可以把具有互联网出口的节点视为服务器。如果用于互联多个内网,可以把具有公网IP的节点视为服务器。
  • [针对非安卓版的说明,安卓版没有这种问题] 因为tinc可以自动选择出口,所以路由互联网流量时不需要设置默认网关,直接把0.0.0.0/0转发到tinc的网卡接口即可(需要先为对等节点添加专属路由,否则到对等节点的流量也被路由到虚拟网卡的话,你就彻底断网了)。对于Linux,类似于ip route add default dev hu60net。对于Windows,就是route add 0.0.0.0/0 10.8.4.1(其中10.8.4.1是tinc接口本身的IP,接口不需要配置默认网关,也无法配置默认网关,因为其他节点位于其他子网。备注:此处不考虑交换机模式,所有说明都只针对默认的路由器模式。)
  • hosts配置文件中的路由等规则只要修改当前节点的就可以了,不需要把修改后的配置文件同步到其他节点。当前节点重启后,其他节点会通过网络自动获取当前节点的路由更新。

14楼和15楼有参考配置文件和网络中继说明。

截图:

回复列表(23|隐藏机器人聊天)
  • @Ta / 2020-03-04 / /
    看不大懂,但感觉很牛逼 小米Mix3
  • @Ta / 2020-03-04 / /

    咋一看以为是前几年的tiny全局免流客户端呢


    菩提本无树,明镜亦非台。
    本来无一物,何处惹尘埃!

    ฏ้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้ฏ้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้ฏ้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้۩͇̿v͇̿i͇̿p͇̿۩
    華為P30 (Pro版)-(金色)

  • @Ta / 2020-03-04 / /

    有什么用,对GFW的穿透力如何


    菩提本无树,明镜亦非台。
    本来无一物,何处惹尘埃!

    ฏ้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้ฏ้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้ฏ้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้۩͇̿v͇̿i͇̿p͇̿۩
    華為P30 (Pro版)-(金色)

  • @Ta / 2020-03-04 / /
    这个tinc似乎和ZeroTier是同一种东西?  但是配置起来复杂得不是一点半点
  • @Ta / 2020-03-04 / /

    @老虎會游泳,用于创建跨地区的内网。也可以用做创建跨地区的公网路由。目前未被拦截。

  • @Ta / 2020-03-04 / /

    @Leslie,提供完整的TCP/IP协议,所以UDP可用。并且它本身是为了创建内网而设计的,不是为了提供Internet代理。

  • @Ta / 2020-03-04 / /

    那么,这个内网是否可以搭建Trojan代理呢,或者说是刷入OpenWRT固件中@老虎会游泳


    菩提本无树,明镜亦非台。
    本来无一物,何处惹尘埃!

    ฏ้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้ฏ้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้ฏ้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้۩͇̿v͇̿i͇̿p͇̿۩
    華為P30 (Pro版)-(金色)

  • @Ta / 2020-03-04 / /
    ZeroTier也蛮好用的
  • @Ta / 2020-03-04 / /

    @老虎會游泳,不需要搭建代理,只要有合适的路由,把公网出口落在国外是完全可以的。

  • @Ta / 2020-03-04 / /

    @老虎会游泳,搞不懂给下配置文件可好
    健健康康

  • @Ta / 2020-03-05 / /

    @老虎会游泳,如何设置远端网络出口
    健健康康

  • @Ta / 2021-02-04 / /

    参考配置文件

    tinc参考配置文件-Linux-Win-Android.zip(15.42 KB)

    配置文件夹不能直接使用,私钥内容已删除,需要重新生成。可以参考 https://www.bilibili.com/read/cv3364699

    注意,因为安卓不支持交换机模式,所以任何其他节点都不能使用Mode=switch交换机模式,否则安卓无法与这些节点互通。

    建议Linux和Windows使用稳定版(1.0.36),不要使用1.1pre17。pre不太稳定。此外,pre版也不能按照教程中的方法生成私钥。
    从软件源安装的tinc(比如apt install tinc)通常是稳定版。
    服务器使用稳定版,安卓需要添加ExperimentalProtocol = no,否则可能连不上。

    用稳定版生成的私钥不包含ed25519_key.privEd25519PublicKey,没关系,只有pre节点才需要这些。我的参考配置文件中包含这些,是因为我最开始用的pre版本,后来不稳定,才切换为稳定版本。pre版本在我的tigerhomepc(WSL2)节点上会段错误崩溃,在Windows节点上经常断网。

    最后的最后我还发现,虽然走的是同一个公网出口,但tinc的Windows节点就是比安卓节点网速慢。不知道为什么。

    参考配置文件中,Linux节点具有公网出口,算是服务器,Windows和Android节点是客户端。
    hosts文件夹中的hu60cnhu60nettigerhomepc都具有公网出口,通过Subnet = 0.0.0.0/0#1Subnet = 0.0.0.0/0#2Subnet = 0.0.0.0/0#3来决定优先级,#后面的数字越小越优先。如果优先的出口节点下线,就切换到第二个出口(可能需要重启客户端才能立即改变出口)。给出的Linux参考配置文件是hu60cn节点,由tinc.conf中的Name = hu60cn指定,它是第三优先出口。

    Linux需要开IPv4转发:

    sysctl -w net.ipv4.ip_forward=1
    

    或者修改/etc/sysctl.conf,添加net.ipv4.ip_forward=1,然后运行sysctl -p

    Windows上的tinc-up.bat说明:

    route add 45.63.54.62 mask 255.255.255.255 192.168.43.1
    route add 47.94.174.113 mask 255.255.255.255 192.168.43.1
    route add 202.133.212.162 mask 255.255.255.255 192.168.43.1
    
    route add 0.0.0.0 mask 0.0.0.0 10.8.4.1
    route delete 0.0.0.0 mask 0.0.0.0 192.168.43.1
    
    ipconfig /flushdns
    

    其中,45.63.54.6247.94.174.113202.133.212.162是三个具有公网出口的服务器,192.168.43.1是Windows的默认网关(路由器IP),10.8.4.1是tinc虚拟网卡的IP。需要自己把网卡重命名为TUN,并设置静态IP。网卡名称在tinc.conf中指定,需要和实际网卡名称匹配,我设置的是TUN。网卡需要运行tinc安装目录中的tap-win64中的addtap.bat添加,需要管理员权限,并且不支持右键“管理员启动”,需要启动管理员cmd再cd过去执行。

  • @Ta / 2020-03-07 / /

    强制中继

    tinc倾向于在两个节点之间自动建立直接连接,即使没有写ConnectTo,它也会这样做。即使你没在配置文件中指定对方的IP地址,它也可以向其他节点询问IP地址,然后自动尝试直连。

    阻止直接连接需要禁用AutoConnect,并启用IndirectData

    对于参考配置文件,如果想建立一条由mi10pro->hu60cn->hu60net的转发链路,禁止mi10prohu60net直接连接,则可以这样做:

    # mi10pro 的 tinc.conf
    AutoConnect = no
    IndirectData = yes
    ConnectTo = hu60cn
    
    # hu60cn 的 tinc.conf
    AutoConnect = no
    IndirectData = yes
    ConnectTo = hu60net
    
    # hu60net 的 tinc.conf
    AutoConnect = no
    IndirectData = yes
    

    注意:hu60cn上不应该有公网出口,如果有,优先级应该比hu60net上的低(数字更大)。否则连接会从hu60cn出去,不会到达hu60net

    对抗丢包

    如果丢包严重导致网速缓慢,可以考虑结合KCPTUNUDPSpeeder使用。让tinc监听在localhost(BindToAddress = 127.0.0.1),然后通过KCPTUNUDPSpeeder把TCP/UDP流量转发到客户端,再在客户端hosts/服务器文件中使用Address = 127.0.0.1来连接。

    注意:

    1. 如果服务器tinc监听在0.0.0.0,客户端最终会直接连接服务器的UDP端口,流量不会通过UDPSpeeder。必须让服务器tinc监听在127.0.0.1才行。
    2. KCPTUNUDPSpeeder必须转发到同一个端口,比如127.0.0.1:3724,TCP和UDP的客户端监听端口都得是这个。以为tinc首先连接TCP端口,然后再尝试连接相同的UDP端口。没有办法为UDP单独指定端口。此外顺便一提,因为TCP和UDP是不同的协议,所以监听相同的端口不会出错。tinc本身也同时监听了相同的TCP和UDP端口。
    3. 为了避免分包影响UDPSpeeder性能,应该通过在tinc.conf中增加PMTU = 1200来限制UDP包的大小,再通过PMTUDiscovery = no来禁止tinc自动调整MTU,客户端和服务器均需要此限制。此外UDPSpeeder也可以使用--mtu 1464等选项增大MTU到链路上限,进一步避免分包。通过ping -f -l 1464 服务器IP这样的命令来探测链路MTU,不断增大数字直到返回错误。

    KCPTUN:https://github.com/xtaci/kcptun
    UDPspeeder:https://github.com/wangyu-/UDPspeeder/blob/branch_libev/doc/README.zh-cn.md

  • @Ta / 2020-03-05 / /

    @老虎会游泳,感谢大佬。
    健健康康

  • @Ta / 2020-03-06 / /
    @老虎会游泳,为了对抗长时间下载导致的丢包问题,利用定时任务分别在两个回程路由中进行5秒切换,另外仅tcp模式的情况下能用PMTU = 这个参数吗?
  • @Ta / 2020-03-06 / /
    另外用KCPTUN/UDPspeeder这类东西可能会破坏tinc本身的p2p特性,更好玩的方式是在tinc上起vlan来解锁特别操作
  • @Ta / 2020-03-06 / /

    健健康康

  • @Ta / 2020-03-06 / /

    @tianQQ,TCP连接双方可以协商MTU(MSS),所以我认为这个值可能会有效。

    但是用TCP承载TCP是非常不靠谱的,因为一但开始丢包,外层TCP和内层TCP都会开始重传,性能会成倍恶化。如果你遇到UDP QoS问题,可以考虑用UDP2Raw把它伪装成TCP,当然这会影响P2P特性。

    但是,很多用tinc的人就是想做中继连接,甚至会专门关掉p2p链路自动发现和直接连接,还有些人只有一个服务器,所以问题通常不大。

添加新回复
回复需要登录