Bisakah listen_addresses benar-benar disetel ke daftar?

32

Saya memiliki VM dengan alamat IP 192.168.0.192 yang menjalankan postgreSQL.

Jika saya tentukan

listen_addresses = '*'

maka saya dapat terhubung dari VM lain di 192.168.0.191 dan dari localhost.

Tapi sepertinya saya tidak bisa menggunakan daftar untuk memberi tahu postgreSQL untuk menggunakan kedua alamat itu. Jika saya mengubah listen_addresses ke daftar:

listen_addresses = '192.168.0.191, localhost'

maka saya tidak bisa lagi terhubung dari 192.168.0.191.

Saya perhatikan bahwa hampir semua contoh di stackexchange mengatur listen_addresses ke '*'. Apakah ini karena formulir daftar tidak berfungsi?

zabouti
sumber

Jawaban:

45

Ya, listen_addressesdapat diatur ke daftar alamat pada host lokal untuk diikat untuk mendengarkan.

Dalam contoh Anda:

listen_addresses = '192.168.0.191, localhost'

Jika mesin lokal memiliki IP 192.168.0.192, Anda harus menentukan IP itu, bukan 192.168.0.191IP host jarak jauh . PostgreSQL tidak dapat mengikat ke alamat IP host jarak jauh.

Anda tidak mengatakan "siapa yang diizinkan untuk terhubung", Anda mengatakan "antarmuka mana PostgreSQL harus menerima koneksi". Bit "siapa yang diizinkan untuk terhubung" adalah berikutnya, dan dikonfigurasi dalam pg_hba.conf.

Jadi: Coba '192.168.0.192, localhost'. Atau hanya *, karena Anda mungkin benar-benar ingin mendengarkan semua antarmuka jaringan.

Craig Ringer
sumber
1
Berhasil. Jadi apakah ada perbedaan praktis antara daftar dan '*'?
zabouti
10
@zabouti Tentu. Jika server Anda memiliki (katakanlah) dua antarmuka jaringan eksternal, Anda dapat memberi tahu PostgreSQL untuk hanya mengikat salah satunya, sehingga tidak mungkin membuat koneksi TCP ke Pg di sisi lain. Sebagian besar tingkat keamanan ekstra untuk sistem yang memiliki banyak antarmuka untuk domain keamanan yang berbeda. Cukup praktis dalam kombinasi dengan VLAN, switch virtual, dll. Penggunaan yang paling umum adalah mengaturnya localhostsehingga koneksi TCP / IP tidak dimungkinkan dari antarmuka jaringan eksternal, hanya alamat loopback.
Craig Ringer
1
@CraigRinger: jawaban yang sangat bagus!
franc
@CraigRinger Anda harus menambahkan komentar itu ke jawaban Anda. Itu informasi yang sangat berguna.
João Portela
1
Ya saya pikir komentarnya mungkin lebih baik daripada jawabannya. Rock on Craig!
Darth Egregious
2

Saya menemukan bahwa alih-alih menggunakannya localhost, 127.0.0.1Anda harus menentukan alamat lain juga.

Jadi dalam kasus saya mendengarkan pada alamat IP host Docker serta localhost, tetapi tidak IP eksternal, ini tidak berfungsi (saya mendapat koneksi yang ditolak dari dalam wadah Docker saya):

listen_addresses = '172.17.0.1, localhost'

Tapi ini memang:

listen_addresses = '172.17.0.1, 127.0.0.1'
VirtualWolf
sumber
0

Entri 0.0.0.0 memungkinkan mendengarkan semua alamat IPv4 dan :: memungkinkan mendengarkan semua alamat IPv6. Jika daftar itu kosong, server sama sekali tidak mendengarkan antarmuka IP, dalam hal ini hanya soket Unix-domain yang dapat digunakan untuk terhubung.

walid redwan
sumber