我的服务器上运行着 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
但是,当我尝试telnet <myip> 25
从 Windows 控制台执行操作时,出现此错误:
Connecting To <my ip>...Could not open connection to the host, on port 25:
Connect failed
在其他开放端口(80、993 等)上执行相同操作,没有问题。所以这肯定是 iptables 的问题。
使用 iptables 允许访问端口 25 上的 SMTP 的正确方法是什么?
答案1
由于您的输入规则以通用接受规则开头,因此您的其他规则都不会生效(因为 iptables 以第一处置规则为基础工作:链中以某种方式处置数据包的第一条规则将是最后处理的规则,并且目标ACCEPT
是处置性的)。您的第二条规则也值得怀疑(阻止所有本地主机流量),但只是因为通常没有任何可信的理由这样做。在 SSH 端口上专门只接受新的、相关的或已建立的数据包也是不寻常的。
尽管如此,您的规则正确地接受了 SMTP 流量,因此问题确实是您没有运行 SMTP。Dovecot 不是 SMTP 服务器;请考虑使用多个 SMTP 守护程序中的任何一个,例如 postfix。
如果有的话,对于您的 127.0.0.0/8 规则,请指定您期望接收欺骗的本地主机数据包的输入接口(如果您担心这一点)。