通过使用此ipTables规则(在不同的服务器上):
-A OUTPUT -p tcp –dport 23 -j REJECT
我阻止传出的telnet,所以我可以运行这个循环:
while true ; do
telnet www.google.co.uk
netstat -s | grep “Failed connection”
doneTrying 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_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.