iptables udp 重定向规则不起作用

mrb*_*eat 5 redhat iptables rhel7

我正在尝试为 syslog UDP 流量创建从传入 IP:PORT 到同一 Linux 机器上其他端口的重定向。其目的是根据目标地址将传入服务器上不同 IP 地址的流量路由到在较高端口号上运行的服务。

操作系统:RHEL 7.2

规则:

iptables -A PREROUTING -t nat -p udp --dport 514 -d A.D.D.R -j REDIRECT --to-port 1514
Run Code Online (Sandbox Code Playgroud)

为了调试我还测试了:

iptables -A PREROUTING -t nat -p udp --dport 514 -d A.D.D.R -j LOG --log-prefix "SYSLOG_REDIRECT"

iptables -t nat -L -v -n 
Run Code Online (Sandbox Code Playgroud)

计数器显示 0,没有记录日志

tcpdump 显示入口端口 514 上传入的流量

目标 IP 地址 (ADDR) 分配给子接口/别名接口 enoXXXX:1

有人有类似的案例吗?

Kha*_*led 1

您的 NAT 规则似乎是正确的并且应该符合您的预期。但是,有一点需要验证,我相信这就是您的 UDP 流量未重定向的原因。

重定向 UDP 流量可能比重定向 TCP 更棘手。这主要是因为TCP是面向连接的协议,而UDP是无连接的。

NAT 规则依赖于连接跟踪模块,该模块跟踪任何“连接”的状态。在 TCP 情况下,它的含义很清楚,因为有特殊的 TCP 数据包来指示新连接。在UDP中,没有连接建立阶段。您的盒子看到的第一个数据包被视为发起“连接”,并且回复数据包指示“连接已建立”。

关闭连接怎么样?在 TCP 中,这一点也很清楚,因为 TCP 使用特殊标志来指示连接关闭。当看到时,您的盒子可以使用它们并相应地清除连接状态。但是,您永远不会知道 UDP“连接”何时终止。因此,除非在没有任何 UDP 数据包的情况下达到超时(在我的机器上设置为 180 秒),否则连接跟踪条目不会被清除。

这与您的问题有什么关系?当您的盒子连续接收系统日志的 UDP 流量时,UDP“连接”超时不会过期,并且连接状态将始终保持。只要连接跟踪表中存在状态,NAT 规则就不会应用。

如何强制执行新的 NAT 规则?您可以尝试使用以下命令手动删除连接跟踪条目(不要在没有任何其他参数的情况下使用它,因为它会清空整个表并中断所有当前连接)。更多参数可以查看说明书。

$ sudo conntrack -D
Run Code Online (Sandbox Code Playgroud)