[英]Reliable (cryptographic) way to verify a devices public IP address behind a NAT
我正在編寫一個相對較小的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輸出是否包含給定的錯誤消息,並相應地返回valid
或invalid
。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.