如何强制主机名解析为本地地址而不是公共地址?

如何强制主机名解析为本地地址而不是公共地址?

我的家庭网络上有一个 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

我的背景实际上并不包括网络概念,但我可以看到针对该问题的两个潜在解决方案:

  1. 当我与服务器位于同一网络上时,强制将主机名解析为本地(静态)IP 地址。
  2. 以某种方式给我的服务器它自己的公共 IP 地址。

我该如何做其中之一(或两者)?还有其他更简单/更好的解决方案吗?谢谢你的帮助。

答案1

首先,正如 AFH 在评论中提到的,如果您只是想使用公共 IP 地址访问自己的服务,则可能根本不需要这样做。您需要在路由器上启用发夹 NAT(又称 NAT 环回)(或获取支持它的路由器),以便可以从网络内部访问您自己的公共 IP。如果您的网络基础设施可以处理/配置它(任何非消费级的东西都应该能够轻松做到这一点),这是最好的解决方案。

现在,如果你仍然想使用 DNS 方法,那么技术术语是水平分割 DNS,您希望根据请求的源地址获得不同的 DNS 响应。不幸的是,大多数动态 DNS 服务器不提供此功能,并且您没有必要的控制级别。因此,您最终会得到两种可能性:

  • 在可公开访问的服务器(例如 VPS)上为您的域设置自定义权威 DNS 服务器,或者
  • 仅在本地网络内设置 DNS 转发器(与大多数消费者路由器内置的 DNS 转发器非常相似)

第二种方法可能更适合您,但它确实要求您配置 DHCP 服务器(可能在您的路由器上)以将 DNS 转发器设置为解析器。

基本上:

  1. 安装域名系统(方法取决于您的服务器操作系统)
  2. 配置 DHCP 以指向 dnsmasq 服务器作为您的解析器
  3. 配置安装 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请查看手册页

祝你好运!

相关内容