-
Firewalld出入站策略配置
FirewallD 是 iptables 的一个封装,可以让你更容易地管理 iptables 规则 - 它并不是 iptables 的替代品。虽然 iptables 命令仍可用于 FirewallD,但建议使用 FirewallD 时仅使用 FirewallD 命令。 Firewalld基本管理命令(CentOS7已默认安装firewalld) #查看firewall状态 firewall-cmd --state #安装 yum -y install firewalld yum -y install firewall-config #启动, systemctl start firewalld #设置开机启动 systemctl enable firewalld #关闭 systemctl stop firewalld #取消开机启动 systemctl disable firewalld 端口开放相关命令 #查询已经开放的端口 firewall-cmd --list-port #查询某个端口是否开放 firewall-cmd --query-port=80/tcp #开启端口(可以是一个端口范围,如1000-2000/tcp) firewall-cmd --zone=public --add-port=80/tcp --permanent #移除端口 firewall-cmd --zone=public --remove-port=80/tcp --permanent 封禁某一个IP或IP段 #单个ip firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='xx.xx.xx.xx' reject" #ip段 firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='xx.xx.xx.0/24' reject" 使用上是没什么问题,只不过一旦大量ip需要拉黑,管理上就会很混乱。因此这里介绍firewalld配置ipset来实现。 创建ipset firewall-cmd --permanent --zone=public --new-ipset=blacklist --type=hash:net #创建一个名为blacklist的库 执行完命令可在/etc/firewalld/ipsets路径下看到生成的blacklist.xml文件。 添加/删除要禁止的IP或IP段 #添加单ip firewall-cmd --permanent --zone=public --ipset=blacklist --add-entry=xxx.x.x.xx #添加ip段 firewall-cmd --permanent --zone=public --ipset=blacklist --add-entry=xxx.xx.xx.0/24 #删除ip firewall-cmd --permanent --zone=public --ipset=blacklist --remove-entry=xxx.x.x.xx #删除ip段 firewall-cmd --permanent --zone=public --ipset=blacklist --remove-entry=xxx.xx.xx.0/24 备注: –permanent参数表示永久生效,内容会写入blacklist.xml文件且需要重启防火墙firewall-cmd --reload生效,如果不加该参数,则立即生效,内容不会写入blacklist.xml文件,服务重启则规则失效。 封禁ipset 前面只是创建了名为blacklist的ipset,而且也往里面增加了内容,最后一步即防火墙封禁该ipset即可,这样的好处是防火墙只是一条规则就封禁了文件里管理的大量IP。 #封禁名为blacklist的ipset firewall-cmd --permanent --zone=public --add-rich-rule='rule source ipset=blacklist drop' 禁止本机向外访问某个IP或IP段 #单IP firewall-cmd --direct --add-rule ipv4 filter OUTPUT 0 -d 10.10.10.22/32 -j REJECT #IP段 firewall-cmd --direct --add-rule ipv4 filter OUTPUT 0 -d 10.10.10.0/24 -j REJECT 最后重新载入防火墙即可生效 firewall-cmd --reload
-
在Postfix SMTP服务器中启用SMTPS端口465以提交电子邮件
在之前的文章中,我们讨论了如何使用iRedMail或Modoboa快速设置自己的邮件服务器,以及如何在Ubuntu上从头开始设置邮件服务器。本教程将向您展示如何在Postfix SMTP服务器中启用SMTPS端口465,以便Microsoft Outlook用户可以发送电子邮件。SMTPS代表简单邮件传输协议安全。 为什么要启用SMTPS 通常,像Thunderbird这样的邮件客户端通过端口587向SMTP服务器提交发送的电子邮件,并使用STARTTLS进行加密。但是,一些邮件客户端(尤其是Microsoft Outlook)只能通过SMTPS端口465提交发送的电子邮件。默认情况下,iRedMail和Modoboa都只允许通过587端口提交。 作为提交协议使用的SMTPS令人困惑,不是吗?让我解释一下。最初是在1997年,IANA(Internet Assigned Numbers Authority)为SMTPS分配了465端口,用于加密一个SMTP服务器到另一个SMTP服务器(如邮件)之间的通信。谷歌。com和mail。雅虎。通用域名格式。后来,STARTTLS出现了,它允许SMTP服务器通过现有的SMTP端口25安全地相互通信,因此不再需要为安全SMTP指定端口465。SMTPS端口已被吊销。然而,一些邮件客户端(如Microsoft Outlook)错误地将smtps解释为提交,并使用端口465提交电子邮件,直到今天仍然如此。 启用端口465提交的另一个原因是,它现在受到IETF(互联网工程任务组)的鼓励。有两种方法可以确保电子邮件通信的安全: 在现有端口上使用STARTTLS(如端口587上的STARTTLS) 另一个专用端口上的隐式TLS(例如,端口143上的IMAP,端口993上的IMAP) 现在IETF认为STARTTLS方法并不完美,并开始推广隐式TLS的使用。2018年1月发布了RFC 8314,鼓励使用端口465提交电子邮件,2018年9月发布了RFC 8461,鼓励使用MTA-STS提交安全SMTP。端口465可能会被重命名为提交端口。 注意:几乎所有邮件客户端都可以在端口25上提交发送电子邮件,但大多数住宅ISP都会阻止端口25。 如何在Postfix SMTP服务器中启用SMTPS端口465 编辑后缀母版。cf文件。 sudo nano /etc/postfix/master.cf 如果您使用的是iRedMail,请在此文件末尾添加以下行。 smtps inet n - y - - smtpd -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject -o content_filter=smtp-amavis:[127.0.0.1]:10026 如果您使用的是Modoboa,请在此文件末尾添加以下行。 smtps inet n - y - - smtpd -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject -o smtpd_proxy_filter=inet:[127.0.0.1]:10026 如果您遵循我的“从头开始设置邮件服务器”教程,请添加以下行。 smtps inet n - y - - smtpd -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject -o smtpd_sasl_type=dovecot -o smtpd_sasl_path=private/auth 保存并关闭文件。重新启动Postfix以使更改生效。 sudo systemctl restart postfix 在防火墙中打开TCP端口465 如果您在Debian/Ubuntu上使用UFW,那么运行以下命令打开TCP端口465。 sudo ufw allow 465/tcp 如果在CentOS上使用firewalld,请运行以下命令打开TCP端口465。 sudo firewall-cmd --permanent --add-service=smtps sudo systemctl reload firewalld 如果您使用的是iptables,那么运行以下命令。 sudo iptables -A INPUT -p tcp --dport 465 -j ACCEPT 将邮件客户端配置为使用端口465进行提交 Microsoft Outlook仅支持在端口465上提交,因此无需进行特殊配置。Mozilla Thunderbird默认为587端口提交。它还支持带有SSL/TLS加密的端口465。 结论 我希望本教程能帮助您在Postfix SMTP服务器中启用SMTPS端口465。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门。当心?
-
设置SMTP&;带有HAProxy的IMAP代理(Debian、Ubuntu、CentOS)
在之前的教程中,我们讨论了如何在Linux(Ubuntu版本、CentOS/RHEL版本)上从头开始设置邮件服务器,以及如何使用iRedMail或Modoboa快速设置自己的邮件服务器,而无需手动配置邮件服务器堆栈的每个组件。本教程将向您展示如何使用HAProxy为邮件服务器设置SMTP和IMAP代理。 什么时候需要SMTP和IMAP代理? 有些人在家里运行电子邮件服务器,但可能存在以下问题: 端口25被阻塞。 它们没有静态IP地址。 他们无法创建PTR记录。 如果端口25被阻止,则无法直接向收件人发送电子邮件。如果你没有静态IP地址或PTR记录,你的电子邮件很可能会被拒绝或进入垃圾邮件文件夹。如果遇到这种情况,可以在数据中心运行VPS(虚拟专用服务器),并将其用作邮件服务器的代理。VPS有一个静态IP地址,您可以为该IP地址创建PTR记录。其他电子邮件服务器会认为VPS运行您的邮件服务,当您发送电子邮件时,他们会认为电子邮件来自您的VPS。 是的,您也可以使用SMTP中继服务(如Sendinblue)来解决这些问题,但每天和每月可以发送多少电子邮件是有限制的。如果你升级到Mailjet的付费账户,每月至少要花25美元。你发送的电子邮件越多,你每月的花费就越高。如果你运行VPS并设置邮件代理,无论你要发送多少封邮件,每月都要花费大约10美元。 如果为很多人运行邮件服务器,可能需要设置邮件代理以实现负载平衡和高可用性。在本文中,我将使用HAProxy设置SMTP和IMAP代理,这是一个免费、开源的高可用性负载平衡器和代理服务器,用于基于TCP和HTTP的应用程序。 步骤1:为邮件代理选择正确的VP 你需要一个副总裁 允许您创建PTR记录 不会阻塞端口25 允许您无限制地发送无限电子邮件。 并非所有VPS提供商都满足上述3个要求。例如,DigitalOcean会阻塞端口25,但不会解锁端口25。另一个问题是,像DigitalOcean这样的大型知名主机提供商被垃圾邮件发送者滥用。通常,服务器IP地址在几个黑名单上。 我在ScalaHost和Kamatera VPS上运行邮件服务器。在设置邮件服务器时,我总是推荐它们。对于不需要太多CPU和RAM的邮件代理,可以选择Kamatera VPS。单CPU 1GB内存计划每月只需花费4美元,您将获得一个月的免费服务。您可以按照下面的教程创建Kamatera VPS。 如何在Kamatera上创建Linux VPS服务器 您可以为VPS选择任何Linux发行版,但我建议您使用Debian、Ubuntu或CentOS。 要登录到服务器,可以使用SSH客户端。如果您在计算机上使用Linux或macOS,只需打开一个终端窗口并运行以下命令即可登录服务器。将12.34.56.78替换为VPS的IP地址。 ssh [email protected]12.34.56.78 系统将要求您输入密码。如果您使用的是Windows,请阅读下面关于如何使用SSH客户端的文章。 在Windows上使用SSH登录Linux服务器的3种方法 第2步:在VPS上设置VPN服务器 如果你家里有一个动态IP地址,那么你需要在你的VPS上设置一个VPN服务器,这样你的VPS就可以与你的邮件服务器通信,而不会因为IP地址的改变而中断。VPN服务器还可以帮助您绕过端口25阻塞。 您可以按照以下教程之一在VPS上设置WireGuard VPN。为什么我要选择WireGuard而不是像OpenVPN这样的其他VPN协议?因为WireGuard允许您为VPN客户端分配静态专用IP地址。 在Ubuntu上设置自己的WireGuard VPN服务器 在Debian上设置自己的WireGuard VPN服务器 在CentOS上设置自己的WireGuard VPN服务器 按照上述文章中的说明操作时,您的VPS是VPN服务器,而您的邮件服务器是VPN客户端。VPS将成为邮件服务器的默认网关,邮件服务器上的所有出站流量将通过VPN进行隧道传输,因此接收SMTP服务器(Gmail、Hotmail、Yahoo mail等)时会认为您的邮件来自VPS。如果你想通过VPS发送邮件,但让其他类型的流量使用原始网关,WireGuard还允许你通过启用策略路由来实现。 你应该为你的VPS设置一个PTR记录,也就是反向DNS记录。Kamatera不允许您在控制面板中编辑PTR记录。相反,你需要打开一张支持票,告诉他们为你添加PTR记录。你可能会想,这并不方便,但这是为了让垃圾邮件发送者远离平台,因此像我们这样的合法电子邮件发送者将拥有良好的IP声誉。告诉支持团队将服务器IP地址的PTR记录更新为mail。你的领域。通用域名格式。 第3步:在防火墙中打开端口并设置权限 VPS需要在防火墙中打开端口25、587、465、143和993。运行以下命令打开这些端口。 Debian/Ubuntu: sudo ufw allow 25,587,465,143,993/tcp CentOS: sudo firewall-cmd --permanent --add-service={smtp,smtp-submission,smtps,imap,imaps} sudo systemctl reload firewalld 邮件服务器需要向VPS打开各种端口。运行以下命令。 Debian/Ubuntu: sudo ufw insert 1 allow in from 10.10.10.0/24 CentOS: sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.10.10.0/24" accept' sudo systemctl reload firewalld 10.10.10.0/24是VPN服务器创建的专用IP范围,因此VPS可以访问邮件服务器上的所有端口。 在CentOS上配置SELinux 在本教程的后面部分,VPS上的HAProxy需要绑定到各种电子邮件端口,如25、587、465、143和993,但SELinux禁止这样做。如果在VPS上使用CentOS,则需要运行以下命令以允许HAProxy绑定到这些端口。 sudo setsebool -P haproxy_connect_any 1 第4步:设置SMTP代理以接收电子邮件 现在,您需要设置SMTP代理,以便其他邮件服务器可以通过VPS向您自己的邮件服务器发送电子邮件。SSH到VPS中并安装HAProxy。 Debian/Ubuntu sudo apt install haproxy 森托斯 sudo dnf install haproxy 然后编辑HAProxy主配置文件。 sudo nano /etc/haproxy/haproxy.cfg 在文件末尾添加以下行。将12.34.56.78替换为VPS的公共IP地址。将10.10.10.101替换为邮件服务器的专用IP地址,该地址由VPN服务器分配。 frontend ft_smtp bind 12.34.56.78:25 mode tcp timeout client 1m log global option tcplog default_backend bk_smtp backend bk_smtp mode tcp log global option tcplog timeout server 1m timeout connect 7s server postfix 10.10.10.101:2525 send-proxy 上述配置将使HAProxy监听端口25,并将SMTP连接传递到邮件服务器的端口2525。保存并关闭文件。重新启动HAProxy。 sudo systemctl restart haproxy 并在启动时启用自动启动。 sudo systemctl enable haproxy 要使用HAProxy作为Postfix SMTP服务器的反向代理,需要在Postfix中启用Postscreen。SSH连接到邮件服务器并编辑Postfix主配置文件。 sudo nano /etc/postfix/master.cf 在该文件开头添加以下行。将10.10.10.101替换为VPN服务器分配的邮件服务器的专用IP地址。这将在端口2525上启用Postscreen,它可以接受来自VPS的HAProxy连接。Postfix能够从HAProxy获得SMTP客户端的原始IP地址。 10.10.10.101:2525 inet n - - - 1 postscreen -o postscreen_upstream_proxy_protocol=haproxy -o postscreen_cache_map=btree:$data_directory/postscreen_2525_cache -o syslog_name=postfix/2525 然后取消对以下三行的注释。(注意:如果您使用iRedMail或Moboba来运行邮件服务器,那么默认情况下,以下三行是未注释的。) smtpd pass - - y - - smtpd dnsblog unix - - y - 0 dnsblog tlsproxy unix - - y - 0 tlsproxy 哪里: 第一行将使Postscreen将SMTP连接传递到smtpd守护进程。 dnsblog(DNS黑名单记录器)服务允许记录DNS黑名单检查。 tlsproxy服务为postscreen启用STARTTLS支持,因此当postscreen启用时,远程SMTP客户端可以建立加密连接。 保存并关闭文件。重新启动Postfix以使更改生效。 sudo systemctl restart postfix 现在为你的域名添加一个新的MX记录,如下所示,你的邮件服务器可以通过VPS接收电子邮件。 Record Type Name Mail Server Priority MX @ hostname-of-your-VPS 0 您可以为VPS使用任何主机名,只要它可以解析为VPS的IP地址。为了简单起见,您可以使用邮件服务器的主机名(mail.yourdomain.com)。别忘了为VPS的主机名添加DNS记录。 第5步:设置提交代理 您的用户可以在不使用代理的情况下向邮件服务器提交发送电子邮件,但如果您希望用户能够通过VPS提交发送电子邮件,该怎么办?您需要为Postfix提交服务设置代理。 在VPS上编辑HAProxy主配置文件。 sudo nano /etc/haproxy/haproxy.cfg 在文件末尾添加以下行。将12.34.56.78替换为VPS的公共IP地址。将10.10.10.101替换为邮件服务器的专用IP地址,该地址由VPN服务器分配。 frontend ft_submission bind 12.34.56.78:587 mode tcp timeout client 1m log global option tcplog default_backend bk_submission backend bk_submission mode tcp log global option tcplog timeout server 1m timeout connect 7s server postfix 10.10.10.101:10587 send-proxy frontend ft_smtps bind 12.34.56.78:465 mode tcp timeout client 1m log global option tcplog default_backend bk_smtps backend bk_smtps mode tcp log global option tcplog timeout server 1m timeout connect 7s server postfix 10.10.10.101:10465 send-proxy 通常有两个端口可以接受经过身份验证的用户提交的电子邮件:587和465。在上面的配置中,我们在HAProxy中定义了两个前端,监听端口587和465。它们将分别连接到邮件服务器的端口10587和10465。 保存并关闭文件。重新启动HAProxy。 sudo systemctl restart haproxy 然后在邮件服务器上编辑Postfix主配置文件。 sudo nano /etc/postfix/master.cf 在该文件末尾添加以下行。将10.10.10.101替换为邮件服务器的专用IP地址,该地址由VPN服务器分配。请在-o之前至少允许一个空格(制表符或空格键)。在后缀配置中,前面的空格字符表示此行是前一行的延续。但是,不应在等号(=)之前或之后添加空格。 10.10.10.101:10587 inet n - y - - smtpd -o syslog_name=postfix/10587 -o smtpd_tls_security_level=encrypt -o smtpd_tls_wrappermode=no -o smtpd_sasl_auth_enable=yes -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject -o smtpd_sasl_type=dovecot -o smtpd_sasl_path=private/auth -o smtpd_upstream_proxy_protocol=haproxy 10.10.10.101:10465 inet n - y - - smtpd -o syslog_name=postfix/10465 -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject -o smtpd_sasl_type=dovecot -o smtpd_sasl_path=private/auth -o smtpd_upstream_proxy_protocol=haproxy 在上面的配置中,我们启用了两个在端口10587和10465上侦听的提交服务,它们支持haproxy协议,因此能够接受来自haproxy的连接。保存并关闭文件。重新启动Postfix以使更改生效。 sudo systemctl restart postfix 第6步:设置IMAP代理 我们还希望用户能够通过VPS登录IMAP服务器,因此我们需要设置IMAP代理。 在VPS上编辑HAProxy主配置文件。 sudo nano /etc/haproxy/haproxy.cfg 在文件末尾添加以下行。将12.34.56.78替换为VPS的公共IP地址。将10.10.10.101替换为邮件服务器的专用IP地址,该地址由VPN服务器分配。 frontend ft_imap bind 12.34.56.78:143 mode tcp default_backend bk_imap backend bk_imap mode tcp balance leastconn stick store-request src stick-table type ip size 200k expire 30m server imap1 10.10.10.101:10143 send-proxy-v2 frontend ft_imaps bind 12.34.56.78:993 mode tcp default_backend bk_imaps backend bk_imaps mode tcp balance leastconn stick store-request src stick-table type ip size 200k expire 30m server imaps1 10.10.10.101:10993 send-proxy-v2 IMAP服务有两个端口:143和993。端口143可以使用STARTTLS,端口993使用隐式TLS,因此在上述配置中,我们在端口143和993的HAproxy监听中添加了两个前端。它们将分别连接到邮件服务器的端口10143和10993。保存并关闭文件。重新启动HAProxy。 sudo systemctl restart haproxy 在邮件服务器上编辑Dovecot配置文件。 sudo nano /etc/dovecot/conf.d/10-master.conf 添加对IMAP和IMAP的HAProxy支持,如下所示。 service imap-login { inet_listener imap { port = 143 } inet_listener imaps { port = 993 ssl = yes } inet_listener imap_haproxy { port = 10143 haproxy = yes } inet_listener imaps_haproxy { port = 10993 ssl = yes haproxy = yes } } 在上述配置中,我们启用了两个IMAP服务:IMAP_haproxy和imaps_haproxy,分别监听端口10143和10993。它们支持haproxy协议,因此能够接受来自haproxy的连接。保存并关闭文件。 然后我们需要在Dovecot中添加受信任的代理主机。编辑Dovecot主配置文件。 sudo nano /etc/dovecot/dovecot.conf 在该文件末尾添加以下两行。将10.10.10.1替换为VPN服务器的专用IP地址。 haproxy_trusted_networks = 10.10.10.1 haproxy_timeout = 3s 保存并关闭文件。重新启动Dovecot以使更改生效。 sudo systemctl restart dovecot 现在,您应该能够登录IMAP服务器,并通过VPS提交发送的电子邮件。 第7步:设置HTTPS代理 如果希望通过VPS访问Roundcube等网络邮件,请在VPS上编辑HAProxy主配置文件。 sudo nano /etc/haproxy/haproxy.cfg 在文件末尾添加以下行。将12.34.56.78替换为VPS的公共IP地址。将10.10.10.101替换为邮件服务器的专用IP地址,该地址由VPN服务器分配。替换邮件。你的地盘。com与您的网络邮件使用的域名。 frontend https bind 12.34.56.78:443 mode tcp tcp-request inspect-delay 5s tcp-request content accept if { req_ssl_hello_type 1 } use_backend webmail if { req_ssl_sni -i mail.yourdomain.com } default_backend webmail backend webmail mode tcp option ssl-hello-chk server webmail 10.10.10.101:443 check 保存并关闭文件。然后重启HAProxy。 sudo systemctl restart haproxy 请注意,如果在certbot中使用默认的http-01质询,HTTPS代理可能会干扰Let's Encrypt TLS证书续订。建议在使用certbot续订Let's Encrypt TLS证书时使用dns-01 challenge。 最后的想法 请注意,我们通过添加更多侦听端口(252510587104651014310993),启用了对Postfix和Dovecot的代理支持。我们没有为现有端口(25、587、465、143和993)启用代理支持,因为如果启用,Postfix和Dovecot将只接受来自HAProxy的连接,并拒绝来自其他IP地址(包括本地主机)的连接。这可以防止邮件服务器上运行的webmail或web应用程序使用127.0.0.1:25发送电子邮件,并防止webmail客户端从Dovecot获取电子邮件。发生这种情况时,您可能会看到以下错误。 host mail.example.com refused to talk to me: 421 4.3.2 No system resources 您的Postfix SMTP服务器将在邮件日志中记录以下消息。 postfix/postscreen[1479]: warning: haproxy read: time limit exceeded 配置HAProxy自动重启 我找到了haproxy。CentOS/RHEL上的服务在启动时可能无法启动。错误如下。 Starting frontend ft_smtp: cannot bind socket [23.254.225.226:25] 如果我手动启动服务,它就会工作,这让我很困惑。为了解决这个问题,我们可以编辑haproxy。服务,使其在出现故障时自动重新启动。为了覆盖默认的systemd服务配置,我们创建了一个单独的目录。 sudo mkdir -p /etc/systemd/system/haproxy.service.d/ 然后创建一个文件。 sudo nano /etc/systemd/system/haproxy.service.d/restart.conf 在文件中添加以下行。 [Service] Restart=always RestartSec=5s 保存并关闭文件。然后重新加载系统D。 sudo systemctl daemon-reload Postfix/Dovecot自动重启 还建议在邮件服务器上配置Postfix和Dovecot,以便在出现故障时自动重启。 后缀 创建一个单独的目录。 sudo mkdir -p /etc/systemd/system/postfix.service.d/ 然后创建一个文件。 sudo nano /etc/systemd/system/postfix.service.d/restart.conf 在文件中添加以下行。请注意,在Debian/Ubuntu上,后缀是。服务是一个一次性服务,不允许重启=始终。 [Service] Restart=on-failure RestartSec=5s 保存并关闭文件。然后重新加载系统D。 sudo systemctl daemon-reload 多佛科特 创建一个单独的目录。 sudo mkdir -p /etc/systemd/system/dovecot.service.d/ 然后创建一个文件。 sudo nano /etc/systemd/system/dovecot.service.d/restart.conf 在文件中添加以下行。 [Service] Restart=always RestartSec=5s 保存并关闭文件。然后重新加载系统D。 sudo systemctl daemon-reload 删除IP黑名单 如果你的VPS的IP地址被某个特定的电子邮件服务提供商列入黑名单怎么办?您可以阅读下面的文章,了解如何将您的IP地址从黑名单中删除。 邮件服务器IP黑名单删除提示,以提高电子邮件的可交付性 故障排除提示 如果您向邮件服务器发送电子邮件,但收到以下错误, lost connection with mail.yourdomain.com[xx.xx.xx.xx] while receiving the initial server greeting 这可能是因为VPN连接中断,请验证是否可以从VPN服务器ping到VPN客户端(邮件服务器)。 ping 10.10.10.101 也可能是您没有将邮件服务器防火墙配置为允许从VPN连接(10.10.10.0/24)。在VPN服务器上运行以下命令,查看端口是否打开。Nmap可以通过sudo apt install Nmap安装在VPN服务器上。 sudo nmap 10.10.10.101 验证是否可以远程登录到端口2525上的邮件服务器。 telnet 10.10.10.101 2525 有时,您的HAProxy配置可能会出错。例如,我曾经在HAProxy中有两个默认的_后端指令,如下所示。 frontend ft_smtp bind 12.34.56.78:25 mode tcp timeout client 1m log global option tcplog default_backend bk_smtp default_backend ocserv 这是错误的。如果在前端部分中定义了默认的_后端,则无法在全局部分中定义另一个默认的_后端。相反,您应该像本文中那样,将每个默认的_后端指令放在相应的前端部分。 另一个配置错误是,您可能会意外地在https前端插入其他指令。 frontend https bind 12.34.56.78:443 mode tcp tcp-request inspect-delay 5s tcp-request content accept if { req_ssl_hello_type 1 } some_other_directives use_backend webmail if { req_ssl_sni -i mail.yourdomain.com } default_backend webmail 替代方法 如果您无法找出服务器环境中的问题,还可以在VPN服务器上使用UFW防火墙设置端口转发。流量将由UFW转发,因此HAProxy根本不会被使用。(无需移除HAProxy。) 如何在UFW中设置端口转发 应将以下端口从VPN服务器转发到邮件服务器。 TCP 25 TCP 587 TCP 465 TCP 143 TCP 993 TCP 80 TCP 443 TCP 110 TCP 995 结论 我希望本教程能帮助您设置SMTP和IMAP代理。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门。当心?
-
在CentOS 8上设置Postfix仅发送SMTP服务器
在本文中,我将向您展示如何在CentOS 8上将Postfix设置为仅发送SMTP服务器。我将首先向您展示如何为单个域执行此操作,然后如果需要,您可以为多个域应用这些步骤。 用例 您有一个需要向用户发送事务性电子邮件(如密码重置电子邮件)的网站/web应用程序。最有可能的是,用户不需要回复这些电子邮件,或者如果他们回复,回复电子邮件将被发送到您的专用邮件服务器。在这种情况下,可以使用Postfix(一种流行的SMTP服务器软件)在web服务器上设置只发送SMTP服务器。 先决条件 要从服务器发送电子邮件,端口25(出站)必须打开。许多ISP和托管公司,如DigitalOcean block port 25来控制垃圾邮件。我建议使用ScalaHost,因为它不会阻止端口25(出站)。拥有ScalaHost服务器后,在其上安装CentOS 8,并按照以下说明操作。 为多个域设置Postfix仅发送SMTP服务器实际上并不困难。首先,我们需要为一个域配置它,然后为多个域设置它。 第一步:设置主机名和PTR记录 默认情况下,Postfix在与其他SMTP服务器通信时使用服务器的主机名来标识自身。如果您的主机名无效,某些SMTP服务器将拒绝您的电子邮件。您应该设置一个完整的限定域名(FQDN),如下所示。 sudo hostnamectl set-hostname mta1.yourdomain.com 要检查服务器的主机名,请运行 hostname -f 您需要注销并重新登录,才能在命令提示下看到主机名的更改。这个主机名应该有一个指向服务器IP地址的DNS a记录。 此外,还需要设置一个PTR记录(又名指针记录),将IP地址映射到FQDN。这是A唱片的对应品。如果你的服务器IP地址没有PTR记录,许多SMTP服务器会拒绝你的电子邮件。 因为您从主机提供商或ISP获得IP地址,而不是从域注册商获得,所以您必须在主机提供商的控制面板中为您的IP设置PTR记录,或者询问ISP。例如,在ScalaHost中,您可以通过打开支持票证或使用他们网站上的实时聊天来设置PTR记录。尽管您可以将PTR记录设置为任何主机名,但为了获得最佳实践,您应该使用刚刚设置的FQDN。 要查看PTR记录设置是否正确,请运行以下命令。将12.34.56.78替换为您自己的IP地址。 host 12.34.56.78 请注意,如果服务器使用IPv6地址,最好为FQDN添加AAAA记录,并为IPv6地址设置PTR记录。 第2步:在CentOS 8上安装Postfix 运行以下命令,从默认的CentOS 8存储库安装Postfix。 sudo dnf update sudo dnf install postfix -y 安装后,启动Postfix SMTP服务器。 sudo systemctl start postfix 并在启动时启用自动启动。 sudo systemctl enable postfix 第3步:配置后缀 设置后缀主机名 默认情况下,Postfix SMTP服务器在与其他SMTP服务器通信时使用操作系统的主机名来标识自身。但是,OS主机名可能会更改,因此使用以下命令直接在Postfix配置文件中设置主机名是一种好的做法。 sudo postconf -e "myhostname = mta1.yourdomain.com" 设置$mydomain参数 $mydomain参数指定本地internet域名。默认情况下,使用$myhostname减去第一个组件。您可以通过以下方式显示$mydomain的当前值: postconf mydomain 它应该是你的顶级域名,比如 linuxbabe.com 如果它没有显示您的apex域名,则将$mydomain参数设置为: sudo postconf -e "mydomain = yourdomain.com" 设置$myorigin参数 $myorigin参数指定附加到没有@domain部分的发件人和收件人地址的默认域名。默认设置是使用$myhostname的值,如下所示: postconf myorigin 输出: myorigin = $myhostname 您可以将其值更改为您的域。通用域名格式。 sudo postconf -e "myorigin = yourdomain.com" 重新启动后缀 最后,我们需要重新启动Postfix以使更改生效。 sudo systemctl restart postfix 第4步:在CentOS 8上安装和配置OpenDKIM DKIM代表域密钥识别邮件。你可以在你的服务器上安装OpenDKIM,并使用它为从你的域发送的电子邮件添加签名,使用你的私钥。接收SMTP服务器使用您在DNS中发布的相应公钥验证签名。如果你想让你的邮件进入收件人的收件箱,添加DKIM签名是必须的。 从EPEL(企业Linux的额外软件包)存储库安装OpenDKIM。 sudo dnf install epel-release sudo dnf install opendkim perl-Getopt-Long 编辑OpenDKIM主配置文件。 sudo nano /etc/opendkim.conf 找到下面这行。 Mode v 默认情况下,OpenDKIM以验证模式(v)运行,该模式将验证传入电子邮件的DKIM签名。我们需要对发送的电子邮件进行签名,因此将此行更改为以下内容以启用签名模式。 Mode sv 找到下面一行并注释掉,因为我们将为每个域名使用单独的密钥。 KeyFile /etc/opendkim/keys/default.private 接下来,找到以下4行并取消注释。 # KeyTable /etc/opendkim/KeyTable # SigningTable refile:/etc/opendkim/SigningTable # ExternalIgnoreList refile:/etc/opendkim/TrustedHosts # InternalHosts refile:/etc/opendkim/TrustedHosts 保存并关闭文件。 创建签名表、密钥表和受信任主机文件 编辑签名表文件。 sudo nano /etc/opendkim/SigningTable 在该文件末尾添加以下行。这会告诉OpenDKIM,如果服务器上的发件人正在使用@your域。com地址,则应使用mta1标识的私钥对其进行签名_域名。你的领域。通用域名格式。 *@your-domain.com mta1._domainkey.your-domain.com mta1是DKIM选择器。域名可能有多个DKIM密钥。DKIM选择器允许您选择特定的DKIM键。您可以为DKIM选择器使用任何名称。我认为使用主机名最左边的部分作为DKIM选择器很方便。保存并关闭文件。然后编辑密钥表文件。 sudo nano /etc/opendkim/KeyTable 添加以下行,指定DKIM私钥的位置。 mta1._domainkey.your-domain.com your-domain.com:mta1:/etc/opendkim/keys/your-domain.com/mta1.private 保存并关闭文件。接下来,编辑受信任的主机文件。 sudo nano /etc/opendkim/TrustedHosts 默认情况下,127.0.0.1和::1包含在此文件中。现在添加以下行。这告诉OpenDKIM,如果电子邮件来自您自己的域名,那么OpenDKIM不应该对该电子邮件执行DKIM验证。 *.your-domain.com 保存并关闭文件。 生成私钥/公钥对 由于DKIM用于对发送的邮件进行签名和验证接收的邮件,因此需要生成一个私钥来对发送的电子邮件进行签名,并生成一个公钥来接收SMTP服务器,以验证电子邮件的DKIM签名。公钥将在DNS中发布。 为域创建一个单独的文件夹。 sudo mkdir /etc/opendkim/keys/your-domain.com 使用opendkim genkey工具生成密钥。 sudo opendkim-genkey -b 2048 -d your-domain.com -D /etc/opendkim/keys/your-domain.com -s mta1 -v 上述命令将创建2048位密钥-d(域)指定域-D(目录)指定存储密钥的目录。我使用mta1作为DKIM选择器。命令执行后,私钥将写入mta1。私有文件和公钥将写入mta1。txt文件。 默认情况下,只有root用户可以读取和写入密钥文件。使opendkim成为私钥的所有者。 sudo chown opendkim:opendkim /etc/opendkim/keys/ -R 在DNS记录中发布您的公钥 显示公钥 sudo cat /etc/opendkim/keys/your-domain.com/mta1.txt p参数后面的字符串是公钥。 在DNS管理器中,创建一个TXT记录,输入mta1_名称字段中的domainkey。然后返回终端窗口,复制括号中的所有内容,并将其粘贴到DNS记录的值字段中。您需要删除值字段中的所有双引号和换行符。如果不删除它们,那么下一步中的密钥测试可能会失败。 测试DKIM密钥 在CentOS 8服务器上输入以下命令以测试密钥。 sudo opendkim-testkey -d your-domain.com -s mta1 -vvv 如果一切正常,您将看到键OK消息。 opendkim-testkey: using default configfile /etc/opendkim.conf opendkim-testkey: checking key 'mta1._domainkey.linuxbabe.com' opendkim-testkey: key OK 如果你看到“钥匙不安全”,不要惊慌。这是因为您的域名上未启用DNSSEC。DNSSEC是安全DNS查询的安全标准。大多数域名都没有启用DNSSEC。你可以继续遵循这个指南。 现在我们可以启动opendkim服务了。 sudo systemctl start opendkim 并在启动时启用自动启动。 sudo systemctl enable opendkim OpenDKIM监听127.0.0.1:8891。 第5步:将Postfix连接到OpenDKIM 编辑后缀主配置文件。 sudo nano /etc/postfix/main.cf 在这个文件的末尾添加以下几行,这样Postfix就可以通过milter协议调用OpenDKIM了。请注意,应该使用127.0.0.1作为地址。不要使用localhost。 # Milter configuration milter_default_action = accept milter_protocol = 6 smtpd_milters = inet:127.0.0.1:8891 non_smtpd_milters = $smtpd_milters 保存并关闭文件。然后将postfix用户添加到opendkim组。 sudo gpasswd -a postfix opendkim 重新启动后缀服务。 sudo systemctl restart postfix 步骤6:创建SPF DNS记录 SPF(发件人策略框架)记录指定允许哪些主机或IP地址代表域发送电子邮件。在DNS管理界面中,创建一个新的TXT记录,如下所示。使用您自己的服务器IPv4地址和IPv6地址。 TXT @ v=spf1 mx ip4:12.34.56.78 ip6:2600:3c01::f03c:93d8:f2c6:78ad ~all 第7步:设置发件人地址、发件人名称和返回路径 您可以在网站/web应用程序中设置自定义发件人地址、发件人名称和返回路径。让我们以WordPress为例。您可以在WordPress主题的函数中添加以下行。php文件覆盖默认的发件人地址、发件人名称和返回路径。必要时替换红色文本。 // Function to change From email address function wpb_sender_email( $original_email_address ) { return '[email protected]'; } // Function to change sender name function wpb_sender_name( $original_email_from ) { return 'LinuxBabe'; } // Set return-path the same as From address function fix_my_email_return_path( $phpmailer ) { $phpmailer->Sender = $phpmailer->From; } // Hooking up our functions to WordPress filters add_filter( 'wp_mail_from', 'wpb_sender_email' ); add_filter( 'wp_mail_from_name', 'wpb_sender_name' ); add_action( 'phpmailer_init', 'fix_my_email_return_path' ); 保存文件,就完成了。 步骤8:为发送的电子邮件启用TLS加密 默认情况下,Postfix在发送邮件时不使用TLS加密。要启用TLS加密,请打开/etc/postfix/main。cf文件,并在该文件末尾添加以下两行。 smtp_tls_security_level = may smtp_tls_loglevel = 1 第一行为Postfix SMTP客户端启用TLS加密。第二行将把TLS连接记录在/var/log/maillog文件中,这样您就可以检查TLS加密是否有效。保存并关闭文件。重新启动Postfix以使更改生效。 sudo systemctl restart postfix 由于Postfix不接收传入的电子邮件,因此无需为Postfix SMTP守护程序配置有效的TLS证书。 第9步:测试发送者分数 现在去https://www.mail-tester.com.你会看到一个独特的电子邮件地址。从Postfix SMTP服务器上的网站向此地址发送电子邮件,然后检查您的分数。如你所见,我得了满分。在测试结果中,您应该检查您的PTR记录、SPF和DKIM记录是否有效。 还可以打开/var/log/maillog文件,检查是否使用了TLS加密。例如,下面一行显示了与mail tester的连接。com是加密的。 Anonymous TLS connection established to mail-tester.com[94.23.206.89]:25: TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits) 如果你的电子邮件仍被标记为垃圾邮件呢? 在本文中,我为您提供了更多关于电子邮件可交付性的提示:如何阻止您的电子邮件被标记为垃圾邮件。虽然这需要一些时间和精力,但在应用这些技巧后,你的电子邮件最终会被放入收件箱。 如何为多个域配置Postfix仅发送SMTP服务器 默认情况下,Postfix允许您使用发件人标题和返回路径地址中的任何域名发送电子邮件。如果你的服务器托管多个网站,你只需要为你的其他域创建SPF DNS记录,这很容易做到,并为你的其他域配置OpenDKIM。 要为其他域配置OpenDKIM,需要在签名表、密钥表和可信主机文件中添加其他域,如下所示。 签名表: *@example.com mta1._domainkey.example.com *@example.net mta1._domainkey.example.net 键表: mta1._domainkey.example.com example.com:mta1:/etc/opendkim/keys/example.com/mta1.private mta1._domainkey.example.net example.net:mta1:/etc/opendkim/keys/example.net/mta1.private 受信任的主机: 127.0.0.1 localhost *.example.com *.example.net 然后按照上述步骤为其他域生成DKIM私钥/公钥对,并在DNS中添加DKIM公钥。重新启动OpenDKIM,就完成了。别忘了测试你的发件人分数。 故障排除 如果您的邮件未签名且DKIM检查失败,您可能需要检查postfix日志(/var/log/maillog)以查看配置中的错误。 从另一台服务器发送电子邮件 有两种方法允许其他服务器通过只发送Postfix SMTP服务器发送电子邮件。 在不使用SMTP身份验证的情况下使用端口25:此方法要求其他服务器不阻止端口25(出站)。 将端口587用于SMTP身份验证:如果其他服务器阻止端口25(出站),则可以使用端口587。 没有SMTP身份验证的端口25 默认情况下,CentOS 8上的Postfix仅在本地主机上侦听。您需要将Postfix配置为在0.0.0.0上侦听,以便其他服务器可以连接到仅发送Postfix SMTP服务器。 sudo postconf "inet_interfaces = all" 然后需要将另一台服务器的IP地址添加到Postfix mynetworks参数中。将12.34.56.78替换为实际IP地址。 sudo postconf "$(postconf mynetworks) 12.34.56.78" 重新启动Postfix以使更改生效。 sudo systemctl restart postfix 运行以下命令打开端口25(入站)。 sudo firewall-cmd --permanent --add-port=25/tcp sudo systemctl reload firewalld 现在,您可以将SMTP客户端配置为使用mta1。你的地盘。com和端口25发送电子邮件。您不需要在SMTP客户端中指定用户名/密码。 带有SMTP身份验证的587端口 打开防火墙中的587和80端口。 sudo firewall-cmd --permanent --add-service={smtp-submission,http} sudo systemctl reload firewalld 默认情况下,CentOS 8上的Postfix仅在本地主机上侦听。您需要将Postfix配置为在0.0.0.0上侦听,以便其他服务器可以连接到仅发送Postfix SMTP服务器。 sudo postconf "inet_interfaces = all" 然后,您需要启用Postfix的提交服务,以便电子邮件客户端可以向Postfix SMTP服务器提交电子邮件。编辑母版。cf文件。 sudo nano /etc/postfix/master.cf 在提交部分,取消注释或添加以下行。请在每个-o之前至少允许一个空格(制表符或空格键)。在后缀配置中,前面的空格字符表示此行是前一行的延续。(默认情况下,提交部分被注释掉。您可以复制以下行并将其粘贴到文件中,这样您就不必手动取消注释或添加新文本。) submission inet n - y - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_tls_wrappermode=no -o smtpd_tls_loglevel=1 -o smtpd_sasl_auth_enable=yes -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject -o smtpd_sasl_type=dovecot -o smtpd_sasl_path=private/auth 上述配置启用Postfix的提交守护程序,并要求对SMTP身份验证进行TLS加密。纯文本身份验证将被拒绝。保存并关闭文件。要启用SMTP身份验证,我们需要在CentOS 8/RHEL 8服务器上安装Dovecot。 sudo dnf install dovecot 启动Dovecot并在启动时启用自动启动。 sudo systemctl start dovecot sudo systemctl enable dovecot 编辑身份验证配置文件。 sudo nano /etc/dovecot/conf.d/10-auth.conf 取消对以下行的注释。 disable_plaintext_auth = yes 当没有SSL/TLS加密时,它将禁用明文身份验证。如果您想使用完整的电子邮件地址([email ;protected])登录,请在文件中添加以下行。 auth_username_format = %n 否则,您只能使用用户名登录(不使用@your domain.com)。接下来,找到下面这行。 auth_mechanisms = plain 这一行只启用普通身份验证机制。登录是您可能希望添加的另一种身份验证机制,以支持旧的电子邮件客户端。 auth_mechanisms = plain login 保存并关闭文件。然后编辑以下文件。 sudo nano /etc/dovecot/conf.d/10-master.conf 将service auth部分更改为以下内容,以便Postfix可以找到Dovecot身份验证服务器。 service auth { unix_listener /var/spool/postfix/private/auth { mode = 0660 user = postfix group = postfix } } 保存并关闭文件。重新启动Dovecot以使更改生效。 sudo systemctl restart dovecot 接下来,我们需要获得有效的TLS证书。我们可以很容易地从Let's Encrypt获得免费的TLS证书。发出以下命令,从EPEL存储库在CentOS 8/RHEL 8上安装Let's Encrypt client(certbot)。 sudo dnf install certbot 然后使用独立插件获取TLS证书(假设Postfix SMTP服务器上没有运行web服务器)。 sudo certbot certonly --standalone --agree-tos --email [email protected] -d mta1.yourdomain.com 过了一会儿,您应该会看到以下几行,这意味着证书已成功获得。您还可以查看证书存储的目录。 接下来,我们需要运行以下两个命令来指定后缀配置文件中TLS证书和私钥的位置。您的Let's Encrypt证书和私钥存储在/etc/letsencrypt/live/mta1下。你的领域。com/directory。 sudo postconf "smtpd_tls_cert_file = /etc/letsencrypt/live/mta1.your-domain.com/fullchain.pem" sudo postconf "smtpd_tls_key_file = /etc/letsencrypt/live/mta1.your-domain.com/privkey.pem" 重新启动Postfix以使更改生效。 sudo systemctl restart postfix 现在,您可以将SMTP客户端配置为使用mta1。你的地盘。com和端口587发送电子邮件。使用TLS加密类型和普通作为身份验证模式。您需要在SMTP服务器上创建电子邮件帐户。这很简单。使用adduser命令添加用户。 sudo adduser user1 然后为该用户设置密码。 sudo passwd user1 电子邮件地址将为[电子邮件 ;受保护]。 从邮件头中删除敏感信息 默认情况下,Postfix SMTP服务器将添加一个Received:电子邮件头,记录客户端的IP地址,这可能会泄露您网站的IP地址(如果它位于CDN后面)。你可以告诉Postfix忽略它。创建一个头检查文件。 sudo nano /etc/postfix/smtp_header_checks 将以下行放入文件中。 /^Received:/ IGNORE 保存并关闭文件。然后编辑后缀主配置文件。 sudo nano /etc/postfix/main.cf 在文件末尾添加以下行。 smtp_header_checks = regexp:/etc/postfix/smtp_header_checks 保存并关闭文件。然后运行以下命令重建哈希表。 sudo postmap /etc/postfix/smtp_header_checks 重新加载后缀以使更改生效。 sudo systemctl reload postfix 现在Postfix不会在邮件头中包含这些敏感信息。 自动更新TLS证书 您可以创建Cron作业来自动续订TLS证书。只需打开root用户的crontab文件。 sudo crontab -e 然后添加以下行。 @daily certbot renew --quiet 保存并关闭文件。 发送大量或大量电子邮件 您可以使用此SMTP服务器发送批量或批量电子邮件吗? 是的,但你应该只向合法订户发送批量电子邮件,也就是说,收件人应该已经注册了你的邮件列表。你不应该发送垃圾邮件(未经请求的批量电子邮件),否则你的SMTP服务器肯定会被列入黑名单。在发送大量电子邮件之前,我强烈建议遵循本文中的建议:如何阻止您的电子邮件被标记为垃圾邮件。 必须先发出STARTTLS命令 如果在邮件日志(/var/log/maillog)中看到以下错误,可能是因为在/etc/postfix/main中没有正确指定TLS证书。cf文件。 Must issue a STARTTLS command first (in reply to MAIL FROM command)) 结论 我希望本教程能帮助您在CentOS 8上为多个域设置Postfix仅发送SMTP服务器。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门。当心?
-
Postfix SMTP在单个VPS上具有多个IP轮换实例
本教程将向您展示如何在单个VPS(虚拟专用服务器)上设置多个具有IP轮换的Postfix SMTP服务器实例。 为什么要使用多个IP地址 如果你使用Mautic这样的自托管电子邮件营销软件发送大量电子邮件,那么使用多个IP地址来传播电子邮件流量是一个很好的做法。如果邮箱提供商观察到大量来自单个IP地址的电子邮件,则很可能被识别为垃圾邮件。为了保持良好的IP声誉,您需要降低从单个IP地址发送的电子邮件流量。 Kamatera是最好的Linux VPS托管提供商,它允许您在一台主机上拥有多个IP地址。VPS的起价为每月4美元,每个新IP地址的起价为每月1美元。按照下面链接的教程创建具有多个公共IP地址的Linux VPS服务器。 如何在Kamatera上创建Linux VPS服务器 接下来,您可以使用iRedMail在Kamatera VPS上快速设置电子邮件服务器。 如何使用iRedMail在Ubuntu20.04上轻松设置自己的邮件服务器 如何使用iRedMail在Debian 10上轻松设置自己的邮件服务器 如何使用iRedMail在CentOS 8上轻松设置自己的邮件服务器 完成后,回到这里设置Postfix多个IP轮换实例。 您应该使用多少IP地址发送电子邮件? 如果你有一万个电子邮件订户,一个IP地址就足够了。 如果你需要一次发送10万封电子邮件,我建议至少5个IP地址。 Postfix多实例的结构 Postfix SMTP服务器可以配置为在一台主机上运行多个实例。所有实例共享相同的程序文件,但对以下文件使用唯一的目录。 配置文件 假脱机/队列 数据 本教程向您展示了设置2个后缀实例的过程。您可以使用相同的过程来添加第三个、第四个、第五个……实例。 步骤1:设置多个后缀实例 运行以下命令初始化Postfix中的多实例。 sudo postmulti -e init 这将在/etc/postfix/main的底部添加以下两行。cf文件。 multi_instance_wrapper = ${command_directory}/postmulti -p -- multi_instance_enable = yes 接下来,创建一个新的后缀实例。 sudo postmulti -e create -I postfix-smtp1 哪里: -e:编辑模式 -I:实例名,必须以后缀-。 它会自动创建/etc/postfix-smtp1/目录,其中包括主目录。cf和main。cf文件。/etc/postfix-smtp1/main。cf文件的底部有以下几行。 readme_directory = no inet_protocols = ipv4 master_service_disable = inet authorized_submit_users = queue_directory = /var/spool/postfix-smtp1 multi_instance_name = postfix-smtp1 改变 master_service_disable = inet 到 master_service_disable = 因此postfix-smtp1实例可以绑定到TCP套接字。每个后缀实例必须具有以下两个参数的唯一值。 myhostname = inet_interfaces = 例如,主实例(/etc/postfix/main.cf)可以使用 myhostname = smtp.example.com inet_interfaces = 11.22.33.44 postfix-smtp1实例可以使用 myhostname = smtp01.example.com inet_interfaces = 11.22.33.55 因此,每个实例都有一个唯一的主机名,并绑定到不同的IP地址。如果在/etc/postfix/main中添加了其他自定义设置。cf文件,您可以将它们复制到/etc/postfix-smtp1/main。cf文件。建议将您的所有IP地址添加到mynetworks参数中。 /etc/postfix-smtp1/master。cf包含Postfix提供的股票内容。同样,您可以从/etc/postfix/master复制自定义设置。cf文件。 接下来,在队列目录下创建一个etc目录。 sudo mkdir -p /var/spool/postfix-smtp1/etc/ 从主实例复制文件。 sudo cp -r /var/spool/postfix/etc/* /var/spool/postfix-smtp1/etc/ 然后运行以下命令以启用postfix-smtp1实例。 sudo postmulti -i postfix-smtp1 -e enable 现在重新启动主实例。 sudo systemctl restart postfix 然后启动postfix-smtp1实例。 sudo postmulti -i postfix-smtp1 -p start 如果你的配置文件有重复的参数,这个命令会显示给你,你需要删除重复的参数。可能重复的参数包括: mynetworks = inet_protocols = 如果postfix-smtp1实例无法启动,请检查邮件日志文件(/var/log/mail.log或/var/log/maillog)以查看出现了什么问题。 如果你想阻止它,快跑 sudo postmulti -i postfix-smtp1 -p stop 要重新加载配置文件,请运行 sudo postmulti -i postfix-smtp1 -p reload 要列出postfix-smtp1实例的邮件队列,请运行 sudo postqueue -c /etc/postfix-smtp1/ -p 请注意,sudo systemctl restart postfix命令只会重新启动主实例。要列出所有后缀实例,请运行 sudo postmulti -l -a 运行以下命令以检查Postfix是否正在侦听正确的IP地址。 sudo ss -lnpt | grep master 第2步:设置DNS负载平衡 您可以为VPS使用单独的主机名,并为主机名创建两个DNS a记录。这被称为DNS负载平衡。 然后将SMTP客户端(例如自托管电子邮件营销应用程序)配置为使用主机名。它将以循环方式尝试这两个IP地址。 3.设置防火墙 默认情况下,服务器有一个默认网关,它总是使用网关IP地址连接到其他服务器。为了实现更好的电子邮件交付,我们需要做到以下几点。 如果SMTP客户端连接到VPS上的第一个IP地址,则VPS应使用第一个IP地址发送电子邮件。 如果SMTP客户端连接到VPS上的第二个IP地址,则VPS应使用第二个IP地址发送电子邮件。 为了实现这一点,我们需要在服务器防火墙中配置SNAT(源NAT)。SNAT更改源IP地址。 Linux上有几种防火墙软件。以下是常见的。 iptables:Linux世界最著名的防火墙。 nftables:街区里的新孩子,应该取代iptables。 UFW:iptables的包装器,常见于Debian/Ubuntu服务器上。 Firewalld:iptables/nftables的包装器,常见于RHEL、CentOS、Rocky Linux和Alma Linux服务器上。 iptables 如果使用iptables,则需要运行以下两个命令来设置SNAT。 sudo iptables -t nat -A POSTROUTING -s 11.22.33.44 -p tcp --dport 25 -j SNAT --to-source 11.22.33.44 sudo iptables -t nat -A POSTROUTING -s 11.22.33.55 -p tcp --dport 25 -j SNAT --to-source 11.22.33.55 这意味着 如果连接来自第一个IP地址,则将其用作源IP地址。收件人的SMTP服务器会认为电子邮件来自第一个IP地址。 如果连接来自第二个IP地址,则将其用作源IP地址。收件人的SMTP服务器会认为电子邮件来自第二个IP地址。 UFW 如果使用UFW防火墙,请编辑/etc/UFW/before。规则文件。 sudo nano /etc/ufw/before.rules 在该文件底部添加以下行。根据需要更换IP地址。 # NAT table rules *nat :POSTROUTING ACCEPT [0:0] -A POSTROUTING -s 11.22.33.44 -p tcp --dport 25 -j SNAT --to-source 11.22.33.44 -A POSTROUTING -s 11.22.33.55 -p tcp --dport 25 -j SNAT --to-source 11.22.33.55 # End each table with the 'COMMIT' line or these rules won't be processed COMMIT 保存并关闭文件。然后重启UFW。 sudo systemctl restart ufw 防火墙 如果使用Firewalld,则运行以下两个命令来设置SNAT。根据需要更换IP地址。 sudo firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -s 11.22.33.44 -p tcp --dport 25 -j SNAT --to-source 11.22.33.44 sudo firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 1 -s 11.22.33.55 -p tcp --dport 25 -j SNAT --to-source 11.22.33.55 重新加载Firewalld以使更改生效。 sudo systemctl reload firewalld 步骤4:为每个IP地址添加PTR记录 Kamatera不允许您在控制面板中编辑PTR记录。相反,你需要打开一张支持票,告诉他们为你添加PTR记录。你可能会想,这并不方便,但这是为了让垃圾邮件发送者远离平台,因此像我们这样的合法电子邮件发送者将拥有良好的IP声誉。 步骤5:配置SMTP身份验证 现在我们需要为postfix-smtp1 postfix实例配置SMTP身份验证。 sudo nano /etc/postfix-smtp1/master.cf 在此文件中添加以下行,以便SMTP客户端可以在TCP端口587上进行身份验证并提交发送的电子邮件。 submission inet n - n - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject -o content_filter=smtp-amavis:[127.0.0.1]:10026 保存并关闭文件。然后停止postfix-smtp01实例。 sudo postmulti -i postfix-smtp1 -p stop 然后重新开始。 sudo postmulti -i postfix-smtp1 -p start 第5步:测试 现在你可以发送测试邮件,看看它是否有效。 故障排除 如果您没有使用iRedMail,并且在邮件日志中看到以下错误(/var/log/mail.log或/var/log/maillog) postfix/submission/smtpd[4125]: warning: SASL: Connect to private/auth failed: No such file or directory postfix/submission/smtpd[4125]: fatal: no SASL authentication mechanisms 然后,需要为postfix-smtp1实例配置一个单独的Dovecot SMTP验证套接字。 sudo nano /etc/dovecot/conf.d/10-master.conf 您的服务验证部分可能如下所示: service auth { unix_listener /var/spool/postfix/private/auth { mode = 0660 user = postfix group = postfix } } 您需要为postfix-smtp1实例添加一个新的unix_侦听器,该实例使用/var/spool/postfix-smp1/目录作为spool目录。 service auth { unix_listener /var/spool/postfix/private/auth { mode = 0660 user = postfix group = postfix } unix_listener /var/spool/postfix-smtp1/private/auth { mode = 0660 user = postfix group = postfix } } 保存并关闭文件。然后重启多佛科特。 sudo systemctl restart dovecot 没有DKIM签名? 如果您使用OpenDKIM,但电子邮件中没有DKIM签名,那么您应该使用以下设置。 打开OpenDKIM配置文件。 sudo nano /etc/opendkim.conf 如果您的文件有下面这样一行,那么OpenDKIM正在使用Unix套接字接受来自Postfix的连接。 Socket local:/var/spool/postfix/opendkim/opendkim.sock 评论一下。我们需要将OpenDKIM配置为使用TCP/IP套接字。 Socket inet:[email protected] 保存并关闭文件。接下来,编辑主菜单。每个Postfix实例的cf文件,在文件中添加以下行,以便Postfix将通过TCP/IP套接字连接到OpenDKIM。 # Milter configuration milter_default_action = accept milter_protocol = 6 smtpd_milters = inet:127.0.0.1:8891 non_smtpd_milters = $smtpd_milters 保存并关闭文件。然后重新启动每个后缀实例。 收尾 我希望本教程能帮助您在单个VPS上设置多个具有IP轮换的Postfix SMTP服务器实例。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门。当心?
-
运行OpenConnect VPN服务器;Apache/Nginx与HAProxy在同一个盒子上
本教程将向您展示如何使用HAProxy在同一个设备上运行OpenConnect VPN服务器(ocserv)和Apache/Nginx。OpenConnect(ocserv)是Cisco AnyConnect VPN协议的开源实现。 先决条件 为了学习本教程,假设您已经使用Let's Encrypt TLS server证书设置了OpenConnect VPN服务器。如果没有,请遵循以下教程之一。 在Ubuntu20.04上用Let's Encrypt设置OpenConnect VPN服务器(ocserv) 使用Let's Encrypt在Ubuntu 16.04/18.04上设置OpenConnect VPN服务器(ocserv) 使用Let's Encrypt在Debian 10 Buster上设置OpenConnect VPN服务器(ocserv) 使用Let's Encrypt在CentOS 8/RHEL 8上设置OpenConnect VPN服务器(ocserv) 使OpenConnect VPN服务器和web服务器同时使用端口443 默认情况下,OpenConnect VPN服务器监听端口443。如果您已经让Apache/Nginx监听端口443,那么ocserv无法绑定到端口443。您可以将ocserv配置为在另一个端口上侦听,但这将要求最终用户在客户端软件中指定端口,如果您关心用户体验,应该避免使用该端口。此外,TCP端口443上的TLS流量通常在QoS(服务质量)方面享有更高的优先级,因此您将有更好的速度。 通常一个端口只能由一个进程使用。但是,我们可以使用HAproxy(高可用性代理)和SNI(服务器名称指示)使ocserv和Apache/Nginx同时使用端口443。 Ocserv配置 首先,编辑ocserv配置文件。 sudo nano /etc/ocserv/ocserv.conf 取消对以下行的注释。这将允许ocserv获取客户端IP地址,而不是HAproxy IP地址。 listen-proxy-proto = true 然后找到下面一行。 #listen-host = [IP|HOSTNAME] 换成 listen-host = 127.0.0.1 这将使ocserv监听127.0.0.1,因为稍后HAproxy将需要监听公共IP地址。保存并关闭文件。然后重启ocserv。 sudo systemctl restart ocserv 接下来,我们还需要让web服务器只监听本地主机,而不是监听公共IP地址。 Nginx配置 如果使用Nginx,请编辑服务器块文件。 sudo nano /etc/nginx/conf.d/example.com.conf 在SSL服务器块中,找到以下指令。 listen 443 ssl; 换成 listen 127.0.0.2:443 ssl; 这一次我们让它在127.0.0.2:443上收听,因为127.0.0.1:443已经被ocserv占用。保存并关闭文件。Nginx主配置文件/etc/Nginx/Nginx。conf和默认的server block/etc/nginx/sites enabled/default可能包括一个默认的虚拟主机监听443,所以您可能也需要编辑这个文件。 然后重新启动Nginx。 sudo systemctl restart nginx Apache配置 如果使用Apache web服务器,请编辑虚拟主机文件。 Debian/Ubuntu sudo nano /etc/apache2/sites-enabled/example.com.conf 森托斯/瑞尔 sudo nano /etc/httpd/conf.d/example.com.conf 在SSL虚拟主机中,更改 <VirtualHost *:443> 到 <VirtualHost 127.0.0.2:443> 这一次我们让它在127.0.0.2:443上收听,因为127.0.0.1:443已经被ocserv占用。保存并关闭文件。 然后编辑/etc/apache2/端口。Debian/Ubuntu上的conf文件。 sudo nano /etc/apache2/ports.conf 编辑/etc/httpd/conf.d/ssl。CentOS/RHEL上的conf文件。 sudo nano /etc/httpd/conf.d/ssl.conf 改变 Listen 443 到 Listen 127.0.0.2:443 保存并关闭文件。重启Apache。 sudo systemctl restart apache2 或 sudo systemctl restart httpd 单倍体构型 现在安装HAproxy。 sudo apt install haproxy 或 sudo dnf install haproxy 开始HAProxy sudo systemctl start haproxy 编辑配置文件。 sudo nano /etc/haproxy/haproxy.cfg 如果使用Nginx,请将以下行复制并粘贴到文件末尾。将12.34.56.78替换为服务器的公共IP地址。替换vpn。实例com和ocserv和www.example使用的域名。com与您的web服务器使用的域名。 frontend https bind 12.34.56.78:443 mode tcp tcp-request inspect-delay 5s tcp-request content accept if { req_ssl_hello_type 1 } use_backend ocserv if { req_ssl_sni -i vpn.example.com } use_backend nginx if { req_ssl_sni -i www.example.com } use_backend nginx if { req_ssl_sni -i example.com } default_backend ocserv backend ocserv mode tcp option ssl-hello-chk # pass requests to 127.0.0.1:443. Proxy protocol (v2) header is required by ocserv. server ocserv 127.0.0.1:443 send-proxy-v2 backend nginx mode tcp option ssl-hello-chk server nginx 127.0.0.2:443 check 如果使用Apache,请将以下行复制并粘贴到文件末尾。将12.34.56.78替换为服务器的公共IP地址。替换vpn。实例com和ocserv和www.example使用的域名。com与您的web服务器使用的域名。 frontend https bind 12.34.56.78:443 mode tcp tcp-request inspect-delay 5s tcp-request content accept if { req_ssl_hello_type 1 } use_backend ocserv if { req_ssl_sni -i vpn.example.com } use_backend apache if { req_ssl_sni -i www.example.com } use_backend apache if { req_ssl_sni -i example.com } default_backend ocserv backend ocserv mode tcp option ssl-hello-chk # pass requests to 127.0.0.1:443. Proxy protocol (v2) header is required by ocserv. server ocserv 127.0.0.1:443 send-proxy-v2 backend apache mode tcp option ssl-hello-chk server apache 127.0.0.2:443 check 保存并关闭文件。然后重启HAproxy。 sudo systemctl restart haproxy 在上面的配置中,我们利用TLS中的SNI(服务器名称指示)功能来区分VPN流量和正常HTTPS流量。 当vpn。实例com位于TLS客户端Hello,HAProxy将流量重定向到ocserv后端。 当www.example。com位于TLS客户端Hello,HAProxy将流量重定向到apache/nginx后端。 如果客户端没有在TLS client Hello中指定服务器名称,那么HAproxy将使用默认后端(ocserv)。 您可以使用openssl工具测试此设置。首先,多次运行以下命令。 echo | openssl s_client -connect your-server-IP:443 | grep subject 我们没有在上面的命令中指定服务器名称,因此HAproxy将始终将请求传递到默认后端(ocserv),其证书将发送到客户端。接下来,运行以下两个命令。 echo | openssl s_client -servername www.example.com -connect your-server-IP:443 | grep subject echo | openssl s_client -servername vpn.example.com -connect your-server-IP:443 | grep subject 现在,我们在命令中指定了服务器名称,因此HAproxy将根据我们定义的SNI规则传递请求。请注意,Cisco AnyConnect应用程序不支持TLS SNI,因此最好在HAProxy配置文件中将ocserv设置为默认后端。 为您的网站续订Let's Encrypt证书时,建议您使用http-01质询而不是tls-alpn-01质询,因为HAproxy正在侦听公共IP地址的端口443,因此它可能会干扰续订过程。 sudo certbot renew --preferred-challenges http-01 修正单极性误差 如果您的Apache/Nginx网站没有显示在浏览器中,而您在haproxy日志(/var/log/haproxy.log)中看到以下消息 Server nginx/nginx is DOWN, reason: Socket error, info: "Connection reset by peer backend nginx has no server available! Layer6 invalid response 可能是您的后端Nginx web服务器正在使用带有OCSP扩展的TLS证书。Nginx不会在第一个HTTP请求时发送OCSP订书钉信息。要使其正常工作,请确保在Nginx虚拟主机配置中添加解析程序,如下所示。 { .... ssl_trusted_certificate /etc/letsencrypt/live/www.example.com/chain.pem; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8; .... } 保存并关闭文件。然后重新启动Nginx。 sudo systemctl restart nginx 此外,考虑删除HAproxy后端服务器的健康检查。所以改变 server nginx 127.0.0.2:443 check 到 server nginx 127.0.0.2:443 保存并关闭文件。然后重启HAproxy。 sudo systemctl restart haproxy 如何使用HAProxy在ocserv中启用IPv6 首先,为vpn创建AAAA记录。实例因此,当您在ocserv中完成IPv6设置后,DNS记录应该传播到Internet。 测试IPv6连接 要在IPv6协议中建立VPN隧道,请确保VPN服务器具有公共IPv6地址。(VPN客户端不必具有公共IPv6地址。)要找到答案,请运行以下命令。 ip addr 找到主网络接口。如果你能找到iNet 6。。。。范围全局行,如下图所示,则您有一个公共IPv6地址。带有作用域链接的inet6地址是专用IPv6地址。 那就去https://test-ipv6.com/检查你的IPv6连接。如果VPN客户端有一个公共IPv6地址,它可能会告诉您,您的VPN只保护一个协议,而不是两个协议。那是因为我们没有在ocserv中启用IPv6。 在ocserv中启用IPv6 要在ocserv中启用IPv6,请编辑ocserv配置文件。 sudo nano /etc/ocserv/ocserv.conf 找到下面两行并取消注释,这样VPN客户端将获得专用IPv6地址。 ipv6-network = fda9:4efe:7e3b:03ea::/48 ipv6-subnet-prefix = 64 如果你看到下面这行 ipv6-network = fda9:4efe:7e3b:03ea::/64 请将其更改为: ipv6-network = fda9:4efe:7e3b:03ea::/48 保存并关闭文件。重新启动ocserv以使更改生效。 sudo systemctl restart ocserv 为IPv6启用IP转发 然后我们需要在Linux内核中为IPv6启用IP转发。编辑sysctl。conf文件。 sudo nano /etc/sysctl.conf 在该文件末尾添加以下行。 net.ipv6.conf.all.forwarding=1 保存并关闭文件。然后使用下面的命令应用更改。 sudo sysctl -p 在防火墙中设置IPv6(Debian、Ubuntu) 接下来,我们需要在UFW防火墙中设置IPv6伪装,以便服务器成为VPN客户端的虚拟路由器。 sudo nano /etc/ufw/before6.rules 默认情况下,过滤器表有一些规则。在该文件末尾添加以下行。将ens3替换为您自己的网络接口名称。在Nano文本编辑器中,按Ctrl+W,然后按Ctrl+V,可以转到文件的末尾。 # NAT table rules *nat :POSTROUTING ACCEPT [0:0] -A POSTROUTING -o ens3 -j MASQUERADE # End each table with the 'COMMIT' line or these rules won't be processed COMMIT 默认情况下,UFW禁止数据包转发。我们可以允许我们的专用IPv6网络进行转发。在该文件中找到ufw6 before forward链,并添加以下3行,如果源IP或目标IP在fda9:4efe:7e3b:03ea::/48范围内,这3行将接受数据包转发。 # allow forwarding for VPN -A ufw6-before-forward -s fda9:4efe:7e3b:03ea::/48 -j ACCEPT -A ufw6-before-forward -d fda9:4efe:7e3b:03ea::/48 -j ACCEPT 保存并关闭文件。我们还需要在防火墙的输入链中允许IPv6 VPN客户端。 sudo ufw allow in from fda9:4efe:7e3b:03ea::/48 重新启动UFW以使更改生效。 sudo systemctl restart ufw 现在,如果使用以下命令列出NAT表的后路由链中的规则: sudo ip6tables -t nat -L POSTROUTING 你可以看到化装规则。 断开当前VPN连接,为VPN添加AAAA记录。实例com并重新建立VPN连接。那就去https://test-ipv6.com/检查你的IPv6连接。 在防火墙中设置IPv6(CentOS) 为IPv6启用伪装。 sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv6" source address="fda9:4efe:7e3b:03ea::/48" masquerade' 允许在输入链中使用VPN客户端。 sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv6" source address="fda9:4efe:7e3b:03ea::/48" accept' 重新加载firewalld以使更改生效。 sudo systemctl reload firewalld 在绑定解析器中配置IPv6 如果在VPN服务器上运行自己的绑定DNS解析器,可以在/etc/ocserv/ocserv中添加以下行。conf文件,将VPN服务器设置为VPN客户端的DNS解析程序。 dns = fda9:4efe:7e3b::1 保存并关闭文件。要在IPv6中查询DNS名称,我们需要将BIND配置为允许IPv6 VPN客户端。 Debian/Ubuntu sudo nano /etc/bind/named.conf.options 找到allow recursion参数并将其更改为: allow-recursion { 127.0.0.1; 10.10.10.0/24; fda9:4efe:7e3b:03ea::/48; }; 保存并关闭文件。重新启动BIND9。 sudo systemctl restart bind9 森托斯 sudo nano /etc/named.conf 找到allow query参数并将其更改为: allow-query { 127.0.0.1; 10.10.10.0/24; fda9:4efe:7e3b:03ea::/48; }; 保存并关闭文件。重新启动BIND9。 sudo systemctl restart named 在HAProxy中设置IPv6 编辑HAProxy配置文件。 sudo nano /etc/haproxy/haproxy.cfg 让https前端同时监听IPv4和IPv6地址。显然,您需要使用自己服务器的公共IPv6地址。 frontend https bind 12.34.56.78:443 bind 2607:f8b0:4006:810::200e:443 mode tcp tcp-request inspect-delay 5s tcp-request content accept if { req_ssl_hello_type 1 } 然后找到ocserv后端并添加IPv6服务器。 backend ocserv mode tcp option ssl-hello-chk server ocserv 127.0.0.1:443 send-proxy-v2 server ocserv6 [::1]:443 send-proxy-v2 保存并关闭文件。 要使ocserv同时在127.0.0.1和::1上侦听,请编辑/etc/hosts文件。 sudo nano /etc/hosts 编辑127.0.0.1和::1的条目,如下所示,这样vpn。实例com主机名可以解析为两个地址。 127.0.0.1 localhost vpn.example.com ::1 ip6-localhost ip6-loopback vpn.example.com 保存并关闭文件。然后编辑ocserv配置文件。 sudo nano /etc/ocserv/ocserv.conf 找到下面这行。 listen-host = 127.0.0.1 换成 listen-host = vpn.example.com ocserv将查找vpn的IPv4和IPv6地址。实例com,并绑定到127.0.0.1和::1地址。保存并关闭文件。然后重启ocserv和HAProxy sudo systemctl restart ocserv sudo systemctl restart haproxy 现在运行以下命令来检查ocserv的监听状态。您将看到它同时在127.0.0.1和::1上收听。 sudo ss -lnpt | grep ocserv 测试IPv6连接 重新启动VPN客户端并转到https://test-ipv6.com/检查你的IPv6连接。如果一切顺利,您应该在测试结果中看到VPN服务器的IPv4和IPv6地址。“VPN只保护一个协议”的警告应该消失。 如果在测试结果中看不到VPN服务器的IPv6地址,可能需要重新启动VPN客户端并重新建立VPN连接。 注意:VPN客户端不必具有公共IPv6地址。它可以通过IPv4 VPN隧道使用IPv6。 收尾 我希望本教程能帮助您在同一台机器上运行OpenConnect VPN服务器和Apache/Nginx。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门。当心?
-
如何修复常见的Nginx Web服务器错误
Nginx是当今非常流行的web服务器。本文将向您展示运行Nginx web服务器时的一些常见错误以及可能的解决方案。这不是一个完整的列表。如果在尝试建议的解决方案后仍然无法修复错误,请检查/var/log/Nginx/目录下的Nginx服务器日志,并在谷歌上搜索以调试问题。 无法连接/拒绝连接 如果在尝试访问网站时看到以下错误: Firefox can’t establish a connection to the server at www.example.com 或 www.example.com refused to connect 或 The site can't be reached, www.example.com unexpectedly closed the connection. 可能是这样 Nginx没有运行。您可以使用sudo systemctl status Nginx检查Nginx状态。使用sudo systemctl Start Nginx启动Nginx。如果Nginx无法启动,请运行sudo Nginx-t以查看配置文件是否有任何问题。并查看日志(sudo journalctl-eu nginx),找出它无法启动的原因。 防火墙阻止端口80和443。如果在Debian/Ubuntu上使用UFW防火墙,请运行sudo UFW allow 80443/tcp以打开tcp端口80和443。如果在RHEL/CentOS/Rocky Linux/AlmaLinux上使用Firewalld,请运行sudo firewall cmd--permanent--add service={http,https},然后sudo systemctl重新加载Firewalld以打开TCP端口80和443。 失败2本。如果您的服务器使用fail2ban阻止恶意请求,则可能是fail2ban禁止了您的IP地址。运行sudo journalctl-eu fail2ban检查您的IP地址是否被禁止。您可以将您的IP地址添加到fail2ban ignoreip列表中,这样就不会再次被禁止。 Nginx没有在正确的网络接口上监听。例如,Nginx没有监听服务器的公共IP地址。 连接已超时 这可能意味着您的服务器处于脱机状态,或者Nginx无法正常工作。我曾经有过一个内存不足的问题,这导致Nginx无法生成工作进程。如果您可以在/var/log/nginx/error中看到以下错误消息。日志文件,服务器内存不足。 fork() failed while spawning "worker process" (12: Cannot allocate memory) 404找不到 404找不到意味着Nginx找不到您的web浏览器要求的资源。原因可能是: 服务器上不存在web根目录。在Nginx中,web roor目录是使用root指令配置的,如下所示:root/usr/share/Nginx/linuxbabe。com/;。确保您的网站文件(HTML、CSS、JavaScript、PHP)存储在正确的目录中。 PHP-FPM没有运行。您可以使用sudo systemctl status php7检查PHP-FPM状态。4-fpm(Debian/Ubuntu)或sudo systemctl status php fpm。 您忘记包含try_文件$uri/索引。php$is_args$args;Nginx服务器配置文件中的指令。处理PHP代码需要此指令。 您的服务器没有可用磁盘空间。试着释放一些磁盘空间。您可以使用ncdu实用程序(sudo-apt-install-ncdu或sudo-dnf-install-ncdu)找出哪些目录占用了大量磁盘空间。 403禁止 此错误意味着不允许您访问请求资源。可能的情况包括: 网站管理员通过IP白名单或其他方法阻止公众访问请求的资源。 该网站可能使用ModSecurity等web应用程序防火墙,该防火墙检测到入侵攻击,因此阻止了请求。 发生403时,某些web应用程序可能会显示不同的错误消息。它可能会告诉您“安全连接失败”,而原因是相同的。 500内部服务器错误 这意味着web应用程序中存在一些错误。可能是这样 数据库服务器已关闭。使用sudo systemctl status MySQL检查MySQL/MariaDB状态。用sudo systemctl Start mysql启动它。运行sudo journalctl-eu mysql,找出它无法启动的原因。MySQL/MariaDB进程可能因内存不足而被终止。 您没有将Nginx配置为使用PHP-FPM,因此Nginx不知道如何执行PHP代码。 如果web应用程序具有内置缓存,则可以尝试刷新应用缓存以修复此错误。 您的web应用程序可能会生成自己的错误日志。检查此日志文件以调试此错误。 您的web应用程序可能具有调试模式。打开它,您将在网页上看到更详细的错误消息。例如,通过在/srv/Modoboa/instance/instance/settings中设置DEBUG=True,可以在Modoboa邮件服务器托管平台中打开调试模式。py文件。 PHP-FPM可能会过载。检查PHP-FPM日志(例如/var/log/php7.4-FPM.log)。如果您发现[pool www]似乎很忙(您可能需要增加pm.start_服务器或pm.min/max_spare_服务器)警告消息,则需要为PHP-FPM分配更多资源。 有时重新加载PHP-FPM(sudo systemctl reload php7.4-FPM)可以修复错误。 Nginx显示默认页面 如果您试图设置Nginx虚拟主机,并且在web浏览器中键入域名时,会显示默认的Nginx页面,它可能是 您在Nginx虚拟主机中的server_name指令没有使用真实的域名。 你忘了重新加载Nginx。 页面没有正确重定向 Firefox显示此错误,因为页面没有正确重定向。Google Chrome将此错误显示为www.example。com重定向了你太多次。 这意味着您配置Nginx重定向的次数过多。例如,您可能在https服务器块中添加了一个不必要的return 301指令,以将HTTP重定向到https连接。 如果已经设置了页面缓存,比如Nginx FastCGI缓存,则需要清除服务器页面缓存。 504网关超时 这意味着像PHP-FPM/MySQL/MariaDB这样的上游服务器无法足够快地处理请求。您可以尝试重新启动PHP-FPM以暂时修复错误,但最好开始调优PHP-FPM/MySQL/MariaDB以获得更快的性能。 以下是my/etc/mysql/mariadb中的InnoDB配置。conf.d/50-server。cnf文件。这是一个非常简单的性能调整。 innodb_buffer_pool_size = 1024M innodb_buffer_pool_dump_at_shutdown = ON innodb_buffer_pool_load_at_startup = ON innodb_log_file_size = 512M innodb_log_buffer_size = 8M #Improving disk I/O performance innodb_file_per_table = 1 innodb_open_files = 400 innodb_io_capacity = 400 innodb_flush_method = O_DIRECT innodb_read_io_threads = 64 innodb_write_io_threads = 64 innodb_buffer_pool_instances = 3 哪里: InnoDB缓冲池大小至少需要为RAM的一半。(对于具有少量RAM的VP,我建议将缓冲池大小设置为较小的值,如400M,否则VP将耗尽RAM。) InnoDB日志文件大小需要为缓冲池大小的25%。 将读IO线程和写IO线程设置为最大值(64),然后 让MariaDB使用3个InnoDB缓冲池实例。实例数必须与系统上的CPU核数相同。 保存更改后,重新启动MariaDB。 sudo systemctl restart mariadb 您还可以在Nginx中设置更长的超时值,以减少网关超时的机会。编辑Nginx虚拟主机文件,并在服务器{…}中添加以下行块 proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; send_timeout 600; 如果将Nginx与PHP-FPM结合使用,那么将fastcgi_read_timeout设置为更大的值,比如300秒。默认值为60秒。 location ~ /.php$ { try_files $uri /index.php$is_args$args; include snippets/fastcgi-php.conf; fastcgi_split_path_info ^(.+/.php)(/.+)$; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_read_timeout 300; } 然后重新加载Nginx。 sudo systemctl reload nginx PHP-FPM也有每个脚本的最大执行时间。编辑php。ini文件。 sudo nano /etc/php/7.4/fpm/php.ini 可以将该值增加到300秒。 max_execution_time = 300 然后重启PHP-FPM sudo systemctl restart php7.4-fpm 内存耗尽 如果您在Nginx错误日志中看到以下行,则表示PHP达到了128MB内存限制。 PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 57134520 bytes) 你可以编辑php。ini文件(/etc/php/7.4/fpm/php.ini),并增加php内存限制。 memory_limit = 512M 然后重启PHP7。4-FPM。 sudo systemctl restart php7.4-fpm 如果错误仍然存在,那么很可能是web应用程序中的坏PHP代码消耗了大量RAM。 PR_END_文件错误 您已将Nginx配置为将HTTP请求重定向到HTTPS,但Nginx中没有服务HTTPS请求的服务器块。 也许Nginx没有运行? 有时,主Nginx二进制文件正在运行,但辅助进程可能会由于各种原因而失败并退出。检查要调试的Nginx错误日志(/var/log/Nginx/error.log)。 PHP-FPM上游超时 有些人可以在Nginx错误日志文件(在/var/log/Nginx/下)中找到以下错误。 [error] 7553#7553: *2234677 upstream timed out (110: Connection timed out) while reading response header from upstream 可能的解决方案: 重新启动PHP-FPM。 升级内存。 资源暂时不可用 有些人可以在Nginx错误日志文件(在/var/log/Nginx/下)中找到以下错误。 connect() to unix:/run/php/php7.4-fpm.sock failed (11: Resource temporarily unavailable) 这通常意味着你的网站有很多访问者,PHP-FPM无法处理大量的请求。您可以调整PHP-FPM子进程的数量,以便它可以处理更多请求。 编辑PHP-FPM www.conf文件。(文件路径因Linux发行版而异。) sudo /etc/php/7.4/fpm/pool.d/www.conf 默认的子进程配置如下所示: pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 上述配置意味着 PHP-FPM动态创建子进程。没有固定数量的子进程。 它最多创建5个子进程。 PHP-FPM启动时启动2个子进程。 至少有一个空闲进程。 最多有3个空闲进程。 默认设置基于没有太多资源的服务器,比如只有1GB RAM的服务器。如果你有一个高流量的网站,你可能想增加子进程的数量,这样它就可以满足更多的请求。 pm = dynamic pm.max_children = 20 pm.start_servers = 8 pm.min_spare_servers = 4 pm.max_spare_servers = 12 确保有足够的RAM来运行更多的子进程。保存并关闭文件。然后重启PHP-FPM。(您可能需要更改版本号。) sudo systemctl restart php7.4-fpm 要监视PHP-FPM的运行状况,可以启用状态页面。在PHP-FPM www.conf文件中找到以下行。请注意: ;pm.status_path = /status 删除分号以启用PHP-FPM状态页。然后重启PHP-FPM。 sudo systemctl restart php7.4-fpm 然后编辑Nginx虚拟主机文件。添加以下行。allow和deny指令用于限制访问。只有白名单上的IP地址才能访问状态页面。 location ~ ^/(status|ping)$ { allow 127.0.0.1; allow your_other_IP_Address; deny all; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_index index.php; include fastcgi_params; #fastcgi_pass 127.0.0.1:9000; fastcgi_pass unix:/run/php/php7.4-fpm.sock; } 保存并关闭文件。然后测试Nginx配置。 sudo nginx -t 如果测试成功,请重新加载Nginx以使更改生效。 sudo systemctl reload nginx PHP-FPM状态页面示例。 PHP-FPM www.conf文件很好地解释了每个参数的含义。 如果PHP-FPM非常忙,无法立即为请求提供服务,它将对该请求进行排队。默认情况下,最多可以有511个未决请求,由侦听器决定。backlog参数。 listen.backlog = 511 如果您在PHP-FPM状态页面上看到以下值,则表示从未有请求放入队列,即您的PHP-FPM可以快速处理请求。 listen queue: 0 max listen queue: 0 如果队列中有511个挂起的请求,这意味着您的PHP-FPM非常繁忙,因此您应该增加子进程的数量。 您可能还需要更改Linux内核网络。果心somaxconn设置,它定义了Linux上套接字文件(如PHP-FPM Unix套接字文件)允许的最大连接数。默认情况下,其值在内核5.4之前为128,从内核5.4开始为4096。 [email protected]:~$ sysctl net.core.somaxconn net.core.somaxconn = 128 如果你经营一个高流量的网站,你可以使用一个大的价值。编辑/etc/sysctl。conf文件。 sudo nano /etc/sysctl.cnf 添加以下两行。 net.core.somaxconn = 20000 net.core.netdev_max_backlog = 65535 保存并关闭文件。然后应用设置。 sudo sysctl -p 注意:如果您的服务器有足够的RAM,您可以为PHP-FPM分配固定数量的子进程,如下所示。根据我的经验,这修复了Joomla+Virtuemart网站的500个内部错误。 pm = static pm.max_children = 50 同一网站的两个虚拟主机文件 如果运行sudo nginx-t并看到以下警告。 nginx: [warn] conflicting server name "example.com" on [::]:443, ignored nginx: [warn] conflicting server name "example.com" on 0.0.0.0:443, ignored 这意味着有两个虚拟主机文件包含相同的服务器名称配置。不要为一个网站创建两个虚拟主机文件。 对等端重置PHP-FPM连接 Nginx错误日志文件显示以下消息。 recv() failed (104: Connection reset by peer) while reading response header from upstream 这可能是由于重新启动PHP-FPM造成的。如果您自己手动重新启动,则可以忽略此错误。 Nginx插座泄漏 如果在/var/log/nginx/error中发现以下错误消息。日志文件,您的Nginx存在套接字泄漏问题。 2021/09/28 13:27:41 [alert] 321#321: *120606 open socket #16 left in connection 163 2021/09/28 13:27:41 [alert] 321#321: *120629 open socket #34 left in connection 188 2021/09/28 13:27:41 [alert] 321#321: *120622 open socket #9 left in connection 213 2021/09/28 13:27:41 [alert] 321#321: *120628 open socket #25 left in connection 217 2021/09/28 13:27:41 [alert] 321#321: *120605 open socket #15 left in connection 244 2021/09/28 13:27:41 [alert] 321#321: *120614 open socket #41 left in connection 245 2021/09/28 13:27:41 [alert] 321#321: *120631 open socket #24 left in connection 255 2021/09/28 13:27:41 [alert] 321#321: *120616 open socket #23 left in connection 258 2021/09/28 13:27:41 [alert] 321#321: *120615 open socket #42 left in connection 269 2021/09/28 13:27:41 [alert] 321#321: aborting 你可以重启操作系统来解决这个问题。如果不起作用,您需要编译一个调试版本的Nginx,它会在日志中显示调试信息。 Cloudflare错误 如果您的网站运行在Cloudflare CDN(内容交付网络)之后,以下是一些常见错误和解决方案。 521网络服务器关闭 Nginx没有运行。 您没有在防火墙中打开TCP端口80和443。 您更改了服务器IP地址,但忘记在Cloudflare中更新DNS记录。 页面没有正确重定向 如果您在SSL/TLS应用程序上的SSL设置设置为“灵活”,但您的源服务器配置为将HTTP请求重定向到HTTPS,则您的Nginx服务器会以加密连接将响应发送回Cloudflare。由于Cloudflare需要HTTP流量,因此它会不断重新发送相同的请求,从而导致重定向循环。在这种情况下,您需要在Cloudflare设置中使用完整(严格)SSL/TLS选项。 收尾 我希望本文能帮助您修复常见的Nginx web服务器错误。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门?