我有我的服务器上运行的iptables阻止除我允许的所有端口上的访问。 其中一个端口需要在端口25上使用SMTP,并且我有以下规则:
-A INPUT -p tcp --dport 25 -j ACCEPT
iptables -L
的输出如下:
Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere REJECT all -- anywhere 127.0.0.0/8 reject-with icmp-port-unreachable ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:http ACCEPT tcp -- anywhere anywhere tcp dpt:https ACCEPT tcp -- anywhere anywhere tcp dpt:mysql ACCEPT tcp -- anywhere anywhere tcp dpt:smtp ACCEPT tcp -- anywhere anywhere tcp dpt:pop3 ACCEPT tcp -- anywhere anywhere tcp dpt:imap2 ACCEPT tcp -- anywhere anywhere tcp dpt:ssmtp ACCEPT tcp -- anywhere anywhere tcp dpt:submission ACCEPT tcp -- anywhere anywhere tcp dpt:imaps ACCEPT tcp -- anywhere anywhere tcp dpt:pop3s ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh ACCEPT icmp -- anywhere anywhere LOG all -- anywhere anywhere limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: " DROP all -- anywhere anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination DROP all -- anywhere anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere
但是,当我尝试从Windows控制台执行telnet <myip> 25
,出现此错误:
Connecting To <my ip>...Could not open connection to the host, on port 25: Connect failed
在其他开放的端口(80,993等)做相同的工作正常。 所以它一定是一个iptables的问题。
使用iptables允许在端口25上访问SMTP的正确方法是什么?
因为你的input规则是以一个通用的接受规则开始的,所以你的其他规则都不会生效(因为iptables在第一个处理规则的基础上工作:链中处理数据包的第一个规则是最后一个处理规则,并且ACCEPT
目标是可处置的)。 你的第二个规则也是有问题的(阻止所有本地主机的stream量),但只是因为通常没有任何可信的理由来做到这一点。 在SSH端口上只接受新的,相关的或build立的数据包也是不常见的。
所有这一切说,你的规则正确接受SMTPstream量,所以问题确实是你没有运行SMTP。 Dovecot不是一个SMTP服务器; 考虑使用任何几个SMTP守护进程,如后缀。
如果有的话,对于你的127.0.0.0/8规则,如果你担心这个问题,指定你期望接收欺骗性本地主机数据包的input接口。