Tinc on OpenWrt 组网

上一篇写了在路由器上使用 WireGuard 在 IPv6 上直连组网,效果也不错。但是 WireGuard 是使用 UDP 通信的,有可能会被运营商 QoS 限速,所以还可以试试使用 TCP 通信的 Tinc 来组网。

安装 Tinc

在两台路由器上均进行安装。

opkg update
opkg install tinc

配置 Tinc

此处假设使用两台路由器来配置互相连接,名称为 A 和 B。
路由器 A 的 DDNS 地址为 A.router.com,路由器 B 的 DDNS 地址为 B.router.com,这里解析出来的地址无论是 IPv4 还是 IPv6 都没关系,只要是公网能访问的地址就可以。
路由器 A 和 B 均使用 665 端口监听 tinc 的传入连接。
路由器 A 的局域网为 192.168.88.0/24,路由器 B 的局域网为 192.168.99.0/24。
在 tinc 网络中,路由器 A 使用 IP 10.0.0.88,路由器 B 使用 IP 10.0.0.99。

路由器 A

首先需要定义一个网络名称,这里使用 tincnet

/etc/tinc/ 目录中新建文件夹,名字为网络名称,即创建 /etc/tinc/tincnet/ 目录。
在此目录下创建 tinc.conf tinc-up tinc-down 文件和 hosts 文件夹。
tinc.conftincnet 的配置文件,tinc-up 为启动该网络时自动执行的脚本,tinc-down 为关闭该网络时自动执行的脚本,hosts 文件夹保存着各个节点(路由器)的信息。

tinc.conf 文件中保存着路由器 A 的配置信息:

Name = A #路由器 A 的名称
BindToAddress = * 665 #监听端口
Interface = tinc #虚拟接口名称
Device = /dev/net/tun
Mode = switch #交换机模式
ConnectTo = B #默认连接路由器 B

tinc-up 文件是网络启动时执行的脚本,一般在这里为 tinc 的接口添加地址信息:

#!/bin/sh

ip link set $INTERFACE up
ip addr add 10.0.0.88/24 dev $INTERFACE
ip route add 192.168.99.0/24 via 10.0.0.99 dev tinc src 10.0.0.88 onlink

tinc-down 文件是网络关闭时执行的脚本,一般在这里为 tinc 的接口清除配置:

#!/bin/sh

ip route del 192.168.99.0/24
ip addr del 10.0.0.88/24 dev $INTERFACE
ip link set $INTERFACE down

配置好 tinc-up tinc-down 文件之后,不要忘了为这两个文件增加执行权限:

chmod +x tinc-up
chmod +x tinc-down

hosts 文件夹中先创建好本机的文件,名称需要与上方 tinc.conf 中第一行的配置保持一致,即文件 A

Address = A.router.com
Port = 665
Subnet = 10.0.0.88/32

接下来为 tincnet 创建密钥信息,在询问保存位置时直接回车使用默认位置即可:

tinc -n tincnet generate-rsa-keys
tinc -n tincnet generate-ed25519-keys

此时路由器 A 的 /etc/tinc/tincnet/ 目录下的情况为:

├── ed25519_key.priv
├── hosts/
│   └── A
├── rsa_key.priv
├── tinc-down*
├── tinc-up*
└── tinc.conf

最后需要编辑 /etc/config/tinc 文件:

config tinc-net tincnet
    option enabled 1
    option Name A

config tinc-host A
    option enabled 1
    option net tincnet

路由器 B

首先需要定义一个网络名称,这里还是使用 tincnet

/etc/tinc/ 目录中新建文件夹,名字为网络名称,即创建 /etc/tinc/tincnet/ 目录。
在此目录下创建 tinc.conf tinc-up tinc-down 文件和 hosts 文件夹。
tinc.conftincnet 的配置文件,tinc-up 为启动该网络时自动执行的脚本,tinc-down 为关闭该网络时自动执行的脚本,hosts 文件夹保存着各个节点(路由器)的信息。

tinc.conf 文件中保存着路由器 B 的配置信息:

Name = B #路由器 B 的名称
BindToAddress = * 665 #监听端口
Interface = tinc #虚拟接口名称
Device = /dev/net/tun
Mode = switch #交换机模式
ConnectTo = A #默认连接路由器 A

tinc-up 文件是网络启动时执行的脚本,一般在这里为 tinc 的接口添加地址信息:

#!/bin/sh

ip link set $INTERFACE up
ip addr add 10.0.0.99/24 dev $INTERFACE
ip route add 192.168.88.0/24 via 10.0.0.88 dev tinc src 10.0.0.99 onlink

tinc-down 文件是网络关闭时执行的脚本,一般在这里为 tinc 的接口清除配置:

#!/bin/sh

ip route del 192.168.88.0/24
ip addr del 10.0.0.99/24 dev $INTERFACE
ip link set $INTERFACE down

配置好 tinc-up tinc-down 文件之后,不要忘了为这两个文件增加执行权限:

chmod +x tinc-up
chmod +x tinc-down

hosts 文件夹中先创建好本机的文件,名称需要与上方 tinc.conf 中第一行的配置保持一致,即文件 B

Address = B.router.com
Port = 665
Subnet = 10.0.0.99/32

接下来为 tincnet 创建密钥信息,在询问保存位置时直接回车使用默认位置即可:

tinc -n tincnet generate-rsa-keys
tinc -n tincnet generate-ed25519-keys

此时路由器 B 的 /etc/tinc/tincnet/ 目录下的情况为:

├── ed25519_key.priv
├── hosts/
│   └── B
├── rsa_key.priv
├── tinc-down*
├── tinc-up*
└── tinc.conf

最后需要编辑 /etc/config/tinc 文件:

config tinc-net tincnet
    option enabled 1
    option Name B

config tinc-host B
    option enabled 1
    option net tincnet

交换密钥

需要将路由器 A 上的 /etc/tinc/tincnet/hosts/A 文件复制到路由器 B 的/etc/tinc/tincnet/hosts/ 目录下,同理,需要将路由器 B 上的 /etc/tinc/tincnet/hosts/B 文件复制到路由器 A 的/etc/tinc/tincnet/hosts/ 目录下。

此时两个路由器的 /etc/tinc/tincnet/ 目录下均为这样:

├── ed25519_key.priv
├── hosts/
│   ├── A
│   └── B
├── rsa_key.priv
├── tinc-down*
├── tinc-up*
└── tinc.conf

需要注意两个路由器要在防火墙中开放 665 端口。

在两个路由器上均启动 tinc,即可连通两个路由器:

/etc/init.d/tinc start

完成

如果需要更省心的操作,可以参考上一篇文章中的自动化的配置。

Tinc on OpenWrt 组网》有23个想法

  1. 007

    这里试了下你的方案,发现通过SSH进到后台输入IP A
    压根没有IP地址存在。

    回复
  2. xlairidious

    Destination Gateway Genmask Flags Metric Ref Use Iface
    0.0.0.0 10.1.2.254 0.0.0.0 UG 0 0 0 br-lan
    10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tinc
    10.1.1.0 0.0.0.0 255.255.255.0 U 0 0 0 tinc
    10.1.2.0 0.0.0.0 255.255.255.0 U 0 0 0 br-lan

    路由表中有,防火墙中也是打开的转发。 这和我的op作为旁路由是否有关系?

    回复
    1. Neo 文章作者

      旁路由应该不是问题,我是主路由旁路由搭配使用的,tinc 仅作为我 tailscale 的备用,但我也是成功使用过 tinc 的。

      回复
  3. xlairidious

    LAN.A 内网设备ping LAN.B 内网设备ip时显示的链路是
    92 bytes from LAN.B.tincIP: Destination Port Unreachable
    Vr HL TOS Len ID Flg off TTL Pro cks Src Dst
    4 5 00 5400 e43e 0 0000 3e 01 8032 LAN.A.clientIP LAN.B.clientIP

    我不是很懂,但是按照逻辑来说感觉像是 LAN.A 内网设备地址通过LAN.B网关的tinc地址将数据送达到LAN.B 内网设备地址,是不是少了一步 LAN.B网关的tinc地址到LAN.B网关的br-lan地址的转发?

    回复
    1. Neo 文章作者

      你说到关键点上了!
      我再想一个思路,你摒弃我之前评论的所有方法来试试这个新思路:
      两端 OpenWrt 均做同样的操作:在 网络 – 防火墙 – 区域 中,新增一个区域,在常规设置中,命名为 vpn,入站、出站、转发 均设置为接受,允许转发到目标区域 和 允许来自源区域的转发 均勾选上 lan,在 高级设置中,涵盖的设备 勾选上 tinc。保存应用防火墙规则后,试一试通不通,如果还不通,就把区域中 lan 区域的 IP 动态伪装 勾选上再试一试。

      回复
      1. xlairidious


        两端 OpenWrt 均做同样的操作:在 网络 – 防火墙 – 区域 中,新增一个区域,在常规设置中,命名为 vpn,入站、出站、转发 均设置为接受,允许转发到目标区域 和 允许来自源区域的转发 均勾选上 lan,在 高级设置中,涵盖的设备 勾选上 tinc。

        之前我也想按照这个逻辑操作一下。 可能是我的op版本的问题,安装并配置启动了tinc后在luci界面中看不到。 这个端口关系的命令是什么格式我也不清楚。。。

        回复
        1. Neo 文章作者

          在 网络 – 接口 中看不到是没关系的,但是在 网络 – 防火墙 – 区域 的设置中 涵盖的设备 里应该是可以看到的。

          回复
          1. xlairidious

            同样也是没有的,只有一个lan的区域转发。lan =》 reject

            回复
            1. Neo 文章作者

              你按照我说的去新增一个区域,在 高级设置 选项卡中去找。总之,仔细对照一下我之前的评论,是可以找到的。我看你的回复,是没有找对地方。

              回复
              1. xlairidious

                嗯嗯, 是的,刚刚理解错误。 我去尝试设置一下。十分感谢🙏

                回复
                1. Neo 文章作者

                  是的,也是 UDP,但实际测试下来,反倒是使用 TCP 的 tinc 速度最慢,以我实际的测试来看,网速排名:WireGuard ≈ TailScale > ZeroTier > Tinc,稳定性排名:TailScale ≈ Tinc > WireGuard ≈ ZeroTier,便捷排名:TailScale ≈ ZeroTier > WireGuard > Tinc,可用性排名(无自己搭建服务器):TailScale ≈ ZeroTier > WireGuard ≈ Tinc,可用性排名(有自己搭建服务器):TailScale ≈ WireGuard ≈ Tinc > ZeroTier。综合考虑下来才使用的 TailScale。

                  回复
                  1. xlairidious

                    我是一开始wireguard,第一天成功后挂了一晚上跨域循环播放mkv… 第二天直接被ban。在找到tinc方案之前一直ZeroTier,每天晚上高峰直接丢包,自己的moon也不行。 回头我也试试 TailScale

                    回复
              2. xlairidious

                已经成功,最后就是在防火墙里将 lan和tinc两个区域互相转发,IP伪装是否勾选貌似都不影响正常的访问。

                回复
  4. xlairidious

    博主 我按照这篇教程设置了两台openwrt的tinc,这两台openwrt均在网络中作为旁路由使用。 tinc-up 中的路由表也是按照教程添加的。 但是目前情况是两台路由器之间可以ping通,内网中的其他设备无法ping通(内网设备的网关是对应的openwrt旁路由)。 请问还需要设置其他的么?

    回复
    1. Neo 文章作者

      我思考了一番,应该是我少写了转发这一步的操作。试一下在两台路由器上都执行以下命令:

      iptables -A FORWARD -i tinc -j ACCEPT
      iptables -A FORWARD -o tinc -j ACCEPT
      iptables -t nat -A POSTROUTING -o tinc -j MASQUERADE
      

      如果有效的话,就都加入到 网络 – 防火墙 – 自定义规则 中。

      回复
      1. xlairidious

        十分感谢,确实有效。 增加三条规则后可访问逻辑如下:
        1)LAN.A的op可以访问 LAN.B的op+内网设备;
        2)LAN.B的op可以访问 LAN.A的op+内网设备;
        3)LAN.A内网设备仅能访问 LAN.B的op,不能访问LAN.B都内网设备;
        4)LAN.B内网设备仅能访问 LAN.A的op,不能访问LAN.A都内网设备;

        回复
        1. Neo 文章作者

          对于3与4的问题,你先看一下 OpenWrt 上的路由表,在 状态 – 路由 – 活跃的 IPv4 路由 中看一下,是否存在对端局域网网段的路由:如果不存在的话,需要在 网络 – 路由 – 静态 IPv4 路由 中添加路由表;如果存在的话,则试一试打开 网络 – 防火墙 – 常规设置 中的转发。

          回复

回复 Neo 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注