外网访问方法

如下图,是我认为比较好的外网访问的方式。

本篇只介绍端口对端口的访问。

如果可以的话,尽量申请公网IP,这样速度最快。因为光猫无法做端口映射,开通公网IP的同时申请将光猫改成桥接模式。这样就能够将内网服务通过端口映射的方式暴露到外网。

如果没有公网IP的话,可以使用frp,frp需要你有一台云服务器作为跳板机,如果没有云服务器可以使用别人提供的免费frp服务。

如果对于安全性有要求的,也可以选择自建 VPN,通过 VPN 访问是非常安全的,连接后可以直接通过局域网IP进行访问。

使用公网IP访问

开通公网IP

如果你是电信用户,这里强烈推荐下载一个天翼生活APP,里面可以直接查询到宽带的账号密码,还能获取到负责你家那片宽带的安装师傅的电话。如果客服实在不给你开通公网 IP,可以试试找师傅开通。

如果你是移动、网通等用户,可以百度一下其他人的经验。

路由器拨号

光猫改为桥接之后,需要用路由器拨号,这里用我的路由器做展示。过程很简单,找到上网设置,然后只需填写账号密码,保存后等待拨号完成,就能上网了。

接下来需要设置 DHCP,一般路由器都是自动开启的。我的路由器修改了局域网 IP 就确定了局域网网段了,因为它的子网掩码固定为 255.255.255.0 不能改。我用 255.255.10.0 网段,地址池从 50 开始,前面 1-49 给固定 IP 的机器预留。

域名

IP 地址是一串无意义的数字,域名可以和 IP 地址绑定起来,这样我们只需要记住域名就行了。

你可以通过阿里云、华为云、腾讯云等云服务商购买域名,现在域名的后缀非常多,还出现了中文后缀,不过还是推荐购买英文后缀的域名,域名本身也用全英文,这样可以避免可能存在的不支持中文的问题。

不同的域名后缀代表了不同的含义,如 cn 代表中国的域名,com 代表公司的域名,但本质上都一样用,选一个价格能接受的、看得顺眼的就行,一般一个域名几十元一年。

注意:如果你使用域名在公网提供 WEB 服务,一定要先备案,每个云服务商都有备案的流程介绍,跟着流程走,一般10-20天能够完成备案。

购买好之后,添加一个空名称和泛域名的 A 记录, A 记录是直接指向 IP 的。如:购买的域名为 abc.com,则需要添加 abc.com 和 *.abc.com 的 A 记录。

DDNS

为什么要DDNS

家庭光猫每隔几天就会强制重新拨号,每次拨号之后获得的公网IP就会变化,所以个人用户申请的公网IP隔几天就会改变,我们称为动态公网IP。

动态公网 IP 是不推荐直接使用 IP 来访问家里的 NAS 的,因为说不定什么时候 IP 就变了,这时需要 DDNS 解决这个问题。

DNS(Domain Name Service)域名服务可以将域名解析为 IP,当 IP 改变时,只要域名绑定的 IP 也跟着变,那么就能用这个域名来访问家里的NAS。

DDNS(Dynamic DNS)动态域名服务可以实现这个功能,当然前提是我们需要有一个域名来使用。

使用ddns-go

你可以在我的网盘下载 ddns-go配置,然后通过 SMB 放到 TrueNAS 中,目录结果如下

使用 TrueNAS 的命令行,进入 ddns-go 文件夹,使用命令docker-compose up -d,启动容器。

部署完成后,通过 http://IP:9876 访问 ddns-go

选择你的域名提供商,获取密钥和密码之后,按图示填写

你也可以设置 ddns-go 的账号密码,并禁止从公网访问

设置好之后点击最下面的保存,注意查看右上角的日志。

端口映射

在路由器设置端口映射,外部端口就是在浏览器地址栏里,域名后面跟着端口,内部端口就是内网服务的端口,内部 IP 就是内网服务所在的 IP。如我的 TrueNAS IP 是 192.168.10.11,通过 80 端口访问控制台,通过下面的设置,我就能通过http://域名:2333 来访问我的 TrueNAS。

注意:以上只是做一个演示,不推荐直接暴露 NAS 的控制台到公网。

注意:家庭宽带一般都被运营商屏蔽了80、443等默认 web 端口。

可能遇到的问题

内网电脑无法通过公网 IP 访问内网服务

当你设置好了 DDNS 和端口映射之后,仍然无法通过 http://域名:端口 访问服务器,出现超时的错误

原因: 这是因为当你访问内网服务时,路由器直接把请求转发到了内网的服务器,而服务器返回结果给客户端时,客户端无法识别这就是你想要访问的那个。举个例子:你的公网IP是 58.214.212.159,端口 2333 映射到内网 192.168.10.11 的 80端口, 当你访问 http://58.214.156.212:2333 时,路由器发现这不就是自己吗,然后看到 2333 设置了端口映射, 就把请求转发给了内网服务器 192.168.10.11 的 80端口,服务器收到了客户端的请求,然后回复。但是客户端请求的是 58.214.156.212:2333,收到的回复是来自 192.168.10.11:80,那么客户端就觉得给 58.214.156.212 的请求超时了,192.168.10.11 的回复就扔了没有管。

如何解决:

  1. 换一个有防火墙功能的路由器,在经过防火墙之后,请求会从公网绕一圈回来,就不会有这个问题。我上一个华为的路由器没有出现这个问题,但是换了京东云路由就出现了这个问题。
  2. 自建 DNS,将域名指向内网的服务器 IP,我就是用的这个方法。