如果我检查有关返回的已建立 TCP 连接的信息sock_diag(7)
(或在/proc/net/tcp
),如何确定给定连接是否源自拥有该连接的本地端被动的、监听套接字还是活动、连接套接字?
更新我有兴趣在 API 级别执行此操作,即无需启动ss
或等命令netstat
。
答案1
如果您检测到使用相同本地 IP+本地端口组合的多个连接,则该系统在这些连接形成时是被动端点。当本地端口+本地 IP 组合用于传出连接时,其他进程通常无法将具有相同本地 IP 的相同本地端口用于其他任何操作。
一旦建立,TCP 连接应该是完全对称的,因此可能没有与连接本身相关的属性可以判断连接是在入站还是出站方向上建立的:如果您检测到侦听套接字或使用相同的其他连接本地 IP+端口对,您可以非常确定所有这些连接都是传入连接。
但是,如果您只看到一个连接并且没有匹配的侦听套接字,则您无法确定。也许它是一个传出连接,或者可能是当前正在关闭并且已经停止侦听新连接的服务的最后一个剩余传入连接。
可以应用一些基于端口号的启发式方法:如果本地端口号在 指定的范围内/proc/sys/net/ipv4/ip_local_port_range
,则很可能是传出连接;或者如果它小于 1024,则可能是传入端口,除非您使用的是旧服务,该服务要求与其之间的传出连接必须源自仅根端口(我认为某些 NIS 服务或类似服务有此要求) )。