我正在尝试为来自传入 IP:PORT 的 syslog UDP 流量创建重定向到同一 Linux 机器上的其他端口。这样做的目的是根据目标地址将来自服务器上不同 IP 地址的流量路由到在更高端口号上运行的服务。
操作系统:RHEL 7.2
规则:
iptables -A PREROUTING -t nat -p udp --dport 514 -d A.D.D.R -j REDIRECT --to-port 1514
为了调试我还测试了:
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
计数器显示 0,没有记录日志
tcpdump 显示入口端口 514 上的传入流量
目标 IP 地址 (ADDR) 分配给子接口/别名接口 enoXXXX:1
有人有类似的情况吗?
答案1
您的 NAT 规则似乎是正确的,应该可以达到您的预期。但是,有一点需要验证,我认为这就是您的 UDP 流量未重定向的原因。
重定向 UDP 流量比重定向 TCP 更棘手。这主要是因为 TCP 是面向连接的协议,而 UDP 是无连接的协议。
NAT 规则依赖于连接跟踪模块,该模块跟踪任何“联系“。在 TCP 的情况下,它的含义很明显,因为有特殊的 TCP 数据包来指示新连接。在 UDP 中,没有连接建立阶段。您的盒子将看到的第一个数据包被视为发起“联系“并且回复数据包表明”连接已建立“。
那么如何关闭连接呢?在 TCP 中,这也是很明显的,因为 TCP 使用特殊标志来指示连接关闭。当看到时,你可以利用它们并相应地清除连接状态。然而,你永远不知道 UDP 何时关闭。联系“终止。因此,除非在没有任何 UDP 数据包的情况下达到超时时间(在我的计算机上,它设置为 180 秒),否则不会清除连接跟踪条目。
这和你的问题有何关系?当您的盒子持续接收 syslog 的 UDP 流量时,UDP“连接”超时不会过期,并且连接状态将始终保持。NAT 规则将不会只要连接跟踪表中有状态就可以应用。
如何强制新的 NAT 规则?您可以尝试使用以下命令手动删除连接跟踪条目(不要在没有任何其他参数的情况下使用它,因为它会清空整个表并中断您当前的所有连接)。有关更多参数,您可以查看手册。
$ sudo conntrack -D