TECH / Серверы и сайты 5 мин чтения

Настройка доступа к PostgreSQL по сети в Linux Gentoo: pg_hba.conf и postgresql.conf

Antonio Автор NEMCD
Опубликовано 08.01.2013 · Обновлено 13.11.2026 · 5 мин

На заметку. Однажды я открывал доступ по сети к базе PostgreSQL, которая работала на терминале официантов под управлением Linux Gentoo. Всё настроил и забыл, а когда позже пришлось снова лезть в конфигурацию – пришлось вспоминать и заново искать, где лежит нужный файл и как выглядят правила.

PostgreSQL LogoPostgreSQL: настройка доступа по локальной сети

За разрешение или запрет клиентских подключений отвечает файл pg_hba.conf, а за прослушивание сетевых интерфейсов – параметр listen_addresses в postgresql.conf. Ниже разобрано, где найти эти файлы в Gentoo, как работает каждая колонка правил доступа и как перечитать конфигурацию без обрыва текущих соединений.

Где находится pg_hba.conf в Linux Gentoo

В классической установке Gentoo конфигурационный файл обычно лежит в каталоге данных PostgreSQL по пути /var/lib/postgresql/data/pg_hba.conf.

Если же на сервере используется слотированная установка (несколько версий PostgreSQL), конфигурация чаще выносится в каталог /etc/postgresql-<версия>/pg_hba.conf или /var/lib/postgresql/<версия>/data/pg_hba.conf. Чтобы не искать файл вручную по всему диску, точный путь проще всего спросить у самого сервера через psql:

SHOW hba_file;
SHOW config_file;

Первая команда выведет актуальный путь к pg_hba.conf, вторая – к основному конфигу postgresql.conf.

Синтаксис правил в pg_hba.conf

pg_hba.conf linux confСтруктура правил авторизации в pg_hba.conf

Каждая активная строка в pg_hba.conf описывает одно правило авторизации и состоит из пяти полей (для локальных Unix-сокетов поле адреса опускается):

# TYPE  DATABASE  USER  ADDRESS         METHOD

В старых выпусках PostgreSQL четвёртая колонка называлась CIDR-ADDRESS, в более новых – ADDRESS, но формат записи остался прежним.

  • TYPE – тип подключения: local для Unix-сокета на самом сервере, host для TCP/IP (обычных и с шифрованием), hostssl только для SSL/TLS и hostnossl только для подключений без шифрования.
  • DATABASE – база данных, к которой применяется правило: all (любая база), конкретное имя (например, pos_db) или список имён через запятую.
  • USER – роль (пользователь) PostgreSQL: all, конкретное имя вроде waiter или группа ролей с префиксом +.
  • ADDRESS / CIDR – IP-адрес или подсеть клиента для правил host. Один IPv4-хост задаётся с маской /32 (например, 192.168.0.1/32), вся локальная подсеть – с маской /24 (192.168.0.0/24). Для IPv6 используется формат вроде ::1/128.
  • METHOD – способ аутентификации клиента при подключении.

Выбор метода: trust, md5 или scram-sha-256

От выбранного метода зависит, потребуется ли пароль и насколько безопасно будет соединение:

  • trust – разрешает подключение без пароля любому клиенту, который попал под маску. В примере с терминалом официантов trust допустим только для localhost (127.0.0.1/32) или одного доверенного адреса в изолированной сети (192.168.0.1/32). Ставить trust на целую подсеть опасно: любой хост сможет войти под суперпользователем postgres без пароля.
  • md5 – классическая проверка пароля по схеме challenge-response с MD5-хешем. Подходит для совместимости со старыми версиями PostgreSQL и унаследованным софтом.
  • scram-sha-256 – современный и стойкий метод парольной аутентификации (появился в PostgreSQL 10 и используется по умолчанию в новых версиях). Если и сервер, и клиент его поддерживают, стоит указывать именно его.
  • reject – явный отказ в доступе; удобно ставить перед широким разрешающим правилом, чтобы закрыть конкретный адрес.

Пример рабочей конфигурации, где локальные подключения и один терминал ходят без пароля, а вся остальная подсеть 192.168.0.0/24 авторизуется по паролю к нужной базе:

# TYPE  DATABASE  USER    ADDRESS           METHOD
local   all       all                       trust
host    all       all     127.0.0.1/32      trust
host    all       all     192.168.0.1/32    trust
host    pos_db    waiter  192.168.0.0/24    scram-sha-256

Порядок строк важен: PostgreSQL просматривает pg_hba.conf сверху вниз и останавливается на первом совпавшем правиле. Если выше стоит общее правило для всей подсети (192.168.0.0/24) с reject или md5, то более узкое правило ниже для 192.168.0.1/32 уже не сработает. Если пароль по совпавшему правилу не подошёл, к следующим строкам сервер тоже не переходит.

Настройка listen_addresses в postgresql.conf

Даже при идеально прописанном pg_hba.conf удалённый клиент получит ошибку Connection refused, если сам PostgreSQL слушает только локальную петлю. По умолчанию в postgresql.conf задано значение listen_addresses = 'localhost'.

Чтобы принимать подключения по локальной сети, откройте postgresql.conf и укажите либо все доступные интерфейсы:

listen_addresses = '*'

либо перечислите только нужные адреса (например, localhost и локальный IP сервера, чтобы порт 5432 не светился наружу на внешнем интерфейсе):

listen_addresses = 'localhost, 192.168.0.10'

Также убедитесь, что локальный файрвол (iptables или nftables) пропускает входящие TCP-пакеты на порт 5432 из вашей подсети. Проверить, на каких адресах реально слушает PostgreSQL, можно командой:

ss -tlnp | grep 5432

Перезагрузка конфигурации без остановки базы

После правки одного только pg_hba.conf перезапускать сервер не нужно – достаточно перечитать конфигурацию на лету, чтобы не оборвать активные сессии терминалов.

В Gentoo с классическим init-скриптом это делается так:

/etc/init.d/postgresql reload

Если используете обёртку OpenRC или слотированный сервис (например, с указанием версии):

rc-service postgresql reload

Универсальный способ, который работает в любом дистрибутиве Linux прямо из консоли psql – вызвать SQL-функцию перезагрузки:

SELECT pg_reload_conf();

А вот если вы меняли параметр listen_addresses (или port) в postgresql.conf, одного reload недостаточно – здесь потребуется полный перезапуск сервиса:

rc-service postgresql restart

P.S. Записал всё в одном месте, потому что когда-то настроил один раз и забыл, а потом пришлось по крупицам вспоминать расположение файла и формат строк. Если после reload клиент всё равно не подключается, загляните в лог PostgreSQL – там сразу видно, какое именно правило из pg_hba.conf сработало или отклонило вход.

Ещё похожие заметки:

Оставить комментарий