diff --git a/conf-rede b/conf-rede index 942eba6..adef45b 100644 --- a/conf-rede +++ b/conf-rede @@ -5,19 +5,18 @@ set -e # ============================================================ # CONFIGURAÇÃO DE REDE / GATEWAY - DEBIAN 13 # +# Funções: # - Detecta interfaces de rede # - Recria /etc/network/interfaces -# - DHCP / Estático / Não configurar por interface -# - Pergunta se a máquina será gateway -# - Permite selecionar a interface de saída (WAN) -# - Ativa IPv4 forwarding permanentemente +# - DHCP / IP estático / Não configurar +# - Configura /etc/resolv.conf +# - Configura gateway IPv4 +# - Ativa ip_forward permanentemente # - Configura nftables -# - Configura masquerade (NAT) permanentemente +# - Configura masquerade permanente # # Compatível com: -# # curl -fsSL URL | bash -# # ============================================================ @@ -43,12 +42,9 @@ valid_ipv4() { [ "${#octets[@]}" -eq 4 ] || return 1 for octet in "${octets[@]}"; do - [[ "$octet" =~ ^[0-9]+$ ]] || return 1 - [ "$octet" -ge 0 ] 2>/dev/null || return 1 [ "$octet" -le 255 ] 2>/dev/null || return 1 - done return 0 @@ -56,7 +52,6 @@ valid_ipv4() { yes_answer() { - case "$1" in s|S|sim|SIM|Sim|y|Y|yes|YES|Yes) return 0 @@ -73,13 +68,10 @@ yes_answer() { # ============================================================ if [ "$EUID" -ne 0 ]; then - echo echo "ERRO: execute este script como root." echo - exit 1 - fi @@ -91,30 +83,11 @@ clear 2>/dev/null || true echo echo "============================================================" -echo " CONFIGURAÇÃO DE REDE - DEBIAN 13" +echo " CONFIGURAÇÃO DE REDE / GATEWAY - DEBIAN 13" echo "============================================================" echo -# ============================================================ -# VERIFICA NFTABLES -# ============================================================ - -if ! command -v nft >/dev/null 2>&1; then - - echo "ERRO: nftables não está instalado." - echo - echo "Instale antes com:" - echo - echo " apt update" - echo " apt install nftables" - echo - - exit 1 - -fi - - # ============================================================ # DETECTA INTERFACES # ============================================================ @@ -131,18 +104,14 @@ mapfile -t INTERFACES < <( if [ "${#INTERFACES[@]}" -eq 0 ]; then - echo "ERRO: nenhuma interface de rede encontrada." - exit 1 - fi echo "Interfaces encontradas:" echo - for IFACE in "${INTERFACES[@]}"; do MAC="desconhecido" @@ -170,21 +139,23 @@ done echo "ATENÇÃO:" echo -echo "O arquivo /etc/network/interfaces será recriado." +echo "Os seguintes arquivos poderão ser alterados:" +echo +echo " /etc/network/interfaces" +echo " /etc/resolv.conf" +echo " /etc/sysctl.d/99-ip-forward.conf" +echo " /etc/nftables.conf" echo read_tty "Deseja continuar? [S/n]: " CONFIRM case "$CONFIRM" in - n|N|nao|não|NAO|NÃO) - echo echo "Operação cancelada." exit 0 ;; - esac @@ -197,30 +168,44 @@ BACKUP_DIR="/root/network-backup-$(date +%Y%m%d-%H%M%S)" mkdir -p "$BACKUP_DIR" -if [ -f /etc/network/interfaces ]; then +for FILE in \ + /etc/network/interfaces \ + /etc/resolv.conf \ + /etc/nftables.conf \ + /etc/sysctl.d/99-ip-forward.conf - cp -a /etc/network/interfaces \ - "$BACKUP_DIR/interfaces" +do -fi + if [ -e "$FILE" ]; then + cp -a "$FILE" "$BACKUP_DIR/$(basename "$FILE")" -if [ -f /etc/nftables.conf ]; then + fi - cp -a /etc/nftables.conf \ - "$BACKUP_DIR/nftables.conf" - -fi +done echo -echo "Backup:" -echo "$BACKUP_DIR" +echo "Backup criado em:" +echo +echo " $BACKUP_DIR" echo # ============================================================ -# CRIA /etc/network/interfaces +# VARIÁVEIS +# ============================================================ + +CONFIGURED_INTERFACES=() + +DNS_SERVERS=() +DNS_SEARCH="" + +STATIC_INTERFACE_FOUND=0 + + +# ============================================================ +# RECRIA /etc/network/interfaces # ============================================================ cat > /etc/network/interfaces <<'EOF' @@ -236,14 +221,7 @@ EOF # ============================================================ -# INTERFACES CONFIGURADAS -# ============================================================ - -CONFIGURED_INTERFACES=() - - -# ============================================================ -# CONFIGURA CADA INTERFACE +# CONFIGURA INTERFACES # ============================================================ for IFACE in "${INTERFACES[@]}"; do @@ -307,6 +285,8 @@ EOF 2) + STATIC_INTERFACE_FOUND=1 + echo echo "Configuração estática de $IFACE" echo @@ -335,7 +315,7 @@ EOF while true; do - read_tty "Prefixo [ex.: 24]: " PREFIX + read_tty "Prefixo da rede [ex.: 24]: " PREFIX if [[ "$PREFIX" =~ ^[0-9]+$ ]] && [ "$PREFIX" -ge 0 ] && @@ -345,7 +325,7 @@ EOF fi - echo "Prefixo inválido." + echo "Prefixo inválido. Informe um valor entre 0 e 32." done @@ -377,7 +357,7 @@ EOF while true; do - read_tty "DNS [ex.: 172.16.0.2 8.8.8.8] [ENTER para nenhum]: " DNS + read_tty "DNS [ex.: 8.8.8.8 1.1.1.1] [ENTER para nenhum]: " DNS if [ -z "$DNS" ]; then break @@ -399,7 +379,7 @@ EOF break fi - echo "DNS inválido." + echo "Um ou mais servidores DNS são inválidos." done @@ -408,11 +388,11 @@ EOF # DNS SEARCH # ------------------------------------------------ - read_tty "Domínio de pesquisa DNS [ENTER para nenhum]: " DNS_SEARCH + read_tty "Domínio de pesquisa DNS [ENTER para nenhum]: " CURRENT_DNS_SEARCH # ------------------------------------------------ - # GRAVA + # GRAVA INTERFACE # ------------------------------------------------ cat >> /etc/network/interfaces <> /etc/network/interfaces - + echo " gateway $GATEWAY" >> /etc/network/interfaces fi if [ -n "$DNS" ]; then + echo " dns-nameservers $DNS" >> /etc/network/interfaces - echo " dns-nameservers $DNS" \ - >> /etc/network/interfaces - + for DNS_IP in $DNS; do + DNS_SERVERS+=("$DNS_IP") + done fi - if [ -n "$DNS_SEARCH" ]; then + if [ -n "$CURRENT_DNS_SEARCH" ]; then - echo " dns-search $DNS_SEARCH" \ + echo " dns-search $CURRENT_DNS_SEARCH" \ >> /etc/network/interfaces + DNS_SEARCH="$CURRENT_DNS_SEARCH" + fi @@ -478,7 +458,7 @@ EOF *) echo - echo "Opção inválida." + echo "Opção inválida. Escolha 1, 2 ou 3." ;; esac @@ -491,6 +471,51 @@ done chmod 644 /etc/network/interfaces +# ============================================================ +# CONFIGURA /etc/resolv.conf +# ============================================================ + +if [ "${#DNS_SERVERS[@]}" -gt 0 ]; then + + echo + echo "Configurando /etc/resolv.conf..." + + + cat > /etc/resolv.conf <<'EOF' +# ============================================================ +# Configuração DNS +# Gerada automaticamente +# ============================================================ + +EOF + + + if [ -n "$DNS_SEARCH" ]; then + + echo "search $DNS_SEARCH" >> /etc/resolv.conf + + fi + + + # Remove duplicatas + mapfile -t UNIQUE_DNS < <( + printf "%s\n" "${DNS_SERVERS[@]}" | + awk '!seen[$0]++' + ) + + + for DNS_IP in "${UNIQUE_DNS[@]}"; do + + echo "nameserver $DNS_IP" >> /etc/resolv.conf + + done + + + chmod 644 /etc/resolv.conf + +fi + + # ============================================================ # GATEWAY # ============================================================ @@ -501,30 +526,46 @@ echo " CONFIGURAÇÃO DE GATEWAY" echo "============================================================" echo -read_tty "Esta máquina será gateway para outras redes? [s/N]: " IS_GATEWAY +read_tty "Esta máquina será gateway para outras máquinas/redes? [s/N]: " IS_GATEWAY if yes_answer "$IS_GATEWAY"; then # ======================================================== - # VERIFICA INTERFACES CONFIGURADAS + # NFTABLES # ======================================================== + if ! command -v nft >/dev/null 2>&1; then + + echo + echo "ERRO: nftables não está instalado." + echo + echo "Instale com:" + echo + echo " apt update" + echo " apt install nftables" + echo + + exit 1 + + fi + + if [ "${#CONFIGURED_INTERFACES[@]}" -lt 2 ]; then echo echo "ATENÇÃO:" echo - echo "Um gateway normalmente precisa de pelo menos" - echo "duas interfaces configuradas." + echo "Foram configuradas menos de duas interfaces." + echo "Um gateway normalmente utiliza pelo menos uma WAN e uma LAN." echo fi # ======================================================== - # SELEÇÃO DA WAN + # SELECIONA WAN # ======================================================== echo @@ -568,12 +609,31 @@ if yes_answer "$IS_GATEWAY"; then echo - echo "Interface WAN selecionada: $WAN_INTERFACE" + echo "Interface WAN selecionada:" + echo + echo " $WAN_INTERFACE" echo # ======================================================== - # FORWARD IPV4 PERMANENTE + # INTERFACES LAN + # ======================================================== + + LAN_INTERFACES=() + + for IFACE in "${CONFIGURED_INTERFACES[@]}"; do + + if [ "$IFACE" != "$WAN_INTERFACE" ]; then + + LAN_INTERFACES+=("$IFACE") + + fi + + done + + + # ======================================================== + # IP FORWARD # ======================================================== echo "Ativando IPv4 forwarding..." @@ -595,24 +655,22 @@ EOF # NFTABLES # ======================================================== - echo "Configurando nftables..." + echo "Criando configuração do nftables..." cat > /etc/nftables.conf < WAN # ======================================================== - for IFACE in "${CONFIGURED_INTERFACES[@]}"; do + for LAN_INTERFACE in "${LAN_INTERFACES[@]}"; do - if [ "$IFACE" != "$WAN_INTERFACE" ]; then - - echo " iifname \"$IFACE\" oifname \"$WAN_INTERFACE\" accept" \ - >> /etc/nftables.conf - - fi + echo " iifname \"$LAN_INTERFACE\" oifname \"$WAN_INTERFACE\" accept" \ + >> /etc/nftables.conf done @@ -662,7 +714,7 @@ EOF # ============================================================ -# NAT IPv4 +# NAT # ============================================================ table ip nat { @@ -681,20 +733,21 @@ EOF # ======================================================== - # TESTA NFTABLES + # VALIDA NFTABLES # ======================================================== echo echo "Validando regras do nftables..." + if ! nft -c -f /etc/nftables.conf; then echo - echo "ERRO:" - echo "A configuração do nftables possui algum problema." + echo "ERRO: configuração inválida do nftables." echo - echo "O backup está em:" - echo "$BACKUP_DIR" + echo "Backup disponível em:" + echo + echo " $BACKUP_DIR" echo exit 1 @@ -703,7 +756,7 @@ EOF # ======================================================== - # ATIVA NFTABLES + # ATIVA # ======================================================== echo @@ -719,37 +772,6 @@ EOF systemctl restart nftables - # ======================================================== - # RESULTADO GATEWAY - # ======================================================== - - echo - echo "============================================================" - echo " GATEWAY CONFIGURADO" - echo "============================================================" - echo - echo "WAN:" - echo " $WAN_INTERFACE" - echo - echo "IPv4 Forwarding:" - echo " ATIVADO" - echo - echo "NAT / Masquerade:" - echo " ATIVADO" - echo - - -else - - - # ======================================================== - # NÃO É GATEWAY - # ======================================================== - - echo - echo "A máquina não será configurada como gateway." - echo - fi @@ -763,26 +785,41 @@ echo " CONFIGURAÇÃO FINAL" echo "============================================================" echo -echo "/etc/network/interfaces:" + +echo "Arquivo de interfaces:" echo echo "------------------------------------------------------------" - cat /etc/network/interfaces +echo "------------------------------------------------------------" + +echo +echo "DNS:" +echo +echo "------------------------------------------------------------" +cat /etc/resolv.conf echo "------------------------------------------------------------" if yes_answer "$IS_GATEWAY"; then echo - echo "IPv4 Forward:" + echo "Gateway:" + echo + echo "WAN : $WAN_INTERFACE" + + if [ "${#LAN_INTERFACES[@]}" -gt 0 ]; then + + echo "LAN : ${LAN_INTERFACES[*]}" + + fi + + echo "IPv4 Forward : $(sysctl -n net.ipv4.ip_forward)" + echo "Masquerade : ativado" echo - sysctl net.ipv4.ip_forward - - echo - echo "Regras nftables:" - echo + echo "------------------------------------------------------------" + echo "NFTABLES" echo "------------------------------------------------------------" nft list ruleset @@ -800,7 +837,7 @@ sync # ============================================================ -# FINALIZAÇÃO +# FINALIZA # ============================================================ echo @@ -808,14 +845,13 @@ echo "============================================================" echo " CONFIGURAÇÃO CONCLUÍDA" echo "============================================================" echo -echo "Backup da configuração anterior:" +echo "Backup:" echo echo " $BACKUP_DIR" echo -echo "Recomenda-se reiniciar a máquina para aplicar" -echo "completamente a nova configuração de interfaces." +echo "A configuração foi gravada." echo -echo "Execute:" +echo "Recomenda-se reiniciar a máquina:" echo echo " reboot" echo \ No newline at end of file