cat /proc/net/netstat
表明:
SyncookiesSent:0
SyncookiesRecv:0
SyncookiesFailed:34954
收到了很多错误的 syncookies,但是系统没有发送任何 syncookies。我预期的是收到的错误 sysncookies 比发送的 syncookies 要少。谁知道原因?
2.6.32:
static struct sock *tcp_v4_hnd_req(struct sock *sk, struct sk_buff *skb)
{
struct tcphdr *th = tcp_hdr(skb);
const struct iphdr *iph = ip_hdr(skb);
struct sock *nsk;
struct request_sock **prev;
/* Find possible connection requests. */
struct request_sock *req = inet_csk_search_req(sk, &prev, th->source,
iph->saddr, iph->daddr);
if (req)
return tcp_check_req(sk, skb, req, prev);
nsk = inet_lookup_established(sock_net(sk), &tcp_hashinfo, iph->saddr,
th->source, iph->daddr, th->dest, inet_iif(skb));
if (nsk) {
if (nsk->sk_state != TCP_TIME_WAIT) {
bh_lock_sock(nsk);
return nsk;
}
inet_twsk_put(inet_twsk(nsk));
return NULL;
}
#ifdef CONFIG_SYN_COOKIES
if (!th->rst && !th->syn && th->ack)
sk = cookie_v4_check(sk, skb, &(IPCB(skb)->opt)); <== check received ack.
#endif
return sk;
}
答案1
以下是 cookie_v4_check 中的相关部分net/ipv4/syncookies.c
:
if (tcp_synq_no_recent_overflow(sk) ||
(mss = cookie_check(skb, cookie)) == 0) {
NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_SYNCOOKIESFAILED);
goto out;
}
NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_SYNCOOKIESRECV);
因此,如果:
- 最近发生了一次需要 SYN cookies 的溢出,并且
- 该 cookie 无法被检查为有效的常规 SYN 数据包或 SYN cookie,
然后SyncookiesFailed
增加。否则,SyncookiesRecv
增加。因此,如果CONFIG_SYN_COOKIES
在内核中启用了,并且您处于需要它的新连接负载下,则您希望它SyncookiesSent
为正,并且SyncookiesRecv
为正(但更少)。事实上,看起来您获得的唯一结果是无效的。
我们看到了类似的数字,我们认为这是因为联邦水务局的默认规则包括丢弃状态无效的数据包,其中可能包括传出和传入的 SYN cookie。您可能需要检查防火墙配置和日志,以查看是否发生了意外丢弃的数据包。
或者,您可能只是因为某些随机攻击者而获得了无效的 SYN cookie。不过,在这种情况下,我希望发送一些 SYN cookie。
答案2
John Witlock 发布的代码实际上是一个错误,已在 v3.19 中修复:https://github.com/torvalds/linux/commit/646697b9e3fef913bb6393ebfb6115c442a96be7在没有发送 syncookie 的情况下,该计数器之前一直处于递增状态。