內(nèi)網(wǎng)穿透&反向代理(奇技淫巧)

Motivation

我搭建內(nèi)網(wǎng)穿透,主要是因為在阿里云租的服務(wù)器配置較低,考慮到如果把一些web service放在阿里云上面運(yùn)算,可能提不起來速度,也會消耗較多的云服務(wù)器資源,使得我能同時部署的項目變少。所以需要將service搭在內(nèi)網(wǎng),然后通過外網(wǎng)的ip訪問內(nèi)網(wǎng)的服務(wù)。內(nèi)網(wǎng)穿透負(fù)責(zé)讓內(nèi)網(wǎng)的service端口A映射到外網(wǎng)的監(jiān)聽端口B,反向代理讓外網(wǎng)的訪問端口C能和監(jiān)聽端口B連上。
這里介紹一種快捷、輕便的方案。雖然有一些不足,但是很適合在完全不懂原理的情況下操作。
然而我以后可能會直接使用內(nèi)網(wǎng)穿透&反向代理(重劍無鋒)的方案了。

介紹

最初在網(wǎng)上試了很多,nginx,ngrok,ssh,都有坑。最終還是萬能的github解決了問題。
這個rproxy項目主要基于go語言編寫。代碼簡短,理解原理、實際使用上都非常方便。但是我試過之后無法實現(xiàn)ssh穿透。
這個tunnel項目主要用c語言編寫,代碼也很簡單。可以實現(xiàn)ssh。有個不足是,它無法指定公網(wǎng)的對外ip,即公網(wǎng)的端口是變化的,所以運(yùn)行之后,還要去阿里云上面開放端口,也有點蠢。
所以還是推薦直接采用這個方案內(nèi)網(wǎng)穿透&反向代理(重劍無鋒)

下面分為3個部分

  • 安裝go語言
  • 使用rproxy
  • 使用tunnel

安裝go

  • 自動安裝
    最簡單的是用yum install golang,但我沒成功,提示說沒golang這個包,所以要手動安裝。
  • 手動安裝
  1. 下包
    直接進(jìn)golang官網(wǎng)下載無法成功,沒能連出去。所以去這個中文站手動下載。
    下載之后解壓安裝,目錄為/usr/local:tar -C /usr/local -xzf filename,由于版本不同,所以filename改成自己下的名字。
  2. 配置環(huán)境變量
    vi /etc/profile在最后加上下面3行
export GOROOT=/usr/local/go #設(shè)置為go安裝的路徑
export GOPATH=/code/goDemo #默認(rèn)安裝包的路徑
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

更新配置文件source /etc/profile

  1. 查看版本信息:go version,如果有輸出就是成功。
    golang成功安裝

使用rproxy做內(nèi)網(wǎng)服務(wù)穿透

  1. 拉代碼:git clone https://github.com/ying32/rproxy.git
  2. 給權(quán)限:chmod a+x rproxy/*
  3. 編譯:
cd rproxy
go build
  1. 到了這里。上面的代碼應(yīng)該在服務(wù)端和客戶端上都執(zhí)行一遍。

我們看一下服務(wù)端的runsrv.sh文件:vi runsrv.sh。內(nèi)容為:

./rproxy --tcpport=8818 --httpport=43006 --mode="server" --vkey="DKiic1g3kY"
# --tcpport 是 服務(wù)端 對客戶端 監(jiān)聽的端口
# --httpport 是 服務(wù)端 向外 開放的端口
# --mode 啟動模式,server
# --vkey 客戶端與服務(wù)端建立連接時校驗的加密key,簡單的。

再看一下客戶端的runcli.sh文件:vi runcli.sh。內(nèi)容為:

./rproxy --tcpport=8818 --httpport=8876 --mode="client" --svraddr="106._._._" --vkey="DKibg3kY"
# --tcpport 是 服務(wù)端 對客戶端 監(jiān)聽的端口
# --httpport 是 客戶端 向服務(wù)端 開放的端口
# --mode 默認(rèn)為client
# --svraddr 為連接服務(wù)器的地址,不需要填寫端口
# --vkey 客戶端與服務(wù)端建立連接時校驗的加密key,簡單的。

如果按我上述的端口設(shè)定,分別在客戶端和服務(wù)端運(yùn)行程序。
然后在其他機(jī)器用瀏覽器訪問106.\_.\_.\_:43006
就會先通過外網(wǎng)的43006端口,轉(zhuǎn)發(fā)到外網(wǎng)的8818端口,再轉(zhuǎn)發(fā)到內(nèi)網(wǎng)的8876,達(dá)到了通過外網(wǎng)ip訪問內(nèi)網(wǎng)8876端口上的服務(wù)的效果。

成功穿到內(nèi)網(wǎng)的tensorboard

如果想讓終端關(guān)閉了、進(jìn)程還能繼續(xù)跑,可以使用nohup ./xxx.sh運(yùn)行程序

利用tunnel做ssh映射

由于rproxy沒法做ssh,其他的普通ssh方法鏈接效果有點不好,雖然能成功,但是還是有掉線的問題。
可以選擇編譯項目,然后運(yùn)行tunnel和tunneld,項目作者也直接提供了編譯好的文件,在這里,可以直接在服務(wù)器運(yùn)行tunneld和在客戶端運(yùn)行tunnel,兩個命令解決。

  • tunneld(服務(wù)器端)使用說明
    執(zhí)行 tunneld 文件
tunneld
Enter listening port(default 8877):8877
Enter connection password(default maqian.cc):maqian.cc
Port:8877, Password:maqian.cc
Listening...

這時 tunneld 已啟動成功,等待客戶端連接。

  • tunnel(客戶端)使用說明
    執(zhí)行 tunnel 文件
tunnel
Enter server IP:xx.xx.xxx.xxx
Enter server port(default 8877):8877
Enter connection password(default maqian.cc):maqian.cc
Enter local port:22
Server IP:xx.xx.xxx.xxx, Server Port:8877, Password:maqian.cc, Local Port:22
Successfully connected, address: xx.xx.xxx.xxx:45915

這樣 tunnel 就連接服務(wù)器成功了,address是映射到公網(wǎng)的IP和端口,通過訪問address的IP和端口就可以訪問內(nèi)部網(wǎng)絡(luò)服務(wù)了。

客戶端連接服務(wù)器成功
登錄客戶端成功

其他

ssh反向代理()

參考:
https://www.cnblogs.com/kwongtai/p/6903420.html
https://blog.csdn.net/sinat_27774177/article/details/76474834

問題描述:要讓外網(wǎng)的機(jī)器C通過阿里云上的B能連到內(nèi)網(wǎng)的A,配置如下所示:

機(jī)器 IP user pwd
局域網(wǎng)機(jī)器A 192.168.. student_docker xxx
阿里云機(jī)器B 106._._._ root yyy
  1. 先在A上操作:ssh -fCNR 43005:localhost:22 root@106._._._
    43005是指定B機(jī)器的端口,這里將B的43005和A的22映射
    ssh -R 43004:localhost:22 root@106._._._

  2. 登去B,查看狀態(tài)netstat -tnl
    在B上操作:ssh -fCNL *:43004:localhost:43005 localhost
    43004代表另一個映射,43005就是第一步指定的映射。

    在執(zhí)行ssh命令的時候,會讓輸入密碼,一個是遠(yuǎn)程密碼,一個是內(nèi)網(wǎng)密碼。

  3. 登去C,用ssh連接,ssh -p 43004 student_docker@106._._._
    輸入密碼xxx,成功登錄。

但是這種方式容易斷,然而我下載autossh又沒有成功,沒法開自動監(jiān)聽。

安裝ngrok實現(xiàn)內(nèi)網(wǎng)穿透

參考:https://blog.csdn.net/truong/article/details/73250683

  1. 安裝依賴包
    yum install zlib-devel openssl-devel perl hg cpio expat-devel gettext-devel curl curl-devel perl-ExtUtils-MakeMaker hg wget gcc gcc-c++ golang
  2. 下載,配置,編譯,啟動服務(wù)端
# 克隆ngrok git倉庫,
git clone https://github.com/inconshreveable/ngrok.git

cd ngrok
# 設(shè)定變量
NGROK_DOMAIN="106._._._"

# 生成秘鑰
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "106._._._" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "106._._._" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

# 復(fù)制秘鑰
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt
cp device.key assets/server/tls/snakeoil.key

# 編譯
make release-server
make release-client
# 服務(wù)端運(yùn)行
bin/ngrokd -httpAddr=":8818"
  1. 啟動客戶端
mkdir ngrok
vi ngrok.cfg

# 輸入以下2行內(nèi)容
server_addr: "106._._._:4443"
trust_host_root_certs: false

# 賦予權(quán)限
sudo chmod a+x ngrok
# 啟動客戶端,將8080端口映射讓遠(yuǎn)程監(jiān)聽
./ngrok -config=ngrok.cfg 8080
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容