Filtragem de URL com tabelas IP

0

Estou tentando configurar a filtragem de URL com Iptables . Eu configurei duas interfaces. O tráfego flui de uma interface e flui para fora da outra.

Abaixo estão os Iptables que configuramos:

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:TCPFILTER - [0:0]
:URLFILTER - [0:0]
#######################
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT

#BGP
-A INPUT -p tcp -m state --state NEW -m tcp --dport 179 -j ACCEPT

# Pass traffic to filters which have TCP Flags PSH,ACK and DST Port 80

-A FORWARD -p tcp --tcp-flags PSH,ACK PSH,ACK --dport 80 -j TCPFILTER
-A FORWARD -p tcp --dport 80 -j TCPFILTER
-A FORWARD -j ACCEPT

# Further process only packets with HTTP Get Request

-A TCPFILTER -m string --string "GET /" --algo bm --from 1 --to 70 -j URLFILTER
-A TCPFILTER -j ACCEPT
-A URLFILTER -m string --algo bm --to 500 --string "Host: www.tutorialspoint.com" -p tcp -j REJECT --reject-with tcp-reset
-A URLFILTER -j ACCEPT
COMMIT

De acordo com a saída Wireshark dos pacotes recebidos, é mostrado abaixo

Acreditoqueissodevefuncionar,masnãoestouobtendonenhumresultadonacadeiaURLFILTER,conformemostradoabaixo:

#iptables-L-v-nChainINPUT(policyACCEPT0packets,0bytes)pktsbytestargetprotoptinoutsourcedestination00ACCEPTall--lo*0.0.0.0/00.0.0.0/07352ACCEPTicmp--**0.0.0.0/00.0.0.0/0icmptype2551086621ACCEPTall--**0.0.0.0/00.0.0.0/0stateNEW,RELATED,ESTABLISHED00ACCEPTtcp--**0.0.0.0/00.0.0.0/0stateNEWtcpdpt:200200ACCEPTtcp--**0.0.0.0/00.0.0.0/0stateNEWtcpdpt:179ChainFORWARD(policyACCEPT0packets,0bytes)pktsbytestargetprotoptinoutsourcedestination3934674TCPFILTERtcp--**0.0.0.0/00.0.0.0/0tcpdpt:80flags:0x18/0x1825313392TCPFILTERtcp--**0.0.0.0/00.0.0.0/0tcpdpt:8000ACCEPTall--**0.0.0.0/00.0.0.0/0ChainOUTPUT(policyACCEPT75packets,13141bytes)pktsbytestargetprotoptinoutsourcedestinationChainTCPFILTER(2references)pktsbytestargetprotoptinoutsourcedestination00URLFILTERall--**0.0.0.0/00.0.0.0/0STRINGmatch"GET /" ALGO name bm FROM 1 TO 70
  292 48066 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain URLFILTER (1 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           STRING match "Host: www.tutorialspoint.com" ALGO name bm TO 500 reject-with tcp-reset
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0

O tráfego é aceito e passado para o TCPFILTER , mas não é possível corresponder a GET / string.

Qualquer assistência seria muito apreciada.

    
por Mustafa Mujahid 19.02.2018 / 07:54

1 resposta

2

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.

    
por 19.02.2018 / 09:34