144 lines
5.0 KiB
Bash
Executable File
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 настроен"
|