连接到受端口敲击保护的资源

连接到受端口敲击保护的资源

考虑到 SF 问题的优秀答案“防止针对 SSH 的暴力攻击“,我正在考虑在测试服务器上配置端口敲击。我正在考虑如何轻松地连接到该服务器和其他端口敲击服务器。

/.ssh/config我通常这样配置 rsa 身份验证、地址和用户名:

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 上提问,因为我觉得完成的脚本对本网站的用户最有用,而且如果有比这里更好的方法,很可能有人会告诉我。

答案1

您正在尝试使用间接,但关联数组(又称“哈希”)是更好的方法。您需要使用支持此功能的语言,例如 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

使用除“login”之外的其他名称作为脚本名称,因为这是现有可执行文件的名称。

始终避免使用全大写的变量名,以防止与 shell 变量发生名称冲突。

答案2

您需要在 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 安全的双因素身份验证。

相关内容