无法连接到 smtp 端口 567
我搭建了邮件服务器postfix+dovecot。
openssl s_client -starttls smtp -crlf -connect localhost:587
这有效并且能够手动发送电子邮件。
openssl s_client -starttls smtp -crlf -connect smtp.example.com:587
显示此错误
connect: Connection refused
connect:errno=61
我检查过的是netstat,iptables。
两者对于 587 提交来说看起来都运行良好。
网络状态-anutp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:465 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:58592 127.0.0.1:587 ESTABLISHED 2793/openssl
tcp 0 388 133.242.184.252:22 210.149.252.243:46415 ESTABLISHED -
tcp 0 0 127.0.0.1:587 127.0.0.1:58592 ESTABLISHED -
tcp6 0 0 :::22 :::* LISTEN -
udp 0 0 133.242.184.252:123 0.0.0.0:* -
udp 0 0 127.0.0.1:123 0.0.0.0:* -
udp 0 0 0.0.0.0:123 0.0.0.0:* -
udp6 0 0 :::123 :::* -
iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:http
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:https
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:3000
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
ACCEPT tcp -- anywhere anywhere tcp dpt:submission
ACCEPT tcp -- anywhere anywhere tcp dpt:pop3
ACCEPT tcp -- anywhere anywhere tcp dpt:smtp
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
还有其他我应该检查的点吗?
答案1
请记住,iptables 规则是读取从上到下。当您添加一条规则并将-A
其附加在末尾(或给定数字之后)时,使用时-I
它会插入到前面。
现在你基本上有:
- 接受 ICMP、HTTP、SSH……
- 拒绝一切
- 接受 SMTP、POP3
因此,您需要移动“接受 SMTP...”规则多于一律拒绝。
您可以删除它们并通过手动指定位置重新添加:
iptables-A 输入 7-p tcp… (或)iptables-I 输入 8-p tcp…
(用于iptables -L --line
查看规则编号。)
或者,立即编辑整个列表 – 只需交换各行即可:
iptables-save > rules.txt
nano rules.txt
iptables-restore < rules.txt
附注:
将来,如果您使用
iptables -S
或 甚至发布规则可能会更好iptables-save
;这比大量重新格式化的输出更容易扫描-L
。(或者两者兼而有之。)Dovecot 仅支持 POP/IMAP/LMTP,不支持 SMTP。您的 SMTP 服务器是 Postfix。
当使用
netstat
该-p
选项时,您应该以 root 身份运行该命令,否则它实际上不会显示任何进程信息。
答案2
Iptables 会按照规则出现的顺序依次尝试匹配规则。对于您的情况(正如评论中所说,请提供命令的结果iptables -S
,因为我们缺少iptables -L
匹配界面的信息)
- 如果数据包
state RELATED,ESTABLISHED
在接口上匹配?,它们被接受并且不再对这些数据包进行匹配; - 否则,如果数据包
icmp
在接口上匹配?它们被接受,并且不再对这些数据包进行匹配; - 否则,iptables 接受接口上的所有数据包?
- ....
因此,鉴于我们不知道在哪个接口上执行规则,我认为您的唯一 REJECT 规则(在 INPUT 表上)与您的tcp dpt:smtp
规则在同一个接口上匹配。由于您的 REJECT 规则匹配前您的 snmp 规则,最后一个永远不会匹配。
编辑写这篇文章太长了……