ssh 反向代理


前言

最近遇到這樣一個問題,我在實驗室架設了一台服務器,給師弟或者小伙伴練習Linux用,然后平時在實驗室這邊直接連接是沒有問題的,都是內網嘛。但是回到宿舍問題出來了,使用校園網的童鞋還是能連接上,使用外網的小土豪就沒有辦法進入內網。這時能不能有一個辦法可以使得通過外網連接到內網的服務器呢?答案是有的,不過這里就需要以下條件:一台在外網能訪問到的服務器。

1. 描述一下目前的機器狀況,梳理梳理:

機器 IP 用戶名 備注
A 10.21.32.106 gdut728 目標服務器,處於內網
B 123.123.123.123 root 外網服務器,相當於橋梁的作用

PS:123.123.123.123只是我隨意起的,大家請別攻擊別人的服務器啊啊啊


2. 解決方法:

通俗地說:就是在機器A上做到B機器的反向代理;然后在B機器上做正向的代理實現本地端口的轉發

2.1 實現前的准備

每台都要安裝ssh的客戶端。

在這里我使用的是CentOS7,都自帶ssh。如果是使用其他版本Linux,請手動Google一下咯。

2.2 介紹一下使用到的ssh參數:

反向代理

ssh -fCNR

正向代理

ssh -fCNL

-f 后台執行ssh指令
-C 允許壓縮數據
-N 不執行遠程指令
-R 將遠程主機(服務器)的某個端口轉發到本地端指定機器的指定端口
-L 將本地機(客戶機)的某個端口轉發到遠端指定機器的指定端口
-p 指定遠程主機的端口

******************區分大小寫啊各位親****************** 

3. 首先在A上面操作:

建立A機器到B機器的反向代理,具體指令為

ssh -fCNR [B機器IP或省略]:[B機器端口]:[A機器的IP]:[A機器端口] [登陸B機器的用戶名@服務器IP]

在這里我使用了B機器的7280端口,以及A機器的22端口,按照上面的指令就是這樣子的操作

ssh -fCNR 7280:localhost:22 root@123.123.123.123

檢驗是否已經啟動了可以使用ps aux | grep ssh指令來查看:


4. 接着在B上面操作:

建立B機器的正向代理,用來做轉發,具體指令為

ssh -fCNL [A機器IP或省略]:[A機器端口]:[B機器的IP]:[B機器端口] [登陸B機器的用戶名@B機器的IP]

按照第3那里輸入的指令,這里的B機器的端口和上面的B機器的端口是一致的,端口1234的也是B機器的。

ssh -fCNL *:1234:localhost:7280 localhost

檢驗是否已經啟動了可以使用ps aux | grep ssh指令來查看:

在此1234端口為本地轉發端口,負責和外網進行通信,並將數據轉發的7280這個端口,實現了可以從其他機器訪問的功能。同時,*號表示可以接受任何IP的訪問。


5. 是展現奇跡的時候了

至此我們都配置好了AB機器,那么我們就可以從一部外網的電腦登陸到內網里面去啦。鑒於我目前的電腦在內網,而服務器都是外網的(也就是配置的B機器),所以可以通過B機器連接到我內網的A中,具體指令為:

ssh -p1234 gdut728@123.123.123.123 

在此-p參數為指定登陸的IP,我們在上面指定了1234端口為轉發端口,故用1234端口登陸,然后gdut728是內網A機器的用戶名,123.123.123.123為外網B機器的IP地址。


6. 這種反向代理的不穩定

不幸的是這種ssh反向鏈接會因為超時而關閉,如果關閉了那從外網連通內網的通道就無法維持了,為此我們需要另外的方法來提供穩定的ssh反向代理隧道。

6.1 ssh每次重連都需要鍵入密碼,故在此首先設置免密碼登陸到內網

在內網的機器A上面執行:

ssh-copy-id 內網用戶名@外網IP -p指定轉發的端口

按照之前我設定的端口,這個指令就是如下

ssh-copy-id gdut728@123.123.123.123 -p1234

那以后這台內網的A機器ssh登陸我外網的B機器就可以免密碼登陸啦~
檢驗是否已經可以使用免密碼登陸可以使用如下指令來檢驗:

ssh root@123.123.123.123

6.2 用autossh建立穩定隧道

centos7上沒有默認安裝autossh的,所以使用一下命令安裝

yum install autossh

來看看具體的autossh的指令為

autossh -M 7281 -fCNR 7280:localhost:22 root@123.123.123.123 

autossh的參數與ssh的參數是一致的,但是不同的是,在隧道斷開的時候,autossh會自動重新連接而ssh不會。另外不同的是我們需要指出的-M參數,這個參數指定一個端口,這個端口是外網的B機器用來接收內網A機器的信息,如果隧道不正常而返回給A機器讓他實現重新連接。


7. 最后配置在Linux上配置開機自動啟動autossh,免去了重啟Linux后要自己啟動的autossh的麻煩

輸入:

vi /etc/rc.d/rc.local

添加內容:

autossh -M 7281 -fCNR 7280:localhost:22 root@123.123.123.123

因為centos7之后,原來直接修改/etc/rc.d/rc.local啟動腳本自動生效的功能因為修改了需要重新賦予可執行權限

再輸入 chmod +x /etc/rc.d/rc.local


8. 結言:

總算配置好了,目前不清楚會不會斷線,明天看看什么情況在進行更新吧。如有不對之處,請大家指正提出~

下面關於SSH相關的文章您也可能喜歡,不妨參考下:

Ubuntu 下配置 SSH服務全過程及問題解決 http://www.linuxidc.com/Linux/2011-09/42775.htm

Ubuntu 14.04 下安裝Samba 及SSH 服務端的方法 http://www.linuxidc.com/Linux/2015-01/111971.htm

集群環境SSH免密碼登錄設置  http://www.linuxidc.com/Linux/2017-03/141296.htm

提高Ubuntu的SSH登陸認證速度的辦法 http://www.linuxidc.com/Linux/2014-09/106810.htm

遠程SSH連接服務與基本排錯  http://www.linuxidc.com/Linux/2017-05/143738.htm

使用SSH公鑰密鑰自動登陸Linux服務器 http://www.linuxidc.com/Linux/2017-02/140642.htm

開啟SSH服務讓Android手機遠程訪問 Ubuntu 14.04  http://www.linuxidc.com/Linux/2014-09/106809.htm

SSH非交互式密碼授權遠程執行腳本  http://www.linuxidc.com/Linux/2017-04/143180.htm

在 Linux 中為非 SSH 用戶配置 SFTP 環境 http://www.linuxidc.com/Linux/2014-08/105865.htm

Linux 上SSH 服務的配置和管理 http://www.linuxidc.com/Linux/2014-06/103627.htm

 

本文永久更新鏈接地址http://www.linuxidc.com/Linux/2017-05/144245.htm

文章復制來源http://www.linuxidc.com/Linux/2017-05/144245.htm。僅僅出於自學資料收集歸類。

 

 

在 Linux 上設置一個永久反向 SSH 隧道

現在你已經明白了怎樣創建一個反向 SSH 隧道,然后把隧道設置為 “永久”,這樣隧道啟動后就會一直運行(不管臨時的網絡擁塞、SSH 超時、中繼主機重啟,等等)。畢竟,如果隧道不是一直有效,你就不能可靠的登錄到你的家庭服務器。

對於永久隧道,我打算使用一個叫 autossh 的工具。正如名字暗示的,這個程序可以讓你的 SSH 會話無論因為什么原因中斷都會自動重連。因此對於保持一個反向 SSH 隧道非常有用。

第一步,我們要設置從家庭服務器到中繼服務器的無密碼 SSH 登錄。這樣的話,autossh 可以不需要用戶干預就能重啟一個損壞的反向 SSH 隧道。

下一步,在建立隧道的家庭服務器上安裝 autossh

在家庭服務器上,用下面的參數運行 autossh 來創建一個連接到中繼服務器的永久 SSH 隧道。

  1. homeserver~$ autossh -10900-fN -"PubkeyAuthentication=yes"-"StrictHostKeyChecking=false"-"PasswordAuthentication=no"-"ServerAliveInterval 60"-"ServerAliveCountMax 3"-1.1.1.1:10022:localhost:22 relayserver_user@1.1.1.1

“-M 10900” 選項指定中繼服務器上的監視端口,用於交換監視 SSH 會話的測試數據。中繼服務器上的其它程序不能使用這個端口。

“-fN” 選項傳遞給 ssh 命令,讓 SSH 隧道在后台運行。

“-o XXXX” 選項讓 ssh:

  • 使用密鑰驗證,而不是密碼驗證。
  • 自動接受(未知)SSH 主機密鑰。
  • 每 60 秒交換 keep-alive 消息。
  • 沒有收到任何響應時最多發送 3 條 keep-alive 消息。

其余 SSH 隧道相關的選項和之前介紹的一樣。

如果你想系統啟動時自動運行 SSH 隧道,你可以將上面的 autossh 命令添加到 /etc/rc.local。

 

總結

在這篇博文中,我介紹了你如何能從外部通過反向 SSH 隧道訪問限制性防火牆或 NAT 網關之后的 Linux 服務器。這里我介紹了家庭網絡中的一個使用事例,但在企業網絡中使用時你尤其要小心。這樣的一個隧道可能被視為違反公司政策,因為它繞過了企業的防火牆並把企業網絡暴露給外部攻擊。這很可能被誤用或者濫用。因此在使用之前一定要記住它的作用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM