Iptables por string não funciona com ACCEPT?

1. Iptables por string não funciona com ACCEPT?

Jorge Mendes
jorgemendes

(usa Debian)

Enviado em 22/02/2018 - 16:22h

Olá amigos,
O cenário é o seguinte:
Tenho um proxy na rede e um firewall com iptables que fecha a porta 80 para forward, forçando os usuários a saírem para a internet através do squid. Entretanto, há algumas exceções, domínios que devem ser liberados para serem acessados diretamente.
Tudo certo com o wpad.dat, as exceções funcionam bem, mas o problema acontece quando preciso liberar a porta 80 para qualquer coisa ".gov.br" por exemplo. O comando que conheço é este:
iptables -I FORWARD -p tcp --dport 80 -m string --algo bm --string ".gov.br" -j ACCEPT
Mas não abre. Tentei o inverso, bloqueando tudo ".gov.br" com:
iptables -I FORWARD -p tcp --dport 80 -m string --algo bm --string ".gov.br" -j DROP
e funcionou perfeitamente.
Mas como eu disse, preciso LIBERAR. Alguma idéia?
Obrigado.



  


2. Re: Iptables por string não funciona com ACCEPT?

Buckminster
Buckminster

(usa Debian)

Enviado em 22/02/2018 - 18:01h

Poste aqui todo teu script do Iptables.


3. Re: Iptables por string não funciona com ACCEPT?

Jorge Mendes
jorgemendes

(usa Debian)

Enviado em 22/02/2018 - 20:00h

O curioso é que eu limpei todas as regras, abri tudo e chequei que as páginas estavam abrindo sem problemas,
depois, criei apenas duas regras:

iptables -A FORWARD -p tcp --dport 80 -m string --algo bm --string ".gov.br" -j ACCEPT
iptables -A FORWARD -p tcp --dport 80 -j DROP

e nada ".gov.br" abre...

Como eu disse, estranhamente para DROP está ok.

de qualquer forma, segue meu script :
#Politicas padrao
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

LAN="192.168.10.0/255.255.255.0"

#REGRA: Libera INPUT p/ rede interna
iptables -A INPUT -s $LAN -j ACCEPT

#REGRA: Aceita input loopback
iptables -A INPUT -i lo -j ACCEPT

#REGRA: Aceita conexões iniciadas por mim
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

#REGRA: Aceita conexões VOIP (SIP udp)
iptables -A INPUT -p udp -m udp --dport 5060 -j ACCEPT

#REGRA: Aceita conexões VOIP (SIP tcp)
iptables -A INPUT -p tcp -m tcp --dport 5060 -j ACCEPT

#REGRA: Aceita streamming para VOIP (RTP)
iptables -A INPUT -p udp -m udp --dport 10000:20000 -j ACCEPT

#REGRA: Libera forward NTPDATE
iptables -A FORWARD -p udp --dport 123 -j ACCEPT

#REGRA: só aceita ssh na interface interna
iptables -A INPUT -p tcp --dport 22 -i eth1 -j ACCEPT

#REGRA: libera forward pop
iptables -A FORWARD -p tcp --dport 110 -j ACCEPT

#REGRA: libera forward pop seguro
iptables -A FORWARD -p tcp --dport 995 -j ACCEPT

#REGRA: libera forward ftp
iptables -A FORWARD -p tcp --dport 20:21 -j ACCEPT

#REGRA: libera forward ftp passivo
iptables -A FORWARD -p tcp --dport 49152:49159 -j ACCEPT

#REGRA: libera forward smtp
iptables -A FORWARD -p tcp --dport 25 -j ACCEPT

#REGRA: libera forward smtps
iptables -A FORWARD -p tcp --dport 587 -j ACCEPT

#REGRA: Libera forward https
iptables -A FORWARD -p tcp --dport 443 -j ACCEPT

#REGRA: Libera forward DNS (udp)
iptables -A FORWARD -p udp --dport 53 -j ACCEPT

#REGRA: Libera forward DNS (tcp)
iptables -A FORWARD -p tcp --dport 53 -j ACCEPT

#REGRA: Libera forward DNS (retorno udp)
iptables -A FORWARD -p udp --sport 53 -j ACCEPT

#REGRA: Libera forward DNS (retorno tcp)
iptables -A FORWARD -p tcp --sport 53 -j ACCEPT

#REGRA: Libera forward DNS (proxy tcp)
iptables -A FORWARD -p tcp --dport 953 -j ACCEPT

#REGRA: Libera forward DNS (proxy udp)
iptables -A FORWARD -p udp --dport 953 -j ACCEPT

#REGRA: Libera forward imap
iptables -A FORWARD -p tcp --dport 143 -j ACCEPT

#REGRA: Libera forward imaps
iptables -A FORWARD -p tcp --dport 993 -j ACCEPT

#REGRA: Evita Ping da morte
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

#REGRA: Bloqueia FORWARD de tudo o que nao foi aberto acima
iptables -A FORWARD -p tcp --syn -j DROP

#REGRA: Libera forward http para exceção de proxy .gov.br
iptables -I FORWARD -p tcp --dport 80 -m string --string ".gov.br" -j ACCEPT


4. Re: Iptables por string não funciona com ACCEPT?

Buckminster
Buckminster

(usa Debian)

Enviado em 22/02/2018 - 20:03h

#REGRA: Libera forward http para exceção de proxy .gov.br
iptables -I FORWARD -p tcp --dport 80 -m string --string ".gov.br" -j ACCEPT

Faltou --algo bm na regra acima ou foi erro de digitação?

iptables -I FORWARD -p tcp --dport 80 -m string --algo bm --string ".gov.br" -j ACCEPT

Apesar de que não faz diferença para o teu problema.

De repente a maioria dos sites .gov.br são em https na porta 443, é uma hipótese.

Se está todo teu script aí não estou vendo o compartilhamento e o redirecionamento para o Squid.
E no Squid não tem algum bloqueio referente ao site?

No lugar da tua regra, tenta essa:

iptables -I FORWARD -m string --algo bm --string ".gov.br" -j ACCEPT

ou então essa:

iptables -I FORWARD -p tcp --dport 80 -m string --algo bm --string ! ".gov.br" -j DROP


5. Re: Iptables por string não funciona com ACCEPT?

Jorge Mendes
jorgemendes

(usa Debian)

Enviado em 22/02/2018 - 20:52h

a falta do "--algo bm" foi erro de digitação sim. Sorry. Também tentei o kmp mas sem sucesso.
eu cheguei a tentar o que você sugeriu, não definindo especificamente a porta 80, mas também falhou.
A dúvida sobre usar o !"gov.br" -j DROP é que isto poderia fechar também outras exceções.
No caso em tela, o squid está parado, e o compartilhamento é um simples: iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0

Obrigado pela atenção.


6. Re: Iptables por string não funciona com ACCEPT?

Jorge Mendes
jorgemendes

(usa Debian)

Enviado em 23/02/2018 - 10:07h

Apliquei o comando:
iptables -A FORWARD -p tcp --dport 80 -m string --algo bm --string '.gov.br' -j LOG

Obs:
wan: eth0
Lan: eth1

Para ver se de fato o iptables estava tratando os pacotes com destino a ".gov.br" e todas as linhas do log (/var/log/messages) são assim:

Feb 23 09:59:16 servidor kernel: [ 1005.942909] IN=eth1 OUT=eth0 MAC=<MAC> SRC=192.168.XX.XX DST=161.148.231.170 LEN=519 TOS=0x00 PREC=0x00 TTL=63 ID=51607 DF PROTO=TCP SPT=45553 DPT=80 WINDOW=3870 RES=0x00 ACK PSH URGP=0

Percebi que todos os pacotes tratados são os de saída, não os de entrada (quando o site me envia as informações)
Me pergunto se o problema não está no retorno, já que a string ".gov.br" pode não estar no pacote, apenas o IP do site.
Para bloqueio, OK, o iptables encontra a string a dropa na saída. Mas e para liberar tudo .gov.br saindo e entrando?

Outra coisa: quando tento dropar o que não for .gov.br, como me foi sugerido:
iptables -A FORWARD -p tcp --dport 80 -m string --algo bm ! --string '.gov.br' -j DROP

Também dropa tudo...

Isto está me deixando maluco.


7. Re: Iptables por string não funciona com ACCEPT?

Buckminster
Buckminster

(usa Debian)

Enviado em 23/02/2018 - 12:15h

Vamos por partes.
"O curioso é que eu limpei todas as regras, abri tudo e chequei que as páginas estavam abrindo sem problemas,
depois, criei apenas duas regras:

iptables -A FORWARD -p tcp --dport 80 -m string --algo bm --string ".gov.br" -j ACCEPT
iptables -A FORWARD -p tcp --dport 80 -j DROP"

1 - Veja bem, quando tu colocou as políticas padrões todas como ACCEPT e somente as duas regras aí em cima, os sites que tem tem a string .gov.br deveriam funcionar.

2 - Se o script que tu postou aí é todo teu cript do Iptables, então, como eu falei antes, estão faltando as regras de compartilhamento e redirecionamento para o Iptables.

3 - #REGRA: Bloqueia FORWARD de tudo o que nao foi aberto acima
iptables -A FORWARD -p tcp --syn -j DROP

#REGRA: Libera forward http para exceção de proxy .gov.br
iptables -I FORWARD -p tcp --dport 80 -m string --string ".gov.br" -j ACCEPT

Inverta a posição das duas regras aí em cima, pois o Iptables lê e executa as regras de cima para baixo, caso haja regras conflitantes, a primeira regra é a que vale. Coloque a regra da string antes da regra syn e teste.

4 - "Percebi que todos os pacotes tratados são os de saída, não os de entrada (quando o site me envia as informações)
Me pergunto se o problema não está no retorno, já que a string ".gov.br" pode não estar no pacote, apenas o IP do site. "

Sim, pois tua política padrão INPUT está como DROP, então o Iptables descarta todo e qualquer pacote direcionado ao servidor.
Veja bem:
INPUT (entrada - para pacotes destinados a sockets locais, pacotes destinados para a própria máquina);
FORWARD (para pacotes sendo roteados através da máquina, pacotes que passam pela máquina) e
OUTPUT (para pacotes gerados localmente, pacotes oriundos da própria máquina com destino para fora dela).

https://www.vivaolinux.com.br/artigo/Manual-do-IPtables-Comentarios-e-sugestoes-de-regras







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts