Linux:跟踪netstat -s“连接尝试失败”的来源

前端之家收集整理的这篇文章主要介绍了Linux:跟踪netstat -s“连接尝试失败”的来源前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有几台服务器,其中netstat -s(来自/ proc / net / snmp)返回的失败连接尝试度量标准大约每秒增长一次,我想诊断这些服务器的来源.

通过使用此ipTables规则(在不同的服务器上):

-A OUTPUT -p tcp –dport 23 -j REJECT

我阻止传出的telnet,所以我可以运行这个循环:

while true ; do
telnet www.google.co.uk
netstat -s | grep “Failed connection”
done

Trying 209.85.203.94…
telnet: Unable to connect to remote host: Connection refused
52 Failed connection attempts
Trying 209.85.203.94… telnet: Unable to connect to remote host: Connection refused
53 Failed connection attempts
Trying 209.85.203.94… telnet: Unable to connect to remote host: Connection refused
54 Failed connection attempts

因此证明计数器因连接到远程套接字的失败尝试而增加. (当然,它并不能证明这是增量的唯一原因).

问题是,我怎样才能找到失败的远程地址和端口(或两者的复数)的特定组合,以便我可以查看下一步;路由/防火墙问题?
顺便说一句,如果我运行这个:

watch -n1 ‘ss | grep “\<23\>”‘

我希望在状态SYN-SENT中看到套接字,但不要.这是因为我使用了REJECT,而不是DROP?
谢谢

解决方法

让我们试着以另一种方式(艰难的方式)回答这个问题.阅读内核的源代码,看看,只有一个地方,这个度量增量 – tcp_done函数.正如我们在代码中看到的,增量仅发生在SYN_SEND或SYN_RECV状态的连接中.然后我们检查,从哪里可以调用tcp_done.我们可以找到几个地方:

> tcp_reset – 在连接中止时调用(收到第一个标志的回复数据包).是的,它可能发生在SYN_SENT和SYN_RECV状态(以及其他状态,理论上).
> tcp_rcv_state_process – 在状态TCP_FIN_WAIT1和TCP_LAST_ACK中调用,因此度量不会递增 – 这不是我们的情况.
> tcp_v4_error – 在SYN_SENT或SYN_RECV的情况下调用. ICMP处理程序调用的tcp_v4_error函数.
> tcp_time_wait调用套接字进入等待时间或等待等待2状态 – 不是我们的情况.
> tcp_write_error – 超时时从几个地方打来电话,超过重传次数.这也可能是我们的怀疑.

现在,打开任何TCP FSM图来检查,在什么情况下我们的连接可以在SYN_SENT或SYN_RECV中.

在客户端情况下,它可以只是SYN_SENT状态,其中syn数据包正在传输,并且由于接收到拒绝(tcp-rst或icmp错误)或未收到回复而中止连接.

在服务器情况下,它可能只是SYN_RECV状态(已经接收到syn并且已经发送了syn ack),并且由于接收到拒绝(某些地方拒绝了syn ack)或超过了回复等待超时(未收到确认)而中止连接.

现在您已了解更新此度量标准的原因,并可以检查系统中可能的源代码.在现代内核中,有一个强大的工具可以在内核级别进行故障排除.从布兰登格雷格开始于this brief tutorial.

猜你在找的Linux相关文章