PostgreSQLを起動するとWireGuardアドレスをバインドできません。

PostgreSQLを起動するとWireGuardアドレスをバインドできません。

VPNトンネルを設定するには、システム起動時にwg-quick.serviceを実行します。

root@db ~ # cat /usr/lib/systemd/system/[email protected]
[Unit]
Description=WireGuard via wg-quick(8) for %I
After=network-online.target nss-lookup.target
Wants=network-online.target nss-lookup.target
PartOf=wg-quick.target
Documentation=man:wg-quick(8)
Documentation=man:wg(8)
Documentation=https://www.wireguard.com/
Documentation=https://www.wireguard.com/quickstart/
Documentation=https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
Documentation=https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/wg-quick up %i
ExecStop=/usr/bin/wg-quick down %i
Environment=WG_ENDPOINT_RESOLUTION_RETRIES=infinity

[Install]
WantedBy=multi-user.target

postgresqlにwireguardアドレスをリッスンさせたいと思います10.100.0.107

root@db ~ # cat /etc/postgresql/13/main/conf.d/db1.conf | grep listen
listen_addresses = '127.0.0.1,10.100.0.107' # what IP address(es) to listen on;

再起動後、postgresqlログに次のエラーが表示されます。

2021-06-23 19:44:26.389 UTC [831] LOG:  starting PostgreSQL 13.3 (Ubuntu 13.3-1.pgdg20.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, 64-bit
2021-06-23 19:44:26.389 UTC [831] LOG:  listening on IPv4 address "127.0.0.1", port 5432
2021-06-23 19:44:26.395 UTC [831] LOG:  could not bind IPv4 address "10.100.0.107": Cannot assign requested address
2021-06-23 19:44:26.395 UTC [831] HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
2021-06-23 19:44:26.395 UTC [831] WARNING:  could not create listen socket for "10.100.0.107"
2021-06-23 19:44:26.395 UTC [831] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2021-06-23 19:44:26.411 UTC [880] LOG:  database system was shut down at 2021-06-23 19:43:14 UTC
2021-06-23 19:44:26.422 UTC [831] LOG:  database system is ready to accept connections

残念ながらpostgresqlは10.100.0.107

サーバーを再起動した後にpostgresqlを再起動すると便利です。また、設定listen_addresses='*'も役立ちます。

127.0.0.1しかし、指定されたアドレス(、)への接続のみを許可したいと思います10.100.0.107。 wg-quickサービスを正常に初期化した後にpostgresqlサービスを開始するには?

ありがとうございます!

ベストアンサー1

postgresql サービスの開始と wireguard トンネルデバイスの設定の間に競合状態があります。

この問題を処理する方法はいくつかあります。

  1. After=/Wants=Postgresサービスへの直接の依存関係
  2. Postgresを任意のIPアドレスにバインドし(たとえば、追加して0.0.0.0)、::ファイアウォール/パケットフィルタにのみ依存して、Postgresのワイヤガードアドレス/インタフェース(およびローカルホスト)アクセスを制限します。*listen_addresses
  3. 非ローカルバインディングを有効にします。

このユースケースでは、systemdの依存関係を設定するのは面倒でエラーが発生しやすく、展開/ systemdのバージョンによって異なります。最後に、wireguardデバイスにIPアドレスが割り当てられた後にのみ、wireguard関連のサービスが確実に開始信号を送信するかどうかはわかりません。

残念ながら、Postgresは、インターフェイスが一時的に消えた場合に備えて、数分後に指定されたアドレスへのバインディングを再試行するバインディング再試行機能をサポートしていないようです。


Linuxの非デフォルトバインディングサポートはデフォルトで無効になっていますが、sysctlを使用して設定できます。例:

sysctl net.ipv4.ip_nonlocal_bind=1

/etc/sysctl.d/永久構成を参照)

その後、Wireguard デバイスが設定されていなくても、起動中の Postgres バインド操作は常に成功します。

テストするには:

networkctl down wg0
ip -o a
systemctl restart postgresql.service
networkctl up wg0

おすすめ記事