问题
我想要'redirect'
从一个端口到另一个端口的流量。但我需要能够计算通过该端口进行通信时使用了多少INPUT
AND字节。OUTPUT
半解
iptables -t nat -A PREROUTING -p udp --dport 50000 -j REDIRECT --to-port 3478
该解决方案将所有流量重定向50000
到3478
此处的所有内容都很好,但我无法计算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;
我使用此设置来计算使用了多少INPUT
ANDOUTPUT
数据,但这仅适用于非'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 位整数标记连接的所有数据包,然后将相同的标记与康马克模块在输出侧。