对端口 25 上的有限 IPv4 连接进行故障排除。
有 ipTables 规则:
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 185.121.228.0/24 anywhere
ACCEPT all -- 127.0.0.0/24 anywhere
ACCEPT tcp -- anywhere anywhere tcp dpt:smtp
一旦默认 INPUT 策略为 ACCEPT,
root@mail:/home/ubuntu# echo “HELO” | nc -4 smtp.google.com 25
220 mx.google.com ESMTP ffacd0b85a97d-38a1c8bb5f7si23003263f8f.375 - gsmtp
502-5.5.1 Unrecognized command. For more information, go to
502 5.5.1 https://support.google.com/a/answer/3221692 ffacd0b85a97d-38a1c8bb5f7si23003263f8f.375 - gsmtp
一旦默认 INPUT 策略为 DROP,相同的命令将无限期挂起。
现在最有趣的部分是 INPUT 策略的改变对
root@mail:/home/ubuntu# echo “HELO” | nc -6 smtp.google.com 25
无论如何,它都会得到 Google 的回应。
需要让邮件服务器将邮件发送到所有其他邮件服务器,而不仅仅是兼容 ipv6 的邮件服务器。
如果有人能解释一下发生了什么,那就太好了!
更新:ip-save 打印输出为:
:INPUT DROP [41791:1739301]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [6390374:3802889072]
-A INPUT -i ens3 -p tcp -m tcp --dport 25 -j ACCEPT
-A INPUT -s 127.0.0.0/24 -i lo -j ACCEPT
-A INPUT -s 185.121.228.0/24 -i ens3 -j ACCEPT
COMMIT
您过滤输入的方式也会阻碍输出。这是因为任何“传出”连接实际上都需要回复(返回数据包),而这些目前在您的防火墙中是不允许的。
想想传出连接是如何工作的,比如 TCP:您的机器发送 SYN,然后它需要接收 SYN 和 ACK(将在 INPUT 链中处理),发送自己的 ACK,等等,例如,当连接从内部发起时,流量总是双向流动。您的防火墙在 INPUT 链中没有任何规则来识别和允许该 SYN 和 ACK,因此它会根据策略进行处理,例如丢弃,并且传出连接无法继续。
对于某些情况,简单的无状态防火墙(不考虑某些数据包是对其他数据包的回复)就足够了。只有当您能够制定涵盖所有转发和返回流量的规则集时才行。但对于绝大多数情况,您无法做到这一点,这就是为什么我们必须在防火墙中引入连接概念(适用于所有内容,包括显然无连接的 UDP、ICMP 等)并区分与某些实时连接相关的数据包。
长话短说,Linux 有一个连接跟踪器模块可以执行此操作,通常称为
conntrack
,并且它的 iptables 接口在规则集语法中有一些匹配和目标。此外,整个 Linux 的 NAT 功能都是基于 conntrack。在典型的状态防火墙规则集中,第一条规则是使用 conntrack 来允许来自所有当前已建立连接或与已建立连接相关的新连接的数据包。可以像这样添加:
即使 INPUT 策略为 DROP,你的传出连接也会神奇地开始工作。
此规则还有一种较旧的形式,即使用过时的
state
模块-m state --state RELATED,ESTABLISHED
。我告诉你这一点,以防你在网上的一些旧指南中遇到它;只需知道它是什么,但不要使用它。最近的内核中没有这样的模块,但这种古老的形式仍然可以工作,被默默地翻译成模块conntrack
,所以最好明确使用它。-I INPUT 1
意思是“插入到前面”(成为第一个)。需要注意的是,如果您已经建立了连接并且想要删除它,您不仅需要在它下面添加一条规则;您还需要断开实际的实时连接,以便连接跟踪器停止识别和允许它。对于 TCP,这通常不是什么大问题,但是当您开始使用基于 UDP 的协议时,尤其是像 SIP 这样的复杂协议,您会遇到一些棘手的问题,您需要非常了解连接跟踪器的行为才能解决这些问题。
至于 IPv6,我怀疑你没有为其设置防火墙。它是一个独立的东西,使用 进行设置
ip6tables
,可以使用 进行查看ip6tables-save
,并且它具有相同的conntrack
模块。