阿里雲服務器上配置ssh反向代理

  本文的內容可能偏運維,不是因爲搞這個方向,而是確實存在一些坑,而且這些坑可能會被很多人踩。可能之前很多人在阿里雲上配置個ssh反向代理,簡單的裝個autossh,然後一條命令就搞定了。但是我最近在使用了阿里雲的輕應用服務器。但是配置好autossh命令之後,在服務器的防火牆上配置了安全規則之後,發現奇怪的一幕。就是autossh已經配置成功了,在雲服務器上使用本地地址和端口可以訪問目的主機的ssh了,但是無法通過外網訪問。
阿里雲防火牆規則
  首先還是從普通的配置ssh反向代理開始,爲了讓目的(學校或者家裏)的主機能夠被其他地方的主機訪問,但是目的主機一般都沒有公網ip,也就是能夠被公網所看到的的ip。但是我們有一臺有公網ip的主機(從雲服務供應商那裏獲得的),這個時候我們需要讓我們租來的這個公網服務器做一個反向代理。
  如果我們要連接目的主機的ssh服務,但是目的主機的ssh可以開啓,還是沒有公網ip,主機所使用的的ip早都被路由器過濾掉了。這個時候想要連接,也是通過公網服務器做這個反向代理。
  通俗來說,就是我們讓目的主機主動告訴公網主機,我在什麼什麼地方。因爲有公網ip,公網主機是可以被目的主機訪問到的。不光告訴你,我在哪,我還用公網主機的一個端口來映射我的一個端口。這樣就能建立一個隧道,訪問公網主機的這個端口,相當於就是訪問目的主機映射的這個端口。
  顯然如果目的主機映射的這個端口是ssh端口的時候(一般是22),這樣訪問公網主機對應的端口,就相當於訪問目的ssh端口了。這個隧道可以通過ssh命令+參數來建立,但是又弊端,這裏直接越過ssh配置的細節和ssh的原理跳到autossh。

使用autossh來讓目的主機在公網主機上建立這個端口映射

  這裏假設目的主機已經安裝好autossh,這個時候就可以使用autossh -M 12345 -gfnNTR 公網主機ip:映射端口:localhost:ssh端口 公網主機登錄用戶名@公網主機ip -o ServerAliveInterval=300。大致解釋一下命令的含義公網主機ip就是上面提到的,可以通過任意聯網主機訪問的主機,一般從雲服務提供商那裏獲得。映射端口表示在公網主機上映射ssh使用的端口。因爲是在目的主機上輸入這個命令,所以使用的localhost。ssh端口表示要開啓ssh服務的主機端口,這個可以設置(默認22)。後面就是和ssh登錄一樣使用的 登錄用戶名@公網主機ip
  至於命令中的參數,大部分都是ssh的參數,大家可以不用理會。最後的-o ServerAliveInterval=300表示300秒監聽一次,如果這個命令沒執行,則運行這個命令。具體原理不細講。一般這個時候就需要輸入公網主機的登錄密碼了。但是每次執行的時候需要輸入密碼不方便。
  ssh登錄可以免密登錄,因爲是目的主機請求公網主機代理自己,所以目的主機需要對公網主機有免密登錄權限。如何實現,只需要把目的主機的 id_rsa.pub,這個文件一般在各個用戶的 ~/.ssh/目錄下,需要把這個文件中的內容寫入到公網主機的對應用戶的~/.ssh/authorized_keys的文件中去。當然也可以通過一條命令,就是ssh-copy-id 公網主機用戶名@公網主機ip -p:公網主機ssh對應的端口。執行成功後,可以ssh連接公網主機,看是否配置成功。
  免密登錄只需要配置一次,但是每次啓動主機之後都需要輸入一次autossh命令,當然還有更好的解決方式,就是將autossh放在目的主機的啓動命令中。爲了開機啓動,autossh命令可以寫在/etc/init.d/autossh中配置開機啓動服務,也可以寫在/etc/rc.local腳本文件中,但是這兩種方式涉及系統的啓動,新手可以跳過。也可以寫在crontab中,使用crontab -e寫入,不過這裏寫入就要加執行的時間設置。這個命令不能被寫在bashrc或者profile等文件中,因爲需要先於這些腳本的執行。
  以下給出一種crontab的配置,不是最優配置,但是可以滿足需求的。具體配置參數含義大家自行學習。

autossh -M 12345 -gfnNTR 公網主機ip:映射端口:localhost:ssh端口 公網主機登錄用戶名@公網主機ip -o ServerAliveInterval=300

  但是autossh命令是通過直接對端口服務進行代理的,這種方式可能會被阿里雲禁止,即便代理成功,也是無法通過外網訪問相應的服務,這就是我踩的坑了。

通過frp實現點對點的代理

  因爲這些端口並非是真的無法對外開放,只是被做了限制。autossh無法有效穿透內網把服務端口暴露出來。但是可以通過給服務加一層殼的方式,使得服務端口能夠暴露出來。至於frp還可以做web服務器的穿透,以及局域網的穿透之類的功能原理類似,這裏不詳細講解。建議查閱官方文檔。
  要使用frp,首先就是公網服務器和目標服務器都需要安裝,安裝的過程也是很簡單。找好版本,然後直接下載即可。下面給出ubuntu上命令行操作的流程。
  首先在github頁面的版本頁面,查看相應的版本。事實上這裏可以直接在這個頁面複製下載地址了。如果是ubuntu系統,則複製_linux_amd64.tar.gz後綴的下載文件。然後得到這樣一個地址:https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz,變化的只是中間的兩個版本號。
在這裏插入圖片描述
  然後到服務器上,可以創建一個/etc/frp目錄,通常需要權限。然後執行以下命令進行下載。之後對下載的文件進行解壓。

mkdir /etc/frp
wget https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz 
sudo tar xzvf frp_0.33.0_linux_amd64.tar.gz
cd frp_0.33.0_linux_amd64 #進入解壓的目錄

  接下來就是配置環節。

frp公網主機配置(服務器)

  公網主機也就是我們的服務器,主要關注frps和frps.ini這兩個文件,需要配置的地方就是frps.ini這個配置文件。配置內容如下。

  # frps.ini
  [common]
  bind_port = 7000

  注意這個7000,表示frp服務運行的端口,這個端口需要是對外開放的,也就是能夠被目標服務器所訪問的端口。陪之後之後,然後執行./frps -c ./frps.ini命令,表示在公網主機上啓動frps服務,讓其作爲服務器。
  需要注意的是這個命令執行後,如果遇到斷網等情況就會斷開連接,還是用到我們後臺運行任務的老技術,nohup 或者其他命令行管理工具,如tmux完成。

frp目標主機的配置(客戶機)

  安裝是同樣的過程,但是在配置上有所差異。這裏主要關注frpc和frpc.ini兩個文件。配置同樣是ini文件,修改他即可。

# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 8000

  這裏的 server_addr和 server_port寫的就是我們的公網主機的地址,和frps服務所運行的端口。然後我們建立一個ssh連接,ssh的協議類型是tcp。我們需要代理的是本機的ssh,下面就寫本機的地址,和需要代理的端口。之後remote_port 表示使用公網主機的這個端口來代理我們的服務,這裏就是ssh服務。
  然後執行./frpc -c ./frpc.ini``就可以把客戶機的frp服務也啓動起來,這樣就可以通過訪問公網主機的8000端口,來訪問目標主機的22端口。
  整個配置過程也比較簡單,同樣是上面的frpc命令可以改爲後臺任務。防止斷掉。
  需要配置web服務或者內網代理也是同樣的操作,區別就在於端口的配置上,操作起來也是比較簡單,大家有需要可以自行查閱相關文檔完成。而且好像有些功能nginx也可以完成。
  文中涉及到的一些linux基礎可能詳略不當,歡迎大家指出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章