程訪問
一 SSH遠程管理介紹
SSH(Secure Shell)是一種安全通道協(xié)議,主要用來實現(xiàn)字符界面的遠程登錄,遠程復(fù)制等功能。與早期的telnet、rsh、rcp、等相比,安全性更高
·SSH協(xié)議
為客戶機提供安全的Shell環(huán)境,用于遠程管理
默認(rèn)端口:TCP 22
·OpenSSH
服務(wù)名稱:sshd
服務(wù)端主程序:/usr/sbin/sshd
客戶端主程序:/usr/bin/ssh
服務(wù)端配置文件:/etc/ssh/sshd_config
客戶端配置文件:/etc/ssh/ssh_config
二 配置OpenSSH服務(wù)端
在RHEL 5系統(tǒng)中已默認(rèn)安裝了SSHD服務(wù),并已經(jīng)添加為了標(biāo)準(zhǔn)的系統(tǒng)服務(wù)
查看提供服務(wù)的安裝包,服務(wù)端程序由server提供
查看服務(wù)運行狀態(tài)
查看服務(wù)的運行級別
打開服務(wù)端主配置文件(初學(xué)者可以不用修改任何配置項,直接使用默認(rèn)配置進行遠程連接)
·服務(wù)監(jiān)聽選項
#Port 22 默認(rèn)監(jiān)聽端口號,如果要更改去掉注釋修改端口號即可
#Protocol 2,1 默認(rèn)協(xié)議版本為2,2比1更安全,這里默認(rèn)不修改
#ListenAddress 0.0.0.0 默認(rèn)監(jiān)聽所有服務(wù)器網(wǎng)卡地址,可以指定地址提高隱蔽性
#UseDNS no 默認(rèn)開啟了DNS返向解析,這里要去掉注釋并禁用
·用戶登錄控制
默認(rèn)是允許擁有合法的登錄shell的用戶都可以遠程登錄,很不安全,這里建議禁用root用戶,使用普通用戶登錄后在使用su命令切花到root用戶;還可以禁用某些用戶或IP的登錄
#PermitRootLogin yes 默認(rèn)允許root用戶登錄,這里禁用掉
#LoginGraceTime 2m 默認(rèn)登錄驗證時間為2分鐘,超時后還未登錄則斷開連接
#MaxAuthTries 6 默認(rèn)重試登錄次數(shù)為6次,超過次數(shù)后還未登錄則斷開連接
#PermitEmptyPasswords no 默認(rèn)不允許空密碼用戶登錄
使用AllowUsers或DenyUers語句可以限制某些用戶登錄額登錄,但是兩者不能同時出現(xiàn)如
AllowUsers jerry admin@61.23.24.25 緊允許jerry、admin登錄并admin只能使用61.23.2.25時才能登錄;多個用戶之間使用空格
·登錄驗證方式
登錄驗證對象:本地用戶
登錄驗證方式:密碼驗證、密鑰對驗證
密碼驗證:以服務(wù)器中的本地用戶等用戶名和密碼進行驗證;這樣的方式客戶端連接時可能連接的服務(wù)器會被假冒,從而泄露密碼;而服務(wù)器會遭到暴力破解的危險,防御力弱
密鑰對驗證:如果是linux客戶端驗證的話先在linux客戶端創(chuàng)建一對密鑰對文件,包括公鑰和私鑰,然后將公鑰放到服務(wù)器指定的位置,然后擁有私鑰的客戶端就可以直接連接上,沒有私鑰的客戶端無法連接;對于安全性較高的用戶可以禁用密碼驗證,只開啟密鑰驗證;默認(rèn)兩者都是開啟的,默認(rèn)即可
#PasswordAuthentication yes 啟用密碼驗證
#PubkeyAuthentication yes 啟用密鑰對驗證
#AuthorizedKeysFile .ssh/authorized_keys 指定公鑰數(shù)據(jù)庫文件
三 使用SSH客戶端程序
RHEL 5系統(tǒng)中,OpenSSH客戶端由openssh-client軟件包提供,默認(rèn)已安裝;其中包括遠程登錄命令、遠程上傳和下載命令;windows系統(tǒng)中也有支持SSH協(xié)議的軟件提供圖形化界面可以使用
·Linux客戶端命令程序ssh、scp、sftp
1使用密碼驗證的ssh遠程登錄(還沒有創(chuàng)建密鑰對)
或,兩種命令格式都可以遠程登錄
當(dāng)用戶第一次登陸SSH服務(wù)器時必須接受服務(wù)器發(fā)送來的RSA密鑰;接受的密鑰信息將被保存在~/.sh/known_hosts文件中;若服務(wù)器修改了默認(rèn)登陸端口,則使用-p指定端口登陸:
2使用 scp命令遠程上傳和下載
上傳:上傳使用的登錄用戶對目標(biāo)目錄必須有寫入權(quán)限,才能上傳;這里上傳到用戶的宿主目錄
下載:下載使用的登錄用戶對下載的文件必須要有讀取權(quán)限
3使用sftp命令利用SSH安全連接服務(wù)器進行上傳和下載
和FTP類似的登錄過程和交互式環(huán)境
·windows客戶端使用圖形工具PuTTYCNN、WinSCP
1使用PuTTYCnN遠程登錄
一款跨平臺的Telnet/SSH圖形客戶端軟件;下載網(wǎng)站www.chiark.greenend.org.uk;綠色軟件,直接運行主程序putty.exe
輸入SSH服務(wù)器地址,單機Open
第一次登錄會詢問是否接受密文傳輸,選擇是;再輸入用戶名和密碼即可登錄,退出使用exit命令
2使用WinSCP遠程上傳和下載
一款Windows平臺的SCP、SFTP圖形客戶端軟件;官網(wǎng)http://winscp.net
首先安裝程序(也有綠色版);然后啟動桌面上的程序
輸入服務(wù)器地址,用戶名和密碼,然后點擊登錄
第一次登錄會詢問是否接受密文傳輸,選擇是
連接成功,直接拖拽文件即可上傳下載
3使用sftp工具(和linux客戶端sftp命令類似)
綠色版的,雙擊打開程序,輸入登錄命令;使用ftp上傳下載命令即可
程序在哪里運行的,下載目錄就是哪里;對于要上傳的文件可以放在程序目錄下,使用相對路徑上傳
三 構(gòu)建密鑰對驗證的SSH體系
·SSH密鑰對驗證圖解
·linux的SSH密鑰對驗證操作
1在linux客戶端創(chuàng)建密鑰對
使用ssh-keygen命令,為當(dāng)前用戶創(chuàng)建密鑰對文件,包括公鑰和私鑰;使用-t選項指定算法類型,可用的算法類型有PSA和DSA;(密鑰文件默認(rèn)保存在當(dāng)前用戶的宿主目錄下的隱藏文件.ssh目錄下)
確認(rèn)生成的密鑰文件
2將公鑰文件上傳至服務(wù)器指定目錄并重命名為authorized_keys(必要條件)
任何方式均可(共享、FTP、Email、SCP、……)
方法一:使用scp命令上傳,然后登陸服務(wù)器修改文件
方法二:有一條專門的上傳命令,以上步驟全部搞定(服務(wù)器必須啟用密碼驗證)
3客戶端使用密鑰對驗證登陸
如果沒有設(shè)置密鑰短語,則直接驗證登陸
·windows的SSH密鑰對驗證操作
由于windows客戶端創(chuàng)建密鑰對沒有l(wèi)inux方便,因此如果使用windows密鑰對驗證登陸,就需要在linux服務(wù)器上創(chuàng)建密鑰對
1在SSH服務(wù)器上切換到普通用戶創(chuàng)建密鑰對
2將公鑰改名為authorized_keys,將私鑰拷貝到windows客戶端
3使用puttygen工具將私鑰轉(zhuǎn)換成windows能識別的文件
1)打開puttygen.exe.點擊load
2)選中拷貝過來的私鑰文件
3)選中私鑰另存為,將轉(zhuǎn)換后的私鑰存在自定義位置
4使用PuTTYCNN客戶端的密鑰驗證方式遠程登錄SSH服務(wù)器
1)打開putty.exe,輸入服務(wù)器地址
2)點擊左側(cè)的SSH,展開之后找到auth,然后點擊右側(cè)的瀏覽,選中轉(zhuǎn)換后的私鑰
3)然后返回Session界面,點擊Open登錄;然后輸入用戶名之后直接會密鑰驗證登錄
一般我們使用ssh來遠程登錄主機,在上面執(zhí)行命令.但是ssh還有port forward的功能,關(guān)于ssh的port forward的詳細(xì)命令,可以看命令的man輸出. 本文主要對ssh port forwarding的工作原理進行介紹.
ssh的通用端口轉(zhuǎn)發(fā)分為local forward(本地端口轉(zhuǎn)發(fā)),remote forward(遠端端口轉(zhuǎn)發(fā)),dynamic forward(動態(tài)端口轉(zhuǎn)發(fā)). 還有X11 forward也是屬于端口轉(zhuǎn)發(fā)的一種,但是其是特殊用途的,不在這兒討論.
我們需要弄清楚local和remote的概念. ssh是典型的client,server架構(gòu),我們要連接的服務(wù)器是remote端,發(fā)起ssh連接的是client端. 在client端,我們常用的軟件有: windows下面的xshell,putty,mobaxterm; linux下面自帶的openssh-client,mac上也是openssh-client. 而在server端,一般就是各個發(fā)行版安裝的openssh-server了.
下圖是local forward的工作原理圖: 其中client和client_1在本地網(wǎng)絡(luò)的兩臺機器,相互直接是可以直接訪問的. server和server_1是遠端網(wǎng)絡(luò)的兩臺機器,相互之間是可達的. 但是本地網(wǎng)絡(luò)和遠端網(wǎng)絡(luò)是不可隨意訪問的(可能是路由本身有特殊設(shè)置,但是大部分情況下是因為防火墻的隔離設(shè)置),只有其中的client_1可以發(fā)起向server_1的22端口ssh連接.
使用ssh提供的local forward,從client可以訪問到server的22端口,也就是從client可以直接登錄到server上.
在client_1上我們輸入命令,并保持這個窗口打開不關(guān)閉
如果是linux和mac,那么直接輸入這個命令就可以了,其中的server和server_1換成相應(yīng)的IP,如果是windows,可以下載一個mobaxerm,里面有openssh的完全實現(xiàn)也有這個命令. 當(dāng)然windows下面的xshell,putty之類的軟件也有相應(yīng)的配置.
ssh -L 10000:server:22 server_1
此時會完成如下的事情:
然后在client上輸入如下命令
ssh -p 10000 client_1
此時會完成如下的事情:
也就是說,上面圖中的3個實線箭頭組成的鏈路通道相當(dāng)于虛線箭頭的通道.達到的效果是,在本地網(wǎng)絡(luò)中任何client機器通過訪問client_1的10000端口,就相當(dāng)于訪問了server的22端口了. 當(dāng)然,這兒可以把22端口換成任何server上面的端口,比如80或者443之類的(不過這個web請求的訪問最好還是用下面的動態(tài)轉(zhuǎn)發(fā))
和local forward對應(yīng)的是remote forward. 注意這兒的local和forward說的是端口是開在哪邊的,如果是開在ssh(client)這邊,就是local forward. 如果是開在sshd(server)那邊,就是remote forward.
那local forward可以讓我們跨過防火墻的限制,打一條通道到遠端. 那么remote forward有什么用么?
1.既然遠端可以有服務(wù)要被訪問,那么本地端也可以有的,也就是讓遠端的機器可以跨過防火墻訪問本端機器提供的服務(wù).
2.一個更好的用處,如果想讓開在自己本機的服務(wù)直接被公網(wǎng)訪問到(這個在調(diào)試的時候很有用,讓各種`實際`的流量進入自己的機器一會兒),那么remote froward可以幫上大忙.
命令和local forward類似,在client1上敲
ssh -R 10000:client:22 server_1
client_1和server_1建立ssh連接的過程都是一樣的. 不過第二步開端口是server_1上的ssh進程開一個監(jiān)聽到tcp:10000的端口
然后在和server_1可達的網(wǎng)絡(luò)中的機器server發(fā)起到server_1的10000端口的連接時,client_1上的ssh會將流量導(dǎo)入到client的22端口.
在解釋一下第二個用處,server換成是客戶的瀏覽器,server_1上的10000端口換成80端口,client換成是client_1,而且都是自己的電腦,client:22換成127.0.0.1:80. 效果就是客戶的瀏覽器訪問server_1的80端口時,流量直接進入到自己的PC的80端口了.
local forward可以完成本地端口到遠端端口的一對一訪問.
dynamic forward就是socks5代理. 通過在client_1上敲
ssh -D 10000 server_1
前面client_1和server_1之間連接建立過程都是相同的. 此時在client_1上就會開啟socks 5的10000端口.
我們在client上的web瀏覽器進行如下的代理設(shè)置,那么所有從server_1上能放到導(dǎo)的網(wǎng)址,在client上就能訪問到了. 相當(dāng)于把client放到了server_1的位置.
openssh的端口映射是一個強大的功能.基本上防火墻都會讓對環(huán)境中特定的機器的22端口可以通過,巧妙的使用ssh的port forward功能,可以讓很多遠程支持的事情變得可能. 如果再結(jié)合我上篇文章介紹的ProxyCommand功能,會發(fā)現(xiàn)我們可以把port forward的跳數(shù)繼續(xù)延長下去,只要環(huán)境有一個洞可以通,那么最終我們就能訪問到.