指南)
出國做海外項目調(diào)試的日子多了我對SSH的依賴幾乎是長在手上的。不過真正讓我意識到“SSH也有體積之分”的是某次需要在只有4MB可用Flash的板子上塞一個遠程管理通道。OpenSSH一放進去空間直接爆掉那時候我把眼光轉(zhuǎn)向了嵌入式Linux圈子里的老熟人——Dropbear。今天這篇就圍繞Dropbear好好聊聊從SSH協(xié)議本身的運作邏輯到它在嵌入式Linux里怎么集成、怎么配密鑰免密登錄、怎么踩坑排障爭取一篇講透。Dropbear嵌入式Linux的輕量級SSH——從協(xié)議原理到遠程管理實戰(zhàn)1. 為什么嵌入式環(huán)境里大家普遍用Dropbear接觸過嵌入式Linux的朋友對Dropbear應(yīng)該都不陌生它幾乎是BusyBox之外的第二件“標(biāo)配工具”。這個名字聽起來有點奇怪但它的定位非常明確為一個資源受限的系統(tǒng)提供完整的SSH服務(wù)端和客戶端能力。與OpenSSH相比Dropbear用到的存儲空間和內(nèi)存占用都小了一個量級而在遠程管理功能上它保住了最關(guān)鍵的部分加密傳輸、公鑰認證、端口轉(zhuǎn)發(fā)。這么說吧OpenSSH是一輛帶全景天窗、真皮座椅的SUV功能全面、配件多但車重擺在那Dropbear是一輛專門為了跑直線而改裝的摩托車后排沒有沙發(fā)但你要的遠程終端、文件傳輸、密鑰登錄它一樣不少。在嵌入式設(shè)備上Flash空間往往以MB計算內(nèi)存也只有幾十MBDropbear優(yōu)秀的地方在于它把面積和能耗控制到了極致同時保持了與OpenSSH在密鑰格式、命令行用法上的高度兼容。我個人的體會是它最實用的三個應(yīng)用場景分別是生產(chǎn)環(huán)境部署時的現(xiàn)場調(diào)試通道板子放在機柜里或者安裝在戶外通過Dropbear遠程進串口終端批量固件升級、遠程日志巡檢配合腳本定時拉取設(shè)備狀態(tài)開發(fā)階段集成進Buildroot或Yocto鏡像讓整個項目組的同事都可以通過網(wǎng)絡(luò)訪問開發(fā)板而不必每人拖一根串口線。你會發(fā)現(xiàn)很多從零構(gòu)建嵌入式Linux系統(tǒng)鏡像的方案里Dropbear都是默認出現(xiàn)的組件。這背后不是偶然而是一個“夠用就好”的工程哲學(xué)。我最初接觸它是在一個需要防止干擾射頻測試的項目里——OpenSSH每次開會話都要fork一堆進程而Dropbear進程模型簡單透明資源占用可以精確預(yù)估這在實時性要求高的場景里很占優(yōu)勢。2. SSH協(xié)議核心原理與Dropbear的實現(xiàn)取舍在動手集成之前值得先把SSH協(xié)議的整體流程捋一遍。很多人只會用SSH但不知道每次連接時背后發(fā)生了什么真正遇到問題就抓瞎。我也是一步一個坑踩過來的這里盡量用大白話講清楚。2.1 SSH連接的三段式流程加密握手、認證、通道復(fù)用SSH從協(xié)議層面分成三個層次按順序執(zhí)行第一層是傳輸層握手??蛻舳诉B接服務(wù)器的22端口雙方先交換版本信息然后協(xié)商出一套加密算法組合比如對稱加密算法aes128-ctr、chacha20-poly1305、MAC算法、壓縮算法等。這一步里有個非常關(guān)鍵的動作是密鑰交換常見算法是ECDH橢圓曲線Diffie-Hellman。我習(xí)慣把它類比成“兩個人隔著一條嘈雜的河要先確定一個只有你倆能聽懂的暗號本”通過DH算法雙方在不直接傳輸密鑰本身的前提下能各自算出一個共享密鑰。這個共享密鑰隨后用來加密整個會話。第二層是用戶認證層。在這個階段服務(wù)器驗證“你是不是這個系統(tǒng)的合法用戶”常用方式有密碼認證和公鑰認證。密碼認證的邏輯是服務(wù)器把你輸入的密碼和/etc/shadow里的哈希值比對公鑰認證的邏輯更微妙服務(wù)器持有你的公鑰客戶端持有私鑰服務(wù)器隨機生成一個挑戰(zhàn)數(shù)據(jù)發(fā)給客戶端客戶端用私鑰簽名服務(wù)器用公鑰驗證簽名。換句話說私鑰一直都在你本地從來不出網(wǎng)口這在安全性上比密碼高出一截。第三層是連接層。認證通過后所有后續(xù)的數(shù)據(jù)流都在這條加密隧道里多路復(fù)用。你可以在一個SSH連接上同時跑終端會話、遠程端口轉(zhuǎn)發(fā)、SCP文件傳輸互不干擾。這也是為什么SSH不僅能登設(shè)備還能當(dāng)作加密代理使用。Dropbear完整實現(xiàn)了這三個層面這是它能與OpenSSH客戶端互通的基礎(chǔ)。2.2 Dropbear為什么能做得這么小Dropbear的源碼是用C寫的整體設(shè)計上刻意回避了OpenSSH的一些通用化抽象專注于提供最常見、最核心的算法組合和協(xié)議分支。舉個例子OpenSSH為了兼容各種加密硬件和擴展認證模塊編譯產(chǎn)物里塞進了大量模塊化接口和插件機制Dropbear則把沒必要保留的代碼直接砍掉保留的路徑都做了精簡。實際數(shù)據(jù)對比非常直觀。一個靜態(tài)編譯的OpenSSH服務(wù)端加上各類依賴庫體積輕松突破2MBDropbear服務(wù)端加客戶端全套二進制編譯完往往只有300KB到500KB。運行內(nèi)存上Dropbear每個會話大約占用2MB到4MB內(nèi)存OpenSSH同樣場景下經(jīng)常要吃掉2倍以上。在只有16MB內(nèi)存的板子上這種差距直接影響系統(tǒng)能否跑起來。這背后還有一個關(guān)鍵取舍Dropbear默認不提供SFTP子系統(tǒng)。為什么不做因為維護一個SFTP服務(wù)端涉及的代碼量不小而絕大多數(shù)嵌入式管理場景只需要一個可用的shell、SCP文件拷貝和端口轉(zhuǎn)發(fā)。少一個子系統(tǒng)就少一塊攻擊面也少一堆依賴。這點在我做安全加固的時候反而成了加分項。3. 在嵌入式Linux中集成Dropbear的完整流程3.1 交叉編譯與BusyBox集成要點在嵌入式環(huán)境里用Dropbear最常見的集成路徑就是交叉編譯后放進rootfs再通過啟動腳本拉起。假設(shè)我們的開發(fā)環(huán)境是標(biāo)準Linux主機交叉工具鏈為arm-linux-gnueabihf-步驟如下。先下載源碼解壓后進入目錄執(zhí)行./configure --prefix/usr --hostarm-linux-gnueabihf --disable-zlib make PROGRAMSdropbear dropbearkey dbclient scp這里有個細節(jié)值得說明--disable-zlib是關(guān)閉zlib壓縮支持。zlib依賴會顯著增加Flash占用對于大多數(shù)嵌入式項目傳輸?shù)亩际俏谋救罩净蛘咝∥募嚎s帶來的收益幾乎可以忽略關(guān)掉反而省資源。如果你的設(shè)備經(jīng)常傳輸大文件那可以保留zlib但需要把zlib也交叉編譯進rootfs。PROGRAMS參數(shù)控制了生成哪些二進制。dropbear是服務(wù)端dropbearkey用來生成host key和用于認證的密鑰對dbclient是Dropbear自帶的最小化SSH客戶端scp則是對應(yīng)OpenSSH scp的替代實現(xiàn)。如果你只是需要遠程登錄設(shè)備保留dropbear和dropbearkey就足夠。編譯完成后把生成的二進制安裝到target的/usr/sbin和/usr/bin目錄下同時記得把man手冊、配置文件模板一并拷貝。這里很多人會忘記的一點是Dropbear運行時的目錄權(quán)限必須嚴格控制。一般建議創(chuàng)建/etc/dropbear目錄用于存放host key權(quán)限設(shè)為700因為一旦私鑰泄露攻擊者可以通過中間人攻擊偽裝成你的設(shè)備。BusyBox本身的集成方式有兩種如果你用的是Buildroot直接在menuconfig里勾選Dropbear包就行如果你手工拼rootfs那么就是在busybox的啟動腳本里加一段。很多老手習(xí)慣把dropbear和busybox配合使用因為busybox提供了init、telnetd、mount等基礎(chǔ)工具dropbear則負責(zé)安全的遠程通道兩者合起來幾乎就是一個完整的嵌入式Linux管理平面。3.2 開機自啟腳本與Host Key生成在rootfs中集成后需要保證設(shè)備每次開機都能自動拉起Dropbear。我習(xí)慣在/etc/init.d/下面寫一個S50dropbear腳本內(nèi)容大致如下#!/bin/sh DSS_KEY/etc/dropbear/dropbear_dss_host_key RSA_KEY/etc/dropbear/dropbear_rsa_host_key ECDSA_KEY/etc/dropbear/dropbear_ecdsa_host_key ED25519_KEY/etc/dropbear/dropbear_ed25519_host_key [ -d /etc/dropbear ] || mkdir -p /etc/dropbear # 生成缺失的host key [ -f $RSA_KEY ] || dropbearkey -t rsa -s 2048 -f $RSA_KEY [ -f $ECDSA_KEY ] || dropbearkey -t ecdsa -s 256 -f $ECDSA_KEY [ -f $ED25519_KEY ] || dropbearkey -t ed25519 -f $ED25519_KEY # 啟動服務(wù)監(jiān)聽2222端口最多允許10個會話 /usr/sbin/dropbear -p 2222 -T 10為什么不直接監(jiān)聽22端口我在實際項目里經(jīng)常讓Dropbear監(jiān)聽非標(biāo)準端口一是減少掃描器的直接攻擊二是很多嵌入式設(shè)備上還有別的應(yīng)用暫用了22端口。當(dāng)然如果產(chǎn)品需要和標(biāo)準SSH客戶端無縫對接監(jiān)聽22端口也沒問題只是建議配合防火墻限制源IP。腳本里用-T限制最大會話數(shù)這在資源緊張的設(shè)備上特別重要。某個客戶現(xiàn)場就出現(xiàn)過這樣的情況遠程維護人員忘記了斷開連接每次都新建會話時間一長內(nèi)存被拖垮。做嵌入式產(chǎn)品必須考慮這種“人的不可靠性”把資源上限寫好寧可連接被拒也不能讓整個系統(tǒng)崩潰。還有一點經(jīng)驗之談Host Key生成之后務(wù)必固化到Flash里不要讓每次重啟都重新生成。如果每次開機都換host key客戶端首次連接時的指紋校驗就會一直告警別人還以為設(shè)備被劫持了。4. 核心配置與安全加固從密碼登錄到公鑰認證4.1 Host Key與認證密鑰的區(qū)別很多人剛接觸SSH時會把Host Key和用戶認證密鑰搞混。打個比方Host Key是服務(wù)器自己的身份證設(shè)備每次啟動都需要它用來證明“這臺設(shè)備確實是它自己”用戶密鑰是你的門禁卡用來證明“你是被允許進入的人”。Dropbear中生成Host Key的命令是dropbearkey -t ed25519 -f /etc/dropbear/dropbear_ed25519_host_key而用戶認證密鑰對最常見的是在自己電腦上用OpenSSH生成ssh-keygen -t ed25519 -C your-emailexample.com生成之后把公鑰.pub文件內(nèi)容追加到設(shè)備上的~/ .ssh/authorized_keys里。在嵌入式設(shè)備上可能沒有專門的~目錄需要注意home目錄的路徑設(shè)置確保用戶的家目錄存在且權(quán)限正確。公鑰認證調(diào)試時我通常會在服務(wù)端啟動Dropbear時加上-v參數(shù)觀察詳細日志看在認證階段有沒有讀到公鑰。4.2 公鑰認證與免密登錄從原理到配置免密登錄是遠程管理里的剛需。每次手工輸密碼在批量操作幾十臺設(shè)備時是一種折磨。配置公鑰認證后登錄就不再需要交互輸入密碼非常方便做自動化腳本。第一步在你的開發(fā)機客戶端上生成密鑰ssh-keygen -t ed25519 -C inteldev-workstation第二步把公鑰拷到設(shè)備上。如果設(shè)備第一次還沒配置公鑰只能用密碼登錄可以借助ssh-copy-id命令ssh-copy-id -i ~/.ssh/id_ed25519.pub root192.168.1.100 -p 2222這一步執(zhí)行完設(shè)備上的~/.ssh/authorized_keys里就有了你的公鑰。接著手動驗證一下免密登錄是否生效ssh -i ~/.ssh/id_ed25519 root192.168.1.100 -p 2222如果還是要求輸密碼九成是權(quán)限問題。Dropbear的authorized_keys文件權(quán)限要求不能是全局可寫家目錄也不能有777權(quán)限。我在現(xiàn)場調(diào)試時遇到過很多次明明公鑰內(nèi)容沒問題但就是免密不生效最后發(fā)現(xiàn)是文件歸屬不對——authorized_keys的owner必須和登錄用戶一致root用戶的authorized_keys被一個普通用戶創(chuàng)建了自然讀不到。針對嵌入式設(shè)備我強烈建議直接把公鑰固化到rootfs的鏡像里而不是等設(shè)備啟動后再手工拷貝。做法是在構(gòu)建rootfs時預(yù)先創(chuàng)建一個/home/admin/.ssh/authorized_keys文件并把權(quán)限設(shè)置好。這樣每臺設(shè)備出廠就自帶免密能力省去了現(xiàn)場配置的工時。4.3 限制root登錄與用戶權(quán)限控制在嵌入式設(shè)備上很多系統(tǒng)直接允許root登錄這也是多數(shù)產(chǎn)品能跑起來的原因。但從安全角度在產(chǎn)品交付時最好收緊root的遠程登錄策略。OpenSSH可以通過sshd_config里的PermitRootLogin做精細控制而Dropbear沒有這個配置文件條目它用啟動參數(shù)來實現(xiàn)常用的是-w參數(shù)含義是“禁止root用戶通過密碼登錄”但允許root通過公鑰認證登錄。/usr/sbin/dropbear -p 2222 -w這樣配置后即使有人暴力破解root密碼也無法直接登錄成功而合法的維護人員由于已經(jīng)配置了公鑰依然暢通無阻。這是一種兼顧便利和安全的折中方案很適合嵌入式設(shè)備的運維場景。如果你需要實現(xiàn)“僅允許wheel組成員通過SSH登錄”之類的策略單靠Dropbear本身做不到需要在PAM層面配置。常見的做法是編輯/etc/pam.d/sshd或者/etc/pam.d/login具體看發(fā)版加上auth required pam_wheel.so groupwheel這樣只有wheel組成員才能通過SSH登錄系統(tǒng)其他用戶即使密碼正確也會被拒絕。這類配置通常在部署到生產(chǎn)環(huán)境之前測試好因為一旦策略生效而運維賬號又不在wheel組里那就只能跑到現(xiàn)場接串口才能恢復(fù)場面會比較尷尬。我自己就吃過這個虧所以現(xiàn)在每次改動認證策略都會先開一個備用SSH連接保持不斷確認新配置沒問題再關(guān)掉備份連接。5. 遠程管理實戰(zhàn)文件傳輸、批量操作與開發(fā)環(huán)境5.1 遠程文件傳輸與嵌入式U盤測速Dropbear的日常用途遠不止登錄設(shè)備敲命令。最常見的是從設(shè)備上拉文件或者把固件推到設(shè)備上。Dropbear自帶了一個簡化版本的scp如果只是做文件拷貝用起來和OpenSSH的scp幾乎沒有差別# 從設(shè)備拉取文件到本地 scp -P 2222 root192.168.1.100:/mnt/log/app.log . # 把本地固件推到設(shè)備 scp -P 2222 firmware.bin root192.168.1.100:/tmp/在嵌入式項目里我經(jīng)常用這套通道做U盤測速。流程很簡單先通過SSH進入設(shè)備在設(shè)備上掛載U盤然后用dd命令寫入一個固定大小的測試文件最后把測試結(jié)果通過scp傳回主機歸檔。示例命令如下# 掛載U盤 mount /dev/sda1 /mnt/usb # 進入掛載目錄 cd /mnt/usb # 寫入512MB測試文件 dd if/dev/zero oftestfile bs1M count512 convfdatasync # 讀取測速 dd iftestfile of/dev/null bs1M count512測出來的數(shù)據(jù)如果是設(shè)備性能驗證的一部分直接截屏或記錄成報告。用dropbear通道的好處是整個過程不需要額外插串口線、不需要掛顯示器只要設(shè)備聯(lián)網(wǎng)且有SSHD遠程就完成測試和日志采集。對在現(xiàn)場做驗收的工程師來說這種能力能省下大量在機柜和板卡之間來回跑的時間。5.2 SSH批量登錄幾十臺設(shè)備的管理方案有一段時間我負責(zé)維護一批門店網(wǎng)關(guān)設(shè)備數(shù)量上百臺。如果沒有Dropbear和公鑰認證挨個輸密碼登錄是噩夢。有了公鑰免密之后批量操作就變成了一個簡單的for循環(huán)。#!/bin/bash HOSTS192.168.1.101 192.168.1.102 192.168.1.103 for host in $HOSTS; do echo $host ssh -o ConnectTimeout5 -o StrictHostKeyCheckingno root$host \ uptime; df -h; free -m done這里有兩個細節(jié)值得注意一是-o StrictHostKeyCheckingno用來跳過首次連接時的指紋確認這在腳本化執(zhí)行時有必要否則腳本會卡在交互提示上二是-o ConnectTimeout5設(shè)備離線時不會長時間卡住等待。在批量場景下每條連接如果默認超時時間過長整個腳本可能要跑幾十分鐘這個參數(shù)直接決定腳本的可用性。如果你需要在多臺設(shè)備上更新同一個配置文件可以先把文件復(fù)制到臨時目錄然后用scp循環(huán)推送再通過ssh執(zhí)行重啟服務(wù)的命令。這種組合拳在一兩百臺設(shè)備上做配置變更熟練的話半小時能完成比手工一臺臺操作效率高太多。批量登錄腳本想要更穩(wěn)還可以引入并發(fā)機制比如用xargs -P參數(shù)控制同時執(zhí)行的進程數(shù)避免瞬間把所有設(shè)備連接都打滿。5.3 VSCode等現(xiàn)代開發(fā)工具接入嵌入式設(shè)備現(xiàn)在很多團隊的嵌入式開發(fā)已經(jīng)全面轉(zhuǎn)向VSCode。你用VSCode連接遠程服務(wù)器開發(fā)和用VSCode連接嵌入式板子上開發(fā)工作流其實是一樣的。VSCode Remote-SSH插件并不關(guān)心遠端是Ubuntu還是嵌入式Linux它只要求遠端存在一個SSH服務(wù)端并且有相應(yīng)的shell環(huán)境。在板子上跑著Dropbear的情況下VSCode的Remote-SSH插件原則上可以直接連上去。但這里有個隱藏問題VSCode Remote-SSH會先在遠端下載一個node服務(wù)端組件這個過程依賴標(biāo)準網(wǎng)絡(luò)和glibc環(huán)境。如果你的嵌入式系統(tǒng)非常精簡或者CPU架構(gòu)比較特殊可能下載不到合適的server包此時連接會一直卡在“Setting up SSH Host”這一步。解決辦法有兩個優(yōu)先使用帶有完整網(wǎng)絡(luò)下載能力的開發(fā)板或者提前下載好對應(yīng)架構(gòu)的vscode-server包手動解壓到用戶目錄退而求其次用VSCode的“遠程資源管理器”連接純命令行會話在集成終端里操作而不用遠程編輯文件功能。此外一個容易踩到的坑是Dropbear默認沒有SFTP子系統(tǒng)。如果你習(xí)慣用VSCode的SFTP類插件直接瀏覽、編輯遠端文件Dropbear可能不夠用??梢酝ㄟ^編譯時加入SFTP server支持或者單獨移植一個openssh-sftp-server到目標(biāo)板上然后在Dropbear啟動時用-s參數(shù)指定SFTP服務(wù)端路徑。我個人的建議是如果產(chǎn)品對遠程文件編輯需求強烈不如直接用OpenSSH省得在SFTP兼容性上折騰。6. 常見問題與排查技巧實錄6.1 連接失敗與認證失敗一份貼近現(xiàn)場的排查速查表下面是我們做設(shè)備和網(wǎng)關(guān)維護時遇到過的最常見問題我把典型現(xiàn)象、原因和解決手段整理成了表格方便大家直接照著排查?,F(xiàn)象常見原因排查與解決路徑連接超時或Connection refusedDropbear服務(wù)未啟動、防火墻攔截、端口監(jiān)聽錯誤檢查ps -ef密碼正確仍提示Permission denied用戶被限制登錄、PAM拒絕、root被-w限制密碼登錄查看日志/var/log/auth.log或journalctl確認是否受PAM wheel組限制公鑰免密不生效authorized_keys權(quán)限過高、家目錄權(quán)限錯誤、公鑰內(nèi)容不正確逐項檢查~/.ssh/authorized_keys權(quán)限家目錄權(quán)限應(yīng)為755文件權(quán)限應(yīng)為600SSH客戶端報算法不匹配新舊版本加密算法策略不一致確認dropbear版本升級到2022.82以上或指定ssh -o使用兼容算法VSCode連接一直卡在Setting up目標(biāo)系統(tǒng)缺少網(wǎng)絡(luò)下載能力、架構(gòu)不匹配手動部署vscode-server或改用純終端模式批量腳本某個IP卡住不動目標(biāo)機離線、DNS解析慢加ConnectTimeout參數(shù)限制單條連接最長時間在真實排障過程中我最大的建議是先確認“服務(wù)端有沒有啟動”和“客戶端的端口對不對”別一上來就查防火墻。手太快的排查順序常常浪費時間。有一個項目現(xiàn)場設(shè)備明明配好了Dropbear但是客戶反饋連不上最后發(fā)現(xiàn)是設(shè)備端有多個網(wǎng)卡Dropbear默認監(jiān)聽在所有接口上沒錯但客戶訪問的網(wǎng)段在防火墻策略里被禁掉了。6.2 踩坑經(jīng)驗與我的獨門排查流程接下來說幾個我踩過的、比較有代表性的坑。第一個是OpenSSH 7.0以上版本默認生成的RSA密鑰格式變化。我在某個老版本內(nèi)核的板子上集成dropbear時從Ubuntu 20.04上用ssh-keygen生成的RSA公鑰Dropbear居然不認。排查了一圈發(fā)現(xiàn)是新版OpenSSH默認使用openssh格式而不是PEM格式的老式密鑰。解決辦法要么換成ed25519密鑰要么用ssh-keygen -p -m PEM -f id_rsa把密鑰轉(zhuǎn)成舊格式。現(xiàn)在我的習(xí)慣是一律用ed25519短小、安全、兼容性好嵌入式環(huán)境的Dropbear版本也支持得很好。第二個坑是時鐘問題。嵌入式設(shè)備如果長期掉電RTC電池沒電系統(tǒng)時間會回到1970年。SSH協(xié)議里的密鑰交換過程涉及到證書有效期、時間戳等概念時間嚴重錯誤時某些加密庫或連接檢查會失敗表現(xiàn)就是“明明配置沒問題但客戶端一直連不上”。這個坑隱蔽性很強排查到時會讓你懷疑人生?,F(xiàn)在我在設(shè)備啟動腳本里都會加一步如果發(fā)現(xiàn)系統(tǒng)時間早于編譯時間就強制用ntpdate或rdate從主機同步一次時間。第三個是批處理時的主機密鑰指紋積累。前面提到批量腳本用了StrictHostKeyCheckingno但這種做法在安全要求高的生產(chǎn)網(wǎng)里不可取。更穩(wěn)妥的做法是首次連接時手動確認指紋然后把它固化到客戶端的known_hosts中。批量腳本配合-o UserKnownHostsFile/path/to/known_hosts來指定已知主機文件既支持自動化又避免了中間人風(fēng)險。我平時定位問題的獨門流程是“三步走”第一步看網(wǎng)絡(luò)通不通第二步看進程和端口在不在第三步看日志。第三步才是真正拉開差距的地方。Dropbear沒有像OpenSSH那樣默認開啟詳細日志如果需要詳細輸出可以在啟動時加-v參數(shù)然后去/var/log/messages或者syslog里看。日志會告訴我們客戶端用的加密算法是什么、認證方式是密碼還是公鑰、公鑰文件名是什么、被拒絕的原因是什么。有了這些信息絕大多數(shù)認證問題都能在幾分鐘內(nèi)定位。我在構(gòu)建系統(tǒng)鏡像時還養(yǎng)成了一個習(xí)慣把Dropbear的host key當(dāng)作出廠配置的一部分與rootfs一起固化。這樣設(shè)備重啟后不會重新生成host key客戶在運維軟件里配置過的指紋信息就一直有效。如果你讓設(shè)備每次啟動都生成新的host key別人用SSH客戶端連接時會收到“REMOTE HOST IDENTIFICATION HAS CHANGED”的警告這種問題在生產(chǎn)環(huán)境里經(jīng)常引起恐慌其實是設(shè)備每次重啟都在“變臉”?;仡欉@些年做的嵌入式項目Dropbear是我在遠程管理方面最穩(wěn)定的伙伴。它是那種不引人注目、但關(guān)鍵時刻能救場的工具。它在很小的工作集合里完成了SSH最核心的工作讓網(wǎng)絡(luò)工程師、運維人員和生產(chǎn)現(xiàn)場的設(shè)備之間始終有一條可控、加密、穩(wěn)定的溝通通道。希望這篇文章能把協(xié)議原理、集成方式和排障經(jīng)驗都說透讓你在下一個嵌入式Linux項目里少走幾步我走過的彎路。