Как организовать доступ к self-hosted сервисам в локальной сети
Как я уже рассказывал, у меня на домашнем сервере крутится с десяток self-hosted сервисов. Все они, так или иначе, предоставляют пользователю web-интерфейс, который позволяет взаимодействовать с сервисом, настраивать его и управлять им. Проще говоря, для того, чтобы воспользоваться услугами какого-либо из этих сервисов, я (пользователь) должен открыть браузер и указать адрес сервиса (в адресной строке), в ответ на что на закладке браузера отобразится (ну, или, скажем так: должен отобразиться) пользовательский интерфейс сервиса, и я (пользователь) смогу через этот интерфейс с этим самым сервисом взаимодействовать.
То есть, развернуть сервис - это круто, но мало. Если есть желание его использовать, надо уметь к нему обратиться, а для этого надо знать, какой адрес нужно вбить в адресной строке браузера для подключения к пользовательскому интерфейсу сервиса.
Когда вы находитесь внутри локальной сети, которой принадлежит компьютер, на котором работает self-hosted сервис, для обращения к нему вам, зачастую, нужно знать IP
адрес этого компьютера (впредь, будем называть этот компьютер, для краткости, домашним сервером), ну и, иногда, номер порта, на котором сервис отлавливает запросы, обращенные к нему. Если вы не укажете номер порта, то, в зависимости от используемого протокола (http
или https
) для отправки запросов будет использоваться порт 80
(http
) или 443
(https
) нужного сервера. Адресная строка будет иметь примерно такой вид:
http://192.168.1.10
Если же настройки вашего сервиса таковы, что он "слушает" на другом порту, например, на 8080
, то, кроме IP
адреса, придется явно указать и номер порта. Примерно, так:
http://192.168.1.10:8080
Но возникает логичный вопрос: а что это за цифры такие (192.168.1.10
)? Ну, то, что это и есть тот самый IP
адрес, это понятно, но почему он такой, а не другой, и откуда можно узнать эти цифры? Вообще, это очень интересный вопрос, и ответ на него можно растянуть на несколько академических часов или, даже, на целый семестр - все зависит от глубины погружения в материал. Но мы же практики (сейчас), а не теоретики. Поэтому, нам подавай ответ сразу, и чтобы без всяких недомолвок.
Но совсем без теории обойтись не получится. И первый факт, который надо пояснить: раз у вас есть локальная домашняя сеть, то, скорее всего, у вас есть устройство, которое подключено к вашему провайдеру интернета (как правило, сетевым или телефонным шнуром), с одной стороны, а с другой стороны, к нему подключаются все ваши домашние потребители интернета: компьютеры, планшеты, телефоны и т.д., в том числе, и ваш домашний сервер. Подключение может производится, например, при помощи все того же сетевого кабеля (речь, конечно же, о витой паре, а не проводе питания, хотя, и провод питания тоже может быть сетевой средой) или по WiFi
.
Это устройство, роутер, как правило, довольно умное и умеет делать много разных вещей. Одна из таких вещей - автоматически раздавать IP
адреса устройствам, которые к нему подключаются. То есть, любой ваш домашний компьютер, включая сервер, телефон или планшет, подключаясь к роутеру, получает определенный IP
адрес. Так как сам роутер с одной стороны подключен к вашему провайдеру, а с другой стороны - к вашей локальной сети, то ему, как минимум, бывает присвоено два IP
адреса: один адрес назначает ему ваш провайдер, второй, для локальной сети - назначаете ему вы, обычно, во время его установки. Чаще всего, это адрес вида 192.168.0.1
, 192.168.1.1
или 10.0.0.1
(но может быть и другим). Когда роутер раздает подключающимся устройствам IP
адреса, то он раздает их из того диапазона, которому принадлежит сам, то есть, например, 192.168.0.5
, 192.168.1.5
или 10.0.0.5
. Надо сказать, что чем раньше подключится устройство, тем более "младший" адрес оно получит - принцип "кто раньше встал, того и тапки" довольно универсален[1].
Сделаю, все-таки, небольшое отступление касательно моего утверждения: "автоматически раздавать IP
адреса устройствам". Да, роутер это умеет делать, но только в том случае, когда в нем реализована и, что не менее важно, активирована функция DHCP
сервера. Вот как эта настройка выглядит на моем роутере:
Видно, что сервер включен и каким-то образом настроен. Почему я делаю это отступление? Дело в том, что так может быть не всегда. Могут быть использованы другие решения и в качестве DHCP
сервера может выступать не роутер, а какое-то другое устройство. Тогда правильно будет отключить DHCP
сервер роутера, чтобы в локальной сети не было бы конфликтов. Однако, в большинстве случаев, в домашней локальной сети в качестве DHCP
сервера выступает, все-таки, роутер.
И еще немного про диапазон выделяемых DHCP
сервером роутера IP
адресов. Во многих роутерах есть такая настройка:
Поле IP адрес
позволяет указать IP
адрес роутера (той его части, которая "смотрит" в локальную сеть), и именно этот адрес затем используется DHCP
сервером в качестве основы при назначении адресов подключающимся устройствам. Маска подсети позволяет задать границы подсети, обычно она равна 255.255.255.0
, что означает,что в подсеть может входить только 254 устройства (адрес xxx.xxx.xxx.0
обычно называют адресом подсети и не назначают никакому устройству, а адрес xxx.xxx.xxx.255
называется широковещательным адресом подсети и его тоже не рекомендуют назначать конкретным устройствам), и, соответственно, DHCP
сервер будет обслуживать только их. То есть, если указать адрес 10.0.0.1
, то DHCP
сервер роутера будет присваивать адреса из диапазона 10.0.0.2
- 10.0.0.254
, а если, например, указать 172.30.10.1
, то будут выдаваться адреса из диапазона 172.30.10.2
- 172.30.10.254
(на самом деле, некоторые роутеры позволяют ограничить диапазон, и на первом русунке можно увидеть специальные поля для этого: Начальный адрес пула IP-адресов
и Конечный адрес пула IP-адресов
). Может возникнуть логичный вопрос: а какой адрес можно в принципе задать для роутера, неужели, абсолютно любой? И ответ: конечно же нет! Есть определенные рекомендации и я советую им следовать в обязательном порядке. На самом деле, любой роутер уже имеет назначенный адрес, что называется, из коробки. Захотите ли вы его изменить - исключительно вопрос ваших предпочтений.
Хорошо, с назначением IP
адресов мы разобрались, но тут же возникает следующий вопрос: если DHCP
сервер роутера раздает IP
адреса по мере подключения устройств, то вполне возможна ситуация, что сегодня устройство (ваш домашний сервер) получило один адрес, а завтра получит другой! И что же делать? К счастью, вы не первый (и не последний), у кого данный вопрос возник. Решений, на самом деле, может быть предложено несколько, но мы, для начала, ограничимся самым, пожалуй, распространенным.
И действительно, первое, что приходит на ум - использовать статические IP
адреса. Чуть выше мы говорили оDHCP
сервере, который назначает адреса устройствам автоматически и (с определенной натяжкой) случайным образом. Как результат, IP
адрес устройства может меняться. То есть, при использовании DHCP
сервера мы имеем дело с динамическими IP
адресами. Однако, есть механизмы, которые позволяют подключающемуся устройству отказаться от услуг DHCP
сервера.
Возмем, например, компьютер под управлением Windows
. В Панели управления
, в настройках Сетевых Подключений
, можно выбрать любой установленный в компютере сетевой адаптер (обычно, это либо беспроводной адаптер (для сетей WiFi
), либо обычный сетевой адаптер) и настроить для него параметры протокола TCP/IP
(в нашем случае, версии 4):
Как видно на рисунке, переключатель изначально находится в положении Получить IP-адрес автоматически
. По сути, эта настройка предполагает получение адреса от DHCP
сервера. Но мы хотим зафиксировать за данным устройством конкретный адрес, который бы никогда не менялся. Для этого мы должны переключиться в режим, в котором получим возможность задания IP
адреса вручную, или, иначе говоря, перевести переключатель в положение Использовать следующий IP-адрес:
:
На приведенной выше картинке все необходимые данные уже указаны, а именно, указано, что данный интерфейс будет иметь статический IP
адрес 192.168.0.12
, укзана также маска подсети (255.255.255.0
) и IP
адрес основного шлюза 192.168.0.1
(это, на самом деле, IP
адрес нашего роутера).
Напомню, что маска подсети определяет границы подсети и максимально возможное количество хостов (устройств) в ней. Хосты, расположенные в одной подсети (получившие адреса, попадающие в задаваемый диапазон) общаются друг с другом напрямую, без помощи всевозможных устройств, в частности, роутеров. Основной же шлюз - тот самый маршрутизатор (роутер), который используется, когда необходимо связать хосты из разных подсетей, и это, как правило, и есть наш домашний роутер, выводящий нас в интернет. Основному шлюзу, обычно, назначают первый IP
адрес подсети. (Вот неплохая статья про сетевую адресацию, в качестве ликбеза, для общего, так сказать, развития).
Если в качестве домашнего сервера вы выбрали компьютер с Linux
на борту, то с настройкой статического IP
адреса тоже нет никаких проблем. Абстрагируемся от всевозможных графических оболочек, коих большое и разнообразное количество. Раз Linux
- только командная строка, только хардкор 😉.
В каталоге /etc/network
есть файл interfaces
. Именно в нем задаются настройки различных сетевых интерфейсов. Для редактирования этого файла нужны определенные права, я, например, работаю из под root
-а. Вот содержимое этого файла, определяющего статический адрес для сетевого проводного интерфейса:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.1.11
netmask 255.255.255.0
broadcast 192.168.1.255
network 192.168.1.0
gateway 192.168.1.1
dns-nameservers 192.168.1.1 8.8.4.4
Как видите, ничего сложного. Для интерфейса eth0
задается статический IP
адрес 192.68.1.11
. Заданы значения и для маски и для основного шлюза, есть даже адреса подсети (192.168.1.0
) и широковещательный адрес (192.168.1.255
). Единственное что, если вы сделали изменения в этом файле, не забудте перезапустить сетевую службу:
/etc/init.d/networking restart
Продолжим. Чуть раньше мы настроили компьютер на использование статического IP
адреса. Но... В нашей сети все остальные устройства продолжают используют динамические IP
адреса, получаемые от DHCP
сервера. Может ли случиться так, что DHCP
сервер выдаст адрес, который мы указали в качестве статического для своего компьютера, какому-то другому устройству? Если исходить из чистой теории, то надо отметить, что все задумано так, что такого быть не должно. Но вот незадача - в реальной жизни не всегда все сходится с теорией. Поэтому ответ на заданный вопрос, к сожалению, звучит так: да, может. Когда это может случиться и как - не угадаешь и не предскажешь, может, и никогда. Но вероятность такая существует.
К счастью, DHCP
серверы, обычно, обладают довольно широким набором настроек. И некоторые позволяют указывать в своих настройках, какие адреса не должны выдаваться устройствам. То есть, вы назначаете своему домашнему серверу статический адрес и исключаете возможность выдачи этого адреса DHCP
сервером, после чего никаких коллизий возникать не должно. Другие, наоборот, позволяют привязать к определенному устройству (задается при помощи MAC
адреса) конкретный IP
адрес. Лично мне такой функционал нравится больше, так как на устройстве в этом случае не надо настраивать статический IP
адрес. Устройство по прежнему обращается за получением адреса к DHCP
серверу, а тот уже, используя информацию из своей настройки и MAC
адрес обратившегося устройства, выделяет нужный IP
. Третьи позволяют указать диапазон (диапазоны) IP
адресов, которые могут выделяться клиентам. Если вы укажете на устройстве статический IP
, который не попадает в этот диапазон, то накладки исключены. Иногда можно встретить и различные комбинации из приведенных вариантов настроек. Какой именно поддерживает DHCP
сервер, используемый в вашей локальной сети - вам, увы, придется выяснять самим.
На самом деле, описанный выше способ назначения статического IP
адреса для своего домашнего сервера является не единственной, но, вероятно, наиболее часто используемой возможностью обеспечить доступ к своим сервисам, развернутым на этом сервере. Есть ли альтернативы? Конечно. Можно, например, попробовать настроить доступ по имени компьютера. Обычно предполагается, что такой доступ должен работать и без всяких дополнительных настроек. И, надо сказать, он так и работает. Но если вы спросите меня, почему я предпочитаю использовать статические IP
адреса (а я действительно предпочитаю именно этот метод), то я отвечу вот что: сколько раз я не пробовал опереться на доступ по имени компьютера, всякий раз мне приходилось рано или позно переключаться на использование статических IP
адресов. Почему? Я не знаю ответа на этот вопрос, если исходить из своих знаний теории. А вот если исходить из практики... Например, доступ по имени хоста вдруг, без какой-либо видимой причины и логики, перестает работать, потом, также вдруг, работоспособность восстанавливается, и снова все падает спустя какое-то время. Или же вдруг резко падает скорость нахождения нужного хоста. Потом все возвращается на круги своя, но проходит какое-то время и замедление может неожиданно повториться вновь.
Возможно, я просто "не умею их готовить". Но, если честно, я не совсем уверен, что нужно учиться. Нет, учиться, конечно же, нужно. Только вот, доступ из локальной сети к своим сервисам это, конечно, хорошо, но настоящей то целью является доступ к сервисам из любого места, в том числе и из-за пределов локальной сети. И, для решения этой задачи, статические IP
адреса, на мой взгляд, подходят как нельзя лучше. В следующий раз мы как раз и поговорим о том, как обеспечить доступ к своим сервисам через интернет, извне локальной сети.
На самом деле, этот алгоритм работает не всегда. У меня есть один роутер от компании Mikrotik, DHCP сервер которого начинает раздавать адреса с конца разрешенного диапазона (по крайней мере, по умолчанию) ↩︎