Crmgo Blog

Dynamiczne otwieranie/zamykanie portu SSH

Dynamiczne otwieranie/zamykanie portu SSH

Ograniczenie liczby połączeń W celu ochrony przed atakami brute force (próbowaniem haseł) można ograniczyć liczbę połączeń do portu 22 z jednego adresu IP do kilku na minutę, a następnie blokować próby połączeń z tego adresu IP. recent to moduł jądra (Core…

Dynamiczne otwieranie/zamykanie portu SSH

Ograniczenie liczby połączeń

Aby ochronić się przed atakiem typu brute force (próbowaniem haseł), można ograniczyć liczbę połączeń na port 22 z jednego adresu IP do kilku razy na minutę, a następnie blokować próby połączeń dla danego adresu IP.

## Создание цепочки правил sshguard
# Максимум 2 новых запроса в минуту для одного ip
/sbin/iptables -N sshguard
# Вкл. лог по желанию

#/sbin/iptables -A sshguard -m state --state NEW -m recent --name SSH --rcheck --seconds 60 --hitcount 2 -j LOG --log-prefix "SSH-shield: "
/sbin/iptables -A sshguard -m state --state NEW -m recent --name SSH --update --seconds 60 --hitcount 2 -j DROP
/sbin/iptables -A sshguard -m state --state NEW -m recent --name SSH --set -j ACCEPT
/sbin/iptables -A sshguard -j ACCEPT

## Применение для трафика ssh цепочку sshguard
/sbin/iptables -A INPUT -p tcp --dport 22 -j sshguard

recent – to moduł jądra (Core Netfilter Configuration), który pozwala tworzyć dynamiczne listy adresów IP. Moduł obsługuje szereg opcji:

  • --name name : nazwa listy, z którą pracuje polecenie. Domyślnie dla listy używana jest nazwa DEFAULT.
  • --rcheck : opcja sprawdza, czy adres nadawcy pakietu znajduje się na liście. Jeśli adres nie istnieje na liście, zwracana jest wartość false.
  • --update : opcja sprawdza, czy adres nadawcy pakietu znajduje się na liście. Jeśli adres istnieje, odpowiadający mu wpis jest aktualizowany. Jeśli adres nie istnieje na liście, zwracana jest wartość false.
  • --hitcount hits : licznik, który zwraca true, gdy adres znajduje się na liście, a liczba odebranych pakietów z tego adresu jest większa lub równa podanej wartości. Używana wraz z rcheck lub update.
  • --seconds seconds : określa okres (od momentu dodania adresu na listę), przez który adres może pozostać na liście.
  • --set : służy do dodawania adresu nadawcy pakietu na listę. Jeśli adres już istnieje na liście, wpis zostanie zaktualizowany.
  • --remove : usuwa adres z listy. Jeśli adres nie zostanie znaleziony, zwracana jest wartość false.

Opcje mogą być używane z operatorem negacji (!).

Niewielka reguła dla iptables, która pomaga nie utrzymywać portów otwartych bez potrzeby.

Przykład dla dostępu do SSH, choć jak sami rozumiecie, można go stosować dowolnie.

Sedno reguły jest proste – aby uzyskać dostęp do powłoki, należy najpierw „zapukać” na port 1500:
np. za pomocą telnet:

telnet myserver 1500

lub przez przeglądarkę:

http://192.168.0.100:1500

odpowiednio, jeśli „zapukamy” na port 1499, port zostanie zamknięty.

 

iptables -N sshguard
# Если адрес в списке, то подключение разрешено
iptables -A sshguard -m state --state NEW -m recent --rcheck --name SSH -j ACCEPT
# Разрешить пакеты для уже установленных соединений
iptables -A sshguard -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A sshguard -j DROP

# Заносит адрес в список
#iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 1500 -j LOG --log-prefix "SSH-open: "
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 1500 -m recent --name SSH --set -j DROP
# Удаляет адрес из списка
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 1499 -m recent --name SSH --remove -j DROP

# Применение для трафика ssh цепочку sshguard
iptables -A INPUT -p tcp --dport 22 -j sshguard


 

 

 

Port jest otwierany tylko dla adresu IP, z którego został otwarty.

 

 

Otwieranie portu SSH na określony czas

Kolejny przykład pokazuje sposób otwarcia portu SSH dla określonego adresu IP na zadany czas.

 

## определяем цепочку для SSH трафика
iptables -N sshguard
iptables -F sshguard
# Разрешить подключение если ip есть в списке и последнее подключение осуществлялось не позднее 108000 секунд (30 часов)
iptables -A sshguard -m state --state NEW -m recent --update --seconds 108000 --name SSH -j ACCEPT
# Разрешить пакеты для уже установленных соединений
iptables -A sshguard -m state --state ESTABLISHED,RELATED -j ACCEPT
# Заблокировать если нет в списке
iptables -A sshguard -j DROP

## Открытие SSH
iptables -A INPUT -m state --state NEW -p tcp --dport 222 -m recent --name SSH --set
## Фильтрация ssh трафика через цепочку sshguard
iptables -A INPUT -p tcp --dport 22 -j sshguard


 

Aby teraz uzyskać dostęp przez SSH, należy najpierw „zapukać” na port 222, np. w następujący sposób:

ssh user@server.name -p 222

Po tym dostęp dla Twojego adresu IP na port 22 zostanie zezwolony na wskazany czas, przy czym każde nowe połączenie SSH przedłuży ten czas. Jeśli nie chcesz przedłużania czasu, zamień --update --seconds 108000 na --rcheck.

Uwaga: wpis mógł powstać z pomocą AI i redakcji. Odpowiedzialny: Dmytro Lomaka, Kaltenkirchen.