配置OpenWrt旁路由,并使用WireGuard实现局域网跨网互访

简述一下需求:

  • 跨公网实现内网互通(单位和家里),两端均无公网IP,但有一个具备公网IP的FRP服务器。
  • 移动端设备也能访问内网(同时访问双端更好),包括IOS设备和Android。

以前的做法是:

  • 在两端使用的RouterOS路由上配置SSTP代理:并使用frp的stcp模式代理,把sstp的端口在两边内网穿透,再使用routeros连接sstp并配置路由。但这只能实现两台routeros设备互通,外部网络的手机和电脑均无法兼容。
  • 在外部网络中,电脑使用frpc的stcp代理,安卓设备可以frpc也可用v2ray,iOS无法使用frpc只能v2ray。

以前做法的缺陷:

  • 配置繁琐,需要配置逐个端口配置frpc,确保安全性使用stcp,在客户端也要逐个端口去配。
  • v2ray移动端设备可以全局代理(TCP),windows上的全局通常只能代理浏览器,cmd等无法代理,需要配合proxifer拦截全局TCP较为繁琐。

使用wireguard的优点:

  • 虽然routeros不支持wireguard,但可加一个openwrt旁路由,过后也可配置科学上网。routeros上只需设好那些IP指向op即可。
  • Android端,IOS端,均有客户端支持,IOS的已经测试可用,Android过后再测试。
  • windows版会生成虚拟网卡,配和路由表设置可以实现各种操作。

以下为配置过程:

一、在ESXi上安装OpenWrt:

注:此部分参考https://blog.csdn.net/alwaysbefine/article/details/109170503

首先下载OpenWrt硬盘镜像:https://mirrors.tuna.tsinghua.edu.cn/openwrt/releases/19.07.7/targets/x86/64/openwrt-19.07.7-x86-64-combined-ext4.img.gz 这里下载x86-64-combined-ext4.img.gz 这个文件。

下载并解压得到一个IMG格式的磁盘镜像,然而VMware需要的是VMDK,这里需要转换一下,使用工具:StarWind V2V Converter

根据界面提示即可完成转换,值得注意的是,下图这里选第一个是无需预分配空间的,比其他两项节省不少空间。下一步虚拟磁盘类型选SCSI

转换后,即可得到一个VMDK格式的虚拟磁盘文件,随后上传到ESXI按常规步骤添加虚拟机即可。

这里放上转换好的:

此处要删除自带的SCSI控制器 否则无法开机
引导方式改为BIOS引导
成功进入系统

此时网卡的默认配置上是一个Ethernet口带一个桥,并且IP是192.168.1.1,我们需要删除网桥,并把IP改为DHCP自动获取。

编辑网卡配置文件:

vi /etc/config/network

保存退出后,重启系统(按理说能热更新,但不知道命令的情况下重启最简单)。

随后即可通过WEB进去编辑(不知道IP的话,可以ip addr看一下获取到的IP,或者去主路由上去看也一样)。

成功进入WEB界面

成功进入WEB后,首先修改软件源为清华大学的源,为之后的安装插件做准备。

按照清华源https://mirrors.tuna.tsinghua.edu.cn/help/openwrt/给的使用帮助:将 downloads.openwrt.org 替换为mirrors.tuna.tsinghua.edu.cn/openwrt 即可。我们这里并不需要登录到路由器编辑,直接在WEB上也可以改的。

修改软件源位置
对每一项都做替换,最后点击SAVE保存即可

保存后,点击update list更新源,安装luci-i18n-base-zh-cn

安装更新,没找到哪里有批量,把UPDATE都点一遍吧 好在不算太多

此时OpenWrt安装已完成。

二、在OpenWrt上安装WireGuard并配置

注:安装部分参考:https://www.jianshu.com/p/4bd5b839ae24

需要安装的包:其中有部分会被自动附带安装,需要手动安装的只有三个包

  • wireguard(需要手动安装)
  • wireguard-tools(自动安装)
  • kmod-wireguard(自动安装)
  • luci-app-wireguard(需要手动安装)
  • luci-proto-wireguard(自动安装)
  • luci-i18n-wireguard-zh-cn(需要手动安装)
  • luci-i18n-base-zh-cn(自动安装)

安装后重启openwrt,重启后已完成wireguard安装。

这里先进openwrt的ssh去生成一些密钥,留着一会用。

wg genkey > privatekey
wg pubkey < privatekey
cat privatekey
rm privatekey

尽量多生成几对,成对保存好,一会会用到。

这里假设存了三对,A对,B对,C对。

下面的配置分为服务器端和客户端(wireguard原理上不分服务端和客户端,都是对等关系。但本配置只有其中一端可通过公网访问,还是暂且认定它为服务端吧):

服务端:

添加wireguard接口:

网络->接口->添加新接口->协议选wireguard vpn

填入A对私钥,监听端口填服务器对外暴露的UDP端口,IP地址填一个IP端用作VPN网段(只要不和其余网络冲突即可)。

防火墙设置里选此wireguard接口,然后是对等节点配置:

公钥那里填B对公钥,允许的IP是从刚才设置的VPN网段中选一个,分配给对方,后边加上/32,路由允许打上勾,否则可能上不去网。此外非公网IP对公网IP的话,还是把keppalive加上吧。注:如果双网都是公网IP(或者都是内网IP)总之是可互通,可以在把端点端口也加上,这样双方都用固定端口通讯了,此外客户端也能当服务端。

到这里服务端配置完毕。

客户端:

还是添加接口,此时私钥填B对私钥,监听端口不用填(没公网IP监听谁呀),IP地址填刚才在服务端上分配的,防火墙里还是选一下这个接口,对等点配置公钥填A对公钥,允许的IP填0.0.0.0/0和分配的本机IP,路由允许的IP打钩,端点主机和端点端口填服务器的公网IP和端口号,keepalive和刚才一样。

到这里配完了两端的wireguard,两端都重启一下wireguard接口理论上就可以互通的。

之后配一下openwrt上的静态路由:

这里参考这篇文章:https://www.right.com.cn/FORUM/thread-1346042-1-1.html

防火墙部分的设置实测需要改变一下:

此处是做了lan=>wg以及wg=>lan的允许规则,并且都开了masquerading伪装(也就是NAT网络地址转换)。这里如果按照上面的教程只开一个,会导致在内网中访问内网设备的IP为wireguard网段的IP,而非openwrt的IP,部分服务会拦截(实测开启前SSH经常会被reset,开启后就好了,也不知是为什么拦截的)。

然后是配置路由规则,这个按照上边给的教程就好了:

另外如果两端均为路由,要实现跨网互相访问局域网,需要做如下设置
A端:局域网网段192.168.1.0 wireguard ip 172.16.16.1
B端:局域网网段192.168.2.0 wireguard ip 172.16.16.2

在A端设置静态路由,接口为wireguard接口,目标为对端(B端)网段192.168.2.0/24,掩码255.255.255.0,网关填本段wireguardIP:172.16.16.1


在B端设置静态路由,接口为wireguard接口,目标为对端(A端)网段192.168.1.0/24,掩码255.255.255.0,网关填本段wireguardIP:172.16.16.2

到此为止openwrt旁路由的配置已经配完了,重启wireguard接口之后,可以在openwrt上ping一下对端IP,如果一切正常,那大概是能通的

三、在RouterOS上配置路由规则

IP->Routes中添加对端内网IP段,gateway的IP设置为openwrt旁路由的IP,此处添加两个,另一个加上routing mark。

IP->Firewall->Mangle添加一个prerouting规则,源地址为本内网IP段,目的地址为对端内网IP段,action为mark routing,routing mark 选刚才填的routing mark,passthrough勾上。

两端routeros都这么配置一下,如果不出别的错误大概是能通的

IP->Routes配置
IP->Firewall配置

总结:

操作总共没几步,但是配置起来却是极为复杂。每处的网络情况不一样,多多少少会遇到点儿问题,很难找到通用的解决方法,期间踩了好多坑,解决的过程也只能是一点一点试验。顺便说一下可以参考的排查方法吧:一是在RouterOS的IP->Firewall->Connections里跟踪当前的链接,再就是利用traceroute查看跳到哪后开始丢包,丢包前的最后一个跳点往往是出现问题的地方

放上一个顺利跳通的traceroute

评论

  1. admin 博主
    Windows Firefox 85.0
    4月前
    2021-2-19 21:09:28

    此次在两端openwrt上都配置了NAT,缺点就是设备无法收到对端内网发来请求的真实IP,不过目前来说问题不大。至少两边访问对端都没有问题。

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇