当我尝试在家搭建私人网盘nextcloud时,遇到一个难题:如何随时随地访问家里的服务器 ?业界有几种解决方案:
option1: 租用公网服务器,把应用部署在公网服务器上。优点:安全稳定,不需要维护设备;缺点:需要定期支付租赁费用。
option2: 应用部署在家用服务器上,依赖“内网穿透”(如frps/frpc)访问家庭网络。优点:适用家庭宽带没有公网IP的场景;缺点:需要租用公网服务器做“代理”,带宽受公网服务器限制。
option3: 应用部署在家用服务器上,用“端口映射”访问家庭网络。优点:带宽大,且无需租赁服务器;缺点:依赖运营商临时公网IP。
我尝试过option1和option2,出于成本考虑我选择性价比高的option3,毕竟长期租用服务器价格不菲,并且带宽越大费用也越高。本文是我个人的经验总结,供大家参考。
1 前提
开始之前,请确认是否满足下列条件,缺一不可。需要宽带拨号账号和密码;需要确认宽带使用公网IP;需要路由器有DDNS功能;需要获取光猫超级权限。
1.1 需要宽带拨号账号和密码
家庭宽带采用拨号上网,即PPPOE上网。通常宽带上门安装时,运营商工作人员会设置好光猫拨号上网,并提供用户名密码。如果不记得用户名密码,可拨打运营商热线电话询问。
1.2 确认宽带是否有公网IP
电信宽带往往会有动态公网IP(ipv4),而移动宽带通常没有动态公网IP,需要自己确认清楚。有一种方法可供确认:
1)查询家用网络对外IP地址:
IP地址查询
2)登录光猫查看WAN口IP地址:
以电信光猫为例,光猫背后往往有IP地址、账号、密码,如下图:
“光猫”铭牌
浏览器地址栏访问192.168.1.1,使用账号useradmin和密码登录,查询WAN口IP地址。
如果上述两个IP一致,表示家用宽使有公网IP。否则,可以尝试拨打运营商热线电话要求提供动态公网IP。
1.3 确认路由器DDNS功能
我使用的是小米AC2100,登录路由器管理地址选择“高级设置”会看到“DDNS”,这表示路由器具有DDNS(动态域名服务)功能。
小米路由器webUI
1.4 获取光猫的超级权限
光猫铭牌上的useradmin不是超级账号,telecomadmin才是超级账号,这里需要获得telecomadmin账号的密码。由于我的光猫年代久远(2015年),获取密码很简单,可以参考豆瓣文章《烽火HG261GS破解超级用户密码》。其他型号如果百度不到就求助万能的淘宝吧。
2 开始配置
2.1 配置光猫为桥接模式
浏览器登录光猫IP 192.168.1.1,输入超级账号telecomadmin,以及密码。
光猫webUI
进入“网络”——“宽带设置”——“Internet连接”,连接名称选择“4_INETERNET_B_VID_41”,连接类型选择“Bridge”,保存配置。注意,修改光猫配置会导致暂时断网。
光猫配置桥接模式
2.2 配置路由器PPOE上网
浏览器登录小米路由器管理IP地址(我已改为192.168.0.1),“常用设置”——“上网设置”,上网方式改为“PPPoE”,输入PPPoE拨号账号和密码,点击“应用”。
小米路由器webUI
路由器设置PPPoE上网
查看“上网信息”——“外网状态”出现“拨号成功”,即表示路由器拨号成功,网络已恢复。做到这一步,表示已完成了重要的一半。
路由器拨号成功
2.3 申请免费域名
我使用“公云(www.pubyun.com)”申请免费域名,注册登录后选择“动态域名”——“创建域名”,输入域名前缀,这里就填你想要的域名名字;仅勾选.f3322.net这个免费域名后缀。
pubyun申请免费域名
申请成功后通过“会员中心”可查看自己的域名:
pubyun会员中心
2.4 配置路由器DDNS
浏览器登录小米路由器管理IP地址(192.168.0.1),“常用设置”——“高级设置”——“DDNS”——“添加服务”。这里的“服务提供商”可以自由选择,因为我的免费域名是在“公云”申请的,因此选择“公云”。当状态显示“连接成功”,表示DDNS配置成功。
DDNS配置
DDNS配置成功
打开windows CMD输入”ping 域名”测试域名解析,如果ping通,表示域名解析已生效,否则可以点击“手动更新”。
域名解析测试
2.5 配置端口转发
浏览器登录小米路由器管理IP地址(192.168.0.1),“常用设置”——“高级设置”——“端口转发”——“添加规则”,配置你想暴露出去的【名称、协议、外部端口、内部IP地址、内部端口】,除了80和443端口不能用,其他端口都可以配置。以我的配置test为例,协议选择“TCP和UDP”,外部端口“8888”,内部IP地址为“windows本机IP”,内部端口“8888”。
端口转发配置
3 测试
3.1 启动windows本地测试服务
我用了nodejs的一个简单命令行http服务器http-server(需要安装nodejs,http-server库)做测试,服务器监听本地IP地址192.168.0.81的8888端口,如下所示:
启动测试程序http-server
浏览器输入http://192.168.0.81:8888测试http-server是否可访问,出现下面界面表示访问成功。
http-server访问测试
3.2 测试端口映射
浏览器输入“http://域名:8888”测试,出现下面界面表示端口映射成功!打开手机浏览器(关闭wifi,避免连上家里的局域网)访问“http://域名:8888”也能同样出现下面界面!这就是端口映射的魅力,即使不连接无线路由器,也能访问家里的服务。
端口映射测试
这是我搭建的nextcloud网盘界面,已经可以通过“域名:端口”的形式访问。
访问nextcloud
4 结语
尽管端口映射看起来很美好,但它仍然美中不足。最重要的一点是免费域名只能通过http访问,而不是https!http协议不会对数据进行加密,就好比你的数据在网络上传输是毫无防备的。