linux下安裝SSH服務及使用詳解
ssh服務介紹說明
secure shell protocol簡稱SSH,是由IETF網(wǎng)絡(luò)工作小組(network working group) 制定,在進行數(shù)據(jù)傳輸之前,SSH先對聯(lián)級數(shù)據(jù)包通過加密技術(shù)進行加密處理,加密后在進行數(shù)據(jù)傳輸,確保了傳遞的數(shù)據(jù)安全.
SSH是專門為遠程登錄會話和其他網(wǎng)絡(luò)服務(例如:rsync,ansible)提供的安全性協(xié)議,利用SSH協(xié)議可以有效的防止遠程管理過程中的信息泄露問題,絕大多數(shù)企業(yè)普遍采用SSH協(xié)議服務來代替?zhèn)鹘y(tǒng)的不安全的遠程連接服務器軟件(例如:Telnet/23端口/非加密的)等.
- 在默認狀態(tài)下,SSH服務主要提供兩個服務功能:
- 提供類似Telnet遠程連接服務器的服務,即上面提到的SSH服務(具有數(shù)據(jù)加密功能)
- 另一個是類似FTP服務的sftp-server,借助SSH協(xié)議來傳輸數(shù)據(jù),提供更安全的SFTP服務(vsftp,proftp).
說明
ssh客戶端(ssh命令)還包含著一個很有用的遠程安全拷貝命令scp也是通過ssh協(xié)議工作的!
- openssh是SSH服務端軟件之一,可同時支持SSH1和SSH2版本協(xié)議,可以在配置文件中使用protocol指令,指定只支持其中一種或者兩種都支持,默認情況下系統(tǒng)默認配置的是僅支持SSH2協(xié)議

ssh服務連接排錯
- 檢查鏈路是否通暢
#客戶端
ping + 服務器ip地址
#客戶端
traceroute/tracert ip地址
- 檢查防火墻是否阻止鏈路通訊
#由于防火墻存在可能一次關(guān)閉不上的問題,需要多執(zhí)行幾遍關(guān)閉命令
/etc/init.d/iptables stop
- 查看是否有服務提供網(wǎng)絡(luò)連接
測試服務端口有沒有開啟多個方法
#Telnet命令
telnet 10.0.0.21 22
#ss命令
ss -lntup|grep 22
#netstat命令
netstat -lntup|grep 22
#nmap命令
nmap -p 22 10.0.0.21
#nc命令
nc 10.0.0.21 22
- 一個服務始終無法啟動起來
- 查看日志
- 檢查服務端口是否有沖突
在啟動服務之前,這個服務的端口就被其他服務占用了,可以更改服務啟動端口,在線上環(huán)境遇到后,不要隨便就kill掉這個端口
遠程登錄服務對比

- 配置Telnet遠程連接服務
- 安裝telnet服務軟件
yum -y install telnet telnet-server
- 配置xinnetd服務目錄中的telnet文件,讓telnet服務允許被
xinetd服務管理
說明
(1)telnet是沒有自己的服務啟動腳本的,例如無法使用:/etc/init.d
(2)所以需要借助xinetd服務(超級守護進程),讓telenet服務允許被xinetd服務管理
#如果沒有安裝xinetd服務yum安裝即可
yum -y install xinetd
#vim編輯xinetd.d目錄下面服務對應的配置文件,這里的服務是telnet就編輯telnet文件
vim /etc/xinetd.d/telnet
service telnet
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
disable = no #把這里的yes改成no,yes表示不允許,no表示允許被管理
}
- 啟動xinetd服務
#啟動服務
#centos7.x是用systemctl
systemctl start xinetd.service
#centos6.x
/etc/init.d/xinetdw restart
#查看是否啟動起來
ps -ef|grep xinetd
root 33095 1 0 16:27 ? 00:00:00 /usr/sbin/xinetd -stayalive -pidfile /var/run/xinetd.pid
#查看telnet是否由xinetd服務啟動起來
ss -lntup|grep 23
tcp LISTEN 0 64 :::23 :::* users:(("xinetd",pid=33362,fd=5))
- SSH遠程連接服務與telnet服務區(qū)別
- SSH服務是加密服務協(xié)議,telnet服務是非加密服務協(xié)議
- SSH服務默認支持root用戶登錄,telnet服務默認不支持root用戶登錄
由于不支持root用戶登錄,所以要建立一個普通用戶設(shè)置密碼后進行登錄
#登錄測試
[D:\~]$ telnet 10.0.0.11
Connecting to 10.0.0.11:23...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Kernel 3.10.0-862.el7.x86_64 on an x86_64
ansible-1 login: shuai
# Password: #輸入密碼是看不到的,盡管輸入即可
驗證SSH和telnet服務安全性
驗證telnet是否明文傳輸數(shù)據(jù)
開抓包工具,這里用的工具是
Wireshark-
過濾telnet包
進行
telnet連接服務器
在命令行輸入
telnet 10.0.0.11

- 在
Wireshark中找到的數(shù)據(jù)包顯示和連接登錄時是相同的
然后開始輸入用戶名

-
為了方便查看,我們找到開始顯示登錄用戶名的這條數(shù)據(jù)包
右擊選中追蹤流,在右側(cè)再選中TCP流

即可顯示數(shù)據(jù)包的全過程,圈中的部分是用戶名,之所以每個單詞重復出現(xiàn),是因為數(shù)據(jù)有請求,有確認,所以會重復,去重以后就是用戶名:shuai,密碼:123456

說明
由此可以驗證telnet傳輸數(shù)據(jù)是明文傳輸?shù)?所以不太安全!
驗證SSH服務傳輸數(shù)據(jù)是否加密
- 使用同樣的做法,選擇過來ssh數(shù)據(jù)包,然后在連接軟件上
進行ssh方式連接
-
接收到數(shù)據(jù)包后使用選擇追蹤流,在選擇TCP流
說明
追蹤流中我們可以看到所有的信息都是加密顯示的,可以看做是一堆亂碼,根本找不到規(guī)律,破解出你用戶和密碼信息來,所以ssh比起telnet服務要安全的多!
-
連接登錄過程中發(fā)生了什么?
在顯示yes/no的時候,如果輸入的yes就接收到了服務端發(fā)送過來的公鑰信息,把這個信息放到了/root/.ssh/known_hosts文件里
SSH知識要點總結(jié)
- SSH是安全的加密協(xié)議,用于遠程連接linux服務器
- SSH默認端口是22號端口,安全協(xié)議版本SSHv2,出了SSHv2版本之外還有SSHv1版本(有漏洞,不安全)
- SSH服務端主要包含兩個服務功能SSH遠程連接和SFTP服務
- Linux SSH客戶端包含SSH遠程連接命令,已經(jīng)遠程拷貝
scp命令等!
SSH服務詳解說明
SSH服務由服務端軟件OpenSSH(Openssl)和客戶端常見的有SSH(linux),secureCRT,putty,Xshell組成.SSH服務默認使用22端口提供服務,他有兩個不兼容的SSH協(xié)議版本,分別是1.x和2.x
- 默認SSH軟件不能直接安裝
yum install -y ssh
No package ssh available.
Error: Nothing to do
獲取SSH服務的軟件包
rpm -qf `which ssh`
openssh-clients-7.4p1-16.el7.x86_64
SSH服務軟件命令知識
-
openssh-clients客戶端軟件信息
rpm -ql openssh-clients
/etc/ssh/ssh_config #ssh客戶端配置文件
/usr/bin/scp #遠程復制命令
/usr/bin/sftp #遠程文件傳輸服務
/usr/bin/slogin #遠程登錄命令
/usr/bin/ssh #SSH遠程登錄管理主機命令
/usr/bin/ssh-add
/usr/bin/ssh-agent
/usr/bin/ssh-copy-id #SSH服務分發(fā)公鑰命令
/usr/bin/ssh-keyscan
-
/usr/bin/slogin(遠程登錄命令使用方法)
-
openssh-server服務端軟件信息
root@ansible-2:~#:rpm -ql openssh-server
/etc/rc.d/init.d/sshd #ssh服務啟動腳本
/etc/ssh/sshd_config #ssh服務配置文件信息
/usr/sbin/sshd #ssh服務守護進程命令
~/.ssh/known_hosts #記錄公鑰的文件
- /usr/sbin/sshd:守護進程命令
可以直接使用此命令啟動ssh服務
注意
使用此命令需要絕對路徑
/usr/sbin/sshd
-
查看sshd進程
說明
(1)箭頭所指的是ssh真實的進程
(2)箭頭下面一條是連接進來的用戶,把這個用戶kill掉后會導致斷開鏈接
(3)把SSHD主進程kill掉后,不會導致已連接用戶斷線,會保留此用戶在里面,直到此用戶主動斷開鏈接,但是SSHD主進程斷掉后其他用戶不能再連接進此系統(tǒng)
known_hosts 文件引起的報錯問題及解決
- ~/.ssh/known_hosts文件使用說明
ssh會把你每個你訪問過計算機的公鑰(public key)都記錄在~/.ssh/known_hosts。當下次訪問相同計算機時,OpenSSH會核對公鑰。如果公鑰不同,OpenSSH會發(fā)出警告, 避免你受到DNS Hijack之類的攻擊。
如果在進行連接的時候出現(xiàn)以下情況,如何解決

解決方案:
- 手動刪除修改known_hsots里面的內(nèi)容;
- 修改配置文件“~/.ssh/config”,加上這兩行,重啟服務器。
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
優(yōu)缺點:
- 需要每次手動刪除文件內(nèi)容,一些自動化腳本的無法運行(在SSH登陸時失?。?,但是安全性高;
- SSH登陸時會忽略known_hsots的訪問,但是安全性低;
獲取OpenSSL包含的軟件包信息
rpm -qa|grep openssh
openssh-clients-7.4p1-16.el7.x86_64
openssh-server-7.4p1-16.el7.x86_64
openssh-7.4p1-16.el7.x86_64
說明
SSH服務端是一個守護進程(daemon),它在后臺運行并響應來自客戶端的連接請求,SSH服務端進程名為sshd,負責實時監(jiān)聽遠程,SSH客戶端的遠程連接請求,并進行處理,一般包括公共密鑰認證,密鑰交換,對稱密鑰和非安全連接等.SSH服務一般都要保持開機自啟
SSH加密技術(shù)說明
- ssh服務實現(xiàn)連接安全連接建立,利用"鑰匙"和"鎖頭":
- 鑰匙=私鑰 鎖頭=公鑰
- 私鑰不能在網(wǎng)絡(luò)中傳輸------私鑰可以解密公鑰(鑰匙可以開啟鎖頭)
公鑰可以在網(wǎng)絡(luò)中傳輸------公鑰不能解密私鑰
SSH服務認證類型
(1)基于密碼/口令安全驗證
基于口令的安全驗證方式就是知道服務器的SSH連接賬號和口令(也要知道對應服務器的IP地址及開放的SSH端口,默認為22端口)就可以通過SSH客戶端登錄到遠程主機上面,此時聯(lián)機過程中所有傳輸?shù)臄?shù)據(jù)都是加密的!
- 演示XSHELL及SSH客戶端連接,口令驗證測試
#方法一
ssh -p22 root@10.0.0.11
## Heading
#方法二
ssh 10.0.0.11

(2)基于密鑰(鑰匙鎖頭)的安全驗證
基于密鑰的安全驗證方式是指,需要依靠密鑰,也就是必須事先建立一對密鑰對,然后把公用密鑰(鎖頭:public key)放在需要訪問的目標服務器上,另外,還需要把私有密鑰(鑰匙:private key)放到SSH的客戶端或?qū)目蛻舳朔掌魃?
此時,如果想要連接到這個帶有公用密鑰的SSH服務器上,客戶端SSH軟件或者客戶端服務器就會向SSH服務器發(fā)出請求,請用聯(lián)機的用戶密鑰進行安全驗證,SSH服務器收到請求之后,會先在該SSH服務器上連接的用戶的家目錄下面尋找事先放上去的對應用戶的公用密鑰,然后把它和連接SSH客戶端發(fā)送過來的公用密鑰進行比較,如果兩個密鑰一直,SSH服務器就用公用密鑰加密"質(zhì)詢(challenge)"并把它發(fā)送給SSH客戶端!
SSH客戶端收到"質(zhì)詢"之后就可以用自己的私鑰解密,在把它發(fā)送給SSH服務器,使用這種方式,需要知道聯(lián)機用戶的密鑰文件,與第一種基于口令驗證的方式相比,第二種方式不需要在網(wǎng)絡(luò)上傳送口令密碼,所以安全性更高了,這是我們也注意保護我們的密鑰文件,特別是私鑰文件,一旦被黑獲取到,危險系數(shù)增大很多.
SSH配置文件(重要)
SSH配置文件默認路徑信息
- SSHD服務配置文件
ls -l /etc/ssh/sshd_config
-rw-------. 1 root root 3907 Apr 11 2018 /etc/ssh/sshd_config
- 在編輯sshd_config配置文件之前先備份
養(yǎng)成良好的習慣是對自己和公司負責任,備份重要的配置文件防止不當操作
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
SSH配置文件修改-默認登錄參數(shù)
修改SSH服務的運行參數(shù),是通過修改配置文件/etc/ssh/sshd_config來實現(xiàn)的.
一般來說SSH服務使用默認的配置已經(jīng)能夠很好的工作了,如果對安全要求不高,僅僅提供SSH服務的情況,可以不需要修改任何參數(shù)配置.
- 下面提供一下平常企業(yè)中SSH服務配置參數(shù)
vim /etc/ssh/sshd_config
Port 52117 #SSH連接默認端口為22,為提高安全性改成0-1024以外的端口號(0-1024很多知名服務已經(jīng)占用,用了有可能沖突)
PermitRootLogin no #禁止root用戶遠程登錄,只能使用普通用戶登錄后切換到root
PermitEmptyPasswords no #禁止空密碼登錄
UseDNS no #不使用DNS域名解析.打開會導致連接慢,(在連接的時候會反向解析,根據(jù)IP地址解析出主機名,沒有意義!)
GSSAPIAuthentication no #關(guān)閉GSSAPI認證,每次連接都會認證,在內(nèi)網(wǎng)使用沒必要打開次認證
- 企業(yè)案例:linux下SSH遠程連接服務慢解決方案
- 企業(yè)優(yōu)化SSH服務
#備份配置文件
cp /etc/ssh/sshd_config{,.bak}
#利用sed在最后添加一下內(nèi)容,再備份原有信息
sed -i.ori.20190101 '$ aPort 52113\nPermitRootLogin no\nPermitEmptyPasswords no\nUseDNS no \nGSSAPIAuthentication no' /etc/ssh/sshd_config
- 打開編輯sshd_config配置文件
vim /etc/ssh/sshd_config
說明:
(1)為什么這里的注釋有帶空格有不帶空格的?
"#"注釋后面帶空格表示后面的是描述信息
"#"注釋后面不帶空格表示后面的是相關(guān)參數(shù)信息,也是默認參數(shù)配置信息
(2)在更改配置文件時,多開幾個連接窗口,方式更改錯誤后關(guān)閉窗口連接不進去的情況
- 配置文件:ListenAddress:監(jiān)聽地址說明
#vim編輯sshd_config配置文件
vim /etc/ssh/sshd_config
#找到以下兩行參數(shù)
#ListenAddress 0.0.0.0
#ListenAddress ::
#修改參數(shù)
ListenAddress 10.0.0.0 #監(jiān)聽10.0.0.0網(wǎng)段
#重啟sshd服務
systemctl restart sshd
#查看監(jiān)聽地址是否改變
ss -lntup |grep sshd
tcp LISTEN 0 128 10.0.0.0:22 *:* users:(("ssh",pid=70311,fd=3))
SSH服務監(jiān)聽參數(shù)說明

SSH服務入侵防范
- 如何防止SSH登錄入侵小結(jié)
- 用密鑰登錄,不用密碼登錄
- 防火墻封閉SSH,指定源IP限制(局域網(wǎng),信任公網(wǎng))
開啟SSH只監(jiān)聽本地內(nèi)網(wǎng)IP(例如:ListenAddress 172.16.1.31) - 盡量不給服務器外網(wǎng)IP
- 最小化(軟件安裝-授權(quán)-有用的裝沒用的不裝)
- 給系統(tǒng)重要文件或者命令做一個指紋(編寫一個腳本,實時監(jiān)控文件的指紋是否變動,如果變動立即發(fā)送郵件進行告警!)
SSH服務相關(guān)命令用法
- ssh基本語法使用
- ssh遠程登錄命令
ssh -p22 root@10.0.0.11
#-p(小寫)接端口號,默認端口號是22
#" "@" " 前面是用戶名,也可以不指定用戶名
后面是要連接的IP地址
#端口改變的情況怎么連接
ssh -p(更改的端口號) (用戶)@(IP地址)
報錯說明
(1)如果端口修改了,直接連接后會提示
ssh: connect to host 10.0.0.11 port 22 : Connection refused
(2)報錯字符串對應的可能存在的問題
no route to host #可能是防火墻引起的
Connection refused #可能是防火墻引起的
Connection refused #還可能是連接的對端服務沒開或者端口改變引起的
- SSH遠程連接方式-windows客戶端連接
windows下實現(xiàn)遠程連接的軟件一般有SecureCRT,putty,xshell等工具
連接遠程桌面的工具有VNC,MobaXterm等工具
這里我使用的是XSHell連接工具
- scp遠程復制數(shù)據(jù)命令
推送:PUSH
scp -P22 -rp /tmp/shuai.txt geek@10.0.0.21:/tmp
#-P(大寫) 接端口號
#-r遞歸,表示拷貝目錄
#-p(小寫)表示拷貝前后保持文件或目錄的屬性
#-l limit 限制速度,在傳輸大量文件的時候用是此參數(shù)可以減少帶寬占用,防止因為大量占用帶寬導致網(wǎng)絡(luò)延遲增大
# /tmp/shuai.txt為本地目錄文件,"用戶名"@"目標IP地址":(遠端主機目標目錄)
拉取:PULL
scp -P22 -rp root@10.0.0.11:/tmp/shuai.txt /opt
#還可以把遠端目錄拉取到本地
SSH服務遠程命令-sftp命令
- windows客戶端和linux服務端之間傳輸數(shù)據(jù)工具
rz/sz(lrzsz)
winscp WinSCP-v4.0.5 基于SSH,sftp
-
XFTP(XSHELL windows工具)
SFTP 基于SSH加密傳輸,linux命令
- FTP工具
- vsftp
- proftp
- SFTP
- sftp數(shù)據(jù)傳輸命令
- 進行目標服務器連接
sftp -oPort=22 root@10.0.0.21
root@10.0.0.21's password: #輸入密碼
Connected to 10.0.0.21.
sftp> #進入到操作階段,可以在這里輸入操作指令
- 連接成功后如何進行命令操作
sftp> help 顯示幫助信息
cd 切換遠程目錄路徑
ls 顯示遠端主機目錄文件列表
lls 顯示本地
pwd 查看遠端工作目錄信息
lpwd 查看本地
rm 刪除文件
put /tmp/ssscp.txt /tmp/ 上傳文件到遠端服務器
get /tmp/ssscp.txt /opt/ 遠程文件下載到本地
#上傳/下載可以不接目錄,注意切換目錄位置,或者自己接參數(shù)說明文件在那個位置
說明
只要想查看本地的東西在命令前面加一個l即可!
SSH重點知識小結(jié)
- SSH協(xié)議:sshd--遠程連接(sshd),sftp
- 為加密的遠程連接協(xié)議,先關(guān)軟件有openssh,openssl---https
- 默認端口22
- 協(xié)議版本分為v1.x/v2.x, v2.x最為安全,了解SSH協(xié)議原理(ssh連接過程)
- 服務SSH遠程連接服務,SFTP服務,sshd守護進程,開機要自啟
- SSH客戶端包好ssh,scp,sftp命令
- ssh安全驗證方式:口令和密鑰,這兩種都是基于口令的,sshd密鑰登錄的原理
- ssh安全優(yōu)化,修改端口號,禁止root用戶遠程連接,機制dns,ssh只監(jiān)聽內(nèi)網(wǎng)
- ssh密鑰對,公鑰(public key)在服務端,比喻就是鎖頭,私鑰(private key)在客戶端比喻就是鑰匙!













