Как я уже рассказывал, у меня на домашнем сервере крутится с десяток 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 адреса, на мой взгляд, подходят как нельзя лучше. В следующий раз мы как раз и поговорим о том, как обеспечить доступ к своим сервисам через интернет, извне локальной сети.


  1. На самом деле, этот алгоритм работает не всегда. У меня есть один роутер от компании Mikrotik, DHCP сервер которого начинает раздавать адреса с конца разрешенного диапазона (по крайней мере, по умолчанию) ↩︎