【踩坑日记】使用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
2
3
4
5
-c=MyCommunity
-k=MyEncryptionKey
-l=88.88.88.88:5678
-a=192.168.111.2
-x=1

edge使用配置文件启动:

1
./edge.exe edge.conf

家中电脑

配置文件edge.conf(仅ip地址不同):

1
2
3
4
5
-c=MyCommunity
-k=MyEncryptionKey
-l=88.88.88.88:5678
-a=192.168.111.1
-x=1

然后想个办法让它开机自启,我是使用的nssm

路由器

下载mips构架的edge

把edge和其配置文件放在挂载的U盘目录下

1
2
/media/ATTACH/n2n/edge
/media/ATTACH/n2n/edge.conf

edge.conf配置文件内容:

1
2
3
4
5
-c=MyCommunity
-k=MyEncryptionKey
-l=88.88.88.88:5678
-a=192.168.111.10
-d=edge0

启动后发现访问不通。。。

最后弄明白是防火墙的问题

而且路由器设置了定时重启,这启动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
2
interface=br0
interface=edge0

把路由器上的edge手动分配一个123网段的ip, 然后再重启DHCP服务器(这个时候微微觉得好像有点不对劲😐,路由器有两个同网段地址)
edge添加-r参数开启包转发

1
2
3
/media/ATTACH/n2n/edge -c MyCommunity -k MyEncryptionKey -l 88.88.88.88:5678 -r -a 192.168.123.50 -d edge0
killall dnsmasq
dnsmasq

访客客户端设置自动获取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
2
3
4
5
6
-c=MyCommunity
-k=MyEncryptionKey
-l=88.88.88.88:5678
-a=192.168.111.10
-d=edge0
-r #开启包转发功能

启动访客电脑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
2
3
4
5
6
-c=MyCommunity
-k=MyEncryptionKey
-l=88.88.88.88:5678
-a=192.168.111.2
-n=192.168.123.0/24:192.168.111.10
-x=1

呃,这个功能像是新开发不久的,结束edge时删除路由命令不正确,然后下一次重复添加,虽然有点小bug,但倒不影响使用

最后还得倒腾下iptables:

1
2
3
4
iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE  #对内网网段做SNAT
iptables -A FORWARD -i br0 -o edge0 -m state --state RELATED,ESTABLISHED -j ACCEPT #放行内网到n2n网络回程
iptables -A FORWARD -i edge0 -o br0 -j ACCEPT #放行n2n网卡到内网转发
iptables -I INPUT -i edge0 -j ACCEPT #放行n2n网卡传入

就这么解决了

这样就可以完全访问家里的局域网了

总结下与方案一的不同:

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功能可以远程唤醒主机;
  • 除此之外还需要注意防火墙规则。

基础不牢固,多走十年路。