Ssh

sshd_config - “匹配地址 <IPv6>” 不匹配

  • January 7, 2022

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
  • 合併/拆分MatchIPv4 和 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/sysadmindiscord伺服器上問過這個問題,人們的反應很“奇怪”。如果您有興趣,請在此處查看我們的完整對話。它有一些關於我嘗試過的不同事情的更多細節。

在嘗試了我能想到的所有事情之後,我找到了一個適合我的解決方案。我想允許對區域網路上的使用者進行密碼驗證,但只允許來自區域網路外部的基於密鑰的驗證,這就是我最終找到這篇文章的原因。

從其他閱讀中,我看到一些跡象表明方括號應該與 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,雖然我不確定五個月後會有多少幫助)

引用自:https://unix.stackexchange.com/questions/658184