
許多服務(如 GitHub)使用廣泛的 IP,並且顯然使用相同的公鑰。
如何將 IP 範圍(最好是單一)新增至known_hosts 檔案?
對於 GitHub 範例,它使用以下範圍:
- 207.97.227.224/27
- 173.203.140.192/27
- 204.232.175.64/27
- 72.4.117.96/27
- 192.30.252.0/22
關鍵是:
AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0fjIjY NnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3cC+weq 8G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
答案1
正如其他答案中指出的,已知主機不支援 IP 位址範圍。但是,它確實支援通配符。當然,通配符並不完全相同,因此您需要非常小心在 IP 位址中使用它們,但在 GitHub 的特殊情況下,這可以安全地完成。
自從這個問題問出來之後,情況似乎變得簡單了。根據GitHub 的官方文檔僅使用一個 IP 位址範圍(至少就 IPv4 而言)。這是 192.30.252.0/22 範圍。這使得 1020 個可能的 IP 位址可以方便地跨越四個不同 C 區塊中最後一個八位元組的整個可能範圍。
從man 8 sshd
,這就是我們必須處理的已知主機:
Hostnames
是逗號分隔的模式清單(*
並?
充當通配符);每個模式依序與規範主機名稱(對用戶端進行身份驗證時)或使用者提供的名稱(對伺服器進行身份驗證時)進行比對。模式前面也可以帶有 來!
表示否定:如果主機名稱與否定模式匹配,則即使它與該行中的另一個模式匹配,它也不會(被該行)接受。主機名稱或位址可以選擇括在方括號內,[
然後]
是:
非標準連接埠號碼。
使用此信息,我們可以使用*
最後一個八位元組的通配符來建構一個條目,該條目與所有可能的 GitHub 端點相符(並且僅有的這些端點)就像這樣:
github.com,192.30.252.*,192.30.253.*,192.30.254.*,192.30.255.* ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
如果您需要建立的 IP 範圍未填入完整的 C 區塊(因此填入八位元組的所有可能值),則不可能使用通配符進行如此準確的匹配。
答案2
我認為您無法輕鬆添加範圍,但我認為(現在無法測試這一點)可以通過將以下內容添加到 .ssh/ssh_config 來實現相同的效果:
Host *.github.com
HostKeyAlias github-server-pool.github.com
接下來,您可以將金鑰新增至名稱為 github-server-pool.github.com 下的known_hosts 檔案中。
假設:主機 github-server-pool.github.com 不存在或從未透過 SSH 連線到。
背後的想法是,ssh 將使用金鑰 github-server-pool.github.com 作為查找 github.com 網域的所有主機的公用主機金鑰的金鑰。
答案3
文件中不支援 IP 位址集known_hosts
。每個地址必須有一行。
儘管預設情況下條目的主機名稱部分是經過哈希處理的,但這只是為了隱私,因此掌握您的人.known_hosts
將無法輕鬆找出您已連接到哪些主機。 (他們仍然可以驗證猜測。)您可以使用普通主機名稱或 IP 位址。
for net in 207.97.227.224/27 173.203.140.192/27 204.232.175.64/27 72.4.117.96/27 192.30.252.0/24 192.30.252.1/24 192.30.252.2/24 192.30.252.3/24; do
base=${net%/*}; d=${base##*.}; abc=${base%.*}
bits=$((32 - ${net#*/}))
e=0
while [ $e -lt $((2 ** bits) ]; do
echo "$abc.$((d + e)) ssh-rsa AAAAB3NzaC1yc…" >>~/.ssh/known_hosts
e=$((e + 1))
done
done
請注意,這可能會新增重複項。
答案4
我編寫了一個小型 Ruby 腳本,github_known_hosts
它可以擴展 GitHub 發布的 IP 位址範圍元 API 端點(https://api.github.com/meta)。
#!/usr/bin/env ruby
require "ipaddr"
require "json"
pubkey = "AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ=="
ips = JSON.parse(STDIN.read)["git"].flat_map { |net| IPAddr.new(net.chomp).to_range.map(&:to_s) }
puts "github.com,gist.github.com,#{ips.join(',')} ssh-rsa #{pubkey}"
像這樣使用它,它會產生一個很長的行,您可以將其貼到文件中~/.ssh/known_hosts
:
curl --silent https://api.github.com/meta | github_known_hosts >> ~/.ssh/known_hosts