Files
gitserver/02/02-k-git-server-deploy.10.sh
2026-02-19 20:05:04 +03:00

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