校园网环境内的远程设备连接尝试
校园网环境内的远程设备连接尝试
前言
这两天在思考如何在寝室局域网之外远程连接寝室设备,以满足我有时候出门不方便带电脑想要用手机远程连接电脑操作的需求。我选定的是 sunshine+moonlight 串流方案,然而该方案本身并不支持远程连接,只适用于局域网连接,所以我需要通过内网穿透获取电脑网络服务或使用 VPN 构建虚拟局域网来让我的电脑和手机设备处于同一个局域网环境内。
openVPN
由于 hdu 在去年进入了大内网时代(可恶(〃> 皿 <)),生活区的网络全部并入了校园网,由学校分配动态内网 ip。所以即便我手头有一个域名我也没法通过 DDNS 直接低成本方便地实现对寝室局域网的访问。
我手上刚好还有一个云服务器,之前作为护网的跳板机又刚好搭过 openVPN 的服务端,那么我想试着尝试通过 VPN 来让两个设备处于同一个虚拟局域网下。稍微修改配置文件,加上 client-to-client 允许客户端间通信,然后在两个设备上均使用 vpn 服务,成功连接!
然而效果一言难尽……
或许是服务器配的带宽太低、又是远程连接导致连接质量不好,总之放弃了这个方法,觉得还是满足校园网内的连接需求即可。
WireGuard
都说 wireguard 是更加高性能、安全稳定的工具,那么趁这个机会就可以来试试用。在此之前我先捣鼓了一下路由器,将路由器刷成 openwrt 系统,参考之前的一篇文章小米 AX3000T 刷机 openwrt 小记,一般来说 openwrt 自带 wireguard,且基本通过图形化界面操作配置即可,我将路由器作为服务端点,手机等移动设备作为对端节点来实现我的目标。
注意:以下 openwrt 上的配置操作均要记得保存并应用
创建密钥对
ssh 连接路由器 ssh root@192.168.1.1
使用如下命令分别生成两组密钥对
1 |
|
生成共享密钥
1 |
|
这些密钥对可在路由器上清除传输至主机保存。如果需要多个对端节点就要生成多对密钥对,不能重复使用,共享密钥则所有均使用同一个。
创建并配置接口
先创建新的接口,协议选择 WireGuard VPN
然后配置该接口的各个关键配置
- 私钥:为路由器准备的私钥
- 监听端口:路由器上将给 WireGuard 使用的端口
- IP 地址:路由器在
虚拟局域网VPN 内的 ip,必须为 IP-CIDR 格式
下方“更多选项”处可选择“预共享密钥”进一步提高安全性
添加 Peer 并配置以下内容
- 公钥:为 Peer 准备的公钥
- 预共享密钥(可选):之前生成的
- 允许的 ip:允许该 Peer 在
虚拟局域网VPN 内使用的 ip,必须为 IP-CIDR 格式(我此处与上面路由器在虚拟局域网VPN 内的 ip 处于同一网段。不要输入路由器自身局域网的网段,如我这的 192.168.1.0/24 就会出现逻辑错误) - 路由允许的 IP:勾选即可访问路由器上的其他网段,如此我们才能从 Peer 访问到路由器本身下的局域网
- 端点主机:我的 Peer 即手机或其他移动设备,没有固定域名什么的,用不上
- 端点端口:有需要就设置,我默认即可
- 持续 Keep-Alive:默认情况下,WireGuard 在不使用时会尽可能保持静默,一般而言没有问题,但当对端处于 Nat 或防火墙后时长时间的静默可能导致映射失效,所以可以设置每隔一段时间向服务端点发送保持活动状态的数据包来保持连接状态。校园网里有些时候会遇到处于 Nat 下的情况,所以保险起见设一下。
将以上均保存并应用后接口配置也就完成了。如果有多个对端节点设备则要配置多个 Peer,不能共同使用,会造成 IP 冲突等问题。
注意:WireGuard 的配置修改后是需要重启才能生效得,所以修改后还需记得点击 连接
重新启动一下
配置防火墙
接下来为 WireGuard 专门配置一个防火墙规则。
先打开防火墙的通信规则
在下方“打开路由器端口”处新增规则,允许 TCP+UDP
协议(moonlight+sunshine 两个协议都要用)并指定对外开放的端口(与之前 WireGuard 监听端口配置一致),只有路由器这个对外端口开放后 WireGuard 服务端点才能与外界建立连接。
而后点击修改进行详细配置。源区域选择 wan
口防火墙,目标区域选择 设备(输入)
,其他按需设置
保存并应用后去到防火墙的常规设置,下方点击添加,为 WireGuard 专门配置一个防火墙规则。转发要选择接受,覆盖网络选择之前配好的 WireGuard 接口,这样这个防火墙规则就应用到那个接口上去了。允许转发目标区域选择 lan
口防火墙和 wan
口防火墙,允许转发源区域选择 lan
口防火墙,这样一来来自 WireGuard 的流量就可以去往 wan 口向外界设备传输,去往 lan 口向寝室局域网设备传输,来自寝室局域网设备的 lan 口流量就可以去往 WireGuard 向对端节点设备传输。
最后保存并应用完成防火墙配置
对端 WireGuard 配置
在对端(手机)下载 WireGuard,手动创建隧道
- 本地私钥:为 Peer 准备的私钥
- 本地公钥:此处不必理会,填入上面的私钥后自动就出来了,跟之前路由器上生成的是一样的
- 局域网 IP 地址:本设备在
虚拟局域网VPN 内的 IP,必须为 IP-CIDR 格式,要属于路由器上配置的允许的ip
- DNS 服务器:随意设置即可,这个场景不太需要
- 远程公钥:为路由器准备的公钥
- 预共享密钥(可选):之前生成的
- 连接保活间隔:自行选择
- 对端(相对于手机本机来说):当前设备所处网络环境下能访问到的另一端的 ip,此处即校园网大内网环境下寝室路由器被 DHCP 分配到的内网 IP。(经过测试,当下 hdu 教学区的校园网与生活区的校园网基本相通,由于我只要求在校园网内使用,所以填写内网 IP 在连接校园 WiFi 的情况下使用即可)注意需带上前面设置的开放端口号,
ip:port
- 路由的 IP 地址(段):另一端设备所处的网段,前面路由器设置的是 192.168.2.1(
虚拟局域网VPN 内)和 192.168.1.1(本身局域网内),那么填入 192.168.2.1/24 和 192.168.1.1/24 也就是在访问这两个网段时将通过 WireGuard 的规则通信,将当前设备“并入”另一端设备(寝室路由器)的局域网络
配置完成后开启,在接口处点击连接并查看,若出现接收、发送流量那基本就全部配置成功了。
配置 moonlight
先局域网内跟电脑绑定一下 Pin 码,远程的时候打开 WireGuard 指定 192.168.1.6 的 ip 连接电脑即可
杂谈
折腾?
折腾,其实图方便的话直接用第三方软件向日葵或者 windows 远程桌面等就能实现需求,如果非要用 moonlight+sunshine 的话在 openwrt 上也有现成的傻瓜式组网工具 ZeroTier 等等可以用,更加方便可能效果也好。那么我这么折腾主要也就是为了多学习实践,再者 DN11 的佬们也使用了 WireGuard 进行组网,那么我就当是并入 DN11 网络前提前尝试一下。
内网穿透、NAT、代理、隧道、VPN、虚拟局域网、端口映射、端口转发
这一大堆概念曾经或许明白了,但过段时间又分不清了……这里简要记录一下现在的理解,不保证正确性和准确性……
内网穿透与 NAT
内网穿透即 NAT 穿透。
在 NAT 后的多台设备通过 NAT 的网络地址转换可以使用同一个外部 IP 进行对外访问。以本次尝试为例,在内部设备(192.168.1.6)发送请求后,请求的 IP 数据包为源 192.168.1.6 至目标 10.150.27.27(这个是随便写的校园内网 IP,但相对于寝室局域网来说是外网,替换成公网 IP 也一样理解),那么 NAT 就会将这个数据包的源 IP 改写为本局域网可用的外部 IP(假设路由器在校园内网中被分配到的 10.150.27.28),并留下一条内部 192.168.1.6 到外部 10.150.27.28 的映射记录,外部并不知道是 NAT 下具体是哪个 IP 发起的请求,将响应数据包返回给路由器后路由器的 NAT 就根据映射记录将响应转发给其下局域网内发起请求的 IP。可以看出来,这种情况下外部想要主动访问内部设备就变得困难了。
那么内网穿透解决的其实就是这个问题,通过让内部设备主动请求外部设备来让路由器 NAT 留下映射记录,然后外部设备才能向内部发送数据,通过已经建立通信的外部设备进行中转与内部通信,就是实现了内网穿透。
代理与内网穿透
代理的概念最浅显易懂,就是让一个中间人(代理服务器)代为传递消息,分为正向代理和反向代理两种
正向可以起到隐藏访问者 IP、访问部分不可达外部网络(更准确通用地说应该是绕过访问限制)等作用。
反向代理则可用于访问控制、CDN 加速、负载均衡缓存优化、访问部分不可达内部网络(更准确通用地说应该是绕过访问限制)等等
那么内网穿透与代理有什么关系呢?我觉得内网穿透的核心就是通过内部设备主动发出请求保持一条与外界持续连接通信的信道,但为了方便使用,这个设备最好作为中转的代理服务器(不需要自己直接使用的设备来维持连接)且有公网 IP(随处均可访问),所以就会与代理技术联系在一起,代理强调的是整体的网络通信逻辑结构,内网穿透强调的是外部设备访问内部设备的方式。例如 frp 就是使用反向代理。
隧道、VPN 与代理
隧道技术是在一个网络协议中封装另一个网络协议的数据包,使其能够在原本不支持的网络上进行传输。(应用层)
而 VPN 则是使用了隧道技术并加密用于构建私有安全通信的技术。
而代理如上所说强调的是中间人中转的通信逻辑,它的实现则可以使用 VPN 技术,如果不使用 VPN 仅使用代理服务器中转那么通信内容是并不隐蔽的,如果使用 VPN 进行代理那么 VPN 的加密隧道就可以确保从客户端到代理服务器的隐秘性。
虚拟局域网与 VPN
虚拟局域网即 VLAN,是在数据链路层上对一个物理网络进行逻辑划分的技术,它使得在物理上处于不同位置的设备可以被划归到同一个逻辑局域网中。(但我发现似乎这个严格来讲是在局域网本身上实现的,而非我之前以为的那样,所以前面内容需部分更正。)
那么虚拟局域网与本篇通过 VPN 实现的效果有什么区别?VPN:通过加密隧道在公共网络上连接远程设备或网络,形成一个逻辑上的“私有网络”,设备可以跨越不同物理位置通信;VLAN:在局域网内通过交换机配置逻辑隔离的广播域,用于分割本地网络流量,不涉及加密或远程连接。
端口映射、端口转发与内网穿透和代理
端口映射、端口转发实现功能类似,技术本质上也没有什么区别,都是通过 NAT 表,将路由器上指定端口的流量转发到内部的指定 IP 的指定端口,只是说端口映射强调的是将内网设备的端口公开到路由器所在的外部网络,端口转发强调的是将外部访问的数据转发到内部设备。
与内网穿透不同的是这个是直接在路由器上配置规则的,这个也可以实现内网穿透的效果。
另外它们帮助代理的实现。
内网穿透与VPN
讲来讲去前面我尝试的全是VPN。这两者的区别感觉可以这样形容,内网穿透是把某个内网设备暴露到外部网络以供访问,VPN是把外部设备并入内部网络,通过VPN外部设备可以访问内网的所有网络服务。
非对称密码与对称密码
配置 WireGuard 时出现了两组密钥,容易搞混,借此记录一下
对称密码的优势在于加解密相对快速,硬件要求相对较低,但无法解决身份认证问题,密钥不能在公开信道传输。
而非对称密码损失了一些加解密效率但解决了身份认证问题,私钥本地保存公钥向外发放,公钥加密私钥解密。
在客户端与服务器通信的场景中,客户端保存私钥并将公钥传输给服务器,这样就确保了服务器发送的数据只有这个客户端能解密,即便公钥被他人获取。在数字签名的场景中,就是客户端保留公钥,向服务端发送私钥,那么就只有该客户端可以正确地加密内容并传输给服务器认证。
那么在 WireGuard 隧道中就是节点 A 与节点 B 间各自保存自己的私钥和对方的公钥,确保 A 发出的数据只有 B 能解密,B 发出的数据只有 A 能解密从而确保安全性。
利用 DDNS 的改进
前面的实现的方案有一个不太方便的问题,就是 IP 是动态变化的(我尝试过设置静态 IP 但原本的租用期满后就无法正常上网了,看来只能接受学校的 DHCP,不过生活区某次断网后发现租期从三天变成了六天),隔段时间就要改一下手机端上 WireGuard 配置的对端 IP。于是我重新考虑 DDNS 到底能不能用(之前以为就是要公网 IP 的来着),发现至少阿里云的域名解析是可以解析成内网 IP 的,后续另起一篇看看能不能 DDNS 吧。
坏消息
这个方案出现了问题,串流成功后过一会后连接会异常中断,后续再排查问题吧,另起一篇。累