我的家庭网络上有一个 Linux 服务器,它使用由noip.com以及相应的主机名“xxxx.hopto.org”。从我的网络外部,比如在咖啡店,我可以使用此主机名 ping 或 SSH 进入我的服务器。但是,当我在本地网络上时,我无法使用该主机名 ping 或 SSH 进入我的服务器。运行host
显示我的服务器的主机名解析为其公共 IP,这与我的机器的公共 IP 相同:
MacBook-Air:~ user$ host xxxx.hopto.org
xxxx.hopto.org has address 47.6.24.149
MacBook-Air:~ user$ curl ipinfo.io/ip
47.6.24.149
我的背景实际上并不包括网络概念,但我可以看到针对该问题的两个潜在解决方案:
- 当我与服务器位于同一网络上时,强制将主机名解析为本地(静态)IP 地址。
- 以某种方式给我的服务器它自己的公共 IP 地址。
我该如何做其中之一(或两者)?还有其他更简单/更好的解决方案吗?谢谢你的帮助。
答案1
首先,正如 AFH 在评论中提到的,如果您只是想使用公共 IP 地址访问自己的服务,则可能根本不需要这样做。您需要在路由器上启用发夹 NAT(又称 NAT 环回)(或获取支持它的路由器),以便可以从网络内部访问您自己的公共 IP。如果您的网络基础设施可以处理/配置它(任何非消费级的东西都应该能够轻松做到这一点),这是最好的解决方案。
现在,如果你仍然想使用 DNS 方法,那么技术术语是水平分割 DNS,您希望根据请求的源地址获得不同的 DNS 响应。不幸的是,大多数动态 DNS 服务器不提供此功能,并且您没有必要的控制级别。因此,您最终会得到两种可能性:
- 在可公开访问的服务器(例如 VPS)上为您的域设置自定义权威 DNS 服务器,或者
- 仅在本地网络内设置 DNS 转发器(与大多数消费者路由器内置的 DNS 转发器非常相似)
第二种方法可能更适合您,但它确实要求您配置 DHCP 服务器(可能在您的路由器上)以将 DNS 转发器设置为解析器。
基本上:
- 安装域名系统(方法取决于您的服务器操作系统)
- 配置 DHCP 以指向 dnsmasq 服务器作为您的解析器
- 配置安装 dnsmasq 的服务器以内部解析地址,例如
/etc/hosts
在服务器上
这种方法意味着:
- 外部客户端直接从动态 DNS 提供商获取公共 IP
- 内部客户端访问 dnsmasq
- 如果他们请求的是普通的公共主机,他们会像往常一样被转发到上游服务器(例如 ISP DNS 服务器)
- 如果他们请求你配置的内部主机之一,他们会得到本地响应 - 这种情况仅当客户端位于你的本地网络内时才会发生
或者,您可以使用功能更齐全的 DNS 服务器(例如 bind9),该服务器可以本地执行水平分割。
答案2
您可以将其添加到/etc/hosts
文件中,但我建议您使用昵称,这样您就不会弄乱网络外部的解析。因此,如下所示/etc/hosts
:
#internal IP of server #nickname
192.168.0.24 hopto.local
现在hopto.local
将解析为服务器的本地地址。
有关更多信息,/etc/hosts
请查看手册页
祝你好运!