Networking

Адрес сервера

Адрес сервера — то, что нужно клиенту для подключения: имя или IP, номер порта и протокол, по которому идёт обмен.

Что такое Адрес сервера

Адрес сервера — набор данных, по которым клиент находит сервис и подключается к нему. В обиходе так называют что угодно: и IP-адрес, и домен, и строку из панели хостинга. На деле полный адрес почти всегда состоит из трёх частей.

      https :// db.example.com : 5432
        │           │              │
    протокол      хост          порт
   как говорить  куда идти   к какой программе
  • ХостFQDN или IP-адрес: какая машина.
  • Порт — какое приложение на ней. Часто не пишут, потому что у протокола есть значение по умолчанию: 443 для HTTPS, 22 для SSH, 5432 для PostgreSQL.
  • Протокол — на каком языке разговаривать. Без него хост и порт бесполезны: на 443 порту может быть и HTTPS, и что угодно ещё.

Имя или IP — вопрос не вкуса: адрес меняется при переезде и пересоздании сервера, имя остаётся. Поэтому в конфигах, строках подключения и мониторинге пишут FQDN, а IP оставляют для случаев, где DNS ещё не работает.

Где вы его встретите

Форма записи меняется, суть — нет:

# SSH: пользователь, хост, порт
ssh -p 2222 deploy@server1.example.com

# строка подключения к БД
postgresql://app_user:пароль@db.example.com:5432/production

# IPv6 — хост в квадратных скобках, иначе двоеточия не разобрать
ssh admin@[2001:db8::1]
curl "http://[2001:db8::1]:8080/health"

# и совсем другой вид адреса — путь к unix-сокету
psql "host=/var/run/postgresql dbname=production"

Последняя строка — важная деталь. Если клиент и сервер на одной машине, сети может не быть вовсе: unix-сокет быстрее TCP и не выставляет ничего наружу.

Локальные адреса, которые путают чаще всего

Адрес Что означает
127.0.0.1, localhost эта же машина, снаружи недоступно
0.0.0.0 слушать на всех интерфейсах
::1 localhost в IPv6
169.254.169.254 метаданные инстанса в облаке

Разница между 127.0.0.1 и 0.0.0.0 в конфиге — граница между «доступно только локально» и «открыто всей сети». Классическая ошибка в двух направлениях: сервис слушает 127.0.0.1, а к нему стучатся снаружи и получают отказ; или наоборот — база подняли на 0.0.0.0, и она оказалась в интернете.

В контейнере localhost — это сам контейнер, а не хост и не соседний сервис. Внутри Docker Compose адресом служит имя сервиса: postgres:5432, а не 127.0.0.1:5432.

Как проверить адрес

Разбор идёт по частям — так вы сразу поймёте, где сломалось:

$ dig +short db.example.com          # 1. имя резолвится?
10.0.0.20
$ ping -c1 10.0.0.20                 # 2. хост доступен?
$ nc -zv db.example.com 5432         # 3. порт открыт?
Connection to db.example.com 5432 port [tcp/postgresql] succeeded!
$ curl -v https://api.example.com/health   # 4. отвечает ли приложение

Резолвится, но порт закрыт — вопрос к файрволу или к тому, на каком интерфейсе слушает сервис. Не резолвится — вопрос к DNS, и до сервера дело ещё не дошло.

Что стоит помнить

  • Адрес приложения и адрес сервера — разные вещи. За одним example.com:443 может стоять балансировщик и десяток машин; клиент видит один адрес, серверов физически много.
  • Учётные данные — не часть адреса. Пароль в строке подключения попадает в историю bash, в логи и в git. Выносите его в переменные окружения.
  • Внутренние адреса не должны быть публичными. База адресуется приватным IP внутри VPC, наружу торчит только веб.

Связанные термины

Готовы запустить GPU-задачу?

Запустить GPU-сервер