Crie seu próprio firewall com iptables usando este script simples

Passei algum tempo pensando em duas coisas sobre o iptables: a maioria dos que procuram esses tutoriais são iniciantes e, em segundo lugar, muitos já estão procurando por algo bastante simples e já elaborado.

Este exemplo é para um servidor web, mas você pode facilmente adicionar mais regras e adaptá-las às suas necessidades.

Quando você vê "x" mudar para o seu IP


#!/bin/bash

# Limpamos tabelas iptables -F iptables -X # Limpamos NAT iptables -t nat -F iptables -t nat -X # tabela mangle para coisas como PPPoE, PPP e ATM iptables -t mangle -F iptables -t mangle -X # Políticas Acho que esta é a melhor maneira para iniciantes e # ainda não é ruim, vou explicar a saída (saída) porque são conexões de saída #, a entrada descartamos tudo e nenhum servidor deve encaminhar. iptables -P INPUT DROP iptables -P SAÍDA ACEITAR iptables -P FORWARD DROP #Intranet LAN intranet = eth0 #Extranet wan extranet = eth1 # Manter estado. Tudo que já está conectado (estabelecido) é deixado assim: iptables -A INPUT -m estado --state ESTABLISHED, RELACIONADO -j ACCEPT # Loop device. iptables -A INPUT -i lo -j ACEITAR # http, https, não especificamos a interface porque # queremos que seja toda iptables -A INPUT -p tcp --dport 80 -j ACEITAR iptables -A INPUT -p tcp - dport 443 -j ACEITAR # ssh apenas internamente e a partir desta faixa de iptables do ip -A INPUT -p tcp -s 192.168.xx / 24 -i $ intranet --dport 7659 -j ACEITAR # monitoramento por exemplo se eles têm zabbix ou algum outro serviço snmp iptables -A ENTRADA -p tcp -s 192.168.xx / 24 -i $ intranet --dport 10050 -j ACEITAR # icmp, ping bem depende de você iptables -A ENTRADA -p icmp -s 192.168.xx / 24 - i $ intranet -j ACEITAR #mysql com postgres é a porta 5432 iptables -A INPUT -p tcp -s 192.168.xx --sport 3306 -i $ intranet -j ACEITAR #sendmail bueeeh se quiser enviar algum correio #iptables -A SAÍDA -p tcp --dport 25 -j ACEITAR # Anti-SPOOFING 09/07/2014 # SERVER_IP = "190.xxx" # IP do servidor - o ip wan real do seu servidor LAN_RANGE = "192.168.xx / 21" # intervalo de LAN da sua rede ou vlan # Ip's que nunca devem entrar na extranet,é usar um pouco de # lógica se tivermos uma interface puramente WAN, ela nunca deve inserir # tráfego do tipo LAN através dessa interface SPOOF_IPS = "0.0.0.0/8 127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0 / 16 "# Ação padrão - a ser executada quando qualquer regra corresponder a ACTION =" DROP "# Pacotes com o mesmo ip do meu servidor através do wan iptables -A INPUT -i $ extranet -s $ SERVER_IP -j $ ACTION # iptables -A OUTPUT -o $ extranet -s $ SERVER_IP -j $ ACTION # Pacotes com o intervalo de LAN para o wan, coloco assim no caso de você ter # alguma rede em particular, mas isso é redundante com a seguinte # regra dentro do loop " para "iptables -A INPUT -i $ extranet -s $ LAN_RANGE -j $ ACTION iptables -A OUTPUT -o $ extranet -s $ LAN_RANGE -j $ ACTION ## Todas as redes SPOOF não permitidas pelo wan para ip em $ SPOOF_IPS do iptables -A INPUT -i $ extranet -s $ ip -j $ ACTION iptables -A OUTPUT -o $ extranet -s $ ip -j $ ACTION concluído

Como sempre aguardo seus comentários, fiquem ligados neste blog, obrigado


Deixe um comentário

Seu endereço de email não será publicado. Campos obrigatórios são marcados com *

*

*

  1. Responsável pelos dados: Miguel Ángel Gatón
  2. Finalidade dos dados: Controle de SPAM, gerenciamento de comentários.
  3. Legitimação: Seu consentimento
  4. Comunicação de dados: Os dados não serão comunicados a terceiros, exceto por obrigação legal.
  5. Armazenamento de dados: banco de dados hospedado pela Occentus Networks (UE)
  6. Direitos: A qualquer momento você pode limitar, recuperar e excluir suas informações.

  1.   HO2Gi dito

    Isso me ajuda a continuar aprendendo um pouco mais obrigado copiado.

    1.    Brody Dalle dito

      de nada, fico feliz em ajudar

  2.   Javier dito

    Sinto muito, mas tenho duas perguntas (e uma de presente 😉):

    Você chegaria com esta configuração para ter o Apache rodando e fecharia o resto, exceto SSH?

    # Nós limpamos mesas
    iptables-F
    iptables-X

    Nós limpamos o NAT

    iptables -t nat -F
    iptables -t nat -X

    iptables -A INPUT -p tcp –dport 80 -j ACEITAR

    ssh apenas internamente e a partir desta faixa de ip's

    iptables -A INPUT -p tcp -s 192.168.xx / 24 -i $ intranet –dport 7659 -j ACEITAR

    Segunda pergunta: 7659 é a porta usada no SSH neste exemplo?

    E terceiro e último: em qual arquivo essa configuração deve ser salva?

    Muito obrigado pelo tutorial, é uma pena que você seja tão novato e não possa aproveitar bem dele.

    1.    Brody Dalle dito

      esta é a regra que você precisa para http do apache
      iptables -A INPUT -p tcp –dport 80 -j ACEITAR

      mas você também precisa declarar as políticas padrão de descarte (está no script)
      iptables -P ENTRADA QUEDA
      iptables -P OUTPUT ACEITAR
      iptables -P FORWARD DROP

      e isso porque se você estiver remoto, isso o jogará fora.
      iptables -A INPUT -m state –state ESTABELECIDO, RELACIONADO -j ACEITAR

      se 7659 é a porta desse ssh no exemplo, por padrão é 22, embora eu recomendo que você mude para uma porta "não muito conhecida"
      Cara, não sei, como você quer ... firewall.sh e você coloca no rc.local (sh firewall.sh) para que rode automaticamente, depende de qual sistema operacional você tem, tem arquivos onde você pode colocar as regras diretamente.

  3.   jge dito

    Ei, seu script é muito bom, analisando-o ... Você sabe como eu poderia negar todas as solicitações de meus usuários para um site específico? mas este site tem muitos servidores….

    1.    Brody Dalle dito

      Eu recomendo outras opções:
      1) Você pode criar uma zona falsa em seu dns ...
      2) Você pode colocar um proxy com acl
      embargo ao pecado
      Para iptables você pode gostar disso ... nem sempre é a melhor opção (existem mais maneiras)
      iptables -A INPUT -s blog.desdelinux.ne -j QUEDA
      iptables -A OUTPUT -d blog.desdelinux.net -j DROP

      Me diga se funcionou

  4.   Javier dito

    Obrigado pela resposta, tudo esclarecido. Eu estava perguntando sobre a porta porque fiquei surpreso ao usar o 7659, já que as portas privadas começam no 49152, e pode atrapalhar algum serviço ou coisa parecida.
    Mais uma vez, obrigado por tudo, isso é bom!

    Saudações.

  5.   sic dito

    BrodyDalle, como posso entrar em contato com você? Muito interessante o seu roteiro.

  6.   Carlos dito

    A penúltima linha "iptables -A OUTPUT -o $ extranet -s $ ip -j $ ACTION" existe para evitar que sua própria máquina seja falsificada? Ou é possível que algum pacote envenenado entre e saia com aquela fonte envenenada e é por isso que a regra também está incluída no OUTPUT?
    Muito obrigado pelo esclarecimento!!!

  7.   fran dito

    este é meu próprio script iptables, é muito completo:

    # franes.iptables.airy
    # doc.iptables.airoso: iptables para legado e para nft
    #
    # portas de firewall
    ##############################
    #! / Bin / bash
    #
    # limpar a tela
    ############################################ Início de /etc/f-iptables/default.cfg |||||
    remover filtragem
    # deixe uma linha em branco
    eco
    export yes = »» no = »echo off»
    # as variáveis ​​que você pode alterar para permitir o acesso
    ############################# Variáveis ​​para modificar com $ yes ou $ no
    export hayexcepciones = »$ no»
    # há exceções: $ yes para permitir hosts excepcionais e $ no para desativar
    export hayping = »$ no»
    # hayping: $ yes para permitir pings de terceiros e $ no para negar
    export haylogserver = »$ no»
    # haylogeosserver: $ yes para poder logar tcp $ no para não ser capaz de logar tcp
    ######
    ############################## Variáveis ​​para modificar adicionando "," ou com intervalos de ":"
    export exceptions = »baldras.wesnoth.org»
    # exceções permitem um ou vários hosts do firewall ou nenhum valor
    export logserver = discard, ipp, dict, ssh
    # portas do servidor tcp que são registradas quando os pacotes chegam
    export redserver = 0/0
    # redserver: a rede para portas do servidor preferível rede local ou vários ips
    exportar cliente vermelho = 0/0
    #clientnet: a rede para portas do cliente preferível a todas as redes
    export servidortcp = discard, ipp, dict, 6771
    # servidortcp: as portas do servidor tcp especificadas
    export serverudp = discard
    #udpserver: as portas do servidor udp especificadas
    exportar clientudp = domínio, bootpc, bootps, ntp, 20000: 45000
    #udp client: as portas do cliente udp especificadas
    exportar clienttcp = domain, http, https, ipp, git, dict, 14999: 15002
    # cliente tcp: as portas do cliente tcp especificadas
    ######################################### Fim de /etc/f-iptables/default.cfg |||||
    ######################################## Fim das variáveis ​​para modificar
    exportar firewall = $ 1 variáveis ​​= $ 2
    if ["$ variáveis" = "$ NULL"]; então source /etc/f-iptables/default.cfg;
    senão fonte / etc / f-iptables / $ 2; fi
    ######################################### Ou você substituirá as variáveis ​​por um arquivo .cfg
    ############################################################### #####################################################
    exportar firewall = $ 1 exportar variáveis ​​= $ 2
    ###################################################### Variáveis ​​automáticas do sistema
    if ["$ firewall" = "desconectado"]; em seguida, echo FIREWALL DISCONNECTED;
    export activateserver = »$ no» activateclient = »$ no» wet = »$ no»;
    elif ["$ firewall" = "cliente"]; em seguida, echo FIREWALL CLIENT;
    export activateserver = »$ no» activateclient = »» wet = »$ no»;
    elif ["$ firewall" = "servidor"]; em seguida, echo FIREWALL SERVER;
    export activateserver = »» activateclient = »$ no» wet = »$ no»;
    elif ["$ firewall" = "cliente e servidor"]; em seguida, echo FIREWALL CLIENT AND SERVER;
    exportar ativar servidor = »»; export activateclient = »»; export wet = »$ no»;
    elif ["$ firewall" = "permissivo"]; em seguida, echo PERMISSIVE FIREWALL;
    export activateserver = »$ no» activateclient = »$ no» wet = »»;
    outro
    $ check sudo echo iptables-legacy:
    $ check sudo iptables-legacy -v -L INPUT
    $ check sudo iptables-legacy -v -L OUTPUT
    $ check sudo echo iptables-nft:
    $ check sudo iptables-nft -v -L INPUT
    $ check sudo iptables-nft -v -L OUTPUT
    eco _____parâmetros____ $ 0 $ 1 $ 2
    echo "lançar sem parâmetros é listar iptables."
    echo "O primeiro parâmetro (habilitar iptables): desconectado ou cliente ou servidor ou cliente e servidor ou permissivo."
    echo "O segundo parâmetro: (opcional): o arquivo .cfg padrão escolhe /etc/f-iptables/default.cfg"
    echo "Configurações de variáveis:" $ (ls / etc / f-iptables /)
    saída 0; fi
    ################
    eco
    echo Lança $ 0 desconectado ou cliente ou servidor ou cliente e servidor ou permissivo ou variáveis ​​ou sem usar parâmetro para listar iptables.
    echo O arquivo $ 0 contém algumas variáveis ​​editáveis ​​dentro.
    ########################################## As variáveis ​​acima ativadas
    ########################################
    echo configurando as variáveis ​​iptables
    variáveis ​​ativadas por eco
    eco
    #################################### As regras de iptables
    echo Configurando o iptables-legacy
    sudo / usr / sbin / iptables-legacy -t filter -F
    sudo / usr / sbin / iptables-legacy -t nat -F
    sudo / usr / sbin / iptables-legacy -t mangle -F
    sudo / usr / sbin / ip6tables-legacy -t filter -F
    sudo / usr / sbin / ip6tables-legacy -t nat -F
    sudo / usr / sbin / ip6tables-legacy -t mangle -F
    sudo / usr / sbin / ip6tables-legacy -A INPUT -j DROP
    sudo / usr / sbin / ip6tables-legacy -A OUTPUT -j DROP
    sudo / usr / sbin / ip6tables-legacy -A FORWARD -j DROP
    sudo / usr / sbin / iptables-legacy -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACEITAR> / dev / null
    $ haylogserver sudo / usr / sbin / iptables-legacy -A INPUT -p tcp -m multiport –dports $ logserver -j LOG> / dev / null
    $ hayeexceptions sudo / usr / sbin / iptables-legacy -A INPUT -s $ exceções -j ACEITAR> / dev / null
    $ ativar servidor sudo / usr / sbin / iptables-legacy -A INPUT -p udp -m multiport –dports $ serverudp -s $ redserver -d $ redserver -j ACEITAR> / dev / null
    $ ativar servidor sudo / usr / sbin / iptables-legacy -A INPUT -p tcp -m multiport –dports $ serverrtcp -s $ redserver -d $ redserver -j ACEITAR> / dev / null
    $ activateclient sudo / usr / sbin / iptables-legacy -A INPUT -p udp -m multiport –sports $ clientudp -m state –state estabelecido -s $ clientnet -d $ clientnet -j ACEITAR> / dev / null
    $ activateclient sudo / usr / sbin / iptables-legacy -A INPUT -p tcp -m multiport –sports $ clienttcp -m estado –estado estabelecido -s $ clientnet -d $ clientnet -j ACEITAR> / dev / null
    $ hayping sudo / usr / sbin / iptables-legacy -A INPUT -p icmp –icmp-type echo-reply -j ACEITAR> / dev / null
    sudo / usr / sbin / iptables-legacy -A INPUT -j DROP> / dev / null
    sudo / usr / sbin / iptables-legacy -A SAÍDA -s 127.0.0.1 -d 127.0.0.1 -j ACEITAR> / dev / null
    $ hayeexceptions sudo / usr / sbin / iptables-legacy -A OUTPUT -d $ exceções -j ACEITAR> / dev / null
    $ ativar servidor sudo / usr / sbin / iptables-legacy -A SAÍDA -p udp -m multiport –sports $ serverudp -s $ redserver -d $ redserver -j ACEITAR> / dev / null
    $ ativar servidor sudo / usr / sbin / iptables-legacy -A SAÍDA -p tcp -m multiport –sports $ serverrtcp -s $ redserver -d $ redserver -j ACEITAR> / dev / null
    $ activateclient sudo / usr / sbin / iptables-legacy -A SAÍDA -p udp -m multiport –dports $ clientudp -s $ clientnet -d $ clientnet -j ACEITAR> / dev / null
    $ activateclient sudo / usr / sbin / iptables-legacy -A SAÍDA -p tcp -m multiport –dports $ clienttcp -s $ clientnet -d $ clientnet -j ACEITAR> / dev / null
    $ hayping sudo / usr / sbin / iptables-legacy -A SAÍDA -p icmp –icmp-type echo-request -j ACEITAR> / dev / null
    sudo / usr / sbin / iptables-legacy -A OUTPUT -j DROP
    sudo / usr / sbin / iptables-legacy -A FORWARD -j DROP
    echo iptables-legacy habilitado
    eco
    echo Setting iptables-nft
    sudo / usr / sbin / iptables-nft -t filter -F
    sudo / usr / sbin / iptables-nft -t nat -F
    sudo / usr / sbin / iptables-nft -t mangle -F
    sudo / usr / sbin / ip6tables-nft -t filter -F
    sudo / usr / sbin / ip6tables-nft -t nat -F
    sudo / usr / sbin / ip6tables-nft -t mangle -F
    sudo / usr / sbin / ip6tables-nft -A INPUT -j DROP
    sudo / usr / sbin / ip6tables-nft -A OUTPUT -j DROP
    sudo / usr / sbin / ip6tables-nft -A FORWARD -j DROP
    sudo / usr / sbin / iptables-nft -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACEITAR> / dev / null
    $ haylogserver sudo / usr / sbin / iptables-nft -A INPUT -p tcp -m multiport –dports $ logserver -j LOG> / dev / null
    $ hayeexceptions sudo / usr / sbin / iptables-nft -A INPUT -s $ exceções -j ACEITAR> / dev / null
    $ ativar servidor sudo / usr / sbin / iptables-nft -A INPUT -p udp -m multiport –dports $ serverudp -s $ redserver -d $ redserver -j ACEITAR> / dev / null
    $ ativar servidor sudo / usr / sbin / iptables-nft -A INPUT -p tcp -m multiport –dports $ serverrtcp -s $ redserver -d $ redserver -j ACEITAR> / dev / null
    $ activateclient sudo / usr / sbin / iptables-nft -A INPUT -p udp -m multiport –sports $ clientudp -m state –state estabelecido -s $ clientnet -d $ clientnet -j ACEITAR> / dev / null
    $ activateclient sudo / usr / sbin / iptables-nft -A INPUT -p tcp -m multiport –sports $ clienttcp -m estado –estado estabelecido -s $ clientnet -d $ clientnet -j ACEITAR> / dev / null
    $ hayping sudo / usr / sbin / iptables-nft -A INPUT -p icmp –icmp-type echo-reply -j ACEITAR> / dev / null
    sudo / usr / sbin / iptables-nft -A INPUT -j DROP> / dev / null
    sudo / usr / sbin / iptables-nft -A SAÍDA -s 127.0.0.1 -d 127.0.0.1 -j ACEITAR> / dev / null
    $ hayeexceptions sudo / usr / sbin / iptables-nft -A OUTPUT -d $ exceptions -j ACEITAR> / dev / null
    $ ativar servidor sudo / usr / sbin / iptables-nft -A SAÍDA -p udp -m multiport –sports $ serverudp -s $ redserver -d $ redserver -j ACEITAR> / dev / null
    $ ativar servidor sudo / usr / sbin / iptables-nft -A SAÍDA -p tcp -m multiport –sports $ serverrtcp -s $ redserver -d $ redserver -j ACEITAR> / dev / null
    $ activateclient sudo / usr / sbin / iptables-nft -A OUTPUT -p udp -m multiport –dports $ clientudp -s $ clientnet -d $ clientnet -j ACEITAR> / dev / null
    $ activateclient sudo / usr / sbin / iptables-nft -A SAÍDA -p tcp -m multiport –dports $ clienttcp -s $ clientnet -d $ clientnet -j ACEITAR> / dev / null
    $ hayping sudo / usr / sbin / iptables-nft -A SAÍDA -p icmp –icmp-type echo-request -j ACEITAR> / dev / null
    sudo / usr / sbin / iptables-nft -A OUTPUT -j DROP
    sudo / usr / sbin / iptables-nft -A FORWARD -j DROP
    echo iptables-nft habilitado
    eco
    $ wet sudo / usr / sbin / iptables-legacy -F> / dev / null
    $ wet sudo / usr / sbin / iptables-legacy -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACEITAR> / dev / null
    $ wet sudo / usr / sbin / iptables-legacy -A INPUT -m estado –state estabelecido -j ACEITAR> / dev / null
    $ wet sudo / usr / sbin / iptables-legacy -A INPUT -j DROP> / dev / null
    $ wet sudo / usr / sbin / iptables-legacy -A SAÍDA -j ACEITAR> / dev / null
    $ wet sudo / usr / sbin / iptables-legacy -A FORWARD -j DROP> / dev / null
    $ wet sudo / usr / sbin / iptables-nft -F> / dev / null
    $ wet sudo / usr / sbin / iptables-nft -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACEITAR> / dev / null
    $ wet sudo / usr / sbin / iptables-nft -A INPUT -m estado –estado estabelecido -j ACEITAR> / dev / null
    $ wet sudo / usr / sbin / iptables-nft -A INPUT -j DROP> / dev / null
    $ wet sudo / usr / sbin / iptables-nft -A SAÍDA -j ACEITAR> / dev / null
    $ wet sudo / usr / sbin / iptables-nft -A FORWARD -j DROP> / dev / null
    ##################################
    eco, você jogou $ 0 $ 1 $ 2
    # sai do script
    sair 0

  8.   Luis duran dito

    Como eu definiria uma regra se esse firewall usasse para meu gateway e tivesse um squid dentro da LAN ???