Az nf_conntrack_log_invalid sysctl működése

Hálózati problémák feltárásánál igen hasznos lehet, ha látjuk, hogy a kernel hogyan kezeli a csomagokat. Előfordulhat ugyanis, hogy hiába látunk egy csomagot a tcpdump kimenetében, az mégsem érkezik meg a megfelelő helyre. Ennek az egyik oka az lehet, hogy a kernel feldolgozás közben eldobja az adott csomagot. Az eldobás természetesen valami komoly okkal történik, de azért jó lenne tudni, hogy mi és miért történt. Szerencsére erre a kernel fejlesztők is gondoltak és a nagyközönség részére is elérhetővé tették az érvénytelen csomagok logolásának finomhangolását.

Lássuk a releváns kernel részeket:

./include/net/netfilter/nf_conntrack_l4proto.h ide vágó része:

#ifdef CONFIG_SYSCTL
#ifdef DEBUG_INVALID_PACKETS
#define LOG_INVALID(net, proto)                         \
        ((net)->ct.sysctl_log_invalid == (proto) ||     \
         (net)->ct.sysctl_log_invalid == IPPROTO_RAW)
#else
#define LOG_INVALID(net, proto)                         \
        (((net)->ct.sysctl_log_invalid == (proto) ||    \
          (net)->ct.sysctl_log_invalid == IPPROTO_RAW)  \
         && net_ratelimit())
#endif
#else
static inline int LOG_INVALID(struct net *net, int proto) { return 0; }
#endif /* CONFIG_SYSCTL */

/include/linux/in.h:

IPPROTO_RAW     = 255,         /* Raw IP packets                       */

/net/netfilter/nf_conntrack_proto_tcp.c:

if (LOG_INVALID(net, IPPROTO_TCP))
nf_log_packet(pf, 0, skb, NULL, NULL, NULL, "nf_ct_tcp: invalid packet ignored ");

Nézzük mindezt szövegesen kifejtve. Tehát ha van sysctl támogatás és nincs bekapcsolva a netfilter debug (alapból nincs), akkor az invalid csomagok a következők szerint logolódnak:

  • ha 0 az nf_conntrack_log_invalid, logolás kikapcsolva
  • ha a protokollnak megfelelő értékkel egyenlő az nf_conntrack_log_invalid értéke, csak az adott protokollt logolja: (1 – icmp, 6 – tcp, 17 – udp … lásd /etc/protocols)
  • ha 255, akkor minden protokollt naplóz

Ennek megfelelően ha 1-et echo-zunk csak bele, akkor csak az invalid ICMP csomagokat fogja naplózni a rendszer, tehát vagy semmit vagy csak az egyes protokollokat vagy az összes invalid IP csomagot lehet naplózni ilyen formán.

Mivel a mi esetünkben ott van még a net_ratelimit() feltétel is, így nem fogja annyira leDoSolni a syslog szervert az üzenetekkel, hanem a sok üzenet helyett ez lesz a logban:

net_ratelimit: [0-9]* callbacks suppressed