Saudações. Nesse tutorial vamos tratar dos principais ajustes em um servidor ou VPS rodando Debian.
O Debian é um sistema muito estável e rápido, mas carece de ajustes para integrá-lo melhor com o monitoramento e a administração. Coloquei aqui todos os ajustes mais comuns para você operá-lo com agilidade.
Requisitos
- Instalar o Debian Linux;
Softwares utilizados nesse artigo
- Linux Debian 12 ou versão mais nova;
Download do Debian
Para baixar o Debian, acesse o site https://www.debian.org – Link direto da pasta com imagem ISO:
O arquivo indicado se chama debian-V.S.R-amd64-netinst.iso onde V=versão, S=sub-versão, R=release (normalmente zero).
Caso deseje se adiantar nos estudos das novas versões, o diretorio para download das compilações de teste é https://cdimage.debian.org/cdimage/weekly-builds/amd64/iso-cd/
1 – Nome do servidor, DNS, reverso e arquivos hosts
É muito importante que todos servidor ou VPS tenha seu nome sincronizado com o endereço IP e o reverso desses IPs. A resolução de nomes é uma etapa vital em todos os programas que usam redes e se estiverem mal configurados pode causar lentidão extrema até mesmo na execução de programas simples.
Supondo que seu servidor/VPS terá o nome srv101.exemplo.com.br e receberá o endereço IPv4 45.255.128.2 e IPv6 2804:cafe:beba:c0ca::2 (substituia pelo seu IPv4 e IPv6 real, vou usar esses 3 valores de exemplo no conteúdo abaixo).
As configurações corretas de nome e endereços serão:
- Se o nome do servidor será srv101.exemplo.com.br, garanta que esse nome está configurado no DNS do domínio exemplo.com.br assim:
- srv101 IN A 45.255.128.2
- srv101 IN AAAA 2804:cafe:beba:c0ca::2
- Solicite a hospedagem (provedor de internet ou datacenter) que faça o mapeamento do DNS REVERSO dos IPs para o nome:
- 45.255.128.2 mapeado (PTR) para srv101.exemplo.com.br:
- 2.128.255.45.in-addr.arpa. IN PTR srv01.exemplo.com.br.
- 2804:cafe:beba:c0ca::2 mapeado (PTR) para srv101.exemplo.com.br:
- 2. (..) a.c.0.c.a.b.e.b.e.f.a.c.4.0.8.2.ip6.arpa. IN PTR srv01.exemplo.com.br.
- 45.255.128.2 mapeado (PTR) para srv101.exemplo.com.br:
Com essa configuração sincronizada (nome para IPs, IPs para o mesmo nome), seu servidor estará apto a fazer uso de protocolos que fazem verificação de endereço IP reverso (sistema de e-mails por exemplo).
Configurando nome principal (hostname) no Debian:
# Definindo nome do servidor:
hostnamectl set-hostname srv101.exemplo.com.br;
# Conferindo:
hostname -f;
cat /proc/sys/kernel/hostname;
Visualizando todas as informações:
# Informações completas do nome e ambiente:
hostnamectl;
Static hostname: srv101.exemplo.com.br
Icon name: computer-vm
Chassis: vm 🖴
Machine ID: 5393c014a0db497995e8c5097b8c1b9c
Boot ID: 914a211d86084bedb3570266e6f34cb9
Virtualization: vmware
Operating System: Debian GNU/Linux 12 (bookworm)
Kernel: Linux 6.1.0-30-amd64
Architecture: x86-64
Hardware Vendor: VMware, Inc.
Hardware Model: VMware Virtual Platform
Firmware Version: 6.00
Tabela de hosts estáticos e consulta a DNS
Todo sistema ou sub-sistema Linux (host, containers) gerencia a relação entre nomes e endereços IP usando a sequência definida no /etc/host.conf, que por padrão define a busca por nomes na sequência:
- 1 – hosts: o nome usado será procurado em /etc/hosts
- Esse arquivo /etc/hosts mapeia os IPs e seus respectivos nomes, com uma entrada por linha, a primeira palavra deve ser o endereço IPv4 ou IPv6 seguido dos nomes dados a esse IP, todas as palavras da linha separadas por espaços ou TAB, exemplo:
127.0.0.1 localhost
::1 localhost
45.255.128.2 srv101 srv101.exemplo.com.br
- Esse arquivo /etc/hosts mapeia os IPs e seus respectivos nomes, com uma entrada por linha, a primeira palavra deve ser o endereço IPv4 ou IPv6 seguido dos nomes dados a esse IP, todas as palavras da linha separadas por espaços ou TAB, exemplo:
- 2 – bind: o nome usado será procurado em /etc/resolv.conf
- Esse arquivo declara o nome padrão do domínio (search) e os servidores DNS usados para, exemplo:
search exemplo.com.br
nameserver 8.8.8.8
- Esse arquivo declara o nome padrão do domínio (search) e os servidores DNS usados para, exemplo:
Assim, procure configurar seu /etc/hosts e seu /etc/resolv.conf corretamente.
# Preenchendo /etc/hosts com configuração correta:
(
echo '127.0.0.1 localhost';
echo '::1 localhost';
echo;
echo 'ff02::1 ip6-allnodes';
echo 'ff02::2 ip6-allrouters';
echo;
echo '45.255.128.2 srv101.exemplo.com.br';
echo '2804:cafe:beba:c0ca::2 srv101.exemplo.com.br';
echo
) > /etc/hosts;
# Preenchendo o /etc/resolv.conf com os servidores DNS e domínio padrão:
(
echo 'nameserver 8.8.8.8';
echo 'nameserver 1.1.1.1';
) > /etc/resolv.conf;
Ao executar qualquer programa de acesso a rede, a consulta do nome utilizado é feito no arquivo hosts, e se não for encontrado ele é consultado via DNS nos IPs declarados no resolv.conf, observe com esse teste:
# Ping para um nome declarado no hosts:
ping -4 -c 2 localhost;
#PING (127.0.0.1) 56(84) bytes of data.
#64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.015 ms
#64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.020 ms
#--- ping statistics ---
#2 packets transmitted, 2 received, 0% packet loss, time 1000ms
#rtt min/avg/max/mdev = 0.015/0.017/0.020/0.002 ms
ping -6 -c 2 localhost;
#PING localhost(localhost (::1)) 56 data bytes
#64 bytes from localhost (::1): icmp_seq=1 ttl=64 time=0.018 ms
#64 bytes from localhost (::1): icmp_seq=2 ttl=64 time=0.029 ms
#--- localhost ping statistics ---
#2 packets transmitted, 2 received, 0% packet loss, time 1046ms
#rtt min/avg/max/mdev = 0.018/0.023/0.029/0.005 ms
# Ping para um nome de Internet:
ping -4 -c 2 google.com;
#PING (142.250.79.14) 56(84) bytes of data.
#64 bytes from sp07.1e100.net (142.250.79.14): icmp_seq=1 ttl=117 time=1.39 ms
#64 bytes from sp07.1e100.net (142.250.79.14): icmp_seq=2 ttl=117 time=1.41 ms
#--- ping statistics ---
#2 packets transmitted, 2 received, 0% packet loss, time 1697ms
#rtt min/avg/max/mdev = 1.393/1.402/1.412/0.009 ms
ping -6 -c 2 google.com;
#PING google.com(2800:3f0::200e (2800:3f0::200e)) 56 data bytes
#64 bytes from 2800:3f0::200e (2800:3f0::200e): icmp_seq=1 ttl=118 time=1.46 ms
#64 bytes from 2800:3f0::200e (2800:3f0::200e): icmp_seq=2 ttl=118 time=1.39 ms
#--- google.com ping statistics ---
#2 packets transmitted, 2 received, 0% packet loss, time 1002ms
#rtt min/avg/max/mdev = 1.388/1.423/1.458/0.035 ms
Nota: ping não é comando de teste DNS respeitável. Teste a resolução de nomes DNS pontualmente com o comando host, informando o nome que deseja resolver e opcionalmente o IP de servidor DNS que deseja testar:
# Teste de DNS, usando DNS do sistema (/etc/resolv.conf)
host google.com;
host -t a google.com;
host -t aaaa google.com;
host -t mx google.com;
host -t txt google.com;
# Teste de DNS informando o IP do servidor DNS a ser testado:
host google.com 1.0.0.1;
host -t a google.com 1.0.0.1;
host -t aaaa google.com 1.0.0.1;
host -t mx google.com 1.0.0.1;
host -t txt google.com 1.0.0.1;
2 – Data/hora, timezone e NTP
A data/hora de todos os computadores do mundo é definida pelo relógio universal (UTC = Universal Time Clock) e todos devem estar sincronizados com ele. No Brasil a diferença da data/hora para o UTC é de normalmente -3 horas.
Como nos interessa o relógio local, então nosso timezone é UTC menos 3 horas, ou UTC-3, padrão America/Sao_Paulo
O timezone é a configuração do sistema que define a diferença de tempo para o UTC e as variações locais (horário de verão e demais leis locais que definem). Definindo:
# Conferindo data/hora local:
date;
# Conferindo data/hora no UTC:
date -u;
# Definindo como America/Sao_Paulo (UTC-3):
timedatectl set-timezone America/Sao_Paulo;
# Consultando configuração:
timedatectl;
# Local time: Fri 2025-01-31 16:31:26 -03
# Universal time: Fri 2025-01-31 19:31:26 UTC
# RTC time: Fri 2025-01-31 19:31:26
# Time zone: America/Sao_Paulo (-03, -0300)
# System clock synchronized: yes
# NTP service: active
# RTC in local TZ: no
# Instalar pacote de sincronismo NTP via systemd (costuma vir instalado)
apt-get -y install systemd-timesyncd;
# Conferindo servidores NTP em uso:
timedatectl show-timesync;
timedatectl show-timesync --all;
#LinkNTPServers=
#SystemNTPServers=
#RuntimeNTPServers=
#FallbackNTPServers=0.debian.pool.ntp.org 1.debian.pool.ntp.org ...
#ServerName=2.debian.pool.ntp.org
#ServerAddress=119.8.229.131
#RootDistanceMaxUSec=5s
#PollIntervalMinUSec=32s
#PollIntervalMaxUSec=34min 8s
#PollIntervalUSec=34min 8s
#NTPMessage=
# {
# Leap=0, Version=4, Mode=4, Stratum=2,
# Precision=-24, RootDelay=233.627ms, RootDispersion=30.700ms,
# Reference=C0248F96,
# OriginateTimestamp=Fri 2025-01-31 16:51:35 -03,
# ReceiveTimestamp=Fri 2025-01-31 16:51:35 -03,
# TransmitTimestamp=Fri 2025-01-31 16:51:35 -03,
# DestinationTimestamp=Fri 2025-01-31 16:51:35 -03,
# Ignored=yes, PacketCount=7, Jitter=13.308ms
# }
#Frequency=974891
systemctl status systemd-timesyncd;
#● systemd-timesyncd.service - Network Time Synchronization
#Loaded: loaded (
# /lib/systemd/system/systemd-timesyncd.service; enabled; preset: enabled)
# Active: active (running) since Fri 2025-01-31 15:43:51 -03; 1h 16min ago
# Docs: man:systemd-timesyncd.service(8)
# Main PID: 363 (systemd-timesyn)
# Status: "Contacted time server 119.8.229.131:123 (2.debian.pool.ntp.org)."
# Tasks: 2 (limit: 9412)
# Memory: 1.8M
# CPU: 55ms
# CGroup: /system.slice/systemd-timesyncd.service
# └─363 /lib/systemd/systemd-timesyncd
#jan 31 15:43:51 debian systemd[1]:
# Starting systemd-timesyncd.service
# - Network Time Synchronization...
#jan 31 15:43:51 debian systemd[1]:
# Started systemd-timesyncd.service - Network Time Synchronization.
#jan 31 15:44:21 debian systemd-timesyncd[363]:
# Contacted time server 119.8.229.131:123 (2.debian.pool.ntp.org).
#jan 31 15:44:21 debian systemd-timesyncd[363]:
# Initial clock synchronization to Fri 2025-01-31 15:44:21.906985 -03.
journalctl -u systemd-timesyncd --no-pager | grep -i 'server';
#jan 31 15:44:21 debian systemd-timesyncd[363]:
# Contacted time server 119.8.229.131:123 (2.debian.pool.ntp.org).
cat /etc/systemd/timesyncd.conf;
Especificando manualmente servidores NTP do Brasil usando o endereço IP para que o sincronismo de NTP ocorra mesmo quando houver falha de DNS:
# Consultando IPs dos servidores NTP do Brasil:
host a.ntp.br;
# a.ntp.br has address 200.160.0.8
# a.ntp.br has IPv6 address 2001:12ff::8
host b.ntp.br;
# b.ntp.br has address 200.189.40.8
# b.ntp.br has IPv6 address 2001:12f8:9:1::8
# IPs dos servidores NTP do Observatorio Nacional
# Divisão de Serviços da Hora Legal Brasileira do Observatório Nacional (DISHO/ON)
# - 200.20.186.75 porta 123 UDP
# - 200.20.186.94 porta 123 UDP
# - 200.20.224.100 porta 123 UDP
# - 200.20.224.101 porta 123 UDP
# Configurando manualmente:
(
echo;
echo '[Time]';
echo 'NTP=200.160.0.8 200.189.40.8 2001:12ff::8 2001:12f8:9:1::8';
echo 'FallbackNTP=200.20.186.75 200.20.186.94 200.20.224.100 200.20.224.101';
echo 'RootDistanceMaxSec=5';
echo 'PollIntervalMinSec=32';
echo 'PollIntervalMaxSec=2048';
echo 'ConnectionRetrySec=30';
echo 'SaveIntervalSec=60';
echo
) > /etc/systemd/timesyncd.conf;
# Reiniciando o servico de timesync:
systemctl restart systemd-timesyncd;
O sincronismo exato com servidores NTP é vital para o funcionamento de centenas de protocolos, principalmente sistemas de criptografia.
3 – Repositórios principais e updates
O Debian é baseado no gerenciador de pacotes APT, que define o formato dos pacotes de instalação dos programas e suas dependências, resolvendo tudo automáticamente.
Garantir que o Debian tenha acesso ao repositório de pacotes oficiais é vital, e isso pode falhar se faltar Internet durante a instalação minimalista (netinst). Garanta que os repositórios estão presentes.
Repositórios principais vitais para o Debian – comandos de restauração:
# Backup de seguranca:
cp /etc/apt/sources.list /root/etc-apt-sources.list;
# Populando repositórios principais:
(
. /etc/os-release;
DIST="$VERSION_CODENAME";
BASE="http://deb.debian.org";
SECB="http://security.debian.org";
echo;
echo "deb $BASE/debian/ $DIST main non-free-firmware";
echo "deb-src $BASE/debian/ $DIST main non-free-firmware";
echo;
echo "deb $SECB/debian-security $DIST-security main non-free-firmware";
echo "deb-src $SECB/debian-security $DIST-security main non-free-firmware";
echo;
echo "deb $BASE/debian/ $DIST-updates main non-free-firmware";
echo "deb-src $BASE/debian/ $DIST-updates main non-free-firmware";
echo;
) > /etc/apt/sources.list;
# Sincronizando índice:
apt -y update;
# Atualizar pacotes
apt -y upgrade;
# Atualizar pacotes centrais:
apt -y dist-upgrade;
# Limpar pacotes desnecessarios:
apt -y autoremove;
# Se houver atualizacao do '/boot/initrd****', reinicie, comando: reboot
4 – Pacotes de comandos básicos
O Debian instalado de maneira minimalista (principalmente em VPSs) carecem de muitos comandos básicos. Segue alguns programas recomendados:
# Caso precise forcar o uso de IPv4 no apt, use esse alias (retire o #):
# alias apt-get='apt-get -o Acquire::ForceIPv4=true'
# alias apt-get='apt-get -y -o Acquire::ForceIPv4=true'
# Pacotes nativos do Debian, mas que devem estar presentes,
# rode esse comando para garantir que nao faltou nenhum pacote basico:
apt-get -y install \
bash bind9-dnsutils bind9-host bsdextrautils \
bsdutils busybox bzip2 ca-certificates coreutils \
cpio cron cron-daemon-common debianutils dmidecode dmsetup \
e2fsprogs eject ethtool fdisk file findutils \
firmware-linux-free fuse3 grep gzip \
hostname iproute2 iputils-ping \
kmod less locales logrotate lsof \
mawk mount nano \
nftables openssh-client openssh-server openssh-sftp-server openssl \
pci.ids pciutils procps \
sed tar traceroute \
tzdata unzip util-linux wget \
whiptail xz-utils zstd;
# Programas de compressao
apt-get -y install tar;
apt-get -y install zstd;
apt-get -y install xz-utils;
apt-get -y install zip;
# Pacote com comando curl, vital para testes de HTTP e chamadas de API REST
apt-get -y install curl;
# Lista de CAs root para certificados SSL/TLS
apt-get -y install ca-certificates;
# Ferramentas de criptografia basica:
apt-get -y install gnupg2 openssl;
# Servidor SSH para acesso remoto
apt-get -y install openssh-client openssh-server rsync;
systemctl enable ssh;
systemctl start ssh;
# Comando ip (ip addr show, ip route show, ip rule show, ip nei show)
apt-get -y install iproute2;
# Comandos de rede: mtr, traceroute, ping, fping, whois
apt-get -y install mtr traceroute iputils-ping fping whois;
# Comando para sniffer de rede e analise de pacotes
# ex.: tcpdump -pnevas0 -i eth0
apt-get -y install tcpdump;
# Editor: mcedit
apt-get -y install mc;
# Comandos para conferir uso de CPU/RAM: htop
apt-get -y install htop psmisc;
# Monitor de consumo de I/O
apt-get -y install iotop;
# Programa de firewall
# - nftables.: nft list ruleset
# - conntrack: conntrack -L
apt-get -y install nftables conntrack;
# Gerador de UUID personalizado ( uuidgen -t, uuidgen -r, ...)
apt-get -y install uuid uuid-runtime;
# Suporte a VLANs (vconfig, vlans 802.1q, 802.1ad)
apt-get -y install vlan;
5 – Agentes de máquinas virtuais
Quando o Linux é executado em uma máquina virtual, a comunicação entre o hypervisor (sistema rodando no hardware) e sua máquina virtual deve ocorrer por meio de canais especiais para sinalizar desligamento suave, economia de memória ociosa, entre outras sinalizações.
O software de agente do hypervisor é responsável por isso e deve ser instalado:
- Para ambientes VMware: open-vm-tools;
- Para ambientes Q-EMU/KVM (Proxmox, EVE-NG, RedHat, …): qemu-guest-agent;
Apenas cole os comandos abaixo, eles irão detectar a plataforma e instalar o agente correto:
# Instalar agente de virtualização adequado:
# Agent de VMWARE, instalar somente se for virtualizado no vmware
hostnamectl | grep -qi vmware && {
apt-get -y install open-vm-tools;
systemctl enable open-vm-tools;
systemctl start open-vm-tools;
}
# Agent de KVM, instalar somente se for virtualizado no kvm
hostnamectl | grep -qi kvm && {
apt-get -y install qemu-guest-agent;
systemctl enable qemu-guest-agent;
systemctl start qemu-guest-agent;
}
6 – Monitorando o Debian via SNMP
O SNMP é um protocolo de consulta de recursos de um sistema, por ele um NMS (Network Manager System). Softwares NMS mais comuns: Zabbix, PTRG, RaviMonitor, Observium, Beeping, etc…).
Por meio do SNMP, o NMS pode monitorar o consumo de rede, CPU, RAM e demais recursos do seu Debian e criar alarmes para detectar problemas e esgotamento de recursos.
Instalando e configurando o servidor SNMP no Debian:
# Instalar
apt -y install snmp snmpd;
# Ativar no boot:
systemctl enable snmpd;
# Backup da config inicial:
cp /etc/snmp/snmpd.conf /etc/snmp/orig-snmpd.conf;
# Configuracao inicial - personalize as variaveis abaixo antes de colar:
ADMIN="Patolino Silva";
COMMUNITY="Nao-use-public";
GPSLOCATION="-19.84784,-43.99129";
PORT=161;
(
echo;
echo 'master agentx';
echo 'agentXPerms 0777 0777';
echo 'smuxpeer .1.3.6.1.2.1.83';
echo 'smuxpeer .1.3.6.1.2.1.157';
echo 'smuxsocket localhost';
echo;
echo "rocommunity $COMMUNITY";
echo "rocommunity6 $COMMUNITY";
echo;
echo "syscontact \"$ADMIN\"";
echo "syslocation $GPSLOCATION";
echo "sysName $(hostname)";
echo "SysDescr Debian-$(hostname)";
echo;
P=$PORT;
echo "agentaddress unix:/run/snmpd.socket,udp:$P,udp6:$P,tcp6:$P,tcp:$P";
echo;
RS1='linkUpTrap linkUp ifIndex ifDescr ifType ifAdminStatus ifOperStatus';
RS2='linkDownTrap linkDown ifIndex ifDescr ifType ifAdminStatus ifOperStatus';
echo "notificationEvent $RS1";
echo "notificationEvent $RS2";
echo;
echo 'monitor -r 10 -e linkUpTrap "Generate linkUp" ifOperStatus != 2';
echo 'monitor -r 10 -e linkDownTrap "Generate linkDown" ifOperStatus == 2';
echo;
echo "com2sec notConfigUser default $COMMUNITY";
echo 'group notConfigGroup v1 notConfigUser';
echo 'group notConfigGroup v2c notConfigUser';
echo;
echo 'view systemview included .1';
echo;
echo 'access notConfigGroup "" any noauth exact systemview none none';
echo 'defaultMonitors yes';
echo 'linkUpDownNotifications yes';
echo;
) > /etc/snmp/snmpd.conf;
# Reiniciar:
systemctl restart snmpd;
# Testando (usando community da variavel acima):
snmpwalk -v2c -c $COMMUNITY 127.0.0.1:$PORT .1.3.6.1.2.1.31.1.1.1.1;
7 – CRON para execução de scripts periódicos
O Debian não implementa bem a configuração inicial do CRON por motivos de segurança, vamos criar pastas para armazenar scripts que serão executados periodicamente, de acordo com a pasta escolhida:
- de 1 em 1 minuto: /etc/cron.1min/
- de 5 em 5 minutos: /etc/cron.5min/
- de 10 em 10 minutos: /etc/cron.10min/
- de 15 em 15 minutos: /etc/cron.15min/
- de 30 em 30 minutos: /etc/cron.30min/
- A cada hora: /etc/cron.hourly/
- A cada 24 horas (uma vez por dia): /etc/cron.daily/
- A cada 7 dias (uma vez por semana): /etc/cron.weekly/
- Para cada dia da semana: /etc/cron.[sunday,monday,…]
Comandos:
# Criar diretorios dos scripts periodicos:
# - intervalos curtos
mkdir -p /etc/cron.1min;
mkdir -p /etc/cron.5min;
mkdir -p /etc/cron.10min;
mkdir -p /etc/cron.15min;
mkdir -p /etc/cron.30min;
# - intervalos basicos
mkdir -p /etc/cron.hourly;
mkdir -p /etc/cron.daily;
mkdir -p /etc/cron.weekly;
mkdir -p /etc/cron.monthly;
# - agendadores de dias da semana
mkdir -p /etc/cron.monday;
mkdir -p /etc/cron.tuesday;
mkdir -p /etc/cron.wednesday;
mkdir -p /etc/cron.thursday;
mkdir -p /etc/cron.friday;
mkdir -p /etc/cron.saturday;
mkdir -p /etc/cron.sunday;
# Criar config de contrab
(
echo "PATH=/usr/sbin:/usr/bin:/sbin:/bin";
echo "0 * * * * run-parts --regex '.*' /etc/cron.hourly";
echo "0 2 * * * run-parts --regex '.*' /etc/cron.daily";
echo "0 3 * * 6 run-parts --regex '.*' /etc/cron.weekly";
echo "0 5 1 * * run-parts --regex '.*' /etc/cron.monthly";
for min in 1 5 10 15 30; do
echo "*/$min * * * * run-parts --regex '.*' /etc/cron.${min}min";
done;
echo "0 0 * * 0 run-parts --regex '.*' /etc/cron.sunday";
echo "0 0 * * 1 run-parts --regex '.*' /etc/cron.monday";
echo "0 0 * * 2 run-parts --regex '.*' /etc/cron.tuesday";
echo "0 0 * * 3 run-parts --regex '.*' /etc/cron.wednesday";
echo "0 0 * * 4 run-parts --regex '.*' /etc/cron.thursday";
echo "0 0 * * 5 run-parts --regex '.*' /etc/cron.friday";
echo "0 0 * * 6 run-parts --regex '.*' /etc/cron.saturday";
) > /tmp/cron-list;
# Registrar no crontab:
cat /tmp/cron-list | crontab -;
# Conferir se instalou agendadores:
crontab -l;
8 – Ajustes finos no Kernel Linux
Acesse o artigo sobre Ajustes Finos no Kernel para proteger seu Debian de “sabotagens” das configurações originais, link do artigo:
9 – Configuração de rede
Para configurar IP, DHCP, VLAN e interfaces de rede, tuneis, VPNs e PBR no Debian é preciso realizar as configurações iniciando pelo arquivo /etc/network/interfaces, você pode fazer isso de duas formas:
- Colocar tudo no /etc/network/interfaces, o que é melhor para sistemas pequenos;
- Modularizar a configuração por meio de arquivos incluídos, assim cada configuração terá seu arquivo particular em /etc/network/interfaces.d/, esse método é melhor para empacotamento de soluções prontas, VPS, VPNs, etc…
Arquivo: /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
Você pode escrever qualquer configuração no final desse arquivo, mas observe a linha source /etc/network/interfaces.d/*
Ela instrui o NetConfig a entrar no diretório /etc/network/interfaces.d/ e ler todos os arquivos como se eles estivessem dentro do arquivo interfaces. Por conta disso, você pode optar por colocar a configuração editando o arquivo principal ou apenas criar um arquivo para cada interface no diretório interfaces.d. Exemplo: para a interface ens192, crie o arquivo /etc/network/interfaces.d/ens192 e coloque a configuração dentro dele.
Exemplo de como colocar a interface ens192 ativa mas sem configuração IP:
# Detectar presença e configurar
auto ens192
allow-hotplug ens192
# Apenas colocar UP
iface ens192 inet manual
Exemplo de como colocar a interface ens192 em DHCP-Client (obter IP automaticamente):
# Detectar presença e configurar
auto ens192
allow-hotplug ens192
# Configurar IP:
# - DHCP IPv4
iface ens192 inet dhcp
# - Slaac IPv6
iface ens192 inet6 auto
# - DHCP IPv6
iface ens192 inet6 dhcp
Exemplo de como colocar a interface ens192 com IP fixo:
# Detectar presença e configurar
auto ens192
allow-hotplug ens192
# Configurar IPv4 fixo:
iface ens192 inet static
address 45.255.128.2/27
gateway 45.255.128.1
dns-nameservers 8.8.8.8
dns-search exemplo.com.br
# Configurar IPv6 fixo:
iface ens192 inet6 static
address 2804:cafe:beba:c0ca::2/64
gateway 2804:cafe:beba:c0ca::1
Para colocar múltiplos IPs fixos (alias) na mesma interface, crie um sufixo “:N” (um número único para cada alias), exemplo:
# Detectar presença e configurar
auto ens192
allow-hotplug ens192
# Configurar IPv4 fixo principal:
iface ens192 inet static
address 45.255.128.2/27
gateway 45.255.128.1
dns-nameservers 8.8.8.8
dns-search exemplo.com.br
# Configurar IPv6 fixo principal:
iface ens192 inet6 static
address 2804:cafe:beba:c0ca::2/64
gateway 2804:cafe:beba:c0ca::1
# Alias 1
#--------------------------------------------
auto ens192:1
# Alias 1 - IPv4
iface ens192:1 inet static
address 172.27.1.2/24
# Alias 1 - IPv6
iface ens192:1 inet6 static
address 2001:db8:ffff:abcd::2/64
# Alias 2
#--------------------------------------------
auto ens192:2
# Alias 2 - IPv4
iface ens192:2 inet static
address 10.191.14.3/27
# Alias 2 - IPv6
iface ens192:2 inet6 static
address fa14::3/64
Criando interface com VLAN (IEEE 802.1q):
# Vlan 2901 na ens192
# - IP fixo e gateway (internet pela VLAN)
auto ens192.2901
iface ens192.2901 inet static
vlan-raw-device ens192
address 172.20.0.8
netmask 255.255.255.0
gateway 172.20.0.1
Criar interface tipo dummy (descarta o que não for capturado por software):
auto lo0
iface lo0 inet static
address 100.127.255.254
netmask 255.255.255.255
pre-up ip link add lo0 type dummy && true
post-down ip link del lo0 && true
Criar uma interface que dependerá de um script externo para construção completa:
auto ovpn1401
iface ovpn1401 inet manual
pre-up /etc/network/ovpn1401.sh pre-up
up /etc/network/ovpn1401.sh up
down /etc/network/ovpn1401.sh down
post-down /etc/network/ovpn1401.sh post-down
Após definir a configuração da interface, aplique-a com esses comandos:
# Aplicar configuração da interface:
if-up ens192;
# Forcar aplicação:
if-up -force ens192;
# Desconfigurar interface (cuidado para não perder acesso):
if-down ens192;
Agora escolha como deseja montar seu sistema de rede e crie os arquivos!
10 – Interfaces de rede com nome eth
Antigamente os nomes das interfaces de rede eram “eth0”, “eth1”, etc…
O Linux (todos eles) adotaram então um padrão chamado Predictable Network Interface Names (Nomes de Interfaces de Rede Previsíveis), onde o nome das interfaces é fixo baseado na localização de hardware. Principais prefixos:
- eno: Interfaces de hardware onboard;
- ens: Interfaces PCI simples;
- enp: Interfaces PCI independentes (com offload e várias portas);
- eth: Nome tradicional de interfaces de rede criadas por software, ainda usada para máquinas virtuais, containers e modo legado;
- wl: Wireless LAN, todas as interfaces wireless para uso em LAN (wifi);
- ww: Wireless WAN, todas as interfaces wireless de média ou longa distância (3G/4G, LTE, …);
Cada driver faz a proposta de nomes e o kernel se encarrega de escolher. O software UDEV do pacote SystemD é responsável por essa nomeação em user-space.
Caso você deseje voltar para os nomes antigos (modo legado), você precisará passar os argumentos “net.ifnames=0 biosdevname=0” para o kernel durante o carregamento.
Configure no arquivo /etc/default/grub a variável GRUB_CMDLINE_LINUX para adicionar esses dois parâmetros acima, se houverem mais parâmetros, separe-os por um espaço e adicione no final. Exemplo:
#...
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
#...
Após inserir os argumentos na variável acima, aplique os novos ajustes no GRUB:
# Atualizar bootloader GRUB:
grub-mkconfig -o /boot/grub/grub.cfg;
É necessário reiniciar o sistema inteiro para que a configuração seja aplicada. Antes de fazer isso, lembre-se que o nome da interface atual (enoX, ensX, …) desaparecerá e passará a ser eth0, eth1, … então você deve ir no arquivo /etc/network/interfaces ou nas configurações em /etc/network/interfaces.d/ e alterar do nome atual para o novo nome “eth“.
Você pode enfrentar problemas de nomes que são trocados durante o boot pela presença de múltiplas interfaces (como uma X710 de 4 portas por exemplo). A cada boot elas podem mudar de nome e isso acaba por colocar o IP/VLAN em portas diferentes.
Para fixar o nome das interfaces pelo MAC, use o seguinte exemplo e expanda, arquivo exemplo: /etc/systemd/network/10-custom-eth0.link
[Match]
MACAddress=00:1a:2b:3c:4d:5e
[Link]
Name=eth0
Reinicie (reboot) e teste até acertar tudo sem esquecer de ajustar o NetConfig.
11 – Personalização do servidor SSH
O acesso por SSH é a base da administração do Debian. Personalizar parâmetros de maneira segura e pontual permite o backup e restauração simplificada dos atributos.
No Servidor OpenSSH, personalizar o arquivo /etc/ssh/sshd_config não é uma boa estratégia pois os updates não gosta de diferenças nesse arquivo. A melhor forma é usar o diretório /etc/ssh/sshd_config.d/ para criar os arquivos com suas personalizações.
Configurações recomendadas:
# Abrir porta padrao 22:
echo "Port 22" > /etc/ssh/sshd_config.d/inc-port-main.conf;
# Abrir porta adicional
echo "Port 22022" > /etc/ssh/sshd_config.d/inc-port-alt.conf;
# Abrir portas em IPv4 e IPv6
echo "AddressFamily any" > /etc/ssh/sshd_config.d/inc-addr-family.conf;
# Endereço IPv4 de escuta, 0.0.0.0 = todos os IPv4 do servidor
echo "ListenAddress 0.0.0.0" > /etc/ssh/sshd_config.d/inc-listen-ipv4.conf;
# Endereço IPv6 de escuta, :: = todos os IPv6 do servidor
echo "ListenAddress ::" > /etc/ssh/sshd_config.d/inc-listen-ipv6.conf;
# Desativar exibição do motd do OpenSSH, ainda mantem o /etc/motd do bash
echo "PrintMotd no" > /etc/ssh/sshd_config.d/inc-motd.conf;
# Flags de cabeçalho IP para tratamento QoS diferenciado
echo "IPQoS lowdelay throughput" > /etc/ssh/sshd_config.d/inc-ipv4-qos.conf;
# Ativar keep-alive de TCP (camada 4)
echo "TCPKeepAlive yes" > /etc/ssh/sshd_config.d/inc-tcp-alive.conf;
# Ativar keep-alive de SSH (camada 5)
echo "ClientAliveInterval 3" > /etc/ssh/sshd_config.d/inc-ssh-alive.conf;
echo "ClientAliveCountMax 15" >> /etc/ssh/sshd_config.d/inc-ssh-alive.conf;
# Ativar autenticacao com uso de senha digitavel
echo "PasswordAuthentication yes" > /etc/ssh/sshd_config.d/inc-pass-auth.conf;
# Não permitir login de usuarios sem senha
echo "PermitEmptyPasswords no" > /etc/ssh/sshd_config.d/inc-pass-empty.conf;
# Permitir encaminhamento pelo ssh-agent
echo "AllowAgentForwarding yes" > /etc/ssh/sshd_config.d/inc-agent-forward.conf;
# Permitir encaminhamento de porta remota
echo "AllowTcpForwarding yes" > /etc/ssh/sshd_config.d/inc-tcp-forward.conf;
# Permitir encaminhamento de servidor X11 por meio de conexao SHS
echo "X11Forwarding yes" > /etc/ssh/sshd_config.d/inc-x11.conf;
# Permitir que o cliente especifique ips e portas para encaminhamento
echo "GatewayPorts clientspecified" > /etc/ssh/sshd_config.d/inc-gateway-ports.conf;
# Permitir que o cliente especifique IPs a escutar em portas remotas
echo "PermitListen any" > /etc/ssh/sshd_config.d/inc-permit-listen.conf;
# Permitir abertura de terminal (necessario para usuario conseguir um shell)
echo "PermitTTY yes" > /etc/ssh/sshd_config.d/inc-tty.conf;
# Permitir usar o SSH para fazer VPN
echo "PermitTunnel yes" > /etc/ssh/sshd_config.d/inc-tunnel.conf;
# Permitir variaveis do shell do usuário transferidas para o lado servidor
echo "PermitUserEnvironment no" > /etc/ssh/sshd_config.d/inc-user-env.conf;
# Nao exibir o ultimo login do usuario ao entrar no shell via SSH
echo "PrintLastLog no" > /etc/ssh/sshd_config.d/inc-lastlog.conf;
# Desativar compressão de dados (shell mais responsivo)
echo "Compression no" > /etc/ssh/sshd_config.d/inc-compression.conf;
# Nao consultar DNS reverso do ip do usuário no inicio da conexão
echo "UseDNS no" > /etc/ssh/sshd_config.d/inc-dns.conf;
# Especificar fingerprint de versão
echo "VersionAddendum OpenSSH_10" >> /etc/ssh/sshd_config.d/inc-version.conf;
# Permitir que o root faça login usando senha
echo "PermitRootLogin yes" > /etc/ssh/sshd_config.d/inc-permit-root.conf;
# Permitir autenticação usando chave publica
echo "PubkeyAuthentication yes" > /etc/ssh/sshd_config.d/inc-pubkey.conf;
# Renegociar chaves simetricas a cada 1G transferido ou a cada 1h de sessão
echo "RekeyLimit 1G 1h" > /etc/ssh/sshd_config.d/inc-rekey.conf;
# Tamanho manimo da chave RSA aceita:
echo "RequiredRSASize 2048" > /etc/ssh/sshd_config.d/inc-rsa-size.conf;
# Opcoes muito perigosas e sensiveis:
#echo "LoginGraceTime 1m" > /etc/ssh/sshd_config.d/inc-login-time.conf
#echo "MaxAuthTries 2" > /etc/ssh/sshd_config.d/inc-max-auth.conf
#echo "MaxSessions 128" > /etc/ssh/sshd_config.d/inc-max-sessions.conf
#echo "MaxStartups 16:32:100" > /etc/ssh/sshd_config.d/inc-max-startups.conf
#echo "PerSourceMaxStartups 16" > /etc/ssh/sshd_config.d/inc-ip-startups.conf
#echo "PerSourceNetBlockSize 22:32" > /etc/ssh/sshd_config.d/inc-net-size.conf
#echo "PermitUserRC yes" > /etc/ssh/sshd_config.d/inc-permit-rc.conf
#AM="publickey password";
#echo "AuthenticationMethods $AM" >/etc/ssh/sshd_config.d/inc-auths.conf
# Suportar todas as cifras (criptografia simetrica):
#echo -n > /etc/ssh/sshd_config.d/inc-ciphers.conf
#for opt in $(ssh -Q cipher); do
# echo "Ciphers +$opt" >> /etc/ssh/sshd_config.d/inc-ciphers.conf
#done
# Suportar todos os hashes de autenticação de mensagens:
#echo -n > /etc/ssh/sshd_config.d/inc-macs.conf
#for opt in $(ssh -Q mac); do
# echo "MACs +$opt" >> /etc/ssh/sshd_config.d/inc-macs.conf
#done
# Suportar todos os tipos de chaves efêmeras:
#echo -n > /etc/ssh/sshd_config.d/inc-kex.conf
#for opt in $(ssh -Q kex); do
# echo "KexAlgorithms +$opt" >> /etc/ssh/sshd_config.d/inc-kex.conf
#done
# Testar configuracao:
sshd -t -f /etc/ssh/sshd_config && { echo; echo CONFIG SSHD OK; echo; }
# Reiniciar servidor ssh para aplicar:
service ssh restart;
12 – Scripts rodando no boot e reboot/shutdown
Para executar um scripts durante o carregamento do Debian, você precisará registrá-lo em algum ponto do carregamento do SystemD, vamos criar:
- /etc/rc.local-up para subir após todos os programas do SystemD durante o boot;
- /etc/rc.local-down para subir quando o reboot/shutdown/poweroff for acionado de forma graciosa (não funciona quando há queda de energia ou desligamento forçado);
Criando os scripts e arquivos de registro no SystemD::
# Criar script para chamadas durante o boot:
touch /etc/rc.local-up; chmod +x /etc/rc.local-up;
touch /etc/rc.local-down; chmod +x /etc/rc.local-down;
# Diretorios para colocar os scripts que serao acionados
mkdir -p /etc/local-up.d;
mkdir -p /etc/local-down.d;
# Conteudo de exemplo:
# - script de boot
(
echo '#!/bin/sh';
echo;
echo 'echo "$(date) - Boot registrado" >> /var/log/local-up.log';
echo "run-parts --regex '.*' /etc/local-up.d";
echo;
echo 'exit 0';
) > /etc/rc.local-up;
# - script de desligamento
(
echo '#!/bin/sh';
echo;
echo 'echo "$(date) - Desligamento registrado" >> /var/log/local-down.log';
echo "run-parts --regex '.*' /etc/local-down.d";
echo;
echo 'exit 0';
) > /etc/rc.local-down;
# Servico de local-up
(
echo '[Unit]';
echo 'Description=Boot script entrypoint';
echo 'After=multi-user.target network-online.target';
echo 'Wants=network-online.target';
echo;
echo '[Service]';
echo 'Type=oneshot';
echo 'ExecStart=/etc/rc.local-up';
echo 'RemainAfterExit=yes';
echo;
echo '[Install]';
echo 'WantedBy=multi-user.target';
echo;
) > /etc/systemd/system/rc-local-up.service;
# Servico de local-down
(
echo '[Unit]';
echo 'Description=Shutdown script entrypoint';
echo 'Before=shutdown.target reboot.target halt.target';
echo 'DefaultDependencies=no';
echo;
echo '[Service]';
echo 'Type=oneshot';
echo 'ExecStart=/etc/rc.local-down';
echo 'RemainAfterExit=yes';
echo;
echo '[Install]';
echo 'WantedBy=halt.target reboot.target shutdown.target';
echo;
) > /etc/systemd/system/rc-local-down.service;
# Atualizar SystemD para ele detectar as novas units
systemctl daemon-reload;
# Ativar servicos rc-local-up e rc-local-down
systemctl enable rc-local-up;
systemctl enable rc-local-down;
Agora basta colocar seus scripts nos diretórios:
- /etc/local-up.d para scripts que devem rodar no boot;
- /etc/local-down.d para scripts que devem rodar antes do desligamento ou reboot;
13 – Apparmor
O Apparmor (armadura de aplicação) é um recurso do kernel que cria uma política de “aprisionamento” de aplicativos, impedindo que eles acessem arquivos, diretórios ou recursos fora do escopo para o qual foram programados/configurados e impede que sejam usados de maneira maliciosa.
O problema é que o Apparmor acaba avacalhando o dia-a-dia de muita gente que deseja usar o Debian livremente.
Você tem duas opções: aprender sobre esse recurso e configurá-lo corretamente ou desativá-lo, se isso não representar nenhum risco (se você roda programas em Docker, o Docker serve como melhor opção de isolamento).
# Desativando Apparmor
# Conferir status:
apparmor_status;
# Desativar:
systemctl stop apparmor;
systemctl disable apparmor;
# Remover do sistema:
apt remove --assume-yes --purge apparmor;
apt -y autoremove;
14 – Limpeza de Cache/Buffer
A limpeza de cache/buffer ajuda o sistema operacional a não usar memória desnecessária. Coloque o script em uma rotina agendada pelo Cron (capítulo anterior sobre crontab).
# Criar script de limpeza de cache
(
echo '#!/bin/bash';
echo;
echo '# Limpar cache/buffer de ram';
echo 'echo 1 > /proc/sys/vm/drop_caches;';
echo 'echo 2 > /proc/sys/vm/drop_caches;';
echo 'echo 3 > /proc/sys/vm/drop_caches;';
echo;
echo 'BLIST=$(lsblk -d -n -o NAME | sed "s/^/\/dev\//");';
echo 'for bdev in $BLIST; do';
echo ' blockdev --flushbufs $bdev;';
echo 'done';
echo;
echo '# Sincronizar escrita atrasada no disco';
echo 'sync;';
echo;
) > /usr/share/drop-cache.sh;
chmod +x /usr/share/drop-cache.sh;
# Colocar para rodar de hora em hora:
cp -rav /usr/share/drop-cache.sh /etc/cron.hourly/drop-cache;
# ou
# Colocar para rodar todo dia:
# - para ambientes com muita carga de I/O (banco de dados) o cache faz bem
cp -rav /usr/share/drop-cache.sh /etc/cron.daily/drop-cache;
15 – Ajustes de embelezamento
Banner de login
Embora seja um recurso estético, eu recomendo que você personalize o /etc/motd para sempre que entrar no servidor você saber onde está se metendo.
Link para gerar texto ASCII:
https://patorjk.com/software/taag/#p=display&f=Colossal&t=%20SRV101
Exemplo de definição do banner:
# Apagar motd:
echo -n > /etc/motd;
# Preencher motd com arte ASCII (copie do cat até o EOF e cole no terminal):
(
echo;
echo ' .d8888b. 8888888b. 888 888 d888 .d8888b. d888';
echo ' d88P Y88b 888 Y88b 888 888 d8888 d88P Y88b d8888';
echo ' Y88b. 888 888 888 888 888 888 888 888';
echo ' "Y888b. 888 d88P Y88b d88P 888 888 888 888';
echo ' "Y88b. 8888888P" Y88b d88P 888 888 888 888';
echo ' "888 888 T88b Y88o88P 888 888 888 888';
echo ' Y88b d88P 888 T88b Y888P 888 Y88b d88P 888';
echo ' "Y8888P" 888 T88b Y8P 8888888 "Y8888P" 8888888';
echo;
) > /etc/motd;
Shell com prompt colorido
A variável $PS1 é usada pelo bash/sh para colorir o terminal e personalizar o prompt, você pode alterar essa variável para testar novos formatos. Execute os comandos que definem o PS1 e teste até achar um que gosta mais. Exemplos (escolha o que te agradar mais, execute um a um e compare):
# Padrão Debian:
export PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ';
# Padrão Debian com diretorio completo (apenas troca o '~' pelo caminho):
export PS1='${debian_chroot:+($debian_chroot)}\u@\h:$(pwd)\$ ';
# Padrão Debian com data/hora:
export PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w [$(date +%k:%M:%S)] \$ ';
# Azul e verde (tudo em uma unica linha):
export PS1='\[\033[0;99m\][\[\033[0;96m\]\u\[\033[0;99m\]@\[\033[0;92m\]\h\[\033[0;99m\]] \[\033[1;38m\]\w\[\033[0;99m\] \$\[\033[0m\] ';
# Verde e amarelo:
export PS1='\[\033[0;99m\][\[\033[0;92m\]\u\[\033[0;99m\]@\[\033[0;93m\]\h\[\033[0;99m\]] \[\033[1;38m\]\w\[\033[0;99m\] \$\[\033[0m\] ';
# Vermelho e amarelo:
export PS1='\[\033[0;99m\][\[\033[0;91m\]\u\[\033[0;99m\]@\[\033[0;93m\]\h\[\033[0;99m\]] \[\033[1;38m\]\w\[\033[0;99m\] \$\[\033[0m\] ';
# Azul claro e amarelo:
export PS1='\[\033[0;99m\][\[\033[0;96m\]\u\[\033[0;99m\]@\[\033[0;93m\]\h\[\033[0;99m\]] \[\033[1;38m\]\w\[\033[0;99m\] \$\[\033[0m\] ';
# Busybox mode 1
export PS1='\u@\h \w> ';
# Busybox mode 2 (+data/hora)
export PS1='\u@\h [$(date +%k:%M:%S)]> ';
# Busybox mode 3 (apenas hora no inicio)
export PS1='[\@] \u@\h> ';
Para tornar a personalização definitiva, preencha a linha do “export PS1=…” no final do script /etc/profile.d/ps1.sh (será executado pelo /etc/profile). Exemplo:
# Azul claro e amarelo:
export PS1='\[\033[0;99m\][\[\033[0;96m\]\u\[\033[0;99m\]@\[\033[0;93m\]\h\[\033[0;99m\]] \[\033[1;38m\]\w\[\033[0;99m\] \$\[\033[0m\] ';
# Colocar personalizacao sempre que iniciar um novo shell:
echo "export PS1='$PS1';" > /etc/profile.d/ps1.sh;
# Tornar script executável:
chmod +x /etc/profile.d/ps1.sh;
Conclusão
Sempre crie um relatório próprio dos servidores que você instala para que no futuro você possa reconstruir o sistema de maneira rápida e sem erros!
Terminamos por hoje, isso deve ter te economizado muito tempo!
Patrick Brandão, patrickbrandao@gmail.com