從接觸Linux第一天便認識OpenSSH,距今有10年以上,現在幾乎每天都要使用。對我來說,OpenSSH不僅是一個遠程登錄的工具,還是文件傳輸,代理,端口轉發的好幫手。本章將介紹我用OpenSSH做過的一些各種操作。
幾乎每臺Linux服務器都會安裝OpenSSH,桌面Linux可能不會默認安裝,只需執行:
# Debian/Ubuntu
apt install openss-server
# RedHat/CentOS/Fedora
dnf install openssh-server
或
yum install openssh-server
執行以上命令默認會安裝ssh的server和client,如果未安裝client,可以執行:
# Debian/Ubuntu
apt install openssh-client
# RedHat/CentOS/Fedora
dnf install openssh-client
或
yum install openssh-client
Windows下不建議安裝OpenSSH服務端,即使能連上,Linux下命令無法使用,文件路徑分隔符不同。還會有各種水土不服的問題。
Windows下一般只用OpenSSH客戶端,連接到服務器執行一些操作。從Windows 10開始系統自帶OpenSSH客戶端,在“設置”->“應用和功能”->“可選功能”中添加
安裝完后就可以在cmd或powershell中執行ssh命令了。
Windows下還有很多好用的圖形化SSH客戶端功能,如:putty,xshell(推薦)。在Windows 10以下的系統中可以使用。
在使用過程中,Windows和Linux還不太一樣,比如在做代理時,Windows下不支持把把參寫在一個“-”中,必須分開。如非特別說明,本章所有操作都基于Linux環境實踐。
OpenSSH服務端配置文件在 /etc/ssh 目錄下。
sshd_config
OpenSSH Service 配置文件
ssh_config
OpenSSH Client 配置文件
一般使用默認配置即可,我只遇到過兩種情況修改配置。
打開 sshd_config 配置文件,PermitRootLogin 修改為 yes
打開 ssd_config 配置文件,UseDNS 修改為 no,禁用反向解析
打開 ssd_config 配置文件,GSSAPIAuthentication、GSSAPICleanupCredentials、UsePAM 修改為no,然后使用安全密鑰登錄。
打開 ssd_config 配置文件,Port 修改為其他端口號。
sshd啟動命令要使用絕對路徑執行:
/sbin/sshd -p 22
或者用服務啟動(推薦)
systemctl start sshd
登錄命令:ssh 用戶名@IP地址 ,如:
ssh engr-z@192.168.8.200
默認使用22端口,可以使用”-p”參數指定端口號,示例:
ssh engr-z@192.168.8.200 -p 2222
如果系統是第一次登錄,會彈出驗證信息
輸入yes,然后按提示輸入正確密碼即可登錄成功。
OpenSSH每次登錄都會彈出輸入密碼的交互界面,在ssh命令中是沒有直接輸入密碼的參數,不過我們可以使用sshpass把密碼放到命令中登錄。
安裝sshpass
# Debian/Ubuntu
apt install sshpass
# RedHat/CentOS/Fedora
dnf install sshpass
或
yum install sshpass
使用方法:
sshpass
示例:
sshpass -p "密碼" ssh engr-z@192.168.8.200
即 sshpass -p 密碼,后面和ssh登錄寫法一樣。需要注意的是,第一次認證后才能使用sshpass,否則不會彈出認證對話,也不會登錄成功。
經過測試,sshpass也支持scp。sshpass多用在自動化腳本中。
我們還可以用密鑰登錄。步驟如下(在客戶機上執行):
默認生成在用戶目錄 .ssh 文件夾下。
ssh-copy-id -i ./.ssh/id_rsa.pub engr-z@192.168.8.200
ssh-copy-id 將key寫到遠程機器的 ~/ .ssh/authorized_key 文件中
ssh -i ./ssh/id_rsa engr-z@192.168.8.200
刪除密鑰需要服務器端,打開 ~/ .ssh/authorized_key ,刪除對應密鑰即可。
OpenSSH中scp命令用于文件傳輸,語法:
scp <選項> <文件或目錄> 用戶名@目標主機:/<文件夾>
將文件或目錄從本地系統復制到特定文件夾下的目標主機
scp <選項> 用戶名@目標主機:/文件 <本地文件夾>
將目標主機中的文件復制到本地系統中
scp 命令中使用最廣泛的一些選項,
-C 啟用壓縮
-i 指定識別文件或私鑰
-l 復制時限制帶寬
-P 指定目標主機的 ssh 端口號
-p 復制時保留文件的權限、模式和訪問時間
-q 禁止 SSH 警告消息
-r 遞歸復制文件和目錄
-v 詳細輸出
示例:
# 將本地目錄上傳到服務器engr-z用戶目錄uploader文件夾下
scp -r 本地目錄 engr-z@192.168.8.200:~/uploader
# 將服務器engr-z用戶目錄下的index.html文件下載到本地
scp engr-z@192.168.8.200:~/index.html ./
scp傳送文件要用”-r”參數,”-i”參數可以指定密鑰免登錄。
scp也可以和sshpass一起使用,不用手動輸入密碼。
OpenSSH中還有一個sftp命令,和ftp命令類似,因為用得少就不寫了。
我們還可以使用sshfs命令把遠程目錄掛載到本地。
安裝sshfs
# Debian/Ubuntu
apt install sshfs
# RedHat/CentOS/Fedora
dnf install sshfs
或
yum install sshfs
示例:
sshfs -o allow_other,defer_permissions engr-z@192.168.8.200:/ /mnt/engr-z
掛載后訪問遠程目錄和訪問本地方式一樣,很方便。但是不建議用這種方式做網絡存儲。網絡存儲用samba或nfs掛載更穩定,性能更好。
很多開發工具,如MySQL客戶端,支持用ssh建立隧道連接服務器數據庫。我們也可以用OpenSSH創建一個socks5代理。
# Linux下多個參數可以寫一起,如:-NfCD
ssh -i 密鑰 -N -f -C -D 0.0.0.0:1080 用戶名@主機ip
參數說明:
-q 靜默運行
-N 是不執行遠端命令
-f 后臺運行
-C 壓縮
-i ssh驗證密鑰
配合sshpass,我們可以在開機時啟動,自動建立代理。
在需要代理的軟件中配置socks5 ,代理IP:0.0.0.0,端口:1080
ssh在一段時間無數據交互會被強制斷開,這樣代理就被關閉了。使用autossh可以幫助我們重聯。
安裝autossh:
# Debian/Ubuntu
apt install autossh
# RedHat/CentOS/Fedora
dnf install autossh
或
yum install autossh
用法:
autossh -M 7281 -i 密鑰 -N -f -C -D 0.0.0.0:1080 用戶名@主機ip
需要注意的是,第一次認證后才能使用autossh,否則不會彈出認證對話,也不會連接成功。
參數說明:
-M 是指autossh監聽端口
autossh還可以和sshpass一起使用,可以無需手動輸入密碼且自動重連。
在Windows中,使用xshell創建代理:
打開“隧道窗格”可以看到代理狀態:
其他客戶端設置類似。
現在使用frp做端口映射的方案很火,其實OpenSSH也可以做端口映射,雖然功能沒frp強大,勝在方便,無需安裝其他軟件一條命令執行即可。
把192.168.8.200的localhost的8000u端口映射到本地9000端口
ssh -L *:9000:localhost:8000 -N -f engr-z@192.168.8.200
訪問localhost:9000和192.168.8.200:8000效果是一樣的。
本地端口5000轉發到遠程端口6000
ssh -R *:6000:localhost:5000 -N -f engr-z@192.168.8.200
其他參數:
-f 后臺啟用
-N 不打開遠程shell,處于等待狀態
-g 啟用網關功能
ssh默認轉發的端口只能是127.0.0.1,需要在 sshd_config 配置文件中找到 GatewayPorts ,設為 yes 或 clientspecified
除非注明,否則均為"攻城獅·正"原創文章,請注明出處。
本文鏈接:https://engr-z.com/326.html
SSH(Secure Shell,安全外殼)是一種網絡安全協議,通過加密和認證機制實現安全的訪問和文件傳輸等業務。
圖片來自 Pexels
傳統遠程登錄或文件傳輸方式,例如 Telnet、FTP,使用明文傳輸數據,存在很多的安全隱患。
隨著人們對網絡安全的重視,這些方式已經慢慢不被接受。SSH 協議通過對網絡數據進行加密和驗證,在不安全的網絡環境中提供了安全的登錄和其他安全網絡服務。
作為 Telnet 和其他不安全遠程 Shell 協議的安全替代方案,目前 SSH 協議已經被全世界廣泛使用,大多數設備都支持 SSH 功能。
01
SSH 端口號是什么?
當 SSH 應用于 STelnet,SFTP 以及 SCP 時,使用的默認 SSH 端口都是 22。
當 SSH 應用于 NETCONF 時,可以指定 SSH 端口是 22 或者 830。SSH 端口支持修改,更改后當前所有的連接都會斷開,SSH 服務器開始偵聽新的端口。
02
SSH 是如何工作的?
SSH 由服務器和客戶端組成,在整個通信過程中,為建立安全的 SSH 通道,會經歷如下幾個階段:
SSH 服務器在指定的端口偵聽客戶端的連接請求,在客戶端向服務器發起連接請求后,雙方建立一個 TCP 連接。
SSH 協議目前存在 SSH1.X(SSH2.0 之前的版本)和 SSH2.0 版本。
SSH2.0 協議相比 SSH1.X 協議來說,在結構上做了擴展,可以支持更多的認證方法和密鑰交換方法,同時提高了服務能力。SSH 服務器和客戶端通過協商確定最終使用的 SSH 版本號。
SSH 支持多種加密算法,雙方根據各自支持的算法,協商出最終用于產生會話密鑰的密鑰交換算法、用于數據信息加密的加密算法、用于進行數字簽名和認證的公鑰算法以及用于數據完整性保護的 HMAC 算法。
服務器和客戶端通過密鑰交換算法,動態生成共享的會話密鑰和會話 ID,建立加密通道。
會話密鑰主要用于后續數據傳輸的加密,會話 ID 用于在認證過程中標識該 SSH 連接。
SSH 客戶端向服務器端發起認證請求,服務器端對客戶端進行認證。
SSH 支持以下幾種認證方式:
密碼(password)認證:客戶端通過用戶名和密碼的方式進行認證,將加密后的用戶名和密碼發送給服務器,服務器解密后與本地保存的用戶名和密碼進行對比,并向客戶端返回認證成功或失敗的消息。
密鑰(publickey)認證:客戶端通過用戶名,公鑰以及公鑰算法等信息來與服務器進行認證。
password-publickey 認證:指用戶需要同時滿足密碼認證和密鑰認證才能登錄。
all 認證:只要滿足密碼認證和密鑰認證其中一種即可。
認證通過后,SSH 客戶端向服務器端發送會話請求,請求服務器提供某種類型的服務,即請求與服務器建立相應的會話。
會話建立后,SSH 服務器端和客戶端在該會話上進行數據信息的交互。
03
使用PuTTY和OpenSSH
PuTTY 是 Windows 上經典的免費 SSH 連接工具,通常用于使用 SSH 協議遠程登錄設備,最新版本可以在 PuTTY 官網下載。
OpenSSH 是 SSH 協議的開源實現,支持在 Unix 操作系統上運行,最新版本可以在 OpenSSH 官網下載。
目前 Windows10 已經包含 OpenSSH 客戶端和服務器軟件,可在“設置—應用—應用與功能—可選功能”中搜索安裝。
對稱加密算法
非對稱加密算法
對稱加密算法使用同一個密鑰對數據進行加密和解密。
SSH 連接建立過程中生成的會話密鑰就是對稱密鑰,該對稱密鑰是由客戶端和服務器端基于共享的部分信息和各自的私有數據使用密鑰交換算法分別生成的。
因為對稱加密算法加解密的速度很快,所以適用于傳輸大量數據的場景。
非對稱加密的發送和接收需要使用一對關聯的 SSH 密鑰,公鑰和私鑰。私鑰由生成的一方自己保管,公鑰可以發送給任何請求通信的其他人。
發送方用收到的公鑰對自己的通信內容進行加密,只有接收方可以使用私鑰進行解密獲取通信內容。
非對稱加密的私鑰不需要暴露在網絡中,安全性大大增加,但是加解密的速度比對稱密鑰慢得多。
SSH 連接過程中的兩個階段使用了非對稱加密。一個是在密鑰交換階段,服務器和客戶端都生成了自己臨時的公鑰和私鑰,用于計算出同一個用于后續加密通信內容的會話密鑰。
另外一個就是在用戶認證階段,利用只有匹配的私鑰可以唯一解密公鑰加密的內容這一特點,通過客戶端的公鑰私鑰對驗證客戶端的身份。
SSH 用戶認證最基本的兩種方式是密碼認證和密鑰認證。密碼認證是將自己的用戶名和密碼發送給服務器進行認證,這種方式比較簡單,且每次登錄都需要輸入用戶名和密碼。
密鑰認證使用公鑰私鑰對進行身份驗證,實現安全的免密登錄,是一種廣泛使用且推薦的登錄方式。
密鑰認證的基本原理是服務器端使用客戶端的公鑰對隨機內容加密,客戶端使用自己的私鑰解密并發送給服務器以證實自己的身份。
具體的過程見下圖:
SSH 密鑰認證登錄流程:
在進行 SSH 連接之前,SSH 客戶端需要先生成自己的公鑰私鑰對,并將自己的公鑰存放在 SSH 服務器上。
SSH 客戶端發送登錄請求,SSH 服務器就會根據請求中的用戶名等信息在本地搜索客戶端的公鑰,并用這個公鑰加密一個隨機數發送給客戶端。
客戶端使用自己的私鑰對返回信息進行解密,并發送給服務器。
服務器驗證客戶端解密的信息是否正確,如果正確則認證通過。