【踩坑日记】使用n2n远程访问家里的网络
前言
目的呢是想实现出门在外通过RDP远程访问我家里的台式电脑,但需要解决以下问题🤔:
- 家庭网络无公网IP,无法直连
- 尽量低延迟
- 电脑按需开机
这好办,买一个国内低延迟大带宽云服务器搭个VPN中转下就解决了嘛👏
这我只能说:有钱真好,可惜我没有🙄
需求分析
首先解决最简单的,电脑在需要用的时候才开机,只要开启主板自带的Wake On Lan
功能:
1.关闭Windows快速启动
2.进BIOS,打开网卡唤醒,关闭ERP电源节能
然后使用路由器上的远程唤醒功能即可。
那焦点来到了路由器,我咋远程访问一个木得公网IP的路由器呢?还好我有一个刷过机自定义化程度比较高的渣渣路由器,固件是Padavan的,就是上图
但自带的存储空间可能不够,我也不知道它能不能存,所以还是屁股上插了个U盘用来放置脚本和其他程序(硬件跟不上的百兆过气路由器)
没有公网IP那就需要外部云服务器来辅助通信,然后要实现低延迟那必然选择n2n啦,NAT打洞能力强,可以不受云服务器带宽延迟限制,支持多种系统构架,不想编译的话直接下大佬们编译好的
实施
名词与设定:
edge
为n2n客户端;supernode
为n2n服务端- 家里的局域网网段
192.168.123.0/24
- n2n虚拟局域网网段
192.168.111.0/24
- 公网服务器地址为
88.88.88.88
第一种方案
路由器起一个edge,电脑上也使用edge,设置开机自启,这样电脑唤醒后自动加入到n2n的虚拟局域网中以便访客电脑远程连接
服务器
架设supernode,这里设置允许的community名称:
文件名communities
1 | MyCommunity |
启动命令:
1 | ./supernode -c communities -p 5678 |
解释:-c参数是允许的community名称文件名,-p参数是服务监听端口
访客电脑
edge配置文件edge.conf:
1 | -c=MyCommunity |
edge使用配置文件启动:
1 | ./edge.exe edge.conf |
家中电脑
配置文件edge.conf(仅ip地址不同):
1 | -c=MyCommunity |
然后想个办法让它开机自启,我是使用的nssm
路由器
下载mips构架的edge
把edge和其配置文件放在挂载的U盘目录下
1 | /media/ATTACH/n2n/edge |
edge.conf配置文件内容:
1 | -c=MyCommunity |
启动后发现访问不通。。。
最后弄明白是防火墙的问题
而且路由器设置了定时重启,这启动edge的命令和防火墙规则命令我都需要让它开机自动配置
最后如下解决:
padavan提供了菜单,直接对应菜单添加脚本命令就行,非常方便
自定义设置-脚本-在 WAN 上行/下行启动后执行
1 | /media/ATTACH/n2n/edge /media/ATTACH/n2n/edge.conf |
自定义设置-脚本-在防火墙规则启动后执行
1 | iptables -I INPUT -i edge0 -j ACCEPT #放行n2n网卡传入 |
这样就OK,重启后测试访问成功:
RDP也正常
第二种脑抽方案【坑来了】
其实第一种方案用的好好的,想着优化下网络结构,如果直接把访客电脑直接加入到家庭局域网就好了
结果踩坑了,吃了不够熟悉网络工程的坑,原理上就决定了不能用。。。
我是怎么想的:访客edge和家庭局域网网段一样就行了,如果能用路由器的DHCP服务器分配ip不就好了嘛,真是大聪明👏
搜了搜,好像有这种操作N2N 之 DHCP 的使用方法
我是怎么做的:
把DHCP服务器绑定到n2n的网卡
1 | interface=br0 |
把路由器上的edge手动分配一个123网段的ip, 然后再重启DHCP服务器(这个时候微微觉得好像有点不对劲😐,路由器有两个同网段地址)
edge添加-r
参数开启包转发
1 | /media/ATTACH/n2n/edge -c MyCommunity -k MyEncryptionKey -l 88.88.88.88:5678 -r -a 192.168.123.50 -d edge0 |
访客客户端设置自动获取IP地址
1 | .\edge.exe -c MyCommunity -k MyEncryptionKey -l 88.88.88.88:5678 -x 1 -r -a dhcp:0.0.0.0 |
看起来好像成功了,IP地址是获取到了
但我咋一个也访问不通🙁
一时还以为是iptables
的问题, 然后关了也不行
过了一会儿突然明白过来
这样操作只不过是得到一个同IP段的新局域网,和家里的网络没啥关系🤡。。。
真•第二种方案
既然n2n提供了包转发功能,那我是不是直接用它就行了
这个时候还刚好找到这篇官方路由设置文章,场景相似,但它是在普通Linux上操作的,有一堆的命令,包括开启包转发和防火墙操作,手动路由操作等,可以借鉴变通下
先按我的想法试一下,路由器本身就有转发包功能,只要在edge上开启包转发
1 | -c=MyCommunity |
启动访客电脑edge,然后设置虚拟网卡网关为家中edge虚拟网卡的IP
然后再添加一条路由:
1 | route add 192.168.123.0 mask 255.255.255.0 192.168.111.10 |
emmmm, 咋不行?
想到是不是防火墙的原因,干脆把防火墙先关了试试,果然可以连接上了
这样,在路由器上,仅仅是edge多加了个-r
参数
那访客处有没有自动添加路由的方法呢,然后我再检查了一遍n2n的参数,发现了我想要的功能
只要加上-n参数就不用手动调整路由了
1 | -c=MyCommunity |
呃,这个功能像是新开发不久的,结束edge时删除路由命令不正确,然后下一次重复添加,虽然有点小bug,但倒不影响使用
最后还得倒腾下iptables:
1 | iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE #对内网网段做SNAT |
就这么解决了
这样就可以完全访问家里的局域网了
总结下与方案一的不同:
1.路由器上edge添加-r
参数开启包转发
2.访客电脑edge添加-n=192.168.123.0/24:192.168.111.10
参数自动添加路由
3.家中电脑无需再启动edge
4.再添加对应防火墙规则
小结
- 路由器虽然有提供搭建VPN功能但无公网IP也办不到直连,若传统借助服务器转发又会受到云服务器带宽性能影响,使用n2n搭建点对点VPN实现直连;
- 想要访问其他网段需要的是网关和路由,把访客电脑直接加入到家庭局域网中靠n2n应该是不行的;
Wake On Lan
功能可以远程唤醒主机;- 除此之外还需要注意防火墙规则。
基础不牢固,多走十年路。