0

我正在编写一个相对较小的 bash 脚本,它应该为 NAT 后面的服务器更新 DNS 记录,这可能会更改其外部 IP 地址。本质上是使用我的 DNS 提供商 API 的免费 DynDNS。

我正在使用对外部服务的简单查询来检索服务器的 IP 地址。但是为了安全起见,在将我的 DNSA记录指向一个由外部服务提供给我的新的任意 IP 地址之前,我首先需要验证这确实是服务器的 IP 地址。并且此检查需要涉及加密步骤,因为可能会发生活动的 MITM 攻击,并且只是将流量转发到服务器的真实 IP 地址。

那么验证这确实是服务器的 IP 地址的最简单方法是什么(如果可能通过 bash)?

4

2 回答 2

0

假设这$IP是服务器的新外部 IP 地址,这首先通过ssh-keyscan在 localhost 上运行并生成一个临时的已知主机文件来获取服务器 SSH 密钥。然后它127.0.0.1用给定的值替换$IP并启动ssh与临时已知主机文件到远程 IP 地址的会话。如果会话已建立并且密钥验证成功,则命令将完全退出。否则它将输出Host key verification failed.消息。即使与服务器的身份验证失败,这也会起作用,因为主机密钥验证是在身份验证之前完成的。该脚本最终检查 ssh 输出是否包含给定的错误消息并返回validinvalid相应地返回。

TMP_KNOWN_HOSTS=$(mktemp)
ssh-keyscan 127.0.0.1 > $TMP_KNOWN_HOSTS
sed -i "s/127\.0\.0\.1/$IP/" $TMP_KNOWN_HOSTS
RESPONSE=$(ssh -n -o "UserKnownHostsFile $TMP_KNOWN_HOSTS" -o "StrictHostKeyChecking yes" $IP true 2>&1)

if ! [[ $RESPONSE = *"Host key verification failed."* ]]; then
  echo "valid"
else
  echo "invalid"
fi
于 2018-03-05T11:50:48.553 回答
0

我想您的意思是 bash 脚本在您需要确定其 IP 的服务器以外的地方运行?

显而易见的解决方案是使用带有严格主机检查(和记住的服务器密钥)的 ssh 或通过带有证书验证的 SSL(您可以使用自签名证书)进行连接。前者更容易开箱即用。

于 2018-02-27T09:32:03.710 回答