iptablesredirect规则为udp不工作

我试图创buildredirect的系统日志UDPstream量从传入的IP:端口到其他端口在同一个Linux机器上。 这样做的目的是将来自服务器上的不同IP地址的stream量路由到根据目标地址在较高端口号上运行的服务。

操作系统:RHEL 7.2

规则:

iptables -A PREROUTING -t nat -p udp --dport 514 -d ADDR -j REDIRECT --to-port 1514 

为了debugging我也testing了:

 iptables -A PREROUTING -t nat -p udp --dport 514 -d ADDR -j LOG --log-prefix "SYSLOG_REDIRECT" iptables -t nat -L -v -n 

计数器显示为0,没有logging日志

tcpdump显示在入口端口514上传入的stream量

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

有人有类似的情况吗?

你的NAT规则似乎是正确的,应该做你所期望的。 但是,有一点要validation,我相信这是为什么你的UDPstream量不redirect的原因。

redirectUDPstream量可能比redirectTCP更复杂。 这主要是因为TCP是面向连接的协议,UDP是无连接的。

NAT规则依赖于跟踪任何“ 连接 ”状态的连接跟踪模块。 在TCP情况下,很明显这是什么意思,因为有特殊的TCP数据包来表示新的连接。 在UDP中,没有连接build立阶段。 你的盒子看到的第一个数据包被认为是启动一个“ 连接 ”,回复数据包表示“ 连接已经build立 ”。

如何closures连接? 在TCP中,由于TCP使用特殊标志来指示连接closures,所以也是清楚的。 看到的时候,你的盒子可以利用它们并相应地清除连接状态。 但是,你永远不会知道UDP“ 连接 ”何时终止。 所以,连接跟踪条目不会被清除,除非达到超时(在我的机器上设置为180秒),没有任何UDP数据包。

这与你的问题有关吗? 当你的机器连续接收到syslog的UDPstream量时,UDP连接超时不会过期,连接状态一直保持不变。 只要连接跟踪表中存在状态,NAT规则就不会被应用。

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

 $ sudo conntrack -D