公网 IP 结合 DDNS 以及 VPN Server 方式访问家庭内网

前提

  • 宽带具有公网 IP
  • 路由具有 DDNS 功能,比如软路由中就有 DDNS 服务
  • 确保家中的网络只有一层 NAT,效果就是家中联网设备都在一个网段。要想实现这样的效果,光猫改成桥接模式(不拨号),主路由拨号并开启 DHCP,其他路由设备改成桥接。

步骤

购买域名

购买一个域名:

  • namesilo
  • namecheap

CloudFlare 管理域名的 DNS

CF 网站配置域名解析:

  • 点击添加站点,输入购买的域名,比如 michael.com
  • 选择免费的计划
  • 添加记录:
    • 类型选择:A
    • 名称输入:www
    • IPV4 地址:1.1.1.1

类型的区别:

  • A记录: 将域名指向一个IPv4地址(例如:100.100.100.100),需要增加A记录
  • CNAME记录: 如果将域名指向一个域名,实现与被指向域名相同的访问效果,需要增加CNAME记录。这个域名一般是主机服务商提供的一个域名
  • MX记录: 建立电子邮箱服务,将指向邮件服务器地址,需要设置MX记录。建立邮箱时,一般会根据邮箱服务商提供的MX记录填写此记录
  • NS记录: 域名解析服务器记录,如果要将子域名指定某个域名服务器来解析,需要设置NS记录
  • TXT记录: 可任意填写,可为空。一般做一些验证记录时会使用此项,如:做SPF(反垃圾邮件)记录
  • AAAA记录: 将主机名(或域名)指向一个IPv6地址(例如:ff03:0:0:0:0:0:0:c1),需要添加AAAA记录
  • SRV记录: 添加服务记录服务器服务记录时会添加此项,SRV记录了哪台计算机提供了哪个服务。格式为:服务的名字.协议的类型(例如:_example-server._tcp)。
  • SOA记录: SOA叫做起始授权机构记录,NS用于标识多台域名解析服务器,SOA记录用于在众多NS记录中那一台是主服务器

保存以后点击继续,会看到如下截图:

Yt4i9l

更改名称服务器

这一步的过程主要就是将域名购买商那里的 nameservers 地址修改为 CF 提供的地址。

回到域名网站 namecheap,删除指定的名称服务器,添加 CloudFlare 名称服务器,保存更改。

nameservers

如果是 namesilo 购买的域名,需要如下图方式进行修改 nameservers:

ompP8N

检查通过后,CF 网站上添加的那条记录的云朵点灭,保存:

设置

获取 CF 密钥

点击 api token 获取Global API Key,注意别谢露,复制保存好。

global api key

设置 DDNS

动态DNS 允许为拥有动态 IP 的主机配置一个固定的可访问域名。

进入软路由中:服务》动态 DNS》》基本设置:
OqK2bo

我的软路由在家庭网络里是旁路由,这里还做了一个高级设置:
TTzAfA

启动:
cF5ea4

这时候回到 CF 网站查看之前添加的记录,可以发现能够获取到公网 IP 了:
oTIw9r

设置端口转发

网络》防火墙》端口转发

rAxgKW

接下来就可以在外网使用 www.michael.com:8888 访问家里的 xxx.xxx.xxx.xxx:5000 端口了。

以上是互联网上大部分教程提供的设置指导,但是我使用以后,在家连上 WiFi 是可以的,但是关闭 WiFi 以后,域名访问的方式就是失效的。

这是为啥呢?

经过思考可以知道,网络调用是一个链路,我手机 WiFi 中的网关是设置的旁路由的 IP,经过域名进来主路由之后,会去经过旁路由,然后旁路由上配置了上面的端口转发,那么,就最终找到目标设备了。

而当关闭 WiFi 模拟在外场景时,经过域名进来主路由之后,由于我的旁路由模式是非侵入式的,在主路由的 DHCP 那边没有将网关指向旁路由,因此,通过域名:端口号的方式,这时候主路由并不知道去局域网内部的哪个 IP 找对应的什么端口。

分析到这里解决这个问题就迎刃而解了。在我主路由端设置一下端口转发即可实现目标,最终验证 OK!也就是说,我这种非侵入式的旁路由方式,在旁路由的 OpenWrt 系统里,就没必要设置端口转发了!

注意:前往记得设置好端口转发以后,点击下面的保存并生效。小米路由器的这里,你添加好规则以后,如果不点击保存并生效的话,你下次打开依然是有你之前填写的数据的,尽管未生效。

iZAF24

后来为了在 NAS 里面下载docker镜像,我将 NAS 中的网关地址改为软路由IP以后,发现外网是无法通过公网IP+端口号或者域名+端口号的方式来访问家里 NAS 里的服务的。这是因为网关指向软路由以后,好像会被软路由的防火墙规则拦截。具体没深入研究,多亏了v2ex的帖子里的回复想起来做了这个改动。

nas 设置反向代理

为了尽量避免对外的开放端口被特定扫描,并没有直接将部署的服务的端口映射为对外的端口,而是做了改变,借助了 nas 里的登录门户>高级>反向代理服务器,设置了域名和内网 IP 的映射:

URL 转发

如果想给常用的设备定义一个简单易记的域名,可以使用 CF 提供的 URL 转发功能。

0GlO2Z

创建页面规则:
0WIawk

DNS 解析新增一条记录:
xZeTUl

URL 转发并不是立刻生效,需要等一段时间再尝试。

总结

经过上面的设置和理解以后,基本上你已经可以通过域名+端口号的方式访问到家中 NAS 搭建的响应服务了,比如 Alist。但是,有一些服务比如 Bitwarden 搭建以后,需要开启 HTTPS 你才可以访问,这时候,又需要进一步折腾开启 HTTPS 了,可以阅读我另一篇总结:群晖 NAS 开启 HTTPS 访问协议,提升安全性

FAQ

怎么知道宽带是否是公网 IP 呢?

  1. 以小米路由器为例,我进入路由器后台查看:常用设置 > 上网设置,获取 IP 地址。此外,在小米 Wi-Fi app 里 > 工具箱 > 路由设置 > 网络设置 > 上网模式设置,也是可以看到家庭网络IP地址的。
  2. 访问 IP,查看我互联网 IP 地址

    二者如果一致,则说明我此时宽带已经是公网 IP。

    参考

文章:

  • youtube/如何随时随地访问家中的软路由和其他设备?远程访问端口转发保姆级教程丨CloudFlare设置动态DNS 域名解析 URL转发
Michael翔 wechat
ヾノ≧∀≦)o 欢迎订阅公众号「Coder魔法院」☑工具控 ☑编程 ☑读书☑电影
「🤓 码字不易,来杯Coffee👇」