sshd_config - “匹配地址 <IPv6>” 不匹配
TLDR
在sshd_config(5)中,這個配置段:
Match Address fe80::/10 PasswordAuthentication yes
… 與預期的鏈路本地 IPv6 地址不匹配。為什麼以及如何解決?
我正在嘗試配置
sshd
為僅在從本地地址連接時允許密碼身份驗證。否則需要公鑰認證。這是sshd_config
.PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication no # Allow password auth on local network Match Address 169.254.0.0/16,192.168.0.0/16 PasswordAuthentication yes Match Address fe80::/10 PasswordAuthentication yes
什麼有效:
- 正如預期的那樣,在所有地址上啟用了公鑰身份驗證。
169.254.0.0/16,192.168.0.0/16
正如預期的那樣,通過 IPv4 連接時在地址範圍上啟用了密碼驗證。什麼不起作用:
fe80::/10
通過 IPv6 連接時,地址範圍未啟用密碼驗證。相關行
var/log/secure
:sshd[9457]: Connection reset by fe80::39c9:9db5:5a2a:1299%eth0 port 60468 [preauth]
…這是一個應該匹配的地址
fe80::/10
我做過的清單項目:
- IPv6 流量未被防火牆阻止
sshd
在兩個堆棧上聽$ netstat -tupln | grep sshd tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 8903/sshd tcp6 0 0 :::22 :::* LISTEN 8903/sshd
- 合併/拆分
Match
IPv4 和 IPv6 的語句不起作用Match Address 169.254.0.0/16,192.168.0.0/16,fe80::/10
這也不起作用。- 將 IPv6 地址放在方括號中
Match Address [fe80::]/10
No bueno。sshd
不記錄任何配置錯誤var/log/secure
- 不是客戶端問題 - 嘗試了 OpenSSH、PuTTY、WinSCP 並得到了同樣的錯誤
版本:
sshd
在 CentOS 7 上執行$ uname -msr Linux 5.4.72-v8.1.el7 aarch64 $ ssh -V OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
我已經在
/r/sysadmin
discord伺服器上問過這個問題,人們的反應很“奇怪”。如果您有興趣,請在此處查看我們的完整對話。它有一些關於我嘗試過的不同事情的更多細節。
在嘗試了我能想到的所有事情之後,我找到了一個適合我的解決方案。我想允許對區域網路上的使用者進行密碼驗證,但只允許來自區域網路外部的基於密鑰的驗證,這就是我最終找到這篇文章的原因。
從其他閱讀中,我看到一些跡象表明方括號應該與 ipv6 地址一起使用,並且我還在 sshd 日誌中看到它記錄了當我使用 ipv6 連接時我的連接來自的介面名稱(即
eth0
, )。wlan0
我決定測試所有的組合,直到找到有用的東西。我輸入了完整的 ipv6 地址並且沒有使用 /10 來確保其格式不會受到干擾,我嘗試了使用和不使用介面名稱以及使用和不使用括號(並將它們放在地址的不同部分周圍)我可以肯定地說 sshd 不喜歡括號。每當我將它們包括在內時,它都不起作用。
即使我使用了完整的確切 ipv6 地址,如果沒有指定介面名稱,它也無法工作,因此 sshd 似乎希望 ipv6 地址不包含方括號,就像它在 URL 中一樣,並希望它無論如何都會包含介面名稱什麼。
最後一塊是包含所有連結本地地址的 /10。我最初期望正確的形式是正確的,
fe80::/10%eth0
但令人驚訝的是它不起作用。相反 sshd 期望你寫fe80::%eth0/10
. 我想如果您將 /10 視為修改整個 IP 地址,其中正確且完整的 ipv6 地址是某個數字和介面名稱,而 ipv4 只是數字,那麼這種情況是有道理的,但在任何一種情況下,這種扭曲都解開了,我有一個解決方案。這是我用來允許 ipv4 和 ipv6 本地連接使用密碼進行身份驗證的完整匹配塊:
Match Address 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,fe80::%eth0/10 PasswordAuthentication yes
顯然,您需要將名稱修改
eth0
為您機器的正確介面名稱,(ifconfig
當您嘗試通過 ipv6 連接時,您可以查看它們的列表或檢查 sshd 日誌以查看您的連接使用的介面)和如果您想支持來自多個介面的連接,我認為您需要,fe80::%name/10
為每個介面指定。我希望這個答案能幫助其他偶然發現這個執行緒的人(也許還有 OP,雖然我不確定五個月後會有多少幫助)