Bem, eu fiz muita escavação e não encontrei nada. Então, eu configurei meu computador doméstico com um serviço de DNS dinâmico e criei o seguinte script bash, espero que seja útil para outra pessoa.
Instruções:
-
Esse script não é específico para o SSH e é uma maneira de permitir um acesso permanente do host dinâmico a uma porta de destino usando o ufw - irrelevante de qual serviço está escutando nessa porta. Portanto, usar a porta 22 (por padrão) permitiria acesso permanente do host dinâmico ao SSH. Da mesma forma, você pode usar esse script para garantir acesso permanente de seu host dinâmico a algo como FTP (porta 21).
-
Tudo o que é necessário é modificar as variáveis
RemoteHostName
ePortNumber
na parte superior do arquivo. Obviamente, oRemoteHostName
é o nome do host fornecido pelo provedor de DNS dinâmico e oPortNumber
é a porta à qual estamos permitindo o acesso. -
Se o IP resolvido do
RemoteHostName
já existir dentro do ufw com acesso à porta de destino, o script sairá, pois não há nada para alterar. -
Se não existir, todas as entradas com o número da porta de destino dentro do ufw serão excluídas e uma nova entrada será incluída usando o endereço IP e a porta de destino atualizados. Resumindo, não tente usar o ufw para outras regras que envolvam a porta no script, pois o script irá percorrê-las.
-
Se este script é chamado por um cron job ou algo assim, então, em teoria, sempre deve manter o endereço IP atualizado dentro do ufw.
-
O script gera o seguinte:
1) Standard output: Could not resolve the IP address of the RemoveHostName XYZ 2) Standard output: No change necessary as the IP address XYZ already has access to port XYZ. 3) Standard output: Deleting old ufw rule: XYZ 4) Standard output: Adding new ufw rule: XYZ 5) Error output: Could not resolve the IP address of the RemoveHostName XYZ
-
Por favor note, eu não sou muito familiarizado com o script bash e tão pouco familiarizado com expressões regulares. Então, se você usar esse script, faça um favor a você (e a mim!) E dê uma olhada nele. Se você perceber algum erro, por favor deixe um comentário e / ou uma nova resposta.
Script:
#!/bin/bash
##############################################################
#Variables
##############################################################
RemoteHostName=someremotehost.dyndnsorsomething.com
PortNumber="22"
##############################################################
#Check if the dynamic IP address exists within ufw.
##############################################################
DynamicIPAddress=$(host $RemoteHostName | awk '/has address/ { print $4 }')
if [[ $DynamicIPAddress = "" ]]
then
echo $(date -u -Iseconds): Could not resolve the IP address of the RemoveHostName $RemoteHostName >&2
exit
fi
UFWRules=$(ufw status numbered)
REGEX=" $PortNumber (.*)ALLOW IN(.*)$DynamicIPAddress$"
while read -r line; do
if [[ $line =~ $REGEX ]]
then
echo $(date -u -Iseconds): No change necessary as the IP address $DynamicIPAddress already has access to port $PortNumber.
exit
fi
done <<< "$UFWRules"
##############################################################
#Remove all entries with the given port number.
##############################################################
while true
do
UFWRules=$(ufw status numbered)
REGEX="(.*) $PortNumber (.*)ALLOW IN(.*)"
Matched="No"
while read -r line; do
if [[ $line =~ $REGEX ]]
then
echo $(date -u -Iseconds): Deleting old ufw rule: $line
RuleNumber=$(echo $line | (cut -d "[" -f2 | cut -d "]" -f1))
ufw --force delete $RuleNumber
Matched="Yes"
break
fi
done <<< "$UFWRules"
if [ $Matched = "No" ]
then
break
fi
done
##############################################################
#Add in access from the dynamic IP address.
##############################################################
echo $(date -u -Iseconds): Adding new ufw rule: "ufw allow from $DynamicIPAddress to any port $PortNumber".
ufw allow from $DynamicIPAddress to any port $PortNumber