Согласно p0f README
«одним из наиболее ценных сигналов дактилоскопии TCP» является макет параметров TCP.Применительно к записям MacOS и Linux это означает, что мы должны изменить макет с:
mss,sok,ts,nop,ws
на
mss,nop,ws,nop,nop,ts,sok,eol+1
Это не может быть сделано sysctl, поскольку ядро Linux жестко закодировало этот порядок в tcp_connect
syscall: https://github.com/torvalds/linux/blob/bab5c80b211035739997ebd361a679fa85b39465/net/ipv4/tcp_output.c#L458
Таким образом, вы должны написать модуль ядра netfilter для изменения параметров TCP позже, как это делает модуль TCPMSS: https://github.com/torvalds/linux/blob/master/net/netfilter/xt_TCPMSS.c.
Либо исправление tcp_connect
, либо запись пользовательского модуля netfilter требует сильного ядранавыки программирования.
Другой вариант - каким-то образом перехватить пакеты TCP SYN/SYN+ACK
программой пользовательского пространства (может помочь nfqueue или tproxy с необработанными сокетами), исказить их и записать обратно в ядро.Это может значительно снизить производительность, но проще в реализации.
UPD: я нашел несколько рабочих и грязных примеров этой техники, основанной на nfqueue / python: https://forums.hak5.org/topic/33532-p0f-mangler/