Назад | Перейти на главную страницу

Подключение к ресурсу, защищенному от перегрузки порта

Учитывая отличные ответы на вопрос о научной фантастике "Предотвращение атак грубой силы на SSH", Я подумываю о настройке блокировки портов на тестовом сервере. Я обсуждаю, как я легко подключусь к этому серверу и к другим серверам с блокировкой портов.

Обычно я настраиваю аутентификацию, адреса и имена пользователей rsa в /.ssh/config в качестве таких:

Host msUpdate
    User bgates
    Hostname updates.microsoft.com
    IdentityFile ~/.ssh/id_rsa.bgates.pub

Таким образом, я могу просто ввести ssh msUpdate войти на сервер. Насколько я знаю /.ssh/config не имеет средства для настройки блокировки портов. Таким образом, я рассматриваю сценарий оболочки для ssh который будет автоматически обрабатывать стук:

$ cat login
#!/bin/bash

msUpdate=( 2000 3000 4000 )
otherServer=( 1024 2048 4096 )

for PORT in ${$@}; do
    ssh -p $PORT
    sleep 1
done

ssh $@

У меня вопрос, как написать for линия. Кажется, я не могу заставить скрипт распознавать аргумент как имя массива для замены. Хотя якобы это вопрос Bash, я задаю его в SF, потому что я чувствую, что завершенный сценарий будет наиболее полезен для пользователей этого сайта, а также потому, что если есть лучший способ, чем он, скорее всего, будет здесь, кто-то даст мне знать о Это.

Вам нужно использовать имя массива в вашем цикле for

for PORT in "${msUpdate[@]}"
do
    ssh -p $PORT host.tld
done

Лучше субъективно, я видел, как выбивание портов реализовано с помощью такого скрипта, но он использовал nmap для стука, а не ssh

for PORT in "${msUpdate[@]}"
do
   nmap -Pn --host_timeout 100 --max-retries 0 -p $PORT host.tld
done
ssh -p someport host.tld

Вы также можете рассмотреть альтернативу, например Duo Securityдвухфакторная аутентификация.

Вы пытаетесь использовать косвенное обращение, но ассоциативный массив (он же «хеш») - лучший подход. Вам нужно будет использовать язык, поддерживающий эту функцию, например Bash 4, AWK, ksh93, Perl, Python и т. Д.

Если у вас есть Bash 4, вы можете использовать ассоциативные массивы следующим образом. Значения не могут быть массивами, но вы можете использовать списки портов, разделенные пробелами, поскольку члены списка не будут включать пробелы.

#!/bin/bash

declare -A servers
servers[msUpdate]='2000 3000 4000'
servers[otherServer]='1024 2048 4096'

for port in ${servers[$1]}
do
    ssh -p "$port" "$1"
    sleep 1
done

ssh "$1"

Вызовите скрипт с именем сервера, на который хотите войти:

./scriptname otherServer

Используйте в качестве имени сценария что-то другое, кроме «логина», поскольку это имя существующего исполняемого файла.

Всегда избегайте использования имен переменных, начинающихся с заглавных букв, чтобы предотвратить возможное столкновение имен с переменными оболочки.