Browsed by
Category: 计算机技术

Postfix / Dovecot 配置的一些修改

Postfix / Dovecot 配置的一些修改

email 大概是自互联网洪荒时代就留存下来的技术,有着厚重的历史沉淀,回味且让人困惑。互联网技术往往粗糙、简陋,像有点漏水的瓶,能用,但就是哪哪总有点不对。而 email 更像是漏水的镶金大瓦罐,更漏水、更实用、更异域风情。相比其他互联网服务,例如web,配置 email 总是让人战战兢兢,需要理解极为繁琐的概念、在不同的配置文件左右横跳,然而过了一段时间后,你会发现,原来配置还没完,还有地方能优化,超有精雕细琢的样子。

最近我就雕琢了一下。

事情其实和我们的 email 本身没有关系,和 IPv6 的地址范围有关。数据中心服务商给我们提供了一个比较大范围的 IPv6 地址群,然而不幸的是其他一些用户也在这个地址群内。我们通过自己的 IPv6 地址发送 email 时,由于反垃圾机构已经将这个地址群拉黑了,导致我们的 email 无法送达到客户。这是典型的「殃及池鱼」,我们进行了申诉(拉黑一个大范围的 IPv6 地址群显然过于粗暴、完全不合理),并向数据中心反馈情况(希望能查查是谁在发垃圾邮件)。反垃圾邮件机构不理会我们(有了SPF、DKIM等技术都不能让它们更精确、更理智点),而数据中心只是表示可以将我们划到另一个小点的 IPv6 地址群……

互联网就是这么荡气回肠,到处漏水,到处打补丁,到处都是草台班子。

我们回头重新思考,将 email 系统限制在 IPv4 地址显然是个简单有效的解决方案。IPv4 的主要缺点是地址太少,但在这个问题上反而是优点,估计没有哪家反垃圾邮件机构会疯到拉黑一大段 IPv4 地址。

方案有了,改起来倒是不太复杂。第一步修改 DNS 的 MX 记录绑定 IPv4 地址。进 DNS 服务商的面板里改改就可以。

第二步修改 Postfix 以及 Dovecot 的配置。Postfix 管理邮件的发送和接收,而 Dovecot 管理个人的邮箱,大致功能就是这样,它们共同组成整个 email 系统。

(1)修改 Dovecot

可以直接修改 /etc/dovecot/dovecot.conf 文件,但这样不太好, 如果将来系统升级,可能还要注意保留配置不被覆盖,因此建议将自己的配置存放在 /etc/dovecot/conf.d/ 目录下。例如,在该目录下创建 99-myvoipapp.conf 文件,并设置以下内容绑定 IPv4 地址(本机的实际地址,这里假设是 1.1.1.1):

listen = 1.1.1.1

(2)修改 Postfix

Postfix 不像 Dovecot 那样提供自定义配置的存放目录,因此只能修改 /etc/postfix/main.cf 文件,修改 inet_interfaces 项绑定 IPv4 地址(本机的实际地址,这里假设是 1.1.1.1):

inet_interfaces = 1.1.1.1

(3)启用 SMTPS

完成上述两步操作后,email 系统绑定了 IPv4 地址,重启 Postfix 以及 Dovecot 就可以了。Debian 系统默认配置没有启动 SMTPS,只启动了SMTP。建立 TCP 连接后,客户端收到 STARTTLS 命令才启用 TLS 加密传输过程,这样可以兼容化石级的 email 客户端,但目前主流的 email 客户端(包括我们正在使用的客户端)都支持 SMTPS,完全可以一开始就直接建立 TLS 连接。

修改 /etc/postfix/master.cf 文件,将以下内容的注释去掉即可启动 SMTPS:

smtps     inet  n       -       -       -       -       smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_reject_unlisted_recipient=no
-o smtpd_client_restrictions=$mua_client_restrictions
-o smtpd_helo_restrictions=$mua_helo_restrictions
-o smtpd_sender_restrictions=$mua_sender_restrictions
-o smtpd_recipient_restrictions=
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING

(4)相关命令

完成配置后,可以使用以下命令检查是否正确:

sudo postfix check
sudo dovecot -n

使用以下命令重启 Postfix 和 Dovecot:

sudo systemctl restart postfix
sudo systemctl restart dovecot

使用以下命令检查 Postfix 和 Dovecot 的端口占用情况:

sudo netstat -tlnp | grep dovecot
sudo netstat -tlnp | grep tcp | grep :25
sudo netstat -tlnp | grep tcp | grep :465

SMTP 默认采用 TCP 25 端口,而 SMTPS 默认采用 TCP 465 端口。

dpkg: 无法恢复的致命错误,中止

dpkg: 无法恢复的致命错误,中止

在一台测试设备上升级 Debian,更新、安装软件时出现以下错误:

dpkg: 无法恢复的致命错误,中止:
软件包 libpipewire-0.3-common 的文件列表缺少最后结尾的换行符
错误: Sub-process /usr/bin/dpkg returned an error code (2)

在网上搜索了一下,解决方法简单:删除掉“/var/lib/dpkg/info”目录下软件包对应的 .list 文件即可。比如对上述错误提示,删除以下文件:

sudo rm /var/lib/dpkg/info/libpipewire-0.3-common.list

然后重新 update & upgrade 。如果没有安装该软件包,重新安装即可。

iPad 只能只读访问samba?

iPad 只能只读访问samba?

使用的是 2019版的iPad,一直都没有升级,也很好用。前段时间不知道是不是手滑,iPad 系统升级了,然后访问 samba 时变成只读,无法在共享目录中创建、修改文件。其他设备(例如 PC,Android 手机等)能正常访问同一个samba服务器下的共享目录和文件。

解决这个问题需要修改 /etc/samba/smb.conf 文件,将 global 段的以下语句使能即可:

vfs objects = catia fruit streams_xattr
fruit:nfs_aces = no

其中的关键是“streams_xattr”。不太清楚这语句为什么默认是注释掉的,感觉默认放开似乎也没什么问题。

修改完配置后,重启 samba 服务即可:

sudo systemctl restart smbd
QSystemTrayIcon 不响应双击事件

QSystemTrayIcon 不响应双击事件

QSystemTrayIcon 产生的图标显示在 Linux XFCE4 系统的顶部状态条上,但是双击没有反应。检查程序没有发现问题,判断了 QSystemTrayIcon::DoubleClick 事件。在以前的 Linux 系统中没有这个问题,不知道是新 Linux 导致的,还是 XFCE4 导致的。

调试发现无论是双击还是单击,QSystemTrayIcon 捕获的事件总是 QSystemTrayIcon::Trigger,也就是说实际上无法区分单击还是双击。修改方法也简单,同时检查QSystemTrayIcon::Trigger 以及 QSystemTrayIcon::DoubleClick 事件即可。

在调试过程中遇到了另一个问题。手贱,update & upgrade 系统,结果 XFCE4 桌面变成黑色、应用程序窗体没有边框、顶部状态栏没了…… 搜索了一些信息,大概是 window 管理进程异常,简单重启系统无法解决。需要重启桌面:

xfwm4 --replace

另外,点击菜单“所有应用程序 – 设置 – 设置管理器 – 会话和启动”,再点击“当前会话”,选择 xfwm4 然后点击按钮“保存会话”即可。

Error: “此流的格式错误。”

Error: “此流的格式错误。”

最近在移植 miniSIPPhone 到 Linux 系统时,遇到一个奇怪的错误:播放 wav 语音文件时提示“此流的格式错误”,无论是采用 QSound 还是 QMediaPlayer 播放 wav 文件都出现了这个错误。按照我们一贯以来的要求,miniSIPServer 和 miniSIPPhone 的语音文件都采用了同样的格式:

CCITT A-Law, 8KHZ, 8Bit, 7KB/sec, 单通道

换用 VLC 播放没有任何问题,在 Windows 系统上播放也没有任何问题。考虑到 Qt 在 Linux 系统上实际是调用 GStreamer 的 plugins 来解码和播放各种语音格式,而我们的录制格式是如此的普通和平平无奇,实在想不通为什么会出现格式错误。

遍历了各种可能原因后忽然想到,或许 GStreamer 默认不支持 A-Law?这个格式在通信领域用得比较多,而一般语音播放、音乐等软件可能不太会关注这种格式。将语音文件格式转换成以下格式:

CCITT PCM, 8KHZ, 8Bit, 7KB/sec, 单通道

然后果然成功了,miniSIPPhone 在 Linux 平台也可以正常播放各种提示音。

Firefox 的奇怪逻辑

Firefox 的奇怪逻辑

在 Firefox 的设置中,关于硬件加速的配置有点奇怪,如下图所示:

如果勾选了“Use recommended performance settings”,就会隐藏其下面的“Use hardware acceleration when available”选项。按常理推断,此时 Firefox 应自动判断 GPU 的情况决定是否采用硬件加速。我的电脑 CPU 是 AMD Ryzen 5 Pro,内置 GPU,这是款比较旧的 APU,理论上来说 Firefox 应该可以识别并用于加速,但实际上并没有采用 GPU 进行加速。

相反,去掉“Use recommended performance settings”选项,直接勾选“Use hardware acceleration when available”(正如截图所示)并重启 Firefox 后,能正常使用 GPU 加速,Firefox 变得更加流畅,尤其是打开图像、视频比较多的网页或者网站时,效果非常明显。

感觉“Use recommended performance settings”默认还是采用 CPU 进行处理,并没有引入 GPU 进行综合的判断。

Debian 系统中安装 Rust

Debian 系统中安装 Rust

可以按照 Rust 官网的介绍,下载 rustup 进行安装。也可以直接使用 apt 安装,一条命令足以:

sudo apt install rust-all

该命令会将 cargo、rustc 等全装好。

could not find a Qt installation of ”

could not find a Qt installation of ”

最近重新搭建了一套 Debian 系统的开发环境,使用 qmake 编译 pro 文件时,提示了标题中的错误。检查qmake 文件,发现以下信息:

 /usr/bin/qmake -> qtchooser

这是因为系统提供了两套 Qt 开发环境,比如 Qt6 和 Qt5 等,因此需要指定默认采用哪一套。网络上的解决方案大多数比较粗暴,手工修改 /usr/bin/qmake 的文件链接,链接到真实的 qmake 文件即可。

但实际上系统提供了更简单的方式,比如我们默认采用 Qt5 的开发环境,则使用以下命令:

sudo apt install qt5-default
curl

curl

最近在开发和测试对 TLSv1.3 的支持,过程颇为困扰,主要有两个问题:(1)测试服务器采用自签名证书,某些终端程序无法跳过对服务器证书的验证步骤,因此实际无法在实验环境进行测试;(2)开发过程中,我们希望了解协议交互的每个步骤的细节,而绝大部分工具默认并不提供足够详细的输出信息,增加了开发过程中的困难。

直到我们使用了 curl,这个工具实在太棒了!

如果需要输出详细信息,则使用“-v”参数。

如果需要跳过证书验证,则使用“-k”参数。

比如,我们测试 HTTPd(IP地址为 192.168.3.2),直接使用以下命令即可:

curl -v -k "https://192.168.3.2"
Postfix 采用 TLS 传输

Postfix 采用 TLS 传输

采用 postfix 发送邮件,默认没有采用 TLS 加密传输,对方的服务器有可能会提示告警(例如 gmail)。另外,邮件传输采用明文,如果不加密,也存在被人窥视的风险。因此建议修改 postfix 的配置,默认采用 TLS 加密。当然,这需要对方的服务器也支持加密,目前绝大多数邮件服务器都支持 TLS 传输。

修改 /etc/postfix/main.cf 文件,增加以下一行配置即可:

smtp_tls_security_level = may

修改了配置文件,使用命令重启 postfix:

sudo systemctl restart postfix