Zuletzt aktiv 1 month ago

Сканира всички LXC контейнери и VM за IP адреси, проверява за дублирани IP и показва отворени портове

check-ips.sh Originalformat
1#!/bin/bash
2
3#==============================================================================
4# Proxmox IP Scanner
5# Описание: Сканира всички LXC контейнери и VM за IP адреси, проверява за
6# дублирани IP и показва отворени портове
7#
8# Употреба:
9# ./check-ips.sh - Основна проверка на IP адресите
10# ./check-ips.sh -p - Показва и отворените портове
11# ./check-ips.sh -o report.txt - Записва резултата във файл
12# ./check-ips.sh -p -o report.txt - Показва портове И записва във файл
13# ./check-ips.sh -h - Показва помощта
14#
15# Параметри:
16# -p, --ports Показва отворените портове на работещите контейнери
17# -o, --output Записва резултата във файл (презаписва файла ако съществува)
18# -h, --help Показва помощната информация
19#
20# Примери:
21# ./check-ips.sh -p # Проверка с портове
22# ./check-ips.sh -o /root/ip-report.txt # Запис в /root/
23# ./check-ips.sh --ports --output scan.txt # Пълен скан със запис
24#==============================================================================
25
26# Цветове за терминала
27RED='\033[0;31m'
28GREEN='\033[0;32m'
29YELLOW='\033[1;33m'
30BLUE='\033[0;34m'
31NC='\033[0m' # No Color
32
33OUTPUT_FILE=""
34SHOW_PORTS=false
35
36# Обработка на параметри
37while [[ $# -gt 0 ]]; do
38 case $1 in
39 -o|--output)
40 OUTPUT_FILE="$2"
41 shift 2
42 ;;
43 -p|--ports)
44 SHOW_PORTS=true
45 shift
46 ;;
47 -h|--help)
48 echo "Употреба: $0 [-o файл] [-p]"
49 echo " -o, --output FILE Записва резултата във файл"
50 echo " -p, --ports Показва отворените портове"
51 echo " -h, --help Показва тази помощ"
52 exit 0
53 ;;
54 *)
55 echo "Непознат параметър: $1"
56 exit 1
57 ;;
58 esac
59done
60
61# Функция за запис и показване
62log() {
63 echo -e "$1"
64 if [ -n "$OUTPUT_FILE" ]; then
65 echo -e "$1" | sed 's/\x1b\[[0-9;]*m//g' >> "$OUTPUT_FILE"
66 fi
67}
68
69# Изчистване на файла ако съществува
70if [ -n "$OUTPUT_FILE" ]; then
71 > "$OUTPUT_FILE"
72fi
73
74log "${BLUE}=== Proxmox IP Проверка ===${NC}"
75log "Дата: $(date '+%Y-%m-%d %H:%M:%S')\n"
76
77# Масив за съхранение на IP адреси
78declare -A ip_list
79declare -A ip_owners
80
81# Обхождане на всички LXC контейнери
82log "${GREEN}Сканиране на LXC контейнери...${NC}\n"
83
84for ctid in $(pct list | awk 'NR>1 {print $1}'); do
85 name=$(pct list | grep "^$ctid" | awk '{print $3}')
86 status=$(pct status $ctid | awk '{print $2}')
87
88 log "${YELLOW}CT $ctid${NC} - $name [$status]"
89
90 # Четене на конфигурацията
91 config_file="/etc/pve/lxc/${ctid}.conf"
92
93 if [ -f "$config_file" ]; then
94 # Извличане на IP адреси от конфигурацията
95 ips=$(grep -E "^net[0-9]+:" "$config_file" | grep -oP 'ip=\K[^/,]+' | sort -u)
96
97 if [ -n "$ips" ]; then
98 while IFS= read -r ip; do
99 if [ "$ip" != "dhcp" ]; then
100 log " IP: ${GREEN}$ip${NC}"
101
102 # Проверка за дублиране
103 if [ -n "${ip_list[$ip]}" ]; then
104 ip_list[$ip]="${ip_list[$ip]}, CT$ctid($name)"
105 else
106 ip_list[$ip]="CT$ctid($name)"
107 fi
108
109 ip_owners[$ip]+="CT$ctid($name) "
110
111 # Проверка на портове ако контейнера работи
112 if [ "$status" = "running" ] && [ "$SHOW_PORTS" = true ]; then
113 ports=$(pct exec $ctid -- ss -tlnp 2>/dev/null | awk 'NR>1 {print $4}' | grep -oP ':\K[0-9]+$' | sort -u | tr '\n' ' ')
114 if [ -n "$ports" ]; then
115 log " Портове: ${BLUE}$ports${NC}"
116 fi
117 fi
118 fi
119 done <<< "$ips"
120 else
121 log " ${YELLOW}Няма намерени IP адреси${NC}"
122 fi
123 fi
124 log ""
125done
126
127# Проверка за VM (опционално)
128log "${GREEN}Сканиране на VM...${NC}\n"
129
130for vmid in $(qm list | awk 'NR>1 {print $1}'); do
131 name=$(qm list | grep "^$vmid" | awk '{print $2}')
132 status=$(qm status $vmid | awk '{print $2}')
133
134 log "${YELLOW}VM $vmid${NC} - $name [$status]"
135
136 config_file="/etc/pve/qemu-server/${vmid}.conf"
137
138 if [ -f "$config_file" ]; then
139 # Извличане на IP от конфигурацията (ако е зададен статично)
140 ips=$(grep -oP 'ip=\K[^/,]+' "$config_file" 2>/dev/null | sort -u)
141
142 if [ -n "$ips" ]; then
143 while IFS= read -r ip; do
144 log " IP: ${GREEN}$ip${NC}"
145
146 if [ -n "${ip_list[$ip]}" ]; then
147 ip_list[$ip]="${ip_list[$ip]}, VM$vmid($name)"
148 else
149 ip_list[$ip]="VM$vmid($name)"
150 fi
151
152 ip_owners[$ip]+="VM$vmid($name) "
153 done <<< "$ips"
154 else
155 log " ${YELLOW}Няма статични IP (DHCP или config празен)${NC}"
156 fi
157 fi
158 log ""
159done
160
161# Проверка за дублирани IP
162log "\n${BLUE}=== Анализ на IP адреси ===${NC}\n"
163
164duplicate_found=false
165for ip in "${!ip_list[@]}"; do
166 count=$(echo "${ip_owners[$ip]}" | wc -w)
167 if [ $count -gt 1 ]; then
168 duplicate_found=true
169 log "${RED}⚠ ДУБЛИРАН IP: $ip${NC}"
170 log " Използва се от: ${ip_owners[$ip]}"
171 log ""
172 fi
173done
174
175if [ "$duplicate_found" = false ]; then
176 log "${GREEN}✓ Няма дублирани IP адреси${NC}\n"
177fi
178
179# Обобщена таблица
180log "${BLUE}=== Всички IP адреси ===${NC}"
181log "$(printf '%-18s | %s' 'IP Адрес' 'Собственик')"
182log "$(printf '%s' '-------------------+----------------------------------------')"
183
184for ip in $(echo "${!ip_list[@]}" | tr ' ' '\n' | sort -V); do
185 count=$(echo "${ip_owners[$ip]}" | wc -w)
186 if [ $count -gt 1 ]; then
187 color=$RED
188 else
189 color=$NC
190 fi
191 log "${color}$(printf '%-18s | %s' "$ip" "${ip_list[$ip]}")${NC}"
192done
193
194if [ -n "$OUTPUT_FILE" ]; then
195 log "\n${GREEN}Резултатът е записан във: $OUTPUT_FILE${NC}"
196fi
proxmox.png Originalformat
proxmox.png