diff --git a/start.sh b/start.sh index a5fd964..8df8afa 100644 --- a/start.sh +++ b/start.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -euo pipefail echo -e " ░█████╗░███╗░░██╗██████╗░██████╗░░█████╗░░██████╗ @@ -8,71 +9,66 @@ echo -e " ██║░░██║██║░╚███║██████╔╝██████╔╝╚█████╔╝██████╔╝ ╚═╝░░╚═╝╚═╝░░╚══╝╚═════╝░╚═════╝░░╚════╝░╚═════╝░" - - COUNTRIES="af es" +ZONE_DIR="zone" + +mkdir -p "$ZONE_DIR" + +function add_iptables_rule() { + local chain=$1 + local set_name=$2 + + if iptables -t raw -C "$chain" -m set --match-set "$set_name" src -j DROP 2>/dev/null; then + echo "Regra iptables para ipset '$set_name' já existe na cadeia $chain." + else + echo "Inserindo regra iptables para ipset '$set_name' na cadeia $chain..." + iptables -t raw -I "$chain" -m set --match-set "$set_name" src -j DROP + fi +} for country in $COUNTRIES; do - if [ ! -d "zone" ]; then - mkdir -p zone - fi url="https://www.ipdeny.com/ipblocks/data/countries/${country}.zone" - echo "Tentando baixar lista de IPs para o país: $country" + echo "[$(date '+%Y-%m-%d %H:%M:%S')] Tentando baixar lista de IPs para o país: $country" - tmp_file="zone/${country}.zone.tmp" - target_file="zone/${country}.zone" + tmp_file="${ZONE_DIR}/${country}.zone.tmp" + target_file="${ZONE_DIR}/${country}.zone" if curl -sSf -o "$tmp_file" "$url"; then - echo "Download concluído para $country." + echo "[$(date '+%Y-%m-%d %H:%M:%S')] Download concluído para $country." - if [ -f "$target_file" ]; then - if cmp -s "$tmp_file" "$target_file"; then - echo "Arquivo para $country não mudou. Mantendo versão atual." - rm "$tmp_file" - else - echo "Arquivo para $country mudou. Atualizando..." - mv "$tmp_file" "$target_file" - fi + if [ -f "$target_file" ] && cmp -s "$tmp_file" "$target_file"; then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] Arquivo para $country não mudou. Mantendo versão atual." + rm "$tmp_file" else - echo "Arquivo para $country não existia. Salvando novo arquivo." + echo "[$(date '+%Y-%m-%d %H:%M:%S')] Arquivo para $country mudou ou não existia. Atualizando..." mv "$tmp_file" "$target_file" fi else - echo "Falha no download do arquivo para $country. Mantendo versão antiga (se existir)." + echo "[$(date '+%Y-%m-%d %H:%M:%S')] Falha no download para $country. Mantendo versão antiga (se existir)." [ -f "$tmp_file" ] && rm "$tmp_file" continue fi - # Verifica se ipset existe - if ipset list "$country" > /dev/null 2>&1; then - echo "IpSet '$country' já existe. Limpando entradas antigas..." + if ipset list "$country" &>/dev/null; then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] IpSet '$country' já existe. Limpando entradas antigas..." ipset flush "$country" else - echo "Criando IpSet '$country'." + echo "[$(date '+%Y-%m-%d %H:%M:%S')] Criando IpSet '$country'." ipset create "$country" hash:net fi - # Adicionar cada rede ao ipset while read -r subnet; do - ipset add "$country" "$subnet" -exist + if ! ipset add "$country" "$subnet" -exist; then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] Aviso: falha ao adicionar $subnet ao ipset $country" + fi done < "$target_file" - echo "Concluído para o país $country." + echo "[$(date '+%Y-%m-%d %H:%M:%S')] Configuração do IpSet concluída para o país $country." - # Verifica se a regra iptables já existe - if iptables -t raw -C PREROUTING -m set --match-set "$country" src -j DROP 2>/dev/null; then - echo "Regra iptables para ipset '$country' já existe." - else - echo "Inserindo regra iptables para bloquear IPs do ipset '$country'..." - iptables -t raw -I PREROUTING -m set --match-set "$country" src -j DROP - fi + add_iptables_rule PREROUTING "$country" + add_iptables_rule OUTPUT "$country" - if iptables -t raw -C OUTPUT -m set --match-set "$country" src -j DROP 2>/dev/null; then - echo "Regra iptables para ipset '$country' já existe." - else - echo "Inserindo regra iptables para bloquear IPs do ipset '$country'..." - iptables -t raw -I OUTPUT -m set --match-set "$country" src -j DROP - fi - - echo "Regra iptables configurada para o país $country." + echo "[$(date '+%Y-%m-%d %H:%M:%S')] Regras iptables configuradas para o país $country." done + +echo "[$(date '+%Y-%m-%d %H:%M:%S')] Script concluído."