您好,我正在尝试创建一个 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