#!/bin/bash #=============================================================================== # ШАГ 7: НАСТРОЙКА FIREWALL (nftables) #=============================================================================== # Запуск: sudo bash 01-k-server-initial-setup.07.sh #=============================================================================== SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) source "$SCRIPT_DIR/01-k-server-initial-setup.00.sh" init_log check_root print_header "ШАГ 7: НАСТРОЙКА FIREWALL (nftables)" NFT_CONF="/etc/nftables.conf" #------------------------------------------------------------------------------- # 7.1 Проверка nftables #------------------------------------------------------------------------------- print_subheader "Проверка nftables" if ! is_installed nftables; then print_info "Установка nftables..." apt install -y nftables fi print_success "nftables установлен" #------------------------------------------------------------------------------- # 7.2 Backup существующей конфигурации #------------------------------------------------------------------------------- print_subheader "Резервная копия" if [[ -f "$NFT_CONF" ]]; then cp "$NFT_CONF" "${NFT_CONF}.backup.$(date +%Y%m%d_%H%M%S)" print_success "Backup создан" fi #------------------------------------------------------------------------------- # 7.3 Создание конфигурации #------------------------------------------------------------------------------- print_subheader "Создание конфигурации" cat > "$NFT_CONF" << EOF #!/usr/sbin/nft -f # Firewall для Git Server # $IFACE_EXT - внешний интерфейс (ограниченный доступ) # $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) iifname $IFACE_EXT tcp dport 80 accept # HTTPS 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 "Конфигурация создана" #------------------------------------------------------------------------------- # 7.4 Проверка синтаксиса #------------------------------------------------------------------------------- print_subheader "Проверка синтаксиса" if nft -c -f "$NFT_CONF" 2>&1; then print_success "Синтаксис валиден" else print_error "Ошибка синтаксиса nftables" exit 1 fi #------------------------------------------------------------------------------- # 7.5 Применение #------------------------------------------------------------------------------- print_subheader "Применение правил" echo "" echo -e "${YELLOW}Внимание! После применения firewall могут быть заблокированы подключения.${NC}" echo "" read -p "Применить правила firewall? [y/N]: " APPLY_FW if [[ "$APPLY_FW" =~ ^[Yy]$ ]]; then nft -f "$NFT_CONF" systemctl enable nftables print_success "Firewall применён" # Показать правила echo "" print_info "Активные правила:" nft list ruleset | head -40 else print_warning "Правила не применены" print_info "Примените вручную: sudo nft -f $NFT_CONF" fi print_success "Шаг 7 завершён: Firewall настроен"