R6300v2上安装zerotier(修订)

前言

之前写的「 R6300v2上安装zerotier 」当时一切正常,但是发现在R6300v2重启之后,还是存在问题,估计问题主要是出在防火墙的设置上。

现在把重做的过程做个记录。

问题1:PORT_ERROR错误

putty登录到R6300v2,执行

1
zerotier-cli listnetworks

title

显示出现了 PORT_ERROR错误。

初步判断是TUN出了问题,执行 ifconfig,确实没发现zt开头的网卡设备

title

重启

重启zerotier

1
2
3
killall zerotier-one
modprobe tun
zerotier-one -d

再次执行 ifconfig ,有了

title

再看看是否正常?

1
zerotier-cli listnetworks

title

显示 OK

可能的原因

虽然在 /jffs/scripts/nat-start 中有 modprobe tun,但是可能存在加载顺序等问题,所以导致在执行 zerotier-one -d 没成功,所以在 /opt/etc/init.d/S90zerotier-one.sh 新加一段,用于解决 PORT_ERROR 问题。

1
2
3
4
5
6
7
if lsmod | grep -q tun ;
then echo "mod tun ready" ;
else
modprobe tun;
logger -t "zerotier" -c "modprobe tun started, zerotier-one should start in one minute" -p user.notice ;
exit 0;
fi

完整的 /opt/etc/init.d/S90zerotier-one.sh脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#! /bin/sh

case "$1" in
start)
# 新增开始
if lsmod | grep -q tun ;
then echo "mod tun ready" ;
else
modprobe tun;
logger -t "zerotier" -c "modprobe tun started, zerotier-one should start in one minute" -p user.notice ;
exit 0;
fi
# 新增结束
if ( pidof zerotier-one )
then echo "ZeroTier-One is already running."
else
echo "Starting ZeroTier-One" ;
/opt/bin/zerotier-one -d ;
echo "$(date) Started ZeroTier-One" >> /opt/var/log/zerotier-one.log ;
fi
;;
stop)
if ( pidof zerotier-one )
then
echo "Stopping ZeroTier-One";
killall zerotier-one
echo "$(date) Stopped ZeroTier-One" >> /opt/var/log/zerotier-one.log
else
echo "ZeroTier-One was not running" ;
fi
;;
status)
if ( pidof zerotier-one )
then echo "ZeroTier-One is running."
else echo "ZeroTier-One is NOT running"
fi
;;
*)
echo "Usage: /etc/init.d/zerotier-one {start|stop|status}"
exit 1
;;
esac

exit 0

问题2:访问不到内网设备

将路由加入到 Zerotier 网络是为了在外网访问到家庭局域网中的设备,但是之前的设置只是能够让我们通过zt网地址 192.168.191.10 访问到R6300v2,而不是通过 192.168.0.1

zerotier.com上设置路由

比如192.168.0.0/24是我的内网网段,后面那个地址是我R6300v2里面zerotier获取的zt地址。

title

增加 iptables rules

先运行

1
iptables -v -L -n --line-numbers

先接受zerotier的所有数据

1
iptables -I INPUT -i zt+ -j ACCEPT

【备注:】 all “zt0, zt1, ztzlgf7vul” can be replaced by zt+ for wild matching in iptables only! 所以后面 ztyqb3hz7p 都将写成 zt+ ,这使得脚本有了很大的通用性

重启zerotier

先停止

1
/opt/etc/init.d/S90zerotier-one.sh stop

或者

1
killall zerotier-one

再启动

1
zerotier-one -d

ping

测试网络

1
ping 192.168.191.10 -c 4

title

Allow FTP, SSH, WEBUI

1
iptables -t nat -A PREROUTING -d 192.168.191.10 -p tcp -m multiport --dport 21,22,80 -j DNAT --to-destination 192.168.0.1

或者替代方案

1
iptables -t nat -I PREROUTING -i zt+ -d 192.168.191.0/24 -p tcp -m multiport --dport 21,22,80 -j DNAT --to-destination `nvram get lan_ipaddr`

修改脚本

修改 /jffs/scripts/firewall-start

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/sh

logger -t "custom iptables" "Enter" -p user.notice

iptables -C INPUT -i zt+ -j ACCEPT

if [ $? != 0 ]; then

iptables -I INPUT -i zt+ -j ACCEPT
iptables -t nat -I PREROUTING -i zt+ -d 192.168.191.0/24 -p tcp -m multiport --dport 21,22,80 -j DNAT --to-destination `nvram get lan_ipaddr`

logger -t "custom iptables" "rules added" -p user.notice
else
logger -t "custom iptables" "rules existed skip" -p user.notice
fi

手机测试

手机上打开zerotier,用4G上网,记得勾选 Use Cellular Data

title

在浏览器中访问192.168.0.1( 就是我们的路由器R6300v2的局域网地址 ) ,已经可以访问了

title

但是直接访问192.168.0.199 ( NAS的局域网地址 )还是不行

再次修改脚本

/jffs/scripts/firewall-start中增加下面三行就直接可以访问到内网的设备;

1
2
3
iptables -I FORWARD -i zt+ -j ACCEPT
iptables -I FORWARD -o zt+ -j ACCEPT
iptables -t nat -I POSTROUTING -o zt+ -j MASQUERADE

完整的 /jffs/scripts/firewall-start脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/sh

logger -t "custom iptables" "Enter" -p user.notice

iptables -C INPUT -i zt+ -j ACCEPT

if [ $? != 0 ]; then

iptables -I INPUT -i zt+ -j ACCEPT
iptables -t nat -I PREROUTING -i zt+ -d 192.168.191.0/24 -p tcp -m multiport --dport 21,22,80 -j DNAT --to-destination `nvram get lan_ipaddr`

# 2020.06.09 参考 https://blog.urusai.me/2019/using-zerotier-to-combine-gateways/
iptables -I FORWARD -i zt+ -j ACCEPT
iptables -I FORWARD -o zt+ -j ACCEPT
iptables -t nat -I POSTROUTING -o zt+ -j MASQUERADE

logger -t "custom iptables" "rules added" -p user.notice
else
logger -t "custom iptables" "rules existed skip" -p user.notice
fi

在手机浏览器中直接访问192.168.0.199 ( NAS的局域网地址 )

title

结论

终于达成所愿!但是从测试看,依然有2个问题:

  1. 速度并不稳定,有时快有时慢,取决于相连的两侧能否P2P打洞(NAT穿越)成功,如果不成功还是会走服务器中转,这个就会比较影响速度
  2. 在外网访问,需要启动zerotier客户端,这一点不如frp方便

但不管怎么说可以和frp互为补充,做个双保险。

附录

为防止和避免拷贝脚本出错,作为附件提供参考

/jffs/scripts/firewall-start

firewall-start

/jffs/scripts/nat-start

nat-start

/jffs/scripts/post-mount

post-mount

/jffs/scripts/wan-start

wan-start

/opt/etc/init.d/S90zerotier-one.sh

S90zerotier-one.sh

参考文档

[教程] LEDE旁路由中安装zerotier,内网穿透,访问局域网,极简教程
地址:https://koolshare.cn/thread-152561-1-1.html

A Guide About Installing ZeroTier on ASUS AC68U Router
地址:https://www.snbforums.com/threads/a-guide-about-installing-zerotier-on-asus-ac68u-router.42648/