Netgate Discussion Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Search
    • Register
    • Login

    [AJUDA] Bloqueando sub-redes por script ou linha de comando

    Scheduled Pinned Locked Moved Portuguese
    11 Posts 4 Posters 1.6k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • J Offline
      johncassol
      last edited by

      Boa tarde,

      Estou querendo mudar o meu firewall, atualmente uso CentOS com iptables, e utilizo um shell script que é imprescindível funcionar no pfsense:

      
      # carrega modulos necessarios
      modprobe ip_tables
      modprobe iptable_nat
      modprobe ip_nat_ftp
      modprobe ip_conntrack_ftp
      modprobe ip_conntrack
      
      iptables -F
      iptables -X
      iptables -Z
      
      #limpa as regras de nat na memoria se tiver
      iptables -t nat -F
      iptables -t nat -X
      iptables -t nat -Z
      
      #limpa as mangle
      iptables -t mangle -F
      iptables -t mangle -X
      iptables -t mangle -Z
      
      S=$(mysql -h 200.xxx.xxx.xxx -u rede -p -e "select * from xxe_lab" xxe)
      
      # a procura retornou algum registro ?!
        [ "$S" ] || { echo "Registro não encontrado";exit; }
      
       # colocar um TAB como IFS
        IFS="$(echo -e '\t')"
        # Apagamos a primeira linha, pois ela contém o nome dos campos
        S=$(echo "$S" | sed '1d')
      
        echo "$S" | while read id_lab descricao_lab ip_inicio_lab ip_fim_lab drop_lab;do
      
      if [ $drop_lab = '1' ];then
        for ((i=$ip_inicio_lab; i <= $ip_fim_lab; i++))
          do
      #      echo "$i xxx"
            iptables -A FORWARD -d 10.80.2.$i -s 200.xxx.xxx.xxx/24 -j ACCEPT
            iptables -A FORWARD -s 10.80.2.$i -d 200.xxx.xxx.xxx/24 -j ACCEPT
            iptables -A FORWARD -d 10.80.2.$i -s 10.80.1.134 -j ACCEPT
            iptables -A FORWARD -s 10.80.2.$i -d 10.80.1.134 -j ACCEPT
            iptables -A FORWARD -d 10.80.2.$i -j DROP
            iptables -A FORWARD -s 10.80.2.$i -j DROP
            iptables -A INPUT -p tcp --dport 3128 -s 10.80.2.$i -j DROP
          done
        fi
      done
      
      

      basicamente ele se conecta em um banco de dados e verifica se a tabela drop_labs está =1 a cada minuto pelo crontab aí ele dropa as conexões dos laboratórios para ninguém navegar.
      Eu já instalei o mysql-client no pfsense pra procurar a tabela, porém não achei ainda nenhum comando que se equivale ao iptables. Tentei utilizar o easyrule porém a cada 1 minuto ele fica adicionando as mesmas regras causando um overload e não existe comando para deletar estas regras.

      Alguém teria alguma idéia para me ajudar a resolver este problema? Obrigado

      EDIT1: Talvez usando SQUID?

      1 Reply Last reply Reply Quote 0
      • T Offline
        tomaswaldow
        last edited by

        Olá, poderia explicar melhor a necessidade e funcionalidade desse script, pois não entendi bem.
        Você tem uma lista de IP que precisa bloquear por determinado tempo ou por horário?

        Tomas @ 2W Consultoria

        1 Reply Last reply Reply Quote 0
        • J Offline
          juninhoandrade
          last edited by

          @johncassol:

          Boa tarde,

          Estou querendo mudar o meu firewall, atualmente uso CentOS com iptables, e utilizo um shell script que é imprescindível funcionar no pfsense:

          
          # carrega modulos necessarios
          modprobe ip_tables
          modprobe iptable_nat
          modprobe ip_nat_ftp
          modprobe ip_conntrack_ftp
          modprobe ip_conntrack
          
          iptables -F
          iptables -X
          iptables -Z
          
          #limpa as regras de nat na memoria se tiver
          iptables -t nat -F
          iptables -t nat -X
          iptables -t nat -Z
          
          #limpa as mangle
          iptables -t mangle -F
          iptables -t mangle -X
          iptables -t mangle -Z
          
          S=$(mysql -h 200.xxx.xxx.xxx -u rede -plaB#08 -e "select * from xxe_lab" xxe)
          
          # a procura retornou algum registro ?!
            [ "$S" ] || { echo "Registro não encontrado";exit; }
          
           # colocar um TAB como IFS
            IFS="$(echo -e '\t')"
            # Apagamos a primeira linha, pois ela contém o nome dos campos
            S=$(echo "$S" | sed '1d')
            
            echo "$S" | while read id_lab descricao_lab ip_inicio_lab ip_fim_lab drop_lab;do
          
          if [ $drop_lab = '1' ];then
            for ((i=$ip_inicio_lab; i <= $ip_fim_lab; i++))
              do
          #      echo "$i xxx"
                iptables -A FORWARD -d 10.80.2.$i -s 200.xxx.xxx.xxx/24 -j ACCEPT
                iptables -A FORWARD -s 10.80.2.$i -d 200.xxx.xxx.xxx/24 -j ACCEPT
                iptables -A FORWARD -d 10.80.2.$i -s 10.80.1.134 -j ACCEPT
                iptables -A FORWARD -s 10.80.2.$i -d 10.80.1.134 -j ACCEPT
                iptables -A FORWARD -d 10.80.2.$i -j DROP
                iptables -A FORWARD -s 10.80.2.$i -j DROP
                iptables -A INPUT -p tcp --dport 3128 -s 10.80.2.$i -j DROP
              done
            fi
          done
          
          

          basicamente ele se conecta em um banco de dados e verifica se a tabela drop_labs está =1 a cada minuto pelo crontab aí ele dropa as conexões dos laboratórios para ninguém navegar.
          Eu já instalei o mysql-client no pfsense pra procurar a tabela, porém não achei ainda nenhum comando que se equivale ao iptables. Tentei utilizar o easyrule porém a cada 1 minuto ele fica adicionando as mesmas regras causando um overload e não existe comando para deletar estas regras.

          Alguém teria alguma idéia para me ajudar a resolver este problema? Obrigado

          EDIT1: Talvez usando SQUID?

          cria o arquivo no /etc/nomedoarquivo

          OBS: lembre de iniciar com : #!/usr/local/bin/php -f

          chmod +x /etc/nomedoarquivo

          instala cron (Packet)

          coloca la

          */1

          Usuário : root
          no comando coloca
          /etc/nomedoarquivo

          1 Reply Last reply Reply Quote 0
          • J Offline
            johncassol
            last edited by

            @Tomas:

            Olá, poderia explicar melhor a necessidade e funcionalidade desse script, pois não entendi bem.
            Você tem uma lista de IP que precisa bloquear por determinado tempo ou por horário?

            Opa! Então, nós temos dois laboratórios aqui em uma escola, quando o professor precisa bloquear a internet, ele acessa um site e faz o bloqueio por lá, o site por sua vez altera o valor da tabela block_labs=0 para block_labs=1. Então o script faz a consulta nessa tabela a cada 1 minuto. Eu precisaria implementar esse script no pfsense porém sem o iptables.

            1 Reply Last reply Reply Quote 0
            • J Offline
              johncassol
              last edited by

              @JuniorAndrade:

              cria o arquivo no /etc/nomedoarquivo

              OBS: lembre de iniciar com : #!/usr/local/bin/php -f

              chmod +x /etc/nomedoarquivo

              instala cron (Packet)

              coloca la

              */1

              Usuário : root
              no comando coloca
              /etc/nomedoarquivo

              isso é o que eu uso atuamente. Eu precisaria implementar isso no pfsense, mas ele não tem suporte ao iptables.

              1 Reply Last reply Reply Quote 0
              • L Offline
                lucaspolli
                last edited by

                pfsense usa ipfw da uma pesquisada em como construir suas regras com ele..

                1 Reply Last reply Reply Quote 0
                • J Offline
                  johncassol
                  last edited by

                  @Lucas:

                  pfsense usa ipfw da uma pesquisada em como construir suas regras com ele..

                  Opa Lucas, tentei habilitar o ipfw aqui no rc.conf mas aí ele ignorou todas as regras criadas no GUI. Como faz?

                  1 Reply Last reply Reply Quote 0
                  • L Offline
                    lucaspolli
                    last edited by

                    pois eh ai vc tem um problema, teoricamente estaria rodando dois firewalls ao mesmo tempo, um no script e um na gui.. nao sei como ele se comporta internamente mais creio que teria que "integrar" as regras.. agora como se faz isso eu nao tenho ideia… talvez interagir com o script ja existente que a gui usa..

                    1 Reply Last reply Reply Quote 0
                    • J Offline
                      johncassol
                      last edited by

                      @Lucas:

                      pois eh ai vc tem um problema, teoricamente estaria rodando dois firewalls ao mesmo tempo, um no script e um na gui.. nao sei como ele se comporta internamente mais creio que teria que "integrar" as regras.. agora como se faz isso eu nao tenho ideia… talvez interagir com o script ja existente que a gui usa..

                      Lucas estou tentando utilizar o curl para fazer um POST nas regras do firewall, da uma olhada na imagem abaixo:

                      ao clicar no play na GUI ele desabilita a regra, só que estou tendo alguns problemas na linha de comando:

                      curl -k -b cookies.txt -c cookies.txt –data 'login=Login&usernamefld=USUARIO&passwordfld=SENHA' --data 'if=lan&act=toggle&id=13' http://xxx.xxx.xxx.xxx:1234/firewall_rules.php

                      ao aplicar a sintaxe a regra não desabilita na GUI. Você saberia utilizar o curl? eu já desabilitei a proteção CSRF.

                      1 Reply Last reply Reply Quote 0
                      • J Offline
                        johncassol
                        last edited by

                        Depois de 8 horas de muita pesquisa e tentativas cheguei a essa solução:

                        curl -v -k -b cookies.txt -c cookies.txt –data 'login=Login&usernamefld=USER&passwordfld=PASSWORD' --get 'http://xxx.xxx.xxx.xxx:1234/firewall_rules.php?if=lan' --data-urlencode POST 'http://xxx.xxx.xxx.xxx:1234/firewall_rules.php?if=lan&act=toggle&id=13'

                        1 Reply Last reply Reply Quote 0
                        • J Offline
                          johncassol
                          last edited by

                          Bom, consegui fazer a solução completa…segue:

                          #!/bin/sh

                          This script will be executed after all the other init scripts.

                          You can put your own initialization stuff in here if you don't

                          want to do the full Sys V style init stuff.

                          S=$(mysql -h xxx.xxx.xxx.xxx -u rede -psenha -e "select * from xxe_lab" xxe)

                          a procura retornou algum registro ?!

                          [ "$S" ] || { echo "Registro nao encontrado";exit; }

                          colocar um TAB como IFS

                          IFS="$(echo -e '\t')"
                            # Apagamos a primeira linha, pois ela contem o nome dos campos
                            S=$(echo "$S" | sed '1d')
                            echo "$S"

                          echo "$S" | while read id_lab descricao_lab ip_inicio_lab ip_fim_lab drop_lab;do

                          #–-------------------------------------------------------------------------------------------------------------------------------------

                          #se o laboratorio GRANDE estive bloqueado no SGI entao...
                          if [ $id_lab = '1' ] && [ $drop_lab = '1' ];then

                          #cria um cookie com o login
                          curl -s -k -c /root/cookies.txt -b /root/cookies.txt –data 'login=Login&usernamefld=admin&passwordfld=pfsense' https://xxx.xxx.xxx.xxx:5050/firewall_rules.php

                          #com a sessao criada aplica a regra 49 da aba LAN
                          curl -s -k -c /root/cookies.txt -b /root/cookies.txt --data 'login=Login&usernamefld=admin&passwordfld=pfsense' --get 'https://xxx.xxx.xxx.xxx:5050/firewall_rules.php?if=lan' --data-urlencode POST
                          'https://xxx.xxx.xxx.xxx:5050/firewall_rules.php?if=lan&act=toggle&id=49'

                          #aplica a regra para funcionamento
                          #curl -s -k -c /root/cookies.txt -b /root/cookies.txt --data 'login=Login&usernamefld=admin&passwordfld=pfsense' --data "apply=aply" https://xxx.xxx.xxx.xxx:5050/firewall_rules.php
                          /etc/rc.filter_configure

                          #conecta no banco e muda o valor do drop_lab para 3 do lab GRANDE
                          mysql -h xxx.xxx.xxx.xxx -u rede -psenha -e "update xxe_lab set drop_lab=3 where id_lab=1" xxe

                          #mata as conexoes ativas
                          pfctl -k 10.80.2.128/26

                          fi
                          #--------------------------------------------------------------------------------------------------------------------------------
                          #se o laboratorio PEQUENO estive bloqueado no SGI entao...
                          if [ $id_lab = '2' ] && [ $drop_lab = '1' ];then

                          #cria um cookie com o login
                          curl -s -k -c /root/cookies.txt -b /root/cookies.txt –data 'login=Login&usernamefld=admin&passwordfld=pfsense' https://xxx.xxx.xxx.xxx:5050/firewall_rules.php

                          #com a sessao criada aplica a regra 50 da aba LAN
                          curl -s -k -c /root/cookies.txt -b /root/cookies.txt --data 'login=Login&usernamefld=admin&passwordfld=pfsense' --get 'https://xxx.xxx.xxx.xxx:5050/firewall_rules.php?if=lan' --data-urlencode POST
                          'https://xxx.xxx.xxx.xxx:5050/firewall_rules.php?if=lan&act=toggle&id=50'

                          #aplica a regra para funcionamento
                          #curl -s -k -c /root/cookies.txt -b /root/cookies.txt --data 'login=Login&usernamefld=admin&passwordfld=pfsense' --data "apply=aply" https://xxx.xxx.xxx.xxx:5050/firewall_rules.php
                          /etc/rc.filter_configure

                          #conecta no banco e muda o valor do drop_lab para 3 do lab PEQUENO
                          mysql -h xxx.xxx.xxx.xxx -u rede -psenha -e "update xxe_lab set drop_lab=3 where id_lab=2" xxe

                          #mata as conexoes ativas
                          pfctl -k 10.80.2.192/27 | pfctl -k 10.80.2.224/29

                          fi

                          #---------------------------------------------------------------------------------------------------------------------------------------

                          #se o laboratorio GRANDE NAO estiver  bloqueado no SGI entao...
                          if [ $id_lab = '1' ] && [ $drop_lab = '0' ];then

                          #cria um cookie com o login
                          curl -s -k -c /root/cookies.txt -b /root/cookies.txt –data 'login=Login&usernamefld=admin&passwordfld=pfsense' https://xxx.xxx.xxx.xxx:5050/firewall_rules.php

                          #com a sessao criada aplica a regra 49 da aba LAN
                          curl -s -k -c /root/cookies.txt -b /root/cookies.txt --data 'login=Login&usernamefld=admin&passwordfld=pfsense' --get 'https://xxx.xxx.xxx.xxx:5050/firewall_rules.php?if=lan' --data-urlencode POST
                          'https://xxx.xxx.xxx.xxx:5050/firewall_rules.php?if=lan&act=toggle&id=49'

                          #aplica a regra para funcionamento
                          #curl -s -k -c /root/cookies.txt -b /root/cookies.txt --data 'login=Login&usernamefld=admin&passwordfld=pfsense' --data "apply=aply" https://xxx.xxx.xxx.xxx:5050/firewall_rules.php
                          /etc/rc.filter_configure

                          #conecta no banco e muda o valor do drop_lab para 4 do lab GRANDE
                          mysql -h xxx.xxx.xxx.xxx -u rede -psenha -e "update xxe_lab set drop_lab=4 where id_lab=1" xxe
                          fi

                          #---------------------------------------------------------------------------------------------------------------------------------------

                          #se o laboratorio PEQUENO NAO estiver  bloqueado no SGI entao...
                          if [ $id_lab = '2' ] && [ $drop_lab = '0' ];then

                          #cria um cookie com o login
                          curl -s -k -c /root/cookies.txt -b /root/cookies.txt –data 'login=Login&usernamefld=admin&passwordfld=pfsense' https://xxx.xxx.xxx.xxx:5050/firewall_rules.php

                          #com a sessao criada aplica a regra 49 da aba LAN
                          curl -s -k -c /root/cookies.txt -b /root/cookies.txt --data 'login=Login&usernamefld=admin&passwordfld=pfsense' --get 'https://xxx.xxx.xxx.xxx:5050/firewall_rules.php?if=lan' --data-urlencode POST
                          'https://xxx.xxx.xxx.xxx:5050/firewall_rules.php?if=lan&act=toggle&id=50'

                          #aplica a regra para funcionamento
                          #curl -s -k -c /root/cookies.txt -b /root/cookies.txt --data 'login=Login&usernamefld=admin&passwordfld=pfsense' --data "apply=aply" https://xxx.xxx.xxx.xxx:5050/firewall_rules.php
                          /etc/rc.filter_configure

                          #conecta no banco e muda o valor do drop_lab para 4 do lab GRANDE
                          mysql -h xxx.xxx.xxx.xxx -u rede -psenha -e "update xxe_lab set drop_lab=4 where id_lab=2" xxe
                          fi

                          #---------------------------------------------------------------------------------------------------------------------------------------

                          done

                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post
                          Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.