我正在运行几个使用 udp 与大量客户端通信的服务器守护程序。如何查找并列出所有活动的 udp“连接”正在与服务器通信以估计连接到服务器守护进程的活动客户端的数量?除了使用 tshark 或 tcpdump 嗅探数据包并查看发送到服务器守护进程的 udp 数据包的源 ip 之外,我想不出一个简单的方法来做到这一点,是的,我知道 UDP 是无连接和无状态协议。
答案1
UDP 是无状态协议——因此没有状态。
要查看正在监听 UDP 的内容:
netstat -lnpu
现代 Linux 上的等效命令:
ss -lnpu
答案2
您可以使用 iptables 记录每个 UDP 连接:
iptables -A INPUT -p udp -j LOG --log-prefix "udp connection: "
也许您可能希望将其限制在某些端口上。检查文档在这里或者,最好是man iptables
。
答案3
正如其他人提到的,UDP 是无连接的,因此您可能查看的标准位置中不会跟踪状态。
您可以使用的一种方法是简单地设置一些使用该选项的简单 netfilter 规则--state
。这将强制 netfilter 跟踪与 UDP 相关的状态。设置规则后,您可以使用类似连接跟踪查看 netfilter 状态表。例如,下面是我的一个系统的样子。您可以看到有几个系统经常与 udp/1194 (OpenVPN) 通信。
root@enterprise:# conntrack -L -p udp
udp 17 173 src=192.168.32.1 dst=192.168.32.10 sport=41179 dport=1194 packets=2072 bytes=188058 src=192.168.32.10 dst=192.168.32.1 sport=1194 dport=41179 packets=2081 bytes=201185 [ASSURED] mark=0 secmark=0 use=1
udp 17 175 src=192.168.32.26 dst=192.168.32.10 sport=57440 dport=1194 packets=806767 bytes=154637738 src=192.168.32.10 dst=192.168.32.26 sport=1194 dport=57440 packets=1265893 bytes=1588040830 [ASSURED] mark=0 secmark=0 use=1
您的 netfilter 规则可以像这样简单。
/sbin/iptables -t filter -A INPUT -m state --state NEW\,ESTABLISHED -j ACCEPT
/sbin/iptables -t filter -A FORWARD -m state --state NEW\,ESTABLISHED -j ACCEPT
/sbin/iptables -t filter -A OUTPUT -m state --state NEW\,ESTABLISHED -j ACCEPT