
У меня есть SSH-сервер, работающий в моей локальной сети, которая открыта для публичного интернета через переадресацию портов моего маршрутизатора. Я также настроил имя для хоста локально на моей машине (через etc/hosts
) и удаленно (через динамический DNS), скажем:
ip name
locally 192.168.0.5 myhost
remotely 11.22.33.44 myhost.example.com
Из своей локальной сети я могу получить доступ к серверу через ssh 192.168.0.5
/ ssh myhost
, а извне своей сети я могу получить к нему доступ через ssh 11.22.33.44
/ ssh myhost.example.com
.
До этого момента все работало нормально. Однако использование двух разных имен хостов для одного сервера немного обременительно. Я хотел бы получить доступ к серверу вединый путь, т. е. использование только одного IP-адреса/имени хоста, которое работает как локально, так и удаленно.
Есть ли простое решение этой проблемы? У меня macOS, если это имеет значение.
Кстати: я не могу получить доступ к своему маршрутизатору из локальной сети, используя его публичный IP-адрес.
решение1
Поскольку у вас настроен динамический DNS, вам не нужно вносить изменения в файл /etc/hosts.
Для внешнего доступа вы будете использовать DNS для преобразования хоста в IP-адрес, и то же самое вам нужно для локальной сети.
Большинство маршрутизаторов поддерживают DNS-инъекцию. Вам нужно проверить конфигурацию маршрутизатора и назначить IP-адрес 192.168.0.5, чтобы он соответствовал тому же динамическому имени хоста DNS, как если бы он был из внешней сети. Затем, когда вы находитесь во внутренней сети и используете маршрутизатор в качестве DNS-сервера, маршрутизатор преобразует myhost.example.com в локальный адрес. А когда вы выходите и пытаетесь получить внешний доступ, то динамический DNS в свою очередь преобразует его во внешний IP.
Если у вас возникли проблемы с настройкой маршрутизатора, укажите марку и модель, чтобы мы могли проверить, поддерживает ли он требуемые настройки.
решение2
Если у вас нет возможности настроить DNS, вы можете поиграть в некоторые игры с конфигурацией SSH на вашем компьютере, сделать что-то подобное. Сначала вам понадобится способ определить, находитесь ли вы в своем «домашнем» или нет. В зависимости от того, куда вы идете и как вы подключаетесь, это может быть проще всего сделать, опросив ваш SSID Wi-Fi, но BSSID или сетевые конфигурации могут быть более надежными/возможными для вас. Вот пример:
MY_SSID="local ssid name"
ssid=`/System/Library/PrivateFrameworks/Apple80211.framework/Resources/airport -I | grep " SSID" | cut -d " " -f 2-`
if [ "$ssid" == "$MY_SSID" ]
then
exit 0
else
exit 1
fi
Назовите это "at_home" и поместите в свой путь. Затем, предполагая, myserver
что нормально разрешается внешний адрес, добавьте в свой config
файл ssh строфу, похожую на эту, чтобы переопределить внутренний адрес:
Match host myserver exec at_home
Hostname myserver.localname # or "local IP"