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:
Bash
# Definindo nome do servidor: hostnamectl set-hostname srv101.exemplo.com.br; # Conferindo: hostname -f; cat /proc/sys/kernel/hostname;Visualizando todas as informações:
Bash
# 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.00Tabela 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.
Bash
# 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:
Bash
# 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 msNota: 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:
Bash
# 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:
Bash
# 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:
Bash
# 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:
Bash
# 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: reboot4 – Pacotes de comandos básicos
O Debian instalado de maneira minimalista (principalmente em VPSs) carecem de muitos comandos básicos. Segue alguns programas recomendados:
Bash
# 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:
Bash
# 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:
Bash
# 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:
Bash
# 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
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:
Exemplo de como colocar a interface ens192 em DHCP-Client (obter IP automaticamente):
Exemplo de como colocar a interface ens192 com IP fixo:
Para colocar múltiplos IPs fixos (alias) na mesma interface, crie um sufixo “:N” (um número único para cada alias), exemplo:
Criando interface com VLAN (IEEE 802.1q):
Criar interface tipo dummy (descarta o que não for capturado por software):
Criar uma interface que dependerá de um script externo para construção completa:
Após definir a configuração da interface, aplique-a com esses comandos:
Bash
# 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:
Após inserir os argumentos na variável acima, aplique os novos ajustes no GRUB:
Bash
# 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
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:
Bash
# 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::
Bash
# 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).
Bash
# 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).
Bash
# 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:
Bash
# 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):
Bash
# 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:
Bash
# 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