无法在 Debian stretch 中的 /etc/default/opendkim 中更改 OpenDKIM 套接字

无法在 Debian stretch 中的 /etc/default/opendkim 中更改 OpenDKIM 套接字

我正在尝试在 Debian stretch 上设置 opendkim,但无法更改套接字。我想更改套接字,/var/spool/postfix/opendkim/opendkim.sock以便可以将其与 postfix 一起使用。

我已经添加Socket local:/var/spool/postfix/opendkim/opendkim.sock/etc/opendkim.conf

并且还尝试添加SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock/etc/default/opendkim我必须创建)。

无论我更改什么或多久重新启动 opendkim,它始终使用/var/run/opendkim/opendkim.sock它的套接字。

➜  ~ netstat -a | fgrep LISTEN | grep open
unix  2      [ ACC ]     STREAM     LISTENING     5534128  /var/run/opendkim/opendkim.sock

➜  ~ sudo systemctl status opendkim.service

● opendkim.service - OpenDKIM DomainKeys Identified Mail (DKIM) Milter
   Loaded: loaded (/lib/systemd/system/opendkim.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2017-04-30 12:41:54 CEST; 5min ago
     Docs: man:opendkim(8)
           man:opendkim.conf(5)
           man:opendkim-genkey(8)
           man:opendkim-genzone(8)
           man:opendkim-testadsp(8)
           man:opendkim-testkey
           http://www.opendkim.org/docs.html
  Process: 25246 ExecStart=/usr/sbin/opendkim -P /var/run/opendkim/opendkim.pid -p local:/var/run/opendkim/opendkim.sock (code=exited, status=0/SUCCESS)
 Main PID: 25248 (opendkim)
    Tasks: 7 (limit: 4915)
   CGroup: /system.slice/opendkim.service
           ├─25248 /usr/sbin/opendkim -P /var/run/opendkim/opendkim.pid -p local:/var/run/opendkim/opendkim.sock
           └─25249 /usr/sbin/opendkim -P /var/run/opendkim/opendkim.pid -p local:/var/run/opendkim/opendkim.sock

Apr 30 12:41:54 vServer systemd[1]: Starting OpenDKIM DomainKeys Identified Mail (DKIM) Milter...
Apr 30 12:41:54 vServer systemd[1]: Started OpenDKIM DomainKeys Identified Mail (DKIM) Milter.
Apr 30 12:41:54 vServer opendkim[25249]: OpenDKIM Filter v2.11.0 starting (args: -P /var/run/opendkim/opendkim.pid -p local:/var/run/opendkim/opendkim.sock)

我做错了什么?(我想这是我的错误,因为我找不到其他有同样问题的人)

更新:

更改/etc/default/opendkimSOCKET="inet:8891@localhost"并更改 postfix 配置以使用此套接字会导致inet:localhost:8891: Connection refused

更新2:

我现在已将其替换为 debian stretch 包中捆绑的文件:

# Command-line options specified here will override the contents of                                                                                                         
# /etc/opendkim.conf. See opendkim(8) for a complete list of options.                                                                                                       
#DAEMON_OPTS=""                                                                                                                                                             
# Change to /var/spool/postfix/var/run/opendkim to use a Unix socket with                                                                                                   
# postfix in a chroot:                                                                                                                                                      
RUNDIR=/var/spool/postfix/var/run/opendkim                                                                                                                                  
#RUNDIR=/var/run/opendkim                                                                                                                                                   
#                                                                                                                                                                           
# Uncomment to specify an alternate socket                                                                                                                                  
# Note that setting this will override any Socket value in opendkim.conf                                                                                                    
# default:                                                                                                                                                                  
SOCKET=local:$RUNDIR/opendkim.sock                                                                                                                                          
# listen on all interfaces on port 54321:                                                                                                                                   
#SOCKET=inet:54321                                                                                                                                                          
# listen on loopback on port 12345:                                                                                                                                         
#SOCKET=inet:12345@localhost                                                                                                                                                
# listen on 192.0.2.1 on port 12345:                                                                                                                                        
#SOCKET=inet:[email protected]                                                                                                                                                
USER=opendkim                                                                                                                                                               
GROUP=opendkim                                                                                                                                                              
PIDFILE=$RUNDIR/$NAME.pid                                                                                                                                                   
EXTRAAFTER=   

其中包括以下几行决定套接字的位置:

if [ -f /etc/opendkim.conf ]; then                                                                                                                                          
    CONFIG_SOCKET=`awk '$1 == "Socket" { print $2 }' /etc/opendkim.conf`                                                                                                    
fi                                                                                                                                                                          

# This can be set via Socket option in config file, so it's not required                                                                                                    
if [ -n "$SOCKET" -a -z "$CONFIG_SOCKET" ]; then                                                                                                                            
    DAEMON_OPTS="-p $SOCKET $DAEMON_OPTS"                                                                                                                                   
fi

答案1

我终于找到了解决方案。

似乎/etc/init.d/opendkim什么也没做。但实际上/lib/systemd/system/opendkim.service使用了硬编码了错误套接字的服务文件。

但是 debian 包似乎还包含一个生成正确 systemd 服务的 bash。

因此运行之后

/lib/opendkim/opendkim.service.generate
systemctl daemon-reload
service opendkim restart

并重新启动 opendkim 套接字文件出现在预期位置,可以通过调用以下命令进行验证:

tail /var/log/mail.log | grep OpenDKIM

更新:似乎有一个关于此问题的 Debian 错误报告:#861169

2021 年更新:

由于这个问题仍然经常被阅读,我想让大家意识到最近的新闻条目

[...]

我们提醒用户,最好通过编辑 /etc/opendkim.conf 来配置 opendkim。/etc/default/opendkim 中的旧默认文件仍然可用,脚本 /lib/opendkim/opendkim.service.generate 也一样。但是,这些文件与默认配置文件 /etc/opendkim.conf 相比没有任何价值。请借此机会检查您的配置设置。

同样从 Debian Bullseye 开始,其/etc/default/opendkim开头为:

# NOTE: This is a legacy configuration file. It is not used by the opendkim
# systemd service. Please use the corresponding configuration parameters in
# /etc/opendkim.conf instead.
#
# Previously, one would edit the default settings here, and then execute
# /lib/opendkim/opendkim.service.generate to generate systemd override files at
# /etc/systemd/system/opendkim.service.d/override.conf and
# /etc/tmpfiles.d/opendkim.conf. While this is still possible, it is now
# recommended to adjust the settings directly in /etc/opendkim.conf.

答案2

我没有足够的声誉来发表评论,并想承认,经过几个小时寻找 OpenDKim-Postfix“连接被拒绝”错误消息的解决方案后,/lib/systemd/system/opendkim.service由提供的编辑蝗虫使用Ubuntu 17.04:

warning: connect to Milter service inet:localhost:8891: Connection refused

编辑/lib/systemd/system/opendkim.service

改变:

ExecStart=/usr/sbin/opendkim -P /var/run/opendkim/opendkim.pid -p local:/var/run/opendkim/opendkim.sock

到:

ExecStart=/usr/sbin/opendkim -P /var/run/opendkim/opendkim.pid -p local:/var/run/opendkim/opendkim.sock -p inet:12301@localhost

systemctl daemon-reload

systemctl opendkim restart

在尝试编辑之前,我将 postfix 用户添加到 opendkim 组,并/lib/opendkim/opendkim.service.generate尝试卢卡斯·温克勒的解决方案。连接被拒绝错误持续存在,直到将端口号添加到/lib/systemd/system/opendkim.service

为了更新/lib/systemd/system/opendkim.service,我使用了 Ubuntu 的端口 8891,并出于测试目的注释掉了原始的 ExecStart 行,然后添加了一个带有端口号的新行:

/lib/systemd/system/opendkim.service (Service category):

    [Service]
    Type=forking
    PIDFile=/var/run/opendkim/opendkim.pid
    User=opendkim
    UMask=0007
    #ExecStart=/usr/sbin/opendkim -P /var/run/opendkim/opendkim.pid -p local:/var/run/opendkim/opendkim.sock
    ExecStart=/usr/sbin/opendkim -P /var/run/opendkim/opendkim.pid -p local:/var/run/opendkim/opendkim.sock -p inet:8891@localhost
    Restart=on-failure
    ExecReload=/bin/kill -USR1 $MAINPID

匹配的端口号另外指定在/etc/opendkim.conf

Socket                  inet:8891@localhost

/etc/postfix/main.cf

smtpd_milters = inet:localhost:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept

重新启动 systemctl 守护程序、opendkim 和 postfix 后,发出的邮件签名没有问题,并且邮件日志显示“已添加 DKIM 签名字段”。

systemctl daemon-reload
systemctl opendkim restart
systemctl postfix restart

最近在 Centos7 上配置 OpenDkim 时没有出现连接问题,因此显然这次问题与 Ubuntu 有关。感谢 Lukas Winkler 发布问题以及分享解决方案的人。

答案3

为了使用inet套接字,您需要指定:

SOCKET="inet:12301@localhost"/etc/default/opendkim

另外,您还需要更改 Postfix 中的设置:

添加/etc/postfix/main.cf

milter_protocol = 2
milter_default_action = accept
smtpd_milters = inet:localhost:12301
non_smtpd_milters = inet:localhost:12301

如果您无法设置local为所需的路径,我建议您:

  • 从 或mail中获取日志并检查syslogopendkim/var/log

  • 检查/etc/init.d/opendkim脚本并检查 sock 文件是否被硬设置为某个值

  • 尝试使用默认值local:/var/run/opendkim/opendkim.sock-smtpd_milters = local:/var/run/opendkim/opendkim.socknon_smtpd_milters = local:/var/run/opendkim/opendkim.sock指定/etc/postfix/main.cf

答案4

我被困了好几个小时才明白发生了什么,使用那个conf:

> nocomment.sh /etc/default/opendkim 
RUNDIR=/var/spool/postfix/var/run/opendkim
SOCKET=local:$RUNDIR/$NAME.sock"
USER=opendkim
GROUP=opendkim
PIDFILE=$RUNDIR/$NAME.pid
EXTRAAFTER=

问题是日志没有显示 opendkim 由于简单文件访问权限而无法访问套接字。

纠正方法:

  1. 将 opendkim 添加到 postfix 组(而不是像我在某处读到的那样相反)

  2. chown postfix:root -R /var/spool/postfix/var/

  3. 验证:

    $ ll /var/spool/postfix/var/run/opendkim/
    total 4
    -rw-rw---- 1 postfix root 6 avril 13 11:50 opendkim.pid
    srwxrwxr-x 1 postfix root 0 avril 13 11:50 opendkim.sock
    

我写了一些关于 DEBIAN BUSTER 上的 OPENDKIM 的提醒. 希望这能有所帮助

相关内容