De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Fabio Maximo
Data de Publicação: 13 de Setembro de 2006
Essa dica é muito legal para quem tem servidores remotos e preocupa-se com segurança no SSH. Voce pode fechar todo fluxo na porta 22 e so voce abre quando precisa.
O knock é um daemon que atenta para o que ocorre em certas portas no servidor. Quando alguem "bate" nas portas certas e na ordem certa, um determinado comando é executado.
Importante notar que as portas não estão abertas. O Deamon checa isso a nivel de kernel, portanto um port scan não detecta diferença nenhuma entre uma porta que sera knockada e uma outra qualquer.
Uma vez que o knock tenha sido realizado corretamente, o comando padrao é liberar acesso ssh para o IP que knockou o servidor.
Poder ser adicionados outros comandos e combinacoes de porta.
$ wget "http://www.zeroflux.org/knock/files/knock-0.5.tar.gz"
$ tar -xvzf knock-0.5.tar.gz
$ cd knock-0.5 $ ./configure $ make $ make install
$ vi /etc/knockd.conf
$ cd /etc/init.d/
O Seguinte script para inicialização foi escrito por Marcio Andréeta - utilizar mas manter a nota de autoria.
  $  vi knockd
  ============================INICIO DO SCRIPT==========================
  #!/bin/sh
  # Script written by Marcio Luis Barsi Andréeta 04/07/2005
  #
  # This script starts/stops knockd
  # normal UNIX system operation
  #
  # This file is installed as:
  #     /etc/rc.d/init.d/knockd
  EXECUTABLE=/usr/local/sbin/knockd
  # error "description"
  error () {
  /bin/echo $0: $* 2>&1
  exit 1
  }
  # find the named process(es)
  findproc() {
  pid=`/bin/ps auxww |
  /bin/grep root |
  /bin/grep -e "$1\$" |
  /bin/grep -v grep |
  /bin/awk '{print $2}'`
  /bin/echo $pid
  }
  # for testing purposes only
  testproc() {
  pid=`/bin/ps auxww |
  /bin/grep root |
  /bin/grep -e "$1\$" |
  /bin/grep -v grep |
  /bin/awk '{print $2}'`
  /bin/echo $pid
  }
  # kill the named process(es)
  killproc() {
  pid=`findproc "$1"`
  [ "$pid" != "" ] && kill -TERM $pid
  }
  # kill the named process(es)
  forcedkillproc() {
  pid=`findproc "$1"`
  [ "$pid" != "" ] && kill -9 $pid
  }
  # Start/stop knockd
  case "$1" in
  'start')
  /bin/echo -n "Starting knockd..."
  # Check if the server is already running.
  if [ -n "`findproc "$EXECUTABLE"`" ]; then
  /bin/echo "knockd deamon is running."
  exit 0
  fi
  $EXECUTABLE &
  /bin/echo "done"
  ;;
  'stop')
  /bin/echo -n "Stopping knockd..."
  echo `findproc $EXECUTABLE`
  if [ -z "`findproc "$EXECUTABLE"`" ]; then
  /bin/echo "not running."
  exit 0
  fi
  killproc "$EXECUTABLE"
  /bin/echo "done"
  ;;
  *)
  /bin/echo "Usage: $0 { start | stop }"
  # for testing testing functions
  echo "`testproc "$EXECUTABLE"`"
  ;;
  esac
  ============================FIM DO SCRIPT==========================
  
  Startar o serviço no RedHat / Fedora
  
  ``` $  service knockd start
  
  Em outras distros
  
  ``` $ /etc/init.d/knockd start
  
  Para que o mesmo starte no boot da maquina vamos adicionar um link no Run
  Level 3 - Isso pode mudar de acordo com a distro.
$ cd /etc/rc3.d/ $ ln -s /etc/init.d/knockd S99knockd
Abaixo esta o conteudo do /etc/knockd.conf - Repare que o mesmo é muito simples, dando opcao de configuracao do arquivo de log e os comandos abaixo com as sequiencias de portas na opcao sequence. ==Conteudo do /etc/knockd.conf==
[options] logfile = /var/log/knockd.log
[openSSH] sequence = 7000,8000,9000 seq_timeout = 5 command = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn
[closeSSH] sequence = 9000,8000,7000 seq_timeout = 5 command = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn
Interessante que se voce quiser montar uma sequencia para outro comando voce pode. Mas se voce tem shell, pra que mais? Em todo caso poderiamos acrescentar:
[wall] sequence = 7001,8001,9001 seq_timeout = 5 command = /usr/bin/wall "TESTE OK" tcpflags = syn
Bem, mas como vamos bater nessa porta?? Simples: De sua estação use o comando knock seguindo a sintaxe / exemplo abaixo:
knock [ip] [portas] $ knock 192.168.0.90 7001 8001 9001
Para os que usam estação Windows, ha um "batedor" para windows, e a sintaxe é a mesma. Da para baixar do seguinte link: http://www.zeroflux.org/cgi-bin/cvstrac.cgi/knock/wiki