使用Zerotier为Syncthing打洞

最近Syncthing越来越慢,有时竟无法连接,翻看官网的github,发现是去掉了kcp,老外竟然说kcp不如tcp快,这真是不符合我国的网络啊。。。

起初换了微力同步,本以为中继服务器在国内,应该好一点吧,谁知道依然是那个样子,毕竟是Syncthing改的,改成Resilio Sync的样子已经不错了,不适合我这种nat到nat的网络,而且没有版本控制,绝对的适合文件分享,而不是文件同步用。

换回Syncthing的过程又折腾了一次,正赶上VPS抽风,frp也不给力了,好在发现了Zerotier这款神器,正好解了燃眉之急。

Zerotier属于虚拟局域网,可以把不同网络状态下的多个设备组织在一起,正好为我所用。正常注册Zerotier的free账户,然后登陆后,可以在Networks下Create一个新的局域网,会得到一个Newwork ID,设备会依靠这个ID来识别属于哪个局域网,最后是把每一台需要连接的设备都安装Zerotier客户端。

Zerotier的安装很简单,关于Windows和Android不多说,直接下载安装就可以了,以下单独说一下我用的RT-AC68U:

这台设备买到手就刷了梅林,自从上次折腾完frp以后,就一直在那里吃灰了,登录上ssh,然后执行更新并安装Zerotier:

opkg update
opkg upgrade
opkg install zerotier

过程很简单,但配置稍微复杂一些,先让Zerotier运行起来:

modprobe tun
zerotier-one -d
zerotier-cli info    # 显示信息

会得到200 info 2********6 1.2.4 ONLINE,这样就显示这台设备上线了。

然后执行zerotier-cli join a**************d,加入之前创建的网络,会提示200 join OK

从网页进入刚才创建的网络,右边可以选择IP段,我自定义输入的10.10.10.0/24,只是为了好记,再下面会显示设备列表,勾选Auth?表示同意加入网络,旁边也是可以自己定义ip地址,我是在上面把ipv6关掉了,因为一般用不到。

验证客户端是否连接成功还可以用zerotier-cli listnetworks命令。

这时可以测试一下路由器通不通,不过由于路由器可能是禁ping的,所以不通也不用担心,先往下说。

查看路由器的nat映射:

iptables -v -L INPUT -n --line-numbers

这里列出的内容不重要,关键是那个行号,因为要在下面添加一行:

iptables -I INPUT 12 -i zt0 -j ACCEPT    # 这里假定原来的iptables有11条信息,所以这里应该是12行,zt0是Zerotier的虚拟网卡

成功与否可以再次运行iptables -v -L INPUT -n --line-numbers查看,也可以到梅林的管理界面看系统记录里的路由表。

接下来就是防火墙,这里heartnn与原文不太一样,只是不想折腾iptables了,直接关掉了防火墙,建议需要防火墙的同学一定要仔细配置iptables,相关的映射命令如下:

iptables -t nat -A PREROUTING -d 10.10.10.2 -j DNAT --to-destination 192.168.1.1

如果不想整个设备映射,只映射个别端口的话:

iptables -t nat -A PREROUTING -d 10.10.10.2 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.1:80

另外只有这些是不够的,需要设置iptables打开相应的端口才可以,熟悉iptables的自然不用多说,不太会的建议多Google一下。

最后是搞定自启动,这里提供相关的脚本,这里启动脚本只写出关于Zerotier的部分,不要完全照抄就是了:

/jffs/scripts/init-start

#!/bin/sh
modprobe tun

/jffs/scripts/wan-start

#!/bin/sh
cru a ZeroTierDaemon "* * * * * /opt/etc/init.d/S90zerotier-one.sh start"

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

#! /bin/sh
case "$1" in
  start)
    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

顺便把防火墙也贴过来,不过是个不完善的版本(这就是我为什么关闭防火墙了),有时间再不断完善吧。

/jffs/scripts/firewall-start

#!/bin/sh
logger -t "custom iptables" "Enter" -p user.notice
iptables -C INPUT -i zt0 -j ACCEPT
if [ $? != 0 ]; then
  #iptables -I INPUT -i zt0 -j ACCEPT
  #iptables -I INPUT -i zt0 -p icmp -j ACCEPT
  iptables -I INPUT 1 -i ppp0 -p icmp -j DROP
  iptables -t nat -A PREROUTING -d 10.10.10.2 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.1:80
  logger -t "custom iptables" "rules added" -p user.notice
else
  logger -t "custom iptables" "rules existed skip" -p user.notice
fi

最后就是重启设备,享受局域网的快乐~~

参考:

  1. https://www.snbforums.com/threads/a-guide-about-installing-zerotier-on-asus-ac68u-router.42648/
  2. http://koolshare.cn/forum.php?mod=viewthread&tid=134930