Как заставить имя хоста преобразовываться в локальный адрес вместо публичного адреса?

Как заставить имя хоста преобразовываться в локальный адрес вместо публичного адреса?

У меня в домашней сети есть сервер Linux, который использует динамический DNS, предоставляемый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-адрес. Вам нужно включить hairpin NAT (он же NAT loopback) на вашем маршрутизаторе (или получить маршрутизатор, который его поддерживает), чтобы ваш собственный публичный IP был доступен изнутри вашей сети. Это лучшее решение, если ваша сетевая инфраструктура может справиться/настроить его (все, что не потребительского уровня, должно легко это сделать).

Теперь, если вы все еще хотите использовать подход DNS, технический термин —DNS с разделенным горизонтом, где вы хотите получить другой ответ DNS на основе исходного адреса запроса. К сожалению, большинство динамических DNS-серверов не предлагают этого, и у вас нет необходимого уровня контроля. Таким образом, у вас есть две возможности:

  • Настройте собственный авторитетный DNS-сервер для вашего домена на общедоступном сервере (например, VPS) или
  • Настройте DNS-пересылку исключительно в пределах вашей локальной сети (подобно той, что встроена в большинство маршрутизаторов потребительского класса)

Второй подход, вероятно, больше вам подойдет, но он требует настройки DHCP-сервера (вероятно, на маршрутизаторе) для установки DNS-пересылки в качестве резолвера.

По сути:

  1. Установитьdnsmasq(метод зависит от ОС вашего сервера)
  2. Настройте DHCP так, чтобы он указывал на сервер dnsmasq в качестве вашего резолвера.
  3. Настройте сервер, на котором установлен dnsmasq, для внутреннего разрешения адреса, например:/etc/hosts на сервере

Такой подход означает:

  • Внешние клиенты получают публичный IP-адрес напрямую от провайдера динамического DNS.
  • Внутренние клиенты обращаются к dnsmasq
    • Если они запрашивают обычный публичный хост, они перенаправляются на вышестоящий сервер (например, DNS-сервер интернет-провайдера) как обычно.
    • Если они запрашивают один из внутренних хостов, которые вы настроили, они получают локальный ответ — это происходит только тогда, когда клиент находится в вашей локальной сети.

В качестве альтернативы вы можете использовать более полнофункциональный DNS-сервер (например, bind9), который изначально поддерживает функцию расщепления горизонта.

решение2

Вы можете добавить его в /etc/hostsфайл, но я бы предложил псевдоним, чтобы вы не испортили разрешение из-за пределов вашей сети. Так что-то вроде следующего в /etc/hosts:

#internal IP of server       #nickname
192.168.0.24                     hopto.local

Теперь hopto.localбудет определен локальный адрес сервера.

Для получения более подробной информации /etc/hostsознакомьтесь с этимстраница руководства

Удачи!

Связанный контент