每次换路由器、刷机后,都要重复一遍zerotier的配置过程,今天抽时间记录下来备用。
zerotier是一个虚拟局域网工具,可以用来做内网穿透,从而实现在外网方便自由地访问内网设备的目的。我家的主路由器是Openwrt系统,通过桥接光猫方式上网,局域网里有NAS等设备,希望能够在外面通过zerotier客户端建立虚拟局域网,直接用原有的内网IP地址访问NAS等设备。
参考: https://github.com/mwarning/zerotier-openwrt/wiki
大多数第三方Openwrt固件都带了zerotier,如果实在没有,可以去zerotier官网下载用于不同设备的版本,或从Openwrt官方或第三方的插件库自行寻找适配的ipk,自行上传安装,网上教程很多,此处不赘述。
去Zerotier官网注册账号,并创建一个虚拟网络,记下下图红框中的Network ID

如下图,在Openwrt中输入Network ID,让当前设备加入虚拟网络。注意下面的“自动允许客户端NAT”,是实现外网访问路由器后其他设备的必要条件,但仅此还不够,还需要后面的步骤配合才能实现。

启用后,你应该能看到接口信息中有如下的内容。目前这里看不到虚拟网络分配的地址,需要下一步完成。

路由器输入Network ID后,并不能直接被访问到,需要去Zerotier官网,登录后进入你建立的虚拟局域网的管理界面,拉到最下面,你会看到类似下面这样的列表,

左边有虚红线的,表示有一个设备刚刚接入,需要你认证。只要简单的打勾就可以了。系统会自动给该设备分配一个虚拟局域网网段内的IP,如果不满意可以调整。
现在,回Openwrt看一下zerotier的信息,如果还没有显示虚拟网IP地址,就重启一下zerotier,信息变成这样就说明路由器已经成功接入虚拟网:

因为我们希望通过路由器的zorotier虚拟局域网访问内网设备,这就需要如下图,在虚拟网络管理界面中,添加路由:

假设你的局域网是192.168.3.0/24(即网络是192.168.3.x,掩码255.255.255.0),路由器的虚拟IP是10.222.33.1,则这里两个框就分别输入192.168.3.0/24和10.222.33.1。这个配置其实就是对加入虚拟局域网的所有设备设置了一个路由:当从任意设备上想访问192.168.3.0网段时,需要经过10.222.33.1,也就是我们的路由器来转发数据。
Zerotier官网的配置到此结束,接下来回到路由器上继续配置。
如下图,在Openwrt防火墙上建立如下规则:

在Openwrt界面的网络->接口下,点击“添加新接口”,按照下图配置:

点击创建接口,并设置成开机自动启用,回到接口列表,保存并应用。
进入Openwrt的网络->防火墙,在最下方的区域列表下方,点“新增”,然后按照下图配置:

注意:按照官网说明,在“允许转发到目标区域”设置中,如果仅仅为了访问局域网内部设备,是不需要选中wan的。当你想让虚拟网络中的其他设备也利用该Openwrt设备上网时,才需要选中wan。我没做过深入测试,考虑到可能其他设备的客户端如果是以VPN方式接入虚拟网络后必须通过这个openwrt上网,简单起见,我选中了wan。
保存,并应用。大功告成。
随便找一台电脑或手机,安装zerotier客户端,并参照步骤2做设备认证。不要用家里的WiFI,启动zerotier客户端,上线,试试直接访问局域网任意设备的IP地址,看是不是能访问了!
如果遇到配置正常但无法连接,可以确认一下路由器上的zerotier接口信息中是否只分配了IPv6地址,没有虚拟IPv4地址。本人在某个版本的openwrt上遇到过这种情况,关掉下图中的选项就正常了,具体原因未知。

其实并不是只能通过Openwrt设备访问局域网,任意一台安装了zerotier的设备都可以做到。只是需要你对网络知识比较了解,能够在该设备上通过命令行或其他方式进行防火墙、路由等相关配置,也一样可以实现目标。
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested