愚蠢的地球人

两台OpenWRT通过Wireguard实现局域网互联

两处住所A和B都是家用宽带,A处有一台wifi打印机,但是在外网不能打印,需要外网打印的时候可以通过OpenVPN连接到A的内网来打印。B处有一台威联通的NAS,虽说可以通过动态域名加端口转发来远程访问,但是想要用Windows的文件共享也只能用OpenVPN连接到B的内网来使用。虽说OpenVPN能满足外网访问的需求,但是需要在局域网内每台设备上都安装OpenVPN的客户端,每次使用之前要先连接到对方的内网,用完之后要断开连接,不够方便。

最近发现了一个叫Wireguard的组网神器,它能在两台网络设备上建立一个加密隧道,并将部分或者所有流量通过这个隧道转发。比方说如果在两台网关路由器上通过Wireguard建立一个隧道,然后将对方的局域网段IP地址设置为通过这个隧道转发,这两个路由器下的所有网络设备就可以直接访问对方的局域网了,非常方便。据说Wireguard的代码非常精简,只有4000多行,而OpenVPN大约有10万行代码,而且Wireguard以Linux内核模块的形式运行,资源占用小。从2020年1月开始,它已经并入了Linux内核的5.6版本,这意味着大多数Linux发行版的用户不用安装任何三方软件就能直接使用。连Linux创始人Linus Torvalds都称其为“一件艺术品”。

Wireguard配置起来非常简单,网上教程一大把,但是很多教程都是手把手的讲步骤,却没有说清楚它的原理,跟着这些教程来做一不小心就容易踩坑。本文着重讲一下他的工作原理,看懂了原理再跟着教程来做就不容易踩坑了。

一、安装
如果你的OpenWRT没有预装Wireguard,我建议还是重新刷个带Wireguard的固件,如果通过软件包来安装,大概率装了之后用不了。我就是在这一步卡了很久,后来才知道安装kmod-wireguard版本必须要跟内核版本一致,但是软件源提供的kmod-wireguard大概率跟你的内核不一致,装了也用不了。

二、工作模式
Wireguard跟其他的VPN不一样,首先,没有服务器端和客户端的概念,通信双方是对等的,双方事先就配置好了对方的公钥,所以在初次连接的时候不需要复杂的握手和认证过程;其次,双方的IP地址也是自己填写的固定值,没有DHCP分配一说。由于以上两点的原因,Wireguard最好是用于两台网关设备的对连,如果你想要让多台设备连接到同一个OpenWRT路由器,那么每增加一个设备,OpenWRT上都要增加一个Peer的配置。一开始我以为OpenWRT上运行的是服务器端,手机上安装的是客户端,所以很多教程一开始没看明白,在配置的时候很多地方都填错了。

三、配置
每个设备上Wireguard的设置都分为两部分,一个是本机设置,另一个是对端的设置。本机也被称为Interface,可以理解为本地的一个虚拟网卡,你需要填写三个东西:自己的私钥、本接口的IP地址、本地侦听端口。一个Interface可以跟多个对端分别建立加密隧道,每一个对端被称为一个Peer,你需要填写三个东西:对端的公钥、需要路由的IP网段、对端的公网地址和端口,其中对端的公网地址和端口不是必填的项目,如果你需要主动去跟对方发起连接你就填,反之就不用填,比如说对方没有公网地址那就没法填,这种情况下只能被动等对方跟自己建立连接。

四、私钥和公钥
私钥和公钥是成对的,每个设备都要有一个私钥公钥对。每个设备的Interface里面填的是自己的私钥,对方要把你的公钥填进他的Peer里面,同样你的Peer配置里面填的是对方的公钥。私钥公钥对可以在终端里通过命令来生成,步骤为先生成私钥然后通过私钥生成公钥,这两个命令可以合并为$ wg genkey | tee privatekey | wg pubkey > publickey,手机上则可以在APP里面直接生成一对随机的私钥公钥对,甚至如果你在OpenWRT上通过$ wg genkey > privatekey这个命令生成了一个私钥,然后把这个私钥填进手机APP里,手机也能通过这个私钥来生成对应的公钥。所以如果你不想用SSH进入OpenWRT的命令行终端,你也可以在手机上生成两对私钥公钥,一对自己用另一对给OpenWRT用。

五、路由的网段
需要路由的网段是配置在Peer里面的,意思是你可以将不同的IP网段的流量发送给不同的Peer,这里应该填对方路由器的内网网段,这样你要访问对方局域网网段的时候流量就会被转发到Wireguard的虚拟网卡,Wireguard再将这些流量通过相应的加密隧道发送给对方。这里一定要注意的是,一旦填了这个东西,系统的路由表就会被修改,我第一次填这个东西的时候一不小心把路由器的Lan口网段填了进去,后果就是所有Lan口的流量全都被转发到了Wireguard的虚拟网卡,然后家里就断网了,而且还不光是断网这么简单,连路由器自身的管理页面都无法访问了。正当我心灰意冷的准备给路由器重新刷机的时候,我发现家里有人还在愉快的用手机逛淘宝,我问是不是用的移动网络,回答不是。我将信将疑的拿过手机一看,确实连的是家里的wifi,开浏览器输入baidu.com,无法访问。我忽然恍然大悟,淘宝走的是IPv6!哈哈,天无绝人之路,我之前在OpenWRT路由器上做个一个IPv6的DDNS,现在终于可以派上用场了,马上在电脑上用IPv6的地址访问路由器,熟悉的Luci界面出现了,还好不用重新刷机。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

友情链接

网站分类

最新留言

最近发表