#!/bin/bash #=============================================================================== # ШАГ 10: ОБНОВЛЕНИЕ FIREWALL #=============================================================================== # Запуск: sudo bash 02-k-git-server-deploy.10.sh #=============================================================================== SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) source "$SCRIPT_DIR/02-k-git-server-deploy.00.sh" init_log check_root print_header "ШАГ 10: ОБНОВЛЕНИЕ FIREWALL (nftables)" #------------------------------------------------------------------------------- # 10.1 Проверка текущих правил #------------------------------------------------------------------------------- print_subheader "Текущие правила" if command -v nft &>/dev/null; then echo "Текущие правила nftables:" nft list ruleset 2>/dev/null | head -30 else print_warning "nftables не установлен. Установка..." apt install -y nftables fi #------------------------------------------------------------------------------- # 10.2 Создание новой конфигурации #------------------------------------------------------------------------------- print_subheader "Создание конфигурации" # Backup существующей конфигурации if [[ -f /etc/nftables.conf ]]; then cp /etc/nftables.conf /etc/nftables.conf.backup.$(date +%Y%m%d_%H%M%S) fi cat > /etc/nftables.conf << EOF #!/usr/sbin/nft -f # Firewall для Git Server (Gitea) # eth0 ($IFACE_EXT) - внешний интерфейс (ограниченный доступ) # eth1 ($IFACE_INT) - внутренний интерфейс (доверенная зона) flush ruleset table inet filter { chain input { type filter hook input priority 0; policy drop; # Разрешить loopback iif lo accept # Установленные соединения ct state established,related accept # Блокировать invalid пакеты ct state invalid drop # ICMP (ограниченно) ip protocol icmp icmp type echo-request limit rate 1/second accept ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate 1/second accept ip protocol icmp icmp type { destination-unreachable, time-exceeded } accept ip6 nexthdr icmpv6 icmpv6 type { destination-unreachable, time-exceeded } accept # === ВНЕШНИЙ ИНТЕРФЕЙС ($IFACE_EXT) === # SSH для администрирования iifname $IFACE_EXT tcp dport 22 accept # HTTP (для Let's Encrypt challenge) iifname $IFACE_EXT tcp dport 80 accept # HTTPS (Gitea) iifname $IFACE_EXT tcp dport 443 accept # === ВНУТРЕННИЙ ИНТЕРФЕЙС ($IFACE_INT) - доверенная зона === iifname $IFACE_INT tcp dport 22 accept iifname $IFACE_INT tcp dport 80 accept iifname $IFACE_INT tcp dport 443 accept iifname $IFACE_INT tcp dport 3000 accept # Логирование заблокированных (опционально - раскомментируйте для отладки) # log prefix "nft drop: " counter # Счётчик отброшенных пакетов counter } chain forward { type filter hook forward priority 0; policy drop; } chain output { type filter hook output priority 0; policy accept; } } EOF print_success "Конфигурация создана" #------------------------------------------------------------------------------- # 10.3 Проверка синтаксиса #------------------------------------------------------------------------------- print_subheader "Проверка синтаксиса" if nft -c -f /etc/nftables.conf 2>&1; then print_success "Синтаксис валиден" else print_error "Ошибка синтаксиса nftables" exit 1 fi #------------------------------------------------------------------------------- # 10.4 Применение правил #------------------------------------------------------------------------------- print_subheader "Применение правил" read -p "Применить правила firewall? [y/N]: " APPLY if [[ "$APPLY" =~ ^[Yy]$ ]]; then nft -f /etc/nftables.conf systemctl enable nftables print_success "Firewall применён" else print_warning "Правила не применены" print_info "Примените вручную: nft -f /etc/nftables.conf" fi #------------------------------------------------------------------------------- # 10.5 Показать активные правила #------------------------------------------------------------------------------- print_subheader "Активные правила" echo "" nft list ruleset print_success "Шаг 10 завершён: Firewall настроен"