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