上一篇写了在路由器上使用 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.conf
为 tincnet
的配置文件,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.conf
为 tincnet
的配置文件,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
完成
如果需要更省心的操作,可以参考上一篇文章中的自动化的配置。
这里试了下你的方案,发现通过SSH进到后台输入IP A
压根没有IP地址存在。
那建议重装或者重启看看,正常来说都是没问题的。
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作为旁路由是否有关系?
旁路由应该不是问题,我是主路由旁路由搭配使用的,tinc 仅作为我 tailscale 的备用,但我也是成功使用过 tinc 的。
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地址的转发?
你说到关键点上了!
我再想一个思路,你摒弃我之前评论的所有方法来试试这个新思路:
两端 OpenWrt 均做同样的操作:在 网络 – 防火墙 – 区域 中,新增一个区域,在常规设置中,命名为 vpn,入站、出站、转发 均设置为接受,允许转发到目标区域 和 允许来自源区域的转发 均勾选上 lan,在 高级设置中,涵盖的设备 勾选上 tinc。保存应用防火墙规则后,试一试通不通,如果还不通,就把区域中 lan 区域的 IP 动态伪装 勾选上再试一试。
”
两端 OpenWrt 均做同样的操作:在 网络 – 防火墙 – 区域 中,新增一个区域,在常规设置中,命名为 vpn,入站、出站、转发 均设置为接受,允许转发到目标区域 和 允许来自源区域的转发 均勾选上 lan,在 高级设置中,涵盖的设备 勾选上 tinc。
”
之前我也想按照这个逻辑操作一下。 可能是我的op版本的问题,安装并配置启动了tinc后在luci界面中看不到。 这个端口关系的命令是什么格式我也不清楚。。。
在 网络 – 接口 中看不到是没关系的,但是在 网络 – 防火墙 – 区域 的设置中 涵盖的设备 里应该是可以看到的。
同样也是没有的,只有一个lan的区域转发。lan =》 reject
你按照我说的去新增一个区域,在 高级设置 选项卡中去找。总之,仔细对照一下我之前的评论,是可以找到的。我看你的回复,是没有找对地方。
嗯嗯, 是的,刚刚理解错误。 我去尝试设置一下。十分感谢🙏
话说, tailscale 也是走udp吧,不是一样会被QoS么?
是的,也是 UDP,但实际测试下来,反倒是使用 TCP 的 tinc 速度最慢,以我实际的测试来看,网速排名:WireGuard ≈ TailScale > ZeroTier > Tinc,稳定性排名:TailScale ≈ Tinc > WireGuard ≈ ZeroTier,便捷排名:TailScale ≈ ZeroTier > WireGuard > Tinc,可用性排名(无自己搭建服务器):TailScale ≈ ZeroTier > WireGuard ≈ Tinc,可用性排名(有自己搭建服务器):TailScale ≈ WireGuard ≈ Tinc > ZeroTier。综合考虑下来才使用的 TailScale。
补充一下 QoS 的体验:
https://www.whosneo.com/wireguard-openwrt-ipv6/comment-page-1/#comment-1112
基本只有在长时间大数据量的传输之后才会触发 IPv6 UDP Qos,IPv4 的表现暂不清楚。
我是一开始wireguard,第一天成功后挂了一晚上跨域循环播放mkv… 第二天直接被ban。在找到tinc方案之前一直ZeroTier,每天晚上高峰直接丢包,自己的moon也不行。 回头我也试试 TailScale
😂那应该和 ZeroTier 没啥区别的。
目前看上去,tinc的icmp包基本上在 10ms左右
已经成功,最后就是在防火墙里将 lan和tinc两个区域互相转发,IP伪装是否勾选貌似都不影响正常的访问。
👏恭喜,终于成功了。关键点就在转发上面。
博主 我按照这篇教程设置了两台openwrt的tinc,这两台openwrt均在网络中作为旁路由使用。 tinc-up 中的路由表也是按照教程添加的。 但是目前情况是两台路由器之间可以ping通,内网中的其他设备无法ping通(内网设备的网关是对应的openwrt旁路由)。 请问还需要设置其他的么?
我思考了一番,应该是我少写了转发这一步的操作。试一下在两台路由器上都执行以下命令:
如果有效的话,就都加入到 网络 – 防火墙 – 自定义规则 中。
十分感谢,确实有效。 增加三条规则后可访问逻辑如下:
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都内网设备;
对于3与4的问题,你先看一下 OpenWrt 上的路由表,在 状态 – 路由 – 活跃的 IPv4 路由 中看一下,是否存在对端局域网网段的路由:如果不存在的话,需要在 网络 – 路由 – 静态 IPv4 路由 中添加路由表;如果存在的话,则试一试打开 网络 – 防火墙 – 常规设置 中的转发。