두 개의 원격 Unix 소켓을 연결하기 위해 socat를 systemd 서비스로 실행하려면 어떻게 해야 합니까?

두 개의 원격 Unix 소켓을 연결하기 위해 socat를 systemd 서비스로 실행하려면 어떻게 해야 합니까?

Exim의 비둘기장 인증을 사용하려면 exim 서버와 비둘기장이라는 서로 다른 두 컴퓨터에 있는 두 개의 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 소켓에 연결됩니다. .단어 유닉스.

이제 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

이제 서비스가 즉시 시작됩니다. 출력이 로그에 기록됩니다.

관련 정보