この記事が対象にしている状況
次のような状況で「Windowsアプリ(TablePlus)から localhost:5432 に繋いでも届かない」ことがあります。
- WSL2は仮想マシンとして動作し、Windowsとは別のネットワーク空間を持つ
- Windowsの
127.0.0.1と、WSL2内の127.0.0.1は別物 - 構成によっては、Windows側の
localhostが WSL側へ転送されない
その結果、TablePlusから localhost:5432 で接続できないことがあり、その場合は WSLのIP(172.x…)に直接接続することで解決できます。
発生した問題
TablePlusで以下の設定で接続しようとしたが失敗する。
- Host:
127.0.0.1(またはlocalhost) - Port:
5432
エラー例:
connection to server at "127.0.0.1", port 5432 failed: Connection refused
原因
- WSL2は独立した仮想マシンとして動作するため、Windowsの
localhostはWindows自身を指す - WSL内で動いているPostgreSQLは、WSL側のネットワーク(例:
172.xx.xx.xx)に存在する - そのため、構成によっては Windowsの
localhostからWSL内のPostgreSQLに到達できない
トラブルシューティング(内側→外側)
1) WSL内でPostgreSQLが動いているか確認
Dockerの場合:
docker ps --format 'table {{.Names}}\t{{.Ports}}'
2) WSL内でPostgreSQLが待ち受けているか確認
(例:5432で待ち受けているか)
ss -ltnp | grep 5432
-
0.0.0.0:5432/*:5432が出れば「WSLの外部IFでも待ち受け」の可能性が高い -
127.0.0.1:5432しか出ない場合、WSL IPでは届かないので Postgresのlisten設定やDockerの公開設定を見直す
3) WSLのIPアドレスを取得
ip addr show eth0 | grep 'inet '
# または
hostname -I
例:172.18.245.28
解決方法(TablePlusでWSL IPに直接接続)
TablePlusの接続設定を以下に変更する。
- Host:
127.0.0.1→ WSLのIP(例:172.18.245.28) - Port:
5432 - User: (例:
postgres) - Password: (例:
postgres) - Database: 空欄でもOK(接続後に選択)
- SSL mode:
PREFERRED(ダメならDISABLED)
結果
WSLのIP指定で接続することでTablePlusから正常に接続でき、DBのテーブルやマイグレーション結果を視覚的に確認できるようになった。
学んだこと
- WSL2は仮想マシンであり、独自のIPアドレス空間を持つ
- Windowsの
localhostはWSL2内のlocalhostとは別物 - トラブルシューティングは「内側(WSL内)→外側(Windowsアプリ)」の順で確認すると早い
- WSLのIPアドレスは再起動で変わる可能性があるため、
hostname -Iで都度確認が必要な場合がある
注意(このエラーのときは話が別)
もし localhost:5432 でのエラーが password authentication failed の場合は、「届いてはいるが、別のPostgreSQLに繋がっている(誤接続)」可能性が高いです。
その場合は、Windows側で 5432 を掴んでいるプロセス確認(例:netstat -ano | findstr :5432)も併せて確認してください。

