Iptables hashlimit 和 nat

Iptables hashlimit 和 nat

您好,我正在尝试创建一个 PREROUTING 规则,以便根据 hashlimit 将流量重新重定向到另一个端口。

iptables -I PREROUTING -t nat -p udp --src 0/0 --dport 53 -j DNAT --to-destination 10.0.2.4:1053

这工作正常,并将所有内容从端口 53 重定向到 1053。

使用 hashlimit 似乎有效:

iptables -I PREROUTING -t raw -p udp --dport 53 -m hashlimit --hashlimit-mode srcip --hashlimit-srcmask 32 --hashlimit-above 100/second --hashlimit-burst 1 --hashlimit-name OL_Proc -j DROP

但下面的操作似乎根本不起作用:

iptables -I PREROUTING -t nat -p udp --dport 53 -m hashlimit --hashlimit-mode srcip --hashlimit-srcmask 32 --hashlimit-above 100/second --hashlimit-burst 1 --hashlimit-name OL_Proc -j DNAT --to-destination 10.0.2.4:1053

我在这里做错什么了吗?

编辑1:

根据 parkamark 的反馈(很有道理),我尝试了以下方法:

这会按预期工作并将所有流量路由到新的 IP /端口:

iptables -t mangle -A PREROUTING -p udp --dport 53 -j MARK --set-mark 1

iptables -t nat -A PREROUTING -p udp -m mark --mark 0x1 -j DNAT --to-destination 10.0.2.5:1053

但这不起作用,我不明白为什么:

iptables -t mangle -A PREROUTING -p udp --dport 53 -m hashlimit --hashlimit-mode srcip --hashlimit-srcmask 32 --hashlimit-above 100/second --hashlimit-burst 1 --hashlimit-htable-expire 300000 --hashlimit-name OL_Proc -j MARK --set-mark 1

iptables -t nat -A PREROUTING -p udp -m mark --mark 0x1 -j DNAT --to-destination 10.0.2.5:1053

我可以在 iptables -t mangle -L -v -n 上看到第一条规则已正确执行,但第二条规则从未触发。我还在第一条规则上添加了日志,我可以验证它 100% 已触发。

对此有什么想法/反馈吗?

答案1

不,你没有做错什么。

NAT 连接在内核的连接跟踪表中进行跟踪。您可以随时使用命令查看此表conntrack(这是一个好的开始)——如果您的系统上没有该命令,conntrack -L您可能需要这样做。yum install conntrack-tools

正如我之前所解释的这里,当涉及到 NAT 时,针对-t nat表定义的 iptables 规则定义了如何初始匹配数据包以将它们添加到连接跟踪表中。在 iptables 规则上进行初始匹配/命中后,会话将添加到连接跟踪表中,并且所有相关数据包都将通过内核中的 NAT 处理,直到连接超时(在一定时间内看不到流量),连接被拆除/终止(对于 TCP 而言),或者您使用选项conntrack -D从连接跟踪表中删除 NAT 规则,因此不再对其进行跟踪。

就您的问题而言,第一条规则已列入表格raw,它将流量导向-j DROP立即丢弃的目的地,其中不涉及 NAT。第二条规则已列入表格nat-j DNAT --to-destination 10.0.2.4:1053它将匹配数据包并将初始会话数据包添加到连接跟踪表中,此后,客户端源 IP/端口和目标 IP/端口之间的任何进一步相关流量将不再与任何 iptables规则10.0.2.4:1053匹配。nat

相关内容