iptables通过字节计算将端口流量转发到另一个端口

iptables通过字节计算将端口流量转发到另一个端口

问题

我想要'redirect'从一个端口到另一个端口的流量。但我需要能够计算通过该端口进行通信时使用了多少INPUTAND字节。OUTPUT

半解

iptables -t nat -A PREROUTING -p udp --dport 50000 -j REDIRECT --to-port 3478

该解决方案将所有流量重定向500003478此处的所有内容都很好,但我无法计算INPUT & OUTPUT通过50000端口的流量!这是一个至关重要的问题。

当前设置

firewall-cmd --zone=public --add-port=50000/udp;
iptables -I INPUT -p udp --dport 50000;
iptables -I OUTPUT -p udp --sport 50000;

我使用此设置来计算使用了多少INPUTANDOUTPUT数据,但这仅适用于非'redirected'.

流动?

Packet -> 50000(adds bytes to INPUT) -> 3478;
Packet <- 50000(adds bytes to OUTPUT) <- 3478

如果有更好的方法,iptables我愿意接受建议。

答案1

您需要以下内容:

# Tag UDP packets of the "connection" with mark 50000
iptables -t mangle -A PREROUTING -p udp --dport 50000 -j CONNMARK --set-mark 50000

# Make the port redirection
iptables -t nat -A PREROUTING -p udp --dport 50000 -j REDIRECT --to-port 3478

# Count the bytes with mark 50000
iptables -m connmark -t mangle -A OUTPUT -p udp --sport 3478 --mark 50000

iptables -t mangle -nvL然后将显示:

Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    4   132 CONNMARK   udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:50000 CONNMARK set 0xc350
...
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    2    66            udp  --  *      *       0.0.0.0/0            0.0.0.0/0            connmark match  0xc350 udp spt:3478

说明:

  • 使用 时-j REDIRECT,您无法制定匹配来自端口 50000 的传出数据包的规则,因为端口 50000 上的连接的所有传出数据包都将匹配,--sport 3478但不匹配--sport 50000,即使实际数据包将显示 UDP 源端口 50000网络捕获。我不知道这是一个错误还是预期的行为(使用 iptables 1.8.2 (nf_tables) 测试)
  • 为了解决这个问题,我们可以使用CONNMARK目标在 PREROUTING 端用任意 32 位整数标记连接的所有数据包,然后将相同的标记与康马克模块在输出侧。

相关内容