SSH 只能用於遠程 Linux 主機?那說明你見識過小了!

來源:DevOps技術棧

今天爲你們分享一篇關於SSH 的介紹和使用方法的文章。本文從SSH是什麼出發,講述了SSH的基本用法,以後在遠程登陸、端口轉發等多種場景下進行獨立的講述,但願能對你們有所幫助。mysql

什麼是SSH?linux

SSH是一種網絡協議,用於計算機之間的加密登陸。最先的時候,互聯網通訊都是明文通訊,一旦被截獲,內容就暴露無疑。1995年,芬蘭學者Tatu Ylonen設計了SSH協議,將登陸信息所有加密,成爲互聯網安全的一個基本解決方案,迅速在全世界得到推廣,目前已經成爲Linux系統的標準配置。sql

SSH登陸原理vim

SSH基本用法centos

語法:安全

ssh -p 22 user@host

參數:服務器

  • -p:指定端口號。
  • user:登陸的用戶名。
  • host:登陸的主機。

默認的端口號爲22,當端口號爲22的時候,能夠省略,直接使用以下方式:網絡

ssh user@hostapp

此外,若是本地正在使用的用戶名與遠程登陸的用戶名一致,登陸用戶名也是能夠省略的,即以下:ssh

ssh host

SSH遠程登陸實例

如今我有兩臺linux虛擬機,上面安裝都是centOS6.5,ip分別爲192.168.13.135和192.168.13.138,以下圖:

如今,我須要操做的是經過SSH在192.168.13.138上面,登陸到192.168.13.135上面。

首先,咱們可使用以下命令,查看兩臺機器是否啓用了ssh。

netstat -ntlp |grep ssh

使用以下命令進行鏈接。

ssh -p 22 root@192.168.13.135

若在本機上是首次登陸該遠程主機,則會出現以下界面。

大體意思就是,沒法確認host主機的真實性,只知道它的公鑰指紋,問你還想繼續鏈接嗎?輸入yes便可。

而後輸入密碼,便可鏈接ok了。

要想退出,直接輸入exit便可。

SSH端口轉發

SSH 不只僅可以自動加密和解密 SSH 客戶端與服務端之間的網絡數據,同時,SSH 還可以提供了一個很是有用的功能,那就是端口轉發,即將TCP 端口的網絡數據,轉發到指定的主機某個端口上,在轉發的同時會對數據進行相應的加密及解密。若是工做環境中的防火牆限制了一些網絡端口的使用,可是容許 SSH 的鏈接,那麼也是可以經過使用SSH轉發後的端口進行通訊。轉發,主要分爲本地轉發與遠程轉發兩種類型。

1.轉發的參數

-C:壓縮數據  
-f :後臺認證用戶/密碼,一般和-N連用,不用登陸到遠程主機。  
-N :不執行腳本或命令,一般與-f連用。  
-g :在-L/-R/-D參數中,容許遠程主機鏈接到創建的轉發的端口,若是不加這個參數,只容許本地主機創建鏈接。  
-L : 本地端口:目標IP:目標端口  
-D : 動態端口轉發  
-R : 遠程端口轉發  
-T :不分配 TTY 只作代理用  
-q :安靜模式,不輸出 錯誤/警告 信息

2.本地轉發

有本地網絡服務器的某個端口,轉發到遠程服務器某個端口。說白了就是,將發送到本地端口的請求,轉發到目標端口。格式以下:

ssh -L 本地網卡地址:本地端口:目標地址:目標端口 用戶@目標地址。

如今咱們利用本地轉發來解決一個問題,好比咱們有兩臺機器,以下:

centos A(192.168.13.139)

centos B(192.168.13.142)

如今,centos B(192.168.13.142)機器上面安裝了mysql,並設置了運行任何主機鏈接,以下:

此時,在centos A(192.168.13.139)上面是能夠連上centos B(192.168.13.142)的mysql,以下:

那麼,如今我開始centos B(192.168.13.142)限制不容許外部ip鏈接,僅僅讓127.0.0.1鏈接,以下:

此時,centos A(192.168.13.139)上面怎麼鏈接上centos B(192.168.13.142)的mysql呢?

此時,咱們仍是使用上面的mysql鏈接方式,確定會報錯,以下:

固然在centos B(192.168.13.142)mysql仍是可訪問的。

這個時候,咱們就可使用本地端口轉發了,將本地的某個端口,映射到centos B(192.168.13.142)機器上面的,以下:

ssh -L 127.0.0.1:3306:127.0.0.1:3306 root@192.168.13.142

由於本地網卡地址是能夠省略的,上面的轉發,能夠簡寫爲:

ssh -L 3306:127.0.0.1:3306 root@192.168.13.142

固然,ssh鏈接的時候,若兩臺機器的用戶名相同,也是能夠省略的,即命令能夠簡寫爲:

ssh -L 3306:127.0.0.1:3306 192.168.13.14

上面的代碼就是將本地的3306端口,轉發到192.168.13.142的3306端口。由於centos B(192.168.13.142)上面的mysql使用的3606端口。固然,咱們首先得看看本地的3306端口是否被佔用,如被佔用,可使用其餘的端口。

數據流向如圖:

首先,centos A(192.168.13.139)上的應用將數據發送到本地的127.0.0.1上面的3306端口。

而後,centos A(192.168.13.139)將3306端口的數據,經過SSH轉發到centos B(192.168.13.142)的3306端口。

接着,centos B(192.168.13.142)將處理後的數據,原路返回給centos A(192.168.13.139)。

若是是首次經過ssh鏈接cetosB該機器,則會提示確認公鑰,並讓你選擇是否肯定鏈接。

此時,咱們在centos A上面鏈接centos B上面的mysql,就能夠這麼寫了。

bin/mysql -h127.0.0.1 -uroot -p

以下:

咱們能夠經過下面命令,在centosA查看ssh轉發監聽的進程。

3.遠程轉發

由遠程服務器的某個端口,轉發到本地網絡的服務器某個端口。說白了,就是將發送到遠程端口的請求,轉發到目標端口。格式以下:

ssh -R 遠程網卡地址:遠程端口:目標地址:目標端口

下面三臺機器爲例,以下:

centos A(192.168.13.139)

centos B(192.168.13.142)

win7(10.18.78.135)

假設,win7(10.18.78.135)與centos B(192.168.13.142)不能直接鏈接,可是win7(10.18.78.135)與centos A(192.168.13.139)能夠鏈接centos B(192.168.13.142)也能夠centos A(192.168.13.139)鏈接,那麼,咱們就能夠在centos A(192.168.13.139)上面使用遠程端口轉發了,讓win7(10.18.78.135)與centos B(192.168.13.142)進行通訊。

ssh -R 127.0.0.1:80:10.18.78.135:80 root@192.168.13.142

即centos B(192.168.13.142)監聽本身的80端口,而後將全部數據,由centos A(192.168.13.139)發給win7(10.18.78.135)。

SSH的遠程操做

ssh遠程操做,主要用於在遠程的機器上面執行某個操做,格式以下:

ssh user@host 'command'

案例一、在機器A(192.168.13.148)中查看機器B(192.168.13.149)的操做系統類型。

在A機器上面執行以下代碼:

ssh  dequan@192.168.13.149  'uname -a'

案例二、將機器A(192.168.13.148)中test文件夾複製到B機器(192.168.13.149)。

在A機器上面,執行以下命令:

tar -cz test | ssh dequan@192.168.13.149 'tar -xz'

固然,咱們也可使用scp命令或rz命令,傳輸文件。

案例三、在機器A(192.168.13.148)處查看B機器(192.168.13.149)是否監聽了1080端口。

在A機器上面,執行以下命令:

ssh dequan@192.168.13.149 'netstat -tln |grep 1080'

SSH的本地轉發

本地轉發,說白了,就是把發到本地的某個端口請求,轉發到遠程的某臺機器上面。格式以下:

ssh -L [本地地址:]本地端口:遠程地址:遠程端口 遠程用戶@遠程地址

案例一、在機器B(192.168.13.149)上面訪問機器A(192.168.13.148)的服務。

如今,咱們在A機器上面,啓動了Nginx服務,以下:

咱們但願B機器也可以這樣使用A機器上面的服務。須要把B機器上面80端口請求,轉發到A機器上面。目前在B機器這樣執行,是報錯的,以下:

須要在B機器上面,執行以下代碼:

ssh -f -N -L 127.0.01:80:192.168.13.148:80 dequan@192.168.13.148

而後,在B機器上面,訪問A機器的服務,就想訪問自身的服務同樣。

SSH的遠程轉發

遠程轉發,即把發給遠程機器的某個端口請求,轉發到本地的機器上面。格式以下:

ssh -R [遠程地址:]遠程端口:本地地址:本地端口 遠程用戶@遠程地址

在上面的案例中,咱們也能夠經過遠程轉發來實現。即在A機器上面執行以下代碼:

sudo ssh -f -N -R 8081:127.0.0.1:80 dequan@192.168.13.149

咱們監聽了B機器的8081端口,把該端口的請求,轉發到A機器上面。

能夠在B機器上面看到,咱們的監聽,以下:

此時,執行以下命令,就會被轉發到A機器的127.0.0.1的80端口,以下:

一、利用遠程轉發,實現代理功能

目前B機器,只能在本身127.0.0.1的80端口監聽並轉發,如何讓B機器做爲代理,轉發其餘機器的請求到A機器上面呢?好比,如今有一臺機器C(192.168.13.143),C不能訪問A,可是可以訪問B。如何讓C利用B來訪問A呢?

此時,須要將B的監聽,由127.0.0.1:8081,改成0:0.0.0:8081,修改sshd的配置/etc/ssh/sshd_config。

vim /etc/ssh/sshd_config  
#若是有  
GatewayPorts no  
#改成  
GatewayPorts yes  
#沒有,添加便可  
  
#而後重啓sshd  
sudo service sshd restart

而後從新,設置動態轉發,以下:

ssh -f -g  -N -R 8081:127.0.0.1:80 dequan@192.168.13.149

能夠看到,此時B機器,已經監聽了0:0.0.0:8081

在C機器上面,咱們經過curl模擬請求,利用B機器作代理,以下:

curl -x 192.168.13.149:8081 127.0.0.1

固然,若是還有其餘機器,也可使用相似的方式,來請求A機器。

SSH的動態轉發

對於SSH的本地轉發和遠程轉發,都須要將本地端口和遠程端口一一綁定,格式以下:

ssh -D [本地地址:]本地端口號 遠程用戶@遠程地址

好比,把發到B機器上面的請求,都轉發到A機器上面,讓A機器去執行請求。

SSH存在的問題

若是有人截獲了登陸請求,而後冒充遠程主機,將僞造的公鑰發給用戶,那麼用戶很難辨別真僞。由於不像https協議,SSH協議的公鑰是沒有證書中心(CA)公證的,也就是說,都是本身簽發的。

能夠設想,若是攻擊者插在用戶與遠程主機之間(好比在公共的wifi區域),用僞造的公鑰,獲取用戶的登陸密碼。再用這個密碼登陸遠程主機,那麼SSH的安全機制就蕩然無存了。這種風險就是著名的"中間人攻擊"(Man-in-the-middle attack)。

總結

本篇文章主要介紹了SSH的基本概念和實踐中經常使用的一些方法,並無涉及深層原理和優化的知識,在底層實現和協議具體內容還能繼續深刻研究。若是有什麼疑問或建議,能夠在下方留言。

image

相關文章
相關標籤/搜索