initial commit
This commit is contained in:
143
01/01-k-server-initial-setup.07.sh
Executable file
143
01/01-k-server-initial-setup.07.sh
Executable file
@@ -0,0 +1,143 @@
|
||||
#!/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 настроен"
|
||||
Reference in New Issue
Block a user