Действительно ли listen_addresses может быть установлен в список?

32

У меня есть виртуальная машина с IP-адресом 192.168.0.192 под управлением PostgreSQL.

Если я укажу

listen_addresses = '*'

тогда я могу подключиться с другой виртуальной машины на 192.168.0.191 и с локального хоста.

Но я не могу использовать список, чтобы указать postgreSQL использовать эти два адреса. Если я изменю listen_addresses на список:

listen_addresses = '192.168.0.191, localhost'

тогда я больше не могу подключиться с 192.168.0.191.

Я заметил, что почти во всех примерах на stackexchange значение listen_addresses установлено в '*'. Это потому, что форма списка не работает?

zabouti
источник

Ответы:

45

Да, listen_addressesможет быть установлен список адресов на локальном хосте для привязки для прослушивания.

В вашем примере:

listen_addresses = '192.168.0.191, localhost'

Если у локального компьютера есть IP 192.168.0.192, вы должны указать этот IP, а не 192.168.0.191IP удаленного хоста . PostgreSQL не может привязаться к IP-адресу удаленного хоста.

Вы не говорите «кому разрешено подключаться», вы говорите «с какими интерфейсами PostgreSQL должен принимать подключения». Бит «кому разрешено подключаться» следующий, и он настроен в pg_hba.conf.

Итак: попробуй '192.168.0.192, localhost'. Или просто *, поскольку вы, вероятно, действительно хотите слушать все сетевые интерфейсы.

Крейг Рингер
источник
1
Оно работает. Так есть ли практическая разница между списком и «*»?
Забути
10
@zabouti Конечно. Если ваш сервер имеет (скажем) два внешних сетевых интерфейса, вы можете указать PostgreSQL связываться только с одним из них, так что даже невозможно установить TCP-соединение с Pg на другом. В основном это дополнительный уровень безопасности для системы, которая имеет несколько интерфейсов для разных доменов безопасности. Весьма удобно в сочетании с виртуальными локальными сетями, виртуальными коммутаторами и т. Д. Наиболее распространенным вариантом использования является настройка localhostтак, чтобы соединения TCP / IP были невозможны из любого внешнего сетевого интерфейса, только адрес обратной связи.
Крейг Рингер
1
@CraigRinger: очень хороший ответ!
франков
@CraigRinger вы должны добавить эти комментарии к своему ответу. Это очень полезная информация.
Жоао Портела
1
Да, я думаю, что комментарий может быть даже лучше, чем ответ. Рок на Крейга!
Дарт Egregious
2

Я обнаружил, что вместо того, чтобы использовать localhostего, нужно 127.0.0.1указывать и другие адреса.

Поэтому в моем случае прослушивания IP-адреса хоста Docker, а также локального хоста, но не внешнего IP-адреса, это не работает (я получаю отказ в соединении изнутри моих контейнеров Docker):

listen_addresses = '172.17.0.1, localhost'

Но это делает:

listen_addresses = '172.17.0.1, 127.0.0.1'
VirtualWolf
источник
0

Запись 0.0.0.0 позволяет прослушивать все адреса IPv4 и :: позволяет прослушивать все адреса IPv6. Если список пуст, сервер вообще не прослушивает ни один IP-интерфейс, и в этом случае для подключения к нему можно использовать только сокеты Unix-домена.

Валид Редван
источник