簡體   English   中英

可靠的(加密)方式來驗證NAT后面的設備公用IP地址

[英]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輸出是否包含給定的錯誤消息,並相應地返回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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM