Files
gitserver/01/01-k-server-initial-setup.07.sh
2026-02-19 20:05:04 +03:00

144 lines
5.0 KiB
Bash
Executable File

#!/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 настроен"