1. 程式人生 > >使用SSH反向隧道進行內網穿透

使用SSH反向隧道進行內網穿透

這篇文章主要介紹瞭如何利用SSH 反向隧道穿透NAT,並演示瞭如何維持一條穩定的SSH 隧道。

假設有機器A 和B,A 有公網IP,B 位於NAT 之後並無可用的埠轉發,現在想由A 主動向B 發起SSH 連線。由於B 在NAT 後端,無可用公網IP + 埠 這樣一個組合,所以A 無法穿透NAT,這篇文章應對的就是這種情況。

首先有如下約定,因為很重要所以放在前面:

機器代號 機器位置 地址 賬戶 ssh/sshd 埠 是否需要執行sshd
A 位於公網 a.site usera 22
B 位於NAT 之後 localhost userb 22
C 位於NAT 之後 localhost userc 22

這裡預設你的系統init 程式為systemd,如果你使用其他的init 程式,如果沒有特殊理由還是換到一個現代化的GNU/Linux 系統吧……

SSH 反向隧道

這種手段實質上是由B 向A 主動地建立一個SSH 隧道,將A 的6766 埠轉發到B 的22 埠上,只要這條隧道不關閉,這個轉發就是有效的。有了這個埠轉發,只需要訪問A 的6766 埠反向連線B 即可。

首先在B 上建立一個SSH 隧道,將A 的6766 埠轉發到B 的22 埠上:

1 B $ ssh -p 22 -qngfNTR 6766
:localhost:22 [email protected]a.site

然後在A 上利用6766 埠反向SSH 到B:

1 A $ ssh -p 6766 userb@localhost

要做的事情其實就是這麼簡單。

隧道的維持

穩定性維持

然而不幸的是SSH 連線是會超時關閉的,如果連線關閉,隧道無法維持,那麼A 就無法利用反向隧道穿透B 所在的NAT 了,為此我們需要一種方案來提供一條穩定的SSH 反向隧道。

一個最簡單的方法就是autossh,這個軟體會在超時之後自動重新建立SSH 隧道,這樣就解決了隧道的穩定性問題,如果你使用Arch Linux

,你可以這樣獲得它:

1 $ sudo pacman -S autossh

下面在B 上做之前類似的事情,不同的是該隧道會由autossh 來維持:

1 B $ autossh -p 22 -M 6777 -NR 6766:localhost:22 [email protected]a.site

-M 引數指定的埠用來監聽隧道的狀態,與埠轉發無關。

之後你可以在A 上通過6766 埠訪問B 了:

1 A $ ssh -p 6766 userb@localhost

隧道的自動建立

然而這又有了另外一個問題,如果B 重啟隧道就會消失。那麼需要有一種手段在B 每次啟動時使用autossh 來建立SSH 隧道。很自然的一個想法就是做成服務,之後會給出在systemd 下的一種解決方案。

“打洞”

之所以標題這麼起,是因為自己覺得這件事情有點類似於UDP 打洞,即通過一臺在公網的機器,讓兩臺分別位於各自NAT 之後的機器可以建立SSH 連線。

下面演示如何使用SSH 反向隧道,讓C 連線到B。

首先在A 上編輯sshd 的配置檔案/etc/ssh/sshd_config,將GatewayPorts 開關開啟:

1 GatewayPorts yes

然後重啟sshd

1 A $ sudo systemctl restart sshd

然後在B 上對之前用到的autossh 指令略加修改:

1 B $ autossh -p 22 -M 6777 -NR '*:6766:localhost:22' [email protected]a.site

之後在C 上利用A 的6766 埠SSH 連線到B

1 C $ ssh -p 6766 [email protected]a.site

至此你已經輕而易舉的穿透了兩層NAT。

最終的解決方案

整合一下前面提到的,最終的解決方案如下:

首先開啟A 上sshd 的GatewayPorts 開關,並重啟sshd(如有需要)。

然後在B 上新建一個使用者autossh,根據許可權最小化思想,B 上的autossh 服務將以autossh 使用者的身份執行,以盡大可能避免出現安全問題:

12 B $ sudo useradd -m autosshB $ sudo passwd autossh

緊接著在B 上為autossh 使用者建立SSH 金鑰,並上傳到A:

123 B $ su - autosshB $ ssh-keygen -t 'rsa' -C '[email protected]'B $ ssh-copy-id usera@a.site

注意該金鑰不要設定密碼,也就是執行ssh-keygen 指令時儘管一路回車,不要輸入額外的字元。

然後在B 上建立以autossh 使用者許可權呼叫autossh 的service 檔案。將下面文字寫入到檔案/lib/systemd/system/autossh.service,並設定許可權為644:

123456789101112131415 [Unit]Description=Auto SSH TunnelAfter=network-online.target[Service]User=autosshType=simpleExecStart=/bin/autossh -p 22 -M 6777 -NR '*:6766:localhost:22' [email protected] -i /home/autossh/.ssh/id_rsaExecReload=/bin/kill -HUP $MAINPIDKillMode=processRestart=always[Install]WantedBy=multi-user.targetWantedBy=graphical.target

在B 上讓network-online.target 生效:

1 B $ systemctl enable NetworkManager-wait-online

如果你使用systemd-networkd,你需要啟用的服務則應當是systemd-networkd-wait-online 。

然後設定該服務自動啟動:

1 B $ sudo systemctl enable autossh

如果你願意,在這之後可以立刻啟動它:

1 B $ sudo systemctl start autossh

然後你可以在A 上使用這條反向隧道穿透B 所在的NAT SSH 連線到B:

1 A $ ssh -p 6766 userb@localhost

或者是在C 上直接穿透兩層NAT SSH 連線到B:

1 C $ ssh -p 6766 [email protected]a.site

如果你對SSH 足夠熟悉,你可以利用這條隧道做更多的事情,例如你可以在反向連線時指定動態埠轉發:

1 C $ ssh -p 6766 -qngfNTD 7677 [email protected]a.site

假設C 是你家中的電腦,A 是你的VPS,B 是你公司的電腦。如果你這樣做了,那麼為瀏覽器設定埠為7677 的sock4 本地(localhost)代理後,你就可以在家裡的瀏覽器上看到公司內網的網頁。

相關推薦

SSH反向隧道進行穿透

對應的情況 這篇文章主要介紹瞭如何利用SSH 反向隧道穿透NAT,並演示瞭如何維持一條穩定的SSH 隧道。 假設有機器A 和B,A 有公網IP,B 位於NAT 之後並無可用的埠轉發,現在想由A 主動向B 發起SSH 連線。由於B 在NAT 後端,無可用公網IP + 埠 這樣一個組合,所以

使用SSH反向隧道進行穿透

這篇文章主要介紹瞭如何利用SSH 反向隧道穿透NAT,並演示瞭如何維持一條穩定的SSH 隧道。 假設有機器A 和B,A 有公網IP,B 位於NAT 之後並無可用的埠轉發,現在想由A 主動向B 發起SSH 連線。由於B 在NAT 後端,無可用公網IP + 埠 這樣一個組合,所以A 無法穿透NAT,這篇文章

SSH反向隧道穿透

pre ssp sts mnt ast rap root eve ports 環境如下: A機器兩塊網卡eth0(192.168.0.173)、eth1(192.168.100.1),eth0可以上外網,eth1僅僅是內部網絡,B機器只有eth1(192.168.100.3

如何用ngrok進行穿透

2.點選左側選單“隧道管理”——>“開通隧道”,進入頁面後點擊購買免費版,進入頁面進行如下操作:“隧道名稱”隨便填入資訊,這裡填入“xxxxxx”;“前置域名”填入xxxxx(如lybwechat);“本地埠”為127.0.0.1:8080(這個可以改,只要與tom

Centos7.5使用nat123進行穿透(外可以訪問區域網機器)

關於nat123 畢設在實驗室部署了三臺機器,部署了一套k8s的環境,因為平時在外實習,無法在內網操作到實際的機器,故選擇對其中的一臺機器k8s-master進行內網穿透,再由這一臺通過ssh去訪問另外的兩臺機器。 之前使用的是實驗室師哥推薦的花生殼,方便簡單容易使用,

Springboot2(27)整合netty實現反向代理(穿透

原始碼地址 springboot2教程系列 其它netty檔案有部落格 Springboot2(24)整合netty實現http服務(類似SpingMvc的contoller層實現) Springboot2(25)整合netty實現檔案傳輸 Spri

花生殼申請域名並進行穿透

使用花生殼可以免費申請一個域名,將域名進行內網穿透,便可以將自己東西分享到公網上,下面介紹如何申請花生殼的免費域名。 1.進入花生殼官網:點選進入 2.註冊個人賬號。 3.登入賬號,進入花生殼。 4.在左邊選單欄,選擇“域名”,進入“殼域名”頁面,在頁面右上

使用VNC軟體與花生殼進行穿透實現在嵌入式平臺中進行廣域網下的遠端控制

在嵌入式平臺中如何實現廣域網下的遠端登入控制? 文章目錄 1 專案需要 2 解決方案 3 首先實現區域網下的VNC遠端控制 4 總結 1 專案需要

十分鐘快速搭建frp的ssh和http的穿透

frp簡介 frp 是一個可用於內網穿透的高效能的反向代理應用,支援 tcp, udp, http, https 協議。frp目前最新版本為0.13.0,frp目前仍然處於前期開發階段,未經充分測試與驗證,不推薦用於生產環境。 其實關於frp的使用官方文件已

使用 ssh 反向隧道穿透 NAT 訪問 Linux 主機

前言 由於公司經常會有專案需要去業主那邊搭建伺服器,基本不需要什麼流量所以就準備用 4G 網絡卡搭建。而該網絡卡無固定公網 ip,只有內網 ip,我們目的就是為了可以遠端操控以避免有時因業務需要往業主那邊跑,要是地方比較遠來回一趟也得花個把星期,不划算。所以就

穿透 - SSH反向代理

SSH反向代理有著很廣泛的實際應用, 例項描述: 本人在家庭區域網放置有一個樹莓派主機(無公網ip),正常情況下只能在家庭區域網內通過 ssh連線這臺樹莓派主機,但如果本人想在其他地方(非本地區域網)對它進行遠端登陸,則需要進行SSH反向代理。 如下圖示例,我的樹莓派主機A可以pin

SSH隧道與埠轉發及穿透繫結本地埠

ssh是一種安全的傳輸協議,我一般使用就是在登陸伺服器或遠端執行命令,最近我意識到這是個強大的命令。 開講~ 本地ssh隧道 工作中由於防火牆導致訪問某些網站或某些ftp連線超時,有什麼解決辦法呢。ssh隧道就是一種解決方式。 首先你需要了解一些資訊: 你自己

ssh反向代理實現NAT穿透[ssh版teamviewer]

由於實驗室伺服器沒有公網IP,如果在校外網的話只能通過teamviewer遠端桌面連線,然而teamviewer的資料傳輸是基於影象的,反應太慢了,所以一直在尋找ssh版的teamviewer,經過谷歌,發現只需要一臺公網伺服器作為中轉站,就可以實現在任何地方登

通過ssh反向隧道及nginx反向代理實現外控制nodemcu晶片

基本思路:通過ssh反向隧道實現外網伺服器埠到內網中繼伺服器埠的轉發,通過配置內網中級伺服器nginx反向代理,將外網發過來的請求轉發到目標伺服器上。最後實現通過訪問外網ip轉到訪問內網的目標伺服器。 (一)ssh反向隧道將外網伺服器埠轉發到內網中繼伺服器指定埠 (1)首

SSH隧道與埠轉發穿透

SSH隧道與埠轉發及內網穿透 大家都知道SSH是一種安全的傳輸協議,用在連線伺服器上比較多。不過其實除了這個功能,它的隧道轉發功能更是吸引人。下面是個人根據自己的需求以及在網上查詢的資料配合自己的實際操作所得到的一些心得。 SSH/plink命令的基

利用ngrok穿透 遠端連線手機ssh終端

圖片好大 臥槽 首先手機利用linux deploy安裝了Kali Linux 然後配置好linux的sshd_config 接下來是重點 1.首先在同一個區域網內ssh連線手機中的kali 2.安裝w3m(apt-get install w3m) 3.然後 w3m ngrok.com/d

frp 穿透實現 ssh 訪問主機

本文目的 frp 是一個可用於內網穿透的高效能的反向代理應用,支援 tcp, udp, http, https 協議。 本文將基於 frp 來實現內網穿透,從而實現從外網 ssh 登入內網主機,而不對 frp 其他的應用做過多的說明。 frp 的作用

穿透 frp,ssh遠端訪問

內網穿透 frp 1,使用谷歌雲,伺服器端安裝frp 1.1,下載Linux 64 位frp版本 2,客戶端配置 3,ssh連線 4,使用supervisor設定開機啟動,程序守護 4.1 報錯 gave u

利用阿里雲和frps做穿透,支援mstsc遠端桌面,ssh,linux連線,所有的tcp 連線都可以轉發 整理by qiweb 2018 1107

準備工作和操作過程: 1、先要有一臺阿里雲或者其他vps 這裡假設外網唯一ip是: 另外要開放一個一個區間的埠號 比如1701 -1750 這些供客戶使用 47.98.195.221 frp官網 到官網下載需要的版本,我這裡都是linux版本 window也能用

利用ssh反向隧道將家裡的樹莓派提供給外訪問

參考文件 其實步驟很簡單,但是有一個必要條件,就是必須有一臺擁有外網ip的伺服器,本文使用的國外vultr提供的虛擬伺服器,將它作為ssh反向隧道的中轉站。 以下是三臺機器的描述。 機器代號 機器位置 地址 賬戶 埠 是否執行sshd