Из какой страны тот, кто пытается несанкционированно получить доступ к моему серверу по SSH!
Здравствуйте, я бездарь. Я публикую сервер FreeBSD на Vultr, и мне стало интересно, кто пытается получить доступ по SSH, поэтому я решил посмотреть. Кстати, в случае с FreeBSD, он отправляет мне на мой домен «security run output» и сообщает, какие попытки были предприняты.
Вот так. Итак, давайте посмотрим, из каких стран глобальные IP-адреса людей, пытающихся это сделать, используя geoip. Кстати, команду geoiplookup можно установить следующим образом:
sudo pacman -S geoip
Вот команда:
$ geoiplookup IP-адрес
GeoIP Country Edition: RU, Russian Federation
Форматирование текста в bash
Итак, сначала я возьму строку исходных данных «security run output» на свой ThinkPad (неважно, как) и затем отформатирую ее.
cat vultr | grep -oP "from.*port" | awk '{print $(NF-1)}' | sort | uniq > grepip
В приведенном выше случае, из описания «security run output» под названием vultr, мы извлекаем описание, содержащее строку «from» до «port», используя совпадение grep -o и регулярное выражение Perl с -P.
Это будет выглядеть примерно так:
from IP-адрес port
Причина, по которой я не использовал awk на этом этапе, заключается в том, что вывод ошибок меняется, если пароль неверен или если целевого пользователя вообще не существует на моем сервере, когда пробел используется в качестве разделителя, поэтому я извлек строку от «from» до «port», чтобы собрать все. Затем я извлекаю только IP-адрес из первого поля в конце с помощью awk, удаляю дублирующиеся IP-адреса с помощью sort и uniq, а затем записываю их в файл под названием grepip. Затем, после выполнения geoiplookup для этого IP-адреса в bash, давайте попросим его сделать небольшой подсчет по странам.
$ cat country.sh
#!/bin/bash
# Файл IP-адресов
INPUT="grepip"
# Выходной файл
OUTPUT="countries.log"
# Инициализация
> $OUTPUT
# Выполнить geoiplookup для каждого IP-адреса и получить информацию о стране
while IFS= read -r ip; do
geoiplookup "$ip" | awk -F: '{print $2}' >> $OUTPUT
done < "$INPUT"
# Сгруппировать и отобразить информацию о стране
sort $OUTPUT | uniq -c | sort -tr
Теперь дадим ему права на выполнение.
chmod +x ./country.sh
Просто запустите это.
$ ./country.sh
1 BE, Belgium
1 BG, Bulgaria
1 BR, Brazil
1 CH, Switzerland
1 HK, Hong Kong
1 HU, Hungary
1 IR, Iran, Islamic Republic of
1 IT, Italy
1 LT, Lithuania
1 MT, Malta
1 MX, Mexico
1 MY, Malaysia
1 NO, Norway
1 PA, Panama
1 PE, Peru
1 SE, Sweden
1 SK, Slovakia
1 TH, Thailand
1 TM, Turkmenistan
1 TZ, Tanzania, United Republic of
1 UZ, Uzbekistan
1 ZA, South Africa
2 RO, Romania
2 UA, Ukraine
3 PL, Poland
6 GB, United Kingdom
7 VN, Vietnam
8 CA, Canada
8 ID, Indonesia
9 RU, Russian Federation
9 SG, Singapore
10 FR, France
10 KR, Korea, Republic of
11 DE, Germany
11 NL, Netherlands
16 CN, China
18 IN, India
43 US, United States
Ого...
Отображение диаграммы с помощью Matplotlib для наглядности
Итак, это понятно в текстовом виде, но если чисел много, это становится трудночитаемым, поэтому мы хотим отобразить это в виде диаграммы, верно?
Кроме того, если мы сделаем это скриптом, его можно будет генерировать как задание cron. Поэтому мы будем отображать диаграмму с помощью Matplotlib, удобной библиотеки Python. Установка и код:
pip install matplotlib
cat AreYouFrom.py
#!/usr/bin/python3
import matplotlib.pyplot as plt
import collections
# Прочитать файл и подсчитать количество доступов по странам
country_counts = collections.Counter()
with open('countries.txt', 'r') as file:
for line in file:
# Получить информацию о стране
country = line.strip().split(",")[1]
country_counts[country] += 1
# Отсортировать данные
countries, counts = zip(*country_counts.most_common())
# Создать график
plt.figure(figsize=(10, 6))
plt.bar(countries, counts, color='skyblue')
plt.xlabel('Country')
plt.ylabel('Accesses')
plt.title('Accesses by Country')
plt.xticks(rotation=90)
plt.tight_layout()
# Вывести изображение в виде файла png
plt.savefig('accesses.png')
Это позволяет выводить диаграммы и изображения.
chmod +x AreYouFrom.py
(Название файла похоже на английский язык для средней школы!)

Бабах! Похоже, что большинство из США.
Подсчет по портам, к которым пытаются подключиться по SSH
Теперь давайте посмотрим по портам, к которым пытаются получить доступ.
Таким образом, мы смогли отфильтровать только порты с помощью grep.
cat vultr | grep -oP "port [123456789].*ssh2$" | grep -oP "[123456789].* "
Вывести это как ports.txt.
Однако, поскольку все номера портов разные, давайте разделим их на блоки при выводе графика.
$ cat AreYouPort.py
#!/usr/bin/python3
import matplotlib.pyplot as plt
from collections import Counter
# Прочитать номера портов из файла
with open('ports.txt', 'r') as file:
ports = [int(line.strip()) for line in file]
# Вычислить частотное распределение номеров портов
counter = Counter(ports)
blocks = {}
for port, count in counter.items():
block = (port // 10000) * 10000
if block not in blocks:
blocks[block] = 0
blocks[block] += count
# Создать график
x = list(blocks.keys())
y = list(blocks.values())
plt.figure(figsize=(12, 6))
plt.bar(x, y, width=6000, color='skyblue', edgecolor='black')
plt.xlabel('Port Number')
plt.ylabel('Frequency')
plt.title('Port Numbers by Frequency')
plt.xticks(x, [f'{i}-{i+9999}' for i in x], rotation=45)
plt.grid(True, axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
# Сохранить в файл PNG
plt.savefig('port_numbers.png')
И тогда....

Почему так много попыток с номерами портов, которые маловероятны, например, более 30 000...? На этом на сегодня все. До новых встреч.