2つのリモートUnixソケットを接続するためにsocatをsystemdサービスとして実行するにはどうすればよいですか?

2つのリモートUnixソケットを接続するためにsocatをsystemdサービスとして実行するにはどうすればよいですか?

Eximのハトの認証を使用するには、eximサーバーとハトの2つの異なる2台のコンピュータにある2つのUnixソケットを接続する必要があります。

このために私はsocatを使用します。

eximserver# socat UNIX-LISTEN:/run/exim4/auth-client,fork,group=Debian-exim,mode=660 OPENSSL:10.10.20.5:9999,cert=/etc/ssl/certs/eximserver.pem,key=/etc/ssl/private/eximserver.key,cafile=/etc/ssl/certs/dovecotserver.pem,commonname=dovecotserver

dovecotserver# socat OPENSSL-LISTEN:9999,reuseaddr,fork,cert=/etc/ssl/certs/dovecotserver.pem,key=/etc/ssl/private/dovecotserver.key,bind=10.10.20.5,cafile=/etc/ssl/certs/eximserver.pem UNIX:/run/dovecot/auth-client

それは魅力のように動作します。 Eximはローカル/run/exim4/auth-client unixソケットを介してdovecotに接続します。このソケットは、TCP / IPを介して暗号化された接続を介してもう一方の端に接続され、もう一方の端にある/ run / dovecot / auth-clientソケットに接続されます。 .単語UNIX。

socatをsystemdサービスとして実行し、dovecotの起動後に自動的に実行したいので、次のsystemdユニットを作成しました。

# /etc/systemd/system/dovecot-auth-bridge.service
[Unit]
Description=Dovecot auth bridge
After=dovecot.service
Requires=dovecot.service

[Service]
ExecStart=socat OPENSSL-LISTEN:9999,reuseaddr,fork,cert=/etc/ssl/certs/dovecotserver.pem,key=/etc/ssl/private/dovecotserver.key,bind=10.10.20.5,cafile=/etc/ssl/certs/eximserver.pem UNIX:/run/dovecot/auth-client
Type=forking

[Install]
WantedBy=multi-user.target

ただし、サービスを開始しようとするたびにタイムアウトエラーが発生します。

dovecotserver# systemctl start dovecot-auth-bridge.service
Job for dovecot-auth-bridge.service failed because a timeout was exceeded.
See "systemctl status dovecot-auth-bridge.service" and "journalctl -xe" for details.

dovecotserver# # systemctl status dovecot-auth-bridge.service
● dovecot-auth-bridge.service - Dovecot auth bridge
   Loaded: loaded (/etc/systemd/system/dovecot-auth-bridge.service; disabled; vendor preset: enabled)
   Active: failed (Result: timeout) since Wed 2021-07-14 09:38:42 CEST; 28s ago
  Process: 13251 ExecStart=/usr/bin/socat OPENSSL-LISTEN:9999,reuseaddr,fork,cert=/etc/ssl/certs/dovecotserver.pem,key=/etc/ssl/private/dovecotserver.key,bind=10.10.20.5,cafile=/etc/ssl/certs/eximserver.pem UNIX:/run/dovecot/auth-client (code=exited, status=143)

Jul 14 09:37:12 Dovecotserver systemd[1]: Starting Dovecot auth bridge...
Jul 14 09:38:42 Dovecotserver systemd[1]: dovecot-auth-bridge.service: Start operation timed out. Terminating.
Jul 14 09:38:42 Dovecotserver systemd[1]: dovecot-auth-bridge.service: Control process exited, code=exited, status=143/n/a
Jul 14 09:38:42 Dovecotserver systemd[1]: dovecot-auth-bridge.service: Failed with result 'timeout'.
Jul 14 09:38:42 Dovecotserver systemd[1]: Failed to start Dovecot auth bridge.

socatがバックグラウンドに入らず、フォアグラウンドで実行され続けて1分ほど経過すると、タイムアウトによりサービスが失敗するため、問題があるようです。

おそらく、次のようにバックグラウンドで実行するには、シェルスクリプトにsocatコマンドをラップする必要があります。

# /usr/local/bin/dovecot-auth-bridge.sh
#!/bin/bash
/usr/bin/socat OPENSSL-LISTEN:9999,reuseaddr,fork,cert=/etc/ssl/certs/dovecotserver.pem,key=/etc/ssl/private/dovecotserver.key,bind=10.10.20.5,cafile=/etc/ssl/certs/eximserver.pem UNIX:/run/dovecot/auth-client &

それでもこれを行うより良い方法があるかどうか疑問に思います。

挨拶、

ベストアンサー1

本当に申し訳ありません。質問を投稿した直後に回答が見つかりました。問題は、socatが書き込み用に標準出力を開こうとしていることです。ユニットファイルを次のように編集しました。

# /etc/systemd/system/dovecot-auth-bridge.service
[Unit]
Description=Dovecot auth bridge
After=dovecot.service
Requires=dovecot.service

[Service]
Type=simple
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=dovecot-auth-bridge

ExecStart=socat -d -d OPENSSL-LISTEN:9999,reuseaddr,fork,cert=/etc/ssl/certs/dovecotserver.pem,key=/etc/ssl/private/dovecotserver.key,bind=10.10.20.5,cafile=/etc/ssl/certs/eximserver.pem UNIX:/run/dovecot/auth-client
Restart=always

[Install]
WantedBy=multi-user.target

今すぐサービスが開始されます。出力がログに記録されます。

おすすめ記事