sábado, 12 de dezembro de 2020

Dança das Cadeiras - Script

O jogo da Dança das Cadeiras é necessário que a música páre aleatoriamente para que os jogadores possam disputar as cadeiras livres.

Uma forma simples de se alcançar isso com o audacious é colocar a reproduzir uma música e utilizar o comando sleep para esperar aleatoriamente e depois pausar a reprodução com a ferramenta audtool:

sleep $((15 + RANDOM % 30)) && audtool --playback-pause

 

Para se repetir rapidamente na consola sem ser necessário iniciar a reprodução novamente no audacious é possível utilizar o seguinte:

audtool --playback-pause && sleep $((15 + RANDOM % 30)) && audtool --playback-pause


sábado, 27 de junho de 2020

Windows 10 Ambiente de Trabalho remoto através de um túnel SSH

A PowerShell do Windows 10 pode ter o cliente de SSH instalado e funcionar tal como num sistema Linux.

Verificar se cliente OpenSSH está instalado

Para se verificar se o cliente OpenSSH está instalado é necessário iniciar a PowerShell como administrador e introduzir o comando:
Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'

Caso seja apresentado Installed é porque está instalado.

No caso de não estar instalado é possível instalar.

Instalar o cliente OpenSSH na PowerShell

Caso seja necessário instalar o cliente OpenSSH é necessário iniciar a PowerShell como administrador e utilizar o comando:
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

Criar tunnel SSH com Port Forwarding

Na Linha de Comandos ou na PowerShell é possível ligar a um servidor SSH remoto e criar dentro dessa ligação um encaminhamento de porto (Port Forwarding) que permita aceder, por exemplo, a um ambiente de trabalho remoto noutra máquina que esteja na mesma rede remota.


Assim, o cliente precisa de iniciar uma ligação SSH ao servidor SSH no porto 22. De seguida tem que ser criado um porto na máquina cliente ligado ao porto 3389 do servidor RDP e que permitirá utilizar o porto local como se fosse de facto o porto remoto.

Esta abstração é feita com a opção -L do comando SSH onde é possível indicar:
[Porto Local]:[IP da máquina remota que disponibiliza o serviço]:[Porto do serviço]

A opção -N permite que não seja executado qualquer comando na máquina remota, pois apenas é necessário o encaminhamento de portos.

A opção -l permite especificar o nome de utilizador para o servidor SSH.

A opção -p permite especificar um porto diferente para o servidor SSH (caso não seja o porto 22 por defeito).

ssh -N -L 13389:[Windows RDP Server]:3389 [SSH Server] -l [ssh username]




Ligação de Ambiente de Trabalho Remoto ao tunnel

A partir daqui o porto local 13389 será uma ligação direta ao porto 3389 da máquina servidora de RDP. Esta ligação é criada dentro da ligação SSH e é, por isso, encriptada.

Através da Ligação de Ambiente de Trabalho Remoto é possível ligar ao servidor RDP remoto utilizando o porto local:

localhost:13389




Terminar a ligação

Para terminar a ligação resta fechar a Ligação de Ambiente de Trabalho Remoto e pressionar CTRL+C para terminar o comando SSH.


domingo, 21 de junho de 2020

Kodi - Youtube AddOn

A instalação do plugin Youtube no Kodi não funciona imediatamente.

Indica que é necessário instalar as chaves de API. Para tal é necessário criar um projeto na consola de developers de uma conta Google.

O processo encontra-se descrito na documentação do plugin e em diversos vídeos e tutoriais.

Criação das Chaves

É necessário aceder a uma conta Google e depois à consola de Developers:

Éé necessário criar um novo projeto:

Deve definir-se o nome do projeto:
Na Biblioteca de API é possível ver as API disponíveis, no caso de ainda não ter qualquer API é preciso acrescentar:

Da lista de API's disponíveis deve escolher-se a YouTube Data API:

E de seguida deve ativar-se:

Ao ativar será necessário criar credenciais para a sua utilização:

No assistente de criação de credenciais deve selecionar-se a API do YouTube, Other UI e User Data. No final deve clicar-se em no botão que contém a pergunta What credentials do I Need?:


Se seguida serão criadas credenciais de autenticação OAuth e é necessário definir o consentimento:

Na nova aba/janela é necessário configurar o tipo de consentimento, neste caso como External e Criar:

No passo seguinte é necessário definir algumas informações genéricas para a nossa API:

Após salvar é necessário regressar à aba/janela original:

E aqui adicionar as credenciais ao projeto, indicando um nome para o cliente OAuth 2.0 e criando o OAuth client ID:

Após a criação do OAuth Clinet ID este passo está concluído:

De seguida é preciso criar uma chave API:

Depois de criada é resta fechar a janela:

No ecrã de Credenciais é possível ver a chave API e o ID de cliente OAuth:

Para se saber o OAuth Client Secret é necessário editar o OAuth Client:

Resta guardar estas informações que correspondem
  • API Key » API Key
  • OAuth client ID » API Id
  • OAuth client secret » API Secret

Configuração do YouTube AddOn no Kodi

Existem diversas opções para configuração do AddOn YouTube no Kodi e, dependendo da forma como está a ser utilizado o Kodi, umas poderão ser mais fáceis do que outras:
  1. Configurar diretamente o AddOn no Kodi introduzindo manualmente todos os valores
  2. Ativar no AddOn: Enable API configuration page e depois configurar os valores através do browser
  3. Fechar o Kodi e editar manualmente o ficheiro userdata/addon_data/plugin.video.youtube/api_keys.json


Configuração através da página web de configuração do AddOn

Como normalmente utilizo o Kodi numa televisão com um Raspberry Pi através do LibreELEC ou OSMC, o mais simples é mesmo ativar a API configuration page e num computador copiar/colar os valores.

No Kodi é necessário aceder à configuração do AddOn YouTube e ativar: Enable API configuration page

De seguida num browser com acesso aos dados da API abrir a página:

Devem colar-se as informações guardadas anteriormente e Guardar:

De seguida deve desativar-se o acesso à página de configuração da API e poder-se-á começar a utilizar o AddOn normalmente no Kodi.

sábado, 20 de junho de 2020

Google Drive File Stream - Linux

Não havendo aplicação nativa para Linux do Google Drive File Stream a comunidade cria e partilha as suas soluções: google-drive-ocamlfuse.

Instalação

Na documentação existem diversas opções para a instalação. Neste caso utilizei as instruções para Debian Stretch.

Instalação de dependências

apt install software-properties-common dir

Adicionar repositório

Criar um ficheiro para o repositório apt:
nano /etc/apt/sources.list.d/google-drive-ocamlfuse.list

Acrescentar ao ficheiro:
deb http://ppa.launchpad.net/alessandro-strada/ppa/ubuntu xenial main

Adicionar a chave do servidor ao apt:
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys AD5F235DF639B041

Instalar

Atualizar a lista de pacotes:
apt update

Instalar o pacote:
apt install google-drive-ocamlfuse

Utilização

Primeira Utilização

Na primeira utilização será configurado o acesso ao Google Drive. Assim, deve executar-se o programa sem qualquer argumento:
google-drive-ocamlfuse

O comando cria uma estrutura de pastas de configuração em ~/.gdfuse/default que contém o ficheiro de configuração config.

De seguida abre o browser e pede para iniciar sessão com a conta Google que dará acesso ao Drive correspondente. Após iniciar-se sessão parece que o processo fica parado e pode demorar algum tempo até a linha de comandos indicar que configurou tudo com sucesso e sair do programa voltando à shell normal.

Pastas

Antes de se começar a utilizar convém criar um diretório que será o ponto de montagem dos ficheiros Google Drive.
Assim, pode criar-se:
mkdir ~/DRIVE

Caso se pretenda ter utilizadores ou drives diferentes podem criar-se diferentes diretórios para cada um desses fins. Como previa essa utilização criei uma pasta para a drive pessoal:
mkdir ~/DRIVE/Drive

Montar Google Drive

Para se aceder aos ficheiros é necessário executar o comando:
google-drive-ocamlfuse ~/DRIVE/Drive

A partir deste momento na pasta ~/DRIVE/Drive estarão os ficheiros e pastas tal e qual como no Google Drive e é possível abrir, editar, copiar, colar, mover, etc.

Desmontar Google Drive

Caso se pretenda terminar a utilização é possível desmontar com o comando:
fusermount -u ~/DRIVE/Drive

Utilização de Outras Contas e Team Drives

No caso de ser necessário utilizar outras contas é possível utilizar o parâmetro -label para definir outras credenciais de acesso ou utilizar uma Team Drive.
google-drive-ocamlfuse -l myTeamDrive

Será iniciado o processo de autorização que deve ser feito com a conta Google que terá acesso à Team Drive e aguardar que termine.
Quando terminar é necessário saber o team_drive_id da Team Drive

Team Drive ID

Para saber qual o team drive ID é necessário aceder à Team Drive através do browser e observar o URL e copiar a última parte:
https://drive.google.com/drive/u/1/folders/0XS2-_aJgHL29KfOVHAS22

De seguida é necessário abrir o ficheiro de configuração: ~/.gdfuse/myTeamDrive/config

Procurar a chave no final do ficheiro e colocar o ID:
team_drive_id=0XS2-_aJgHL29KfOVHAS22

Guardar o ficheiro e fechar.

Criar Pasta

Deve criar-se a pasta para a Team Driv:
mkdir ~/DRIVE/Team

Montar Team Drive

Para montar a Team Drive é necessário executar o comando com a label e o diretório correspondente:
google-drive-ocamlfuse -label myTeamDrive ~/DRIVE/Team

Desmontar Google Drive

Caso se pretenda terminar a utilização é possível desmontar com o comando:
fusermount -u ~/DRIVE/Team


Referências e Recursos

domingo, 17 de maio de 2020

Kodi - Netflix e HBO Portugal

Utilização de um Raspberry Pi com OSMC e Kodi para ver Netflix e HBO Portugal

Ao longo dos anos a utilização de um raspberry pi para transformar uma televisão estúpida numa televisão esperta foi uma opção muito válida.

Agora com os serviços de streaming legais e disponíveis em Portugal a sua utilização num simples Raspberry Pi eleva ainda mais a inteligência de qualquer televisão.

Mais, qualquer televisão que tenha ficado burra (porque deixou de ter suporte para as atualizações dos serviços de streaming) pode recuperar alguma inteligência.

O sistema está operacional num Raspberry Pi 3 B+, com o OSMC num cartão de 32GB (é necessário ter algum espaço, no mínimo deverá utilizar-se um cartão de 8GB).

Atualização: Recentemente testei o setup num Raspberry Pi 4 B e, como o OSMC ainda não tem suporte para este dispositivo, utilizei o LibreELEC num cartão de 16GB.
Assim, pude verificar que o processo para instalação do Netflix pode ser mais simples tendo funcionado sem instalar os pacotes extra como referido pelo pimylife.


HBO Portugal

A instalação do Add-On para a HBO Portugal é simples e encontra-se disponível no repositório oficial.

Assim, basta aceder aos Add-Ons e Instalar a partir de um repositório. Na secção de Vídeos Add-Ons é necessário procurar por hGO EU e instalar.

Durante a instalação será necessário instalar o WidevineCDM (ver) que demora algum tempo.

Na configuração do Add-On é necessário escolher o País e no caso de Portugal escolher o tipo de utilização, neste caso foi escolhido o HBO Portugal. A lista de países suportadas é extensa.

Na primeira inicialização será preciso introduzir as credenciais de acesso à HBO Portugal e começar a utilizar o Add-On que funciona muito bem.


Netflix

Há pouco tempo experimentei novamente a instalação do AddOn Netflix utilizando o LibreELEC com a última versão do Kodi e os passos dados foram substancialmente mais simples.

Acedendo por SSH é possível descarregar o ZIP do repositório CastagnaIT diretamente para o raspberry pi (também é possível transferir utilizando outras formas, por exemplo, por pen ou SAMBA):

ssh root@LibreELEC
wget https://github.com/castagnait/repository.castagnait/raw/master/repository.castagnait-1.0.1.zip

Após estes comandos podemos aceder ao Kodi e será necessário ir a Sistema e ativar Fontes Desconhecidas para ser possível utilizar o repositório CastagnaIT.

Nos Add-Ons é necessário aceder a Instalar a partir de um ZIP e escolher o ficheiro ZIP descarregado anteriormente (que deve estar na pasta home).

Depois de instalado é possível entrar no repositório CastagnaIT e instalar o Add-On Netflix que está em Video Add-Ons.

A instalação demora um pouco e depois é possível abrir o Add-On.

Mesmo que não esteja instalado o Widevine CDM o AddOn funciona deixando navegar por todo o conteúdo e apenas pedindo para ser instalado aquando da primeira reprodução de um qualquer conteúdo.


Para estes AddOns funcionarem será necessário ter instalado o Widevine CDM. Qualquer um deles, caso seja necessário, pedirá para se instalar o Widevine CDM e basta seguir os diferentes passos. Só é necessário instalar uma vez.

Atenção que será necessário bastante espaço para fazer as operações necessárias (>3GB) por isso convém ter um cartão com espaço e aguardar que a instalação termine (ainda é um processo demorado).


Problemas
Caso a imagem esteja desfasada do som/legendas pode ser necessário aceder às Definições do Add-on e baixar a qualidade. No Raspberry Pi 3 B+ standard é possível utilizar a qualidade 720p sem qualquer problema. O 1080p funciona bem em animação mas não dá para ver conteúdos de imagem real de forma minimamente aceitável.

Referências


quarta-feira, 22 de janeiro de 2020

Clonezilla - Clonar HDD para SSD mais pequeno

Gparted ou Windows Disk Management

Reduzir o tamanho das partições até ficar com espaço não alocado no final do disco. O tamanho total das partições deverá ser inferior à capacidade do SSD.


Clonezilla - Expert

device-device
-g
-icds


-k (a tabela de partições foi criada manualmente pelo layout do disco de origem setor de início, setor de fim e tipo de partição)


Nota: Ao clonar uma imagem maior para um disco mais pequeno que tenha a tabela de partições semelhante é possível utilizar as opções -g e -icds e utilizar a tabela de partições do disco de destino -k.

Referências:


domingo, 10 de novembro de 2019

Recuperar ficheiros apgados num RAID com LVM

Neste caso foi utilizada uma máquinacom 2 discos de 1TBem RAID por mdadm e LVM.


- /dev/sdb e /dev/sdc - Espelhados em RAID 1 com mdadm
- /dev/md0 - Com LVM
- /dev/vg0/swap e /dev/vg0/data


- /dev/vg0/data é montado como /home

Para recuperar ficheiros apagados em /home é necessário iniciar o sistema sem montar /home.

Uma das formas é arrancar um sistema live (por exemplo, USB) e ligar um outro disco para guardar as recuperações.

Ativar RAID
- Confirmar se RAID não está montado:
cat /proc/mdstat

- Ativar RAID
mdadm --assemble --scan





- Confirmar se LVM está ativo
lvscan

- Ativar LVM com
vgchange -ay

- Depois é necessário montar a partição como readonly e com a opção noload para evitar escritas
mount -o ro,noload /dev/vg0/data /mnt/data


- Finalmente é possível utilizar o photorec para procurar e recuperar os ficheiros pretendidos.

Cartão de Cidadão em Linux

 

Atenção: Está disponível uma nova versão mais atualizada aqui.


Após diversas tentativas foi possível colocar o leitor de cartões do cartão de cidadão a funcionar em Debian GNU/Linux - buster 64bits.


1. Descarregar plugin do site: https://autenticacao.gov.pt/fa/ajuda/autenticacaogovpt.aspx

É possível descarregar o plugin para Debian/Ubuntu e fazer a sua instalação manual:
dpkg -i plugin-autenticacao-gov.deb

Um dos problemas estava em arrancar o plugin utilizando o OpenBox... Acedendo ao conteúdo do .deb é possível obter o ficheiro .desktop que contém a informação de arranque:
[Desktop Entry]
Version=1.0
Name=plugin Autenticação.Gov
GenericName=plugin Autenticação.Gov
GenericName[pt]=plugin Autenticação.Gov
Comment=Autenticação com o Cartão de Cidadão
Exec=/usr/bin/java -Dsun.java2d.xrender=false -jar /usr/share/plugin-autenticacao-gov/plugin-autenticacao-gov.jar sj
Icon=plugin-autenticacao-gov
Terminal=false
Type=Application
Categories=Utility


Assim, resta arrancar o plugin:
/usr/bin/java -Dsun.java2d.xrender=false -jar /usr/share/plugin-autenticacao-gov/plugin-autenticacao-gov.jar sj

O ícone aparece na barra de tarefas do tint2 e a opção Diagnosticar Plugin abre uma página indecifrável com uma impossibilidade qualquer relativa ao DNS e a um *.mordomo...

Alguma pesquisa e um comentário no PPLware indica a razão da questão:
«N'uno 7 de Dezembro de 2017 às 13:21
Continuas a depender de uma aplicação que faz o mesmo que as applets java faziam mas usa uma comunicação com o browser incompatível com alguns routers. No meu caso, num ambiente linux ligado a um router com DD-WRT, esta aplicação batia sempre na impossibilidade de resolver nomes para o IP do localhost. O serviço de DNS do DD-WRT não permite tal coisa, logo não funcionava. Contactei o suporte deles e a solução foi mesmo martelar os múltiplos nomes que eles usam com o 127.0.0.1 no ficheiro de hosts…»


Assim, deve editar-se o /etc/hosts para conter:
127.0.0.1 m1.mordomo.gov.pt
127.0.0.1 m2.mordomo.gov.pt
127.0.0.1 m3.mordomo.gov.pt
127.0.0.1 m4.mordomo.gov.pt
127.0.0.1 m5.mordomo.gov.pt
127.0.0.1 m6.mordomo.gov.pt
127.0.0.1 m7.mordomo.gov.pt
127.0.0.1 m8.mordomo.gov.pt
127.0.0.1 m9.mordomo.gov.pt
127.0.0.1 m10.mordomo.gov.pt
127.0.0.1 m11.mordomo.gov.pt
127.0.0.1 m12.mordomo.gov.pt
127.0.0.1 m13.mordomo.gov.pt
127.0.0.1 m14.mordomo.gov.pt
127.0.0.1 m15.mordomo.gov.pt
127.0.0.1 m16.mordomo.gov.pt
127.0.0.1 m17.mordomo.gov.pt
127.0.0.1 m18.mordomo.gov.pt
127.0.0.1 m19.mordomo.gov.pt
127.0.0.1 m20.mordomo.gov.pt


Ao que parece o leitor de cartões anuncia-se como webserver com um domínio *.mordomo.gov.pt e o router não permite essa alteração.

Situação resolvida, é possível utilizar o cartão de cidadão com o leitor para realizar as operações, correu tudo bem com o Opera, resta testar com outros browsers.


terça-feira, 19 de março de 2019

RAID 1 - substituir drive com mdadm

Apesar de o array não ter qualquer problema o SMART do disco indica problemas. A troca do disco é aconselhada.

Verificar o array

Para ver o estado do array:
cat /proc/mdstat

md0 : active raid1 sdb1[0] sdc1[1]
      976629760 blocks super 1.2 [2/2] [UU]
      bitmap: 0/8 pages [0KB], 65536KB chunk

Para ver os detalhes do array:
mdadm --detail /dev/md0
 /dev/md0:
        Version : 1.2
  Creation Time : Sat Jan 21 17:33:16 2017
     Raid Level : raid1
     Array Size : 976629760 (931.39 GiB 1000.07 GB)
  Used Dev Size : 976629760 (931.39 GiB 1000.07 GB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

  Intent Bitmap : Internal

    Update Time : Tue Mar 19 08:48:42 2019
          State : clean
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

           Name : data:0  (local to host hostname)
           UUID : f047a10d:ae9c8424:c469fb59:5f6773bd
         Events : 13799

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1



Verificar erros nos discos

É possível os discos com a ferramenta  smartctl, fazendo o teste curto (cerca de 2 minutos) ou o teste longo (mais demorado):
smartctl -t short /dev/sdb
smartctl -t long /dev/sdb

Assim, apesar de o array indicar que está tudo bem, um dos disco apresenta erros nos testes SMART.
smartctl -a /dev/sdb(...)
=== START OF INFORMATION SECTION ===
Model Family:     Western Digital Green
Device Model:     WDC WD10EARX-00N0YB0
Serial Number:    WD-WMC0T0383723

(...)
SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed: read failure       90%     33281         296
# 2  Short offline       Completed: read failure       90%     33281         296
(...)

Substituir disco do array

Para substituir o disco é necessário provocar uma falha no disco:
mdadm --manage /dev/md0 --fail /dev/sdb1
mdadm: set /dev/sdb1 faulty in /dev/md0

cat /proc/mdstat
md0 : active raid1 sdb1[0](F) sdc1[1]      976629760 blocks super 1.2 [2/1] [_U]
      bitmap: 3/8 pages [12KB], 65536KB chunk


Depois é necessário remover o disco do array:
mdadm --manage /dev/md0 --remove /dev/sdb1
mdadm: hot removed /dev/sdb1 from /dev/md0

Agora é necessário:
  1. desligar a máquina;
  2. retirar o disco em falha (é possível ver o serial number com o smartctl -a para remover o disco correto);
  3. colocar o novo disco;
  4. ligar a máquina.

Como o novo disco está vazio é necessário clonar a tabela de partições do disco bom do array para o novo:


sfdisk -d /dev/sdc | sfdisk /dev/sdb
Checking that no-one is using this disk right now ... OK

Disk /dev/sdb: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes

>>> Script header accepted.
>>> Script header accepted.
>>> Script header accepted.
>>> Script header accepted.
>>> Created a new DOS disklabel with disk identifier 0xd6ec1f12.
/dev/sdb1: Created a new partition 1 of type 'Linux raid autodetect' and of size 931.5 GiB.
/dev/sdb2: Done.

New situation:

Device     Boot Start        End    Sectors   Size Id Type
/dev/sdb1        2048 1953523711 1953521664 931.5G fd Linux raid autodetect
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.


Após esta operação pode adicionar-se o novo disco ao array:

mdadm --manage /dev/md0 --add /dev/sdb1
mdadm: added /dev/sdb1

O array inicia o processo de espelho do disco bom para o novo.

Como o processo é demorado, pode ser acompanhado com:
watch cat /proc/mdstat
md0 : active raid1 sdb1[2] sdc1[1]
      976629760 blocks super 1.2 [2/1] [_U]
      [>....................]  recovery =  1.0% (10220864/976629760) finish=122.3min speed=131660K/sec
      bitmap: 7/8 pages [28KB], 65536KB chunk



Referências:


[1] - Replacing a Failed Mirror Disk in a Software RAID Array (mdadm) - https://www.thegeekdiary.com/replacing-a-failed-mirror-disk-in-a-software-raid-array-mdadm/

[2] - mdadm cheat sheet - http://www.ducea.com/2009/03/08/mdadm-cheat-sheet/

quinta-feira, 31 de maio de 2018

Regras iptables - webserver SYN flood

Algumas regras para o iptables proteger um webserver contra alguns ataques. Por exemplo, o ataque SYN flood [0].

Descartar os pacotes SYN que não são recebidos:
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

Descartar pacotes com fragmentos:
iptables -A INPUT -f -j DROP

Descartar pacotes mal criados XMAS:
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

Descartar pacotes nulos:
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

Bloquear um IP externo de aceder ao servidor:
iptables -A INPUT -s IP-ADDRESS -j DROP

Bloquear um IP externo de aceder a uma porta do servidor:
iptables -A INPUT -s IP-ADDRESS -p tcp --destination-port 80 -j DROP


[0] - https://en.wikipedia.org/wiki/SYN_flood

[1] - https://www.cyberciti.biz/tips/linux-iptables-10-how-to-block-common-attack.html

[2] - https://www.cyberciti.biz/faq/how-do-i-block-an-ip-on-my-linux-server/