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
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.
