Debian: Ajustes finos

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.

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.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
  • 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

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 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:

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: 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:

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

# Agent de VM VMWARE, instalar somente se for virtualizado no vmware
hostnamectl | grep -qi vmware && apt-get -y install open-vm-tools

# 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 – 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"
(
    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
    echo 'agentaddress unix:/run/snmpd.socket,udp:161,udp6:161,tcp6:161,tcp:161'
    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  .1.3.6.1.2.1.31.1.1.1.1
      

6 – 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

7 – 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:

8 – 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:

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!

9 – 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:

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

[Match]
MACAddress=00:1a:2b:3c:4d:5e

[Link]
Name=eth0

Reinicie (reboot) e teste até acertar tudo sem esquecer de ajustar o NetConfig.

10 – 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 o scripts:

Bash
# Criar script para chamadas durante o boot:
touch /etc/rc.local-up
touch /etc/rc.local-down
chmod +x /etc/rc.local-up
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

Criando arquivos de registro no SystemD:

Bash
# 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;

11 – 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

12 – 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:

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\]'

# 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 de sistema /etc/profile e saia/entre no terminal novamente para ver o efeito!

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