可靠(加密)方式验证NAT后面的设备公共IP地址

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可靠(加密)方式验证NAT后面的设备公共IP地址相关的知识,希望对你有一定的参考价值。

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

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

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

答案

我认为你的意思是bash脚本运行的地方不是你需要确定其IP的服务器吗?

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

另一答案

假设$IP是服务器的新外部IP地址,首先通过在localhost上运行ssh-keyscan并生成临时已知主机文件来获取服务器SSH密钥。然后它用给定的127.0.0.1替换$IP并启动与临时已知主机文件到远程IP地址的ssh会话。如果会话已建立且密钥验证成功,则命令将完全退出。否则它将输出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

以上是关于可靠(加密)方式验证NAT后面的设备公共IP地址的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 php 获取 NAT 后面的 ip?

NAT 后面的 UDP 打孔

P2P穿透NAT的原理

NAT配置的步骤

如何通过 NAT 通过公共 IP 发送 UDP 数据包?

获取NAT转换的IP和某些本地端口的端口