Eu encontrei o motivo pelo qual isso não está funcionando.
Você não pode confiar em ter toda a solicitação HTTP em um único pacote sendo inspecionado pelo netfilter. O mesmo pacote não corresponderá a 'GET /' e 'Host: *', já que essa carga é distribuída por vários pacotes.
Considere a seguinte lista de regras:
-A OUTPUT -p tcp -m tcp --dport 80 -j URLFILTER # would be FORWARD in your case
-A URLFILTER -m string --string "Host: www.kernel.org" --algo bm --from 1 --to 500 --icase -j LOG --log-prefix UF_MATCHHOST
-A URLFILTER -m string --string "GET /" --algo bm --from 1 --to 500 --icase -j LOG --log-prefix UF_MATCHGET
Uma chamada HTTP para www.kernel.org assim
GET / HTTP/1.0
Host: www.kernel.org
Combinará as duas regras na ordem inversa, provando que a cadeia URLFILTER foi percorrida por mais de um pacote; O primeiro carregando a string GET e o segundo carregando a string Host. Portanto, você não pode combinar simultaneamente GET e Host sem mais trabalho.
[471493.767020] UF_MATCHGETIN= OUT=enp0s31f6 SRC=192.168.20.204 DST=147.75.205.195 LEN=67 TOS=0x00 PREC=0x00 TTL=64 ID=65494 DF PROTO=TCP SPT=51624 DPT=80 WINDOW=229 RES=0x00 ACK PSH URGP=0
[471499.761216] UF_MATCHHOSTIN= OUT=enp0s31f6 SRC=192.168.20.204 DST=147.75.205.195 LEN=73 TOS=0x00 PREC=0x00 TTL=64 ID=65495 DF PROTO=TCP SPT=51624 DPT=80 WINDOW=229 RES=0x00 ACK PSH URGP=0
Talvez você possa rastrear cada conexão que corresponda a GET / e corresponda aos seguintes pacotes. Acredito que isso seria possível.
O Netfilter pode fazer isso por você, mas está longe de ser a melhor ferramenta para o trabalho.
Resposta original:
Seu
-A TCPFILTER -m string --string "GET /" --algo bm --from 1 --to 70 -j URLFILTER
a entrada não está correspondendo, você tem certeza de que pode combinar strings com tráfego HTTP bruto, você pode ver a string usando tcpdump -vv? Você pode tentar uma correspondência mais simples e ver se isso funciona?
A saída do wireshark que você está mostrando é o pacote analisado, não o que o iptables está vendo necessariamente. Você deseja ver a carga hex / ascii do pacote para verificar novamente.