script iptables não bloqueia ping externo

Iniciado por Hacham-Anish, 06 de Fevereiro de 2011, 21:01

tópico anterior - próximo tópico

Hacham-Anish

Olá caros amigos, eu sou novo aqui no fórum e no ubuntu estou com problemas no script do iptables não consigo bloquear ping externo, eu tenho um modem adsl+route e compartilho internet com meu irmão. Desde já agradeço !!!

Esse é o Script:

##### Definição de Policiamento #####
     # Tabela filter
     iptables -t filter -P INPUT DROP
     iptables -t filter -P OUTPUT ACCEPT
     iptables -t filter -P FORWARD DROP
     # Tabela nat
     iptables -t nat -P PREROUTING ACCEPT
     iptables -t nat -P OUTPUT ACCEPT
     iptables -t nat -P POSTROUTING DROP
     # Tabela mangle
     iptables -t mangle -P PREROUTING ACCEPT
     iptables -t mangle -P OUTPUT ACCEPT
     
     
     ##### Proteção contra IP Spoofing #####
     for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
      echo 1 >$i
     done
     
     ##### Ativamos o redirecionamento de pacotes (requerido para NAT) #####
     echo "1" >/proc/sys/net/ipv4/ip_forward
     
     # O iptables define automaticamente o número máximo de conexões simultâneas
     # com base na memória do sistema. Para 32MB = 2048, 64MB = 4096, 128MB = 8192,
     # sendo que são usados 350 bytes de memória residente para controlar
     # cada conexão.
     # Quando este limite é excedido a seguinte mensagem é mostrada:
     #  "ip_conntrack: maximum limit of XXX entries exceed"
     #
     # Como temos uma rede simples, vamos abaixar este limite. Por outro lado isto
     # criará uma certa limitação de tráfego para evitar a sobrecarga do servidor.
     echo "2048" > /proc/sys/net/ipv4/ip_conntrack_max
     
     
     ###############################################################
     #                      Tabela filter                          #
     ###############################################################
     
     ##### Chain INPUT #####
     # Criamos um chain que será usado para tratar o tráfego vindo da Internet e
     iptables -N ppp-input
     
     # Aceita todo o tráfego vindo do loopback e indo pro loopback
     iptables -A INPUT -i lo -j ACCEPT
     # Todo tráfego vindo da rede interna também é aceito
     iptables -A INPUT -s 192.168.1.0/24 -i eth0 -j ACCEPT
     
     # Conexões vindas da interface ppp0 são tratadas pelo chain ppp-input
     iptables -A INPUT -i ppp+ -j ppp-input
     
     # Qualquer outra conexão desconhecida é imediatamente registrada e derrubada
     iptables -A INPUT -j LOG --log-prefix "FIREWALL: INPUT "
     iptables -A INPUT -j DROP
         
     
     ##### Chain FORWARD ####
     # Permite redirecionamento de conexões entre as interfaces locais
     # especificadas abaixo. Qualquer tráfego vindo/indo para outras
     # interfaces será bloqueado neste passo
     iptables -A FORWARD -d 192.168.1.0/24 -i ppp+ -o eth0 -j ACCEPT
     iptables -A FORWARD -s 192.168.1.0/24 -i eth0 -o ppp+ -j ACCEPT
     iptables -A FORWARD -j LOG --log-prefix "FIREWALL: FORWARD "
     iptables -A FORWARD -j DROP
     
         
     
     # Primeiro aceitamos o tráfego vindo da Internet para o serviço www (porta 80)
     iptables -A ppp-input -p tcp --dport 80 -j ACCEPT
     
     # A tentativa de acesso externo a estes serviços serão registrados no syslog
     # do sistema e serão bloqueados pela última regra abaixo.
     iptables -A ppp-input -p tcp --dport 21 -j LOG --log-prefix "FIREWALL: ftp "
     iptables -A ppp-input -p tcp --dport 25 -j LOG --log-prefix "FIREWALL: smtp "
     iptables -A ppp-input -p udp --dport 53 -j LOG --log-prefix "FIREWALL: dns "
     iptables -A ppp-input -p tcp --dport 110 -j LOG --log-prefix "FIREWALL: pop3 "
     iptables -A ppp-input -p tcp --dport 113 -j LOG --log-prefix "FIREWALL: identd "
     iptables -A ppp-input -p udp --dport 111 -j LOG --log-prefix "FIREWALL: rpc"
     iptables -A ppp-input -p tcp --dport 111 -j LOG --log-prefix "FIREWALL: rpc"
     iptables -A ppp-input -p tcp --dport 137:139 -j LOG --log-prefix "FIREWALL: samba "
     iptables -A ppp-input -p udp --dport 137:139 -j LOG --log-prefix "FIREWALL: samba "
     # Bloqueia qualquer tentativa de nova conexão de fora para esta máquina
     iptables -A ppp-input -m state --state ! ESTABLISHED,RELATED -j LOG --log-prefix "FIREWALL: ppp-in "
     iptables -A ppp-input -m state --state ! ESTABLISHED,RELATED -j DROP
     # Qualquer outro tipo de tráfego é aceito
     iptables -A ppp-input -j ACCEPT
     
     
     #######################################################
     #                   Tabela nat                        #
     #######################################################
     
     ##### Chain POSTROUTING #####
     # Permite qualquer conexão vinda com destino a lo e rede local para eth0
     iptables -t nat -A POSTROUTING -o lo -j ACCEPT
     iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j ACCEPT
     
     # Não queremos que usuários tenham acesso direto a www e smtp da rede externa, o
     # squid e smtpd do firewall devem ser obrigatoriamente usados. Também registramos
     # as tentativas para monitorarmos qual máquina está tentando conectar-se diretamente.
     iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp+ -p tcp --dport 80 -j LOG --log-prefix "FIREWALL: SNAT-www "
     iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp+ -p tcp --dport 25 -j LOG --log-prefix "FIREWALL: SNAT-smtp "
     iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp+ -p tcp --dport 25 -j DROP
     iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp+ -p tcp --dport 80 -j DROP
     # É feito masquerading dos outros serviços da rede interna indo para a interface
     # ppp0
     iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp+ -j MASQUERADE
     
     # Qualquer outra origem de tráfego desconhecida indo para eth0 (conexões vindas
     # de ppp+) são bloqueadas aqui
     iptables -t nat -A POSTROUTING -o eth0 -d 192.168.1.0/24 -j LOG --log-prefix "FIREWALL: SNAT unknown"
     iptables -t nat -A POSTROUTING -o eth0 -d 192.168.1.0/24 -j DROP
     # Quando iniciamos uma conexão ppp, obtermos um endereço classe A (10.x.x.x) e após
     # estabelecida a conexão real, este endereço é modificado. O tráfego indo para
     # a interface ppp não deverá ser bloqueado. Os bloqueios serão feitos no
     # chain INPUT da tabela filter
     iptables -t nat -A POSTROUTING -o ppp+ -j ACCEPT
     
     # Registra e bloqueia qualquer outro tipo de tráfego desconhecido
     iptables -t nat -A POSTROUTING -j LOG --log-prefix "FIREWALL: SNAT "
     iptables -t nat -A POSTROUTING -j DROP
     
     
     ###############################################
     #                Tabela mangle                #
     ###############################################
     
     ##### Chain OUTPUT #####
     # Define mínimo de espera para os serviços ftp, telnet, irc e DNS, isto
     # dará uma melhor sensação de conexão em tempo real e diminuirá o tempo
     # de espera para conexões que requerem resolução de nomes.
     iptables -t mangle -A OUTPUT -o ppp+ -p tcp --dport 21 -j TOS --set-tos 0x10
     iptables -t mangle -A OUTPUT -o ppp+ -p tcp --dport 23 -j TOS --set-tos 0x10
     iptables -t mangle -A OUTPUT -o ppp+ -p tcp --dport 6665:6668 -j TOS --set-tos 0x10
     iptables -t mangle -A OUTPUT -o ppp+ -p udp --dport 53 -j TOS --set-tos 0x10
       

    #Proteção contra ICMP Broadcasting:

echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts


#Proteções diversas contra portscanners, ping of death, ataques DoS e etc.

iptables -A FORWARD -o eth0 -p icmp -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type echo-request -j DROP
iptables -A FORWARD -p tcp -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD --protocol tcp --tcp-flags ALL SYN,ACK -j DROP
iptables -A FORWARD -m unclean -j DROP
iptables -A INPUT -m state --state INVALID -j DROP
iptables -N VALID_CHECK
iptables -A VALID_CHECK  -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
iptables -A VALID_CHECK  -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
iptables -A VALID_CHECK  -p tcp --tcp-flags ALL ALL -j DROP
iptables -A VALID_CHECK  -p tcp --tcp-flags ALL FIN -j DROP
iptables -A VALID_CHECK  -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -A VALID_CHECK  -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
iptables -A VALID_CHECK  -p tcp --tcp-flags ALL NONE -j DROP


     

zekkerj

Rapaz, quem deve estar respondendo ao ping é seu modem, não sua máquina.

Inclusive, uma coisa que eu vi: se o seu modem é "adsl+route", se ele está trabalhando em modo roteador, seu firewall tá errado, pq vc tá se baseando em receber a conexão via PPPoE, e ela vem via DHCP.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

Hacham-Anish

Oi zekkerj obrigado pelo seu auxilio, sem querer abusar da sua boa vontade vc poderia me ajudar a configurar meu firewall?
Como eu poderia deixar o firewall bem configurado?

Mais uma vez agradeço !!!

zekkerj

Olha, não posso te garantir presteza no contato, eu acesso quando dá tempo.

Deixar o firewall configurado... o primeiro conselho que eu te dou é não tentar dar um passo maior que a perna. Comece com um firewall simples, e vá acrescentando recursos a ele aos poucos, conforme vc for entendendo. Pegar um firewall enorme, e complexo, feito por outra pessoa, já é difícil para um técnico experiente, que dirá pra quem tá chegando agora.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

bryan

Para ter certeza que sua maquina (firewall) não responderá a ping escreva essa regra:

iptables -t nat -I PREROUTING -d (ip do servidor) -p icmp -j DROP

zekkerj

Bacana, isso não funciona. A tabela "nat" não filtra pacotes, só altera.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

bryan

Zekkerj,

Segundo estudos pela internet e seguindo o pacote quando entra no firewall(netfilter) ele passa pelas seguintes cadeias dentro dessas tabelas:

1 - T= mangle C=PREROUTING
2 - T= NAT C=PREROUTING
3 - existe o roteamento do pacote

depois caso seja destinado a mesma rede o pacote entra na T=filter C=IMPUT se não ele entra na T=filter C=FORWARD


Então imaginei o seguinte quando escrevi essa regra, se ele primeiro pela tabela NAT então vamos bloquear para evitar processamento.


Se estiver errado favor me informe como acontece que estou disposto a aprender!!!

zekkerj

Sim, você está errado. Há as três tabelas, "filter", "nat" e "mangle".

O pacote é bloqueado/liberado na tabela "filter".

A tabela "nat" trata de alterações nos endereços de origem e destino do pacote, e nas portas TCP/UDP.

A tabela "mangle" trata de alterações em campos como ToS, pra lidar com QoS, filas, etc.

O pacote ao entrar na máquina, passa primeiro na cadeia PREROUTING da tabela nat, onde você pode alterar o endereço de destino dele, e assim mudar a forma como o pacote é roteado.

De lá, ele pode ir pra cadeia FORWARD da tabela filter, se o destino dele for outra máquina, ou pra cadeia INPUT da tabela filter, se o destino dele for a própria máquina.

Se o objetivo é bloquear pings vindos de fora, a regra deveria ser colocada na cadeia INPUT, assim:

iptables -A INPUT -p icmp --icmp-type echo-request -s \! $redelocal -j DROP

Veja que o nome da tabela (filter) não entra no comando, pois ela é a tabela default do iptables.

Mas apesar do comando ser esse, não basta passar o comando: ele tem que entrar no lugar certo, pois se por exemplo eu tiver outra regra antes dessa dando um "-j ACCEPT" no pacote, ele vai ser aceito e não vai processar a regra do "-j DROP".

As regras devem ser colocadas da regra mais específica, pra regra mais geral (igual como se faz no Squid).

Se o objetivo for controlar o ping pra outras máquinas, em vez da cadeia INPUT usa-se a cadeia FORWARD.
Se o objetivo for controlar tanto o ping pra própria máquina, quanto pra rede interna, usa-se a regra nas duas cadeias (INPUT e FORWARD).
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

bryan

Zekkerj,


Agora concretizou meu conhecimento.. muito obrigado pela justificativa!!!!  acho que agora você esclareceu muitas das minhas dúvidas e de outras pessoas.

Hacham-Anish

oi zekkerj, primeiramente parabéns pela contribuição ao fórum, e quanto ao meu script é como vc falo eu preciso entender o  conceito de como funciona o iptables e inclui minha falta de conhecimento em rede eu vou seguir seu conselho!!!

valeu pela atenção!!!