Motivation
我搭建內網穿透,主要是因為在阿里云租的服務器配置較低搀暑,考慮到如果把一些web service放在阿里云上面運算沥阳,可能提不起來速度,也會消耗較多的云服務器資源自点,使得我能同時部署的項目變少桐罕。所以需要將service搭在內網,然后通過外網的ip訪問內網的服務桂敛。內網穿透負責讓內網的service端口A映射到外網的監(jiān)聽端口B功炮,反向代理讓外網的訪問端口C能和監(jiān)聽端口B連上。
這里介紹一種快捷埠啃、輕便的方案死宣。雖然有一些不足,但是很適合在完全不懂原理的情況下操作碴开。
然而我以后可能會直接使用內網穿透&反向代理(重劍無鋒)的方案了毅该。
介紹
最初在網上試了很多博秫,nginx,ngrok眶掌,ssh挡育,都有坑。最終還是萬能的github解決了問題朴爬。
這個rproxy項目主要基于go語言編寫即寒。代碼簡短,理解原理召噩、實際使用上都非常方便母赵。但是我試過之后無法實現(xiàn)ssh穿透。
這個tunnel項目主要用c語言編寫具滴,代碼也很簡單凹嘲。可以實現(xiàn)ssh构韵。有個不足是周蹭,它無法指定公網的對外ip,即公網的端口是變化的疲恢,所以運行之后凶朗,還要去阿里云上面開放端口,也有點蠢显拳。
所以還是推薦直接采用這個方案內網穿透&反向代理(重劍無鋒)
下面分為3個部分
- 安裝go語言
- 使用rproxy
- 使用tunnel
安裝go
- 自動安裝
最簡單的是用yum install golang
棚愤,但我沒成功,提示說沒golang這個包萎攒,所以要手動安裝遇八。 - 手動安裝
- 下包
直接進golang官網下載無法成功矛绘,沒能連出去耍休。所以去這個中文站手動下載。
下載之后解壓安裝货矮,目錄為/usr/local:tar -C /usr/local -xzf filename
羊精,由于版本不同,所以filename改成自己下的名字囚玫。 - 配置環(huán)境變量
vi /etc/profile
在最后加上下面3行
export GOROOT=/usr/local/go #設置為go安裝的路徑
export GOPATH=/code/goDemo #默認安裝包的路徑
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
更新配置文件source /etc/profile
- 查看版本信息:
go version
喧锦,如果有輸出就是成功。
使用rproxy做內網服務穿透
- 拉代碼:
git clone https://github.com/ying32/rproxy.git
- 給權限:
chmod a+x rproxy/*
- 編譯:
cd rproxy
go build
- 到了這里抓督。上面的代碼應該在服務端和客戶端上都執(zhí)行一遍燃少。
我們看一下服務端的runsrv.sh文件:vi runsrv.sh
。內容為:
./rproxy --tcpport=8818 --httpport=43006 --mode="server" --vkey="DKiic1g3kY"
# --tcpport 是 服務端 對客戶端 監(jiān)聽的端口
# --httpport 是 服務端 向外 開放的端口
# --mode 啟動模式铃在,server
# --vkey 客戶端與服務端建立連接時校驗的加密key阵具,簡單的碍遍。
再看一下客戶端的runcli.sh文件:vi runcli.sh
。內容為:
./rproxy --tcpport=8818 --httpport=8876 --mode="client" --svraddr="106._._._" --vkey="DKibg3kY"
# --tcpport 是 服務端 對客戶端 監(jiān)聽的端口
# --httpport 是 客戶端 向服務端 開放的端口
# --mode 默認為client
# --svraddr 為連接服務器的地址阳液,不需要填寫端口
# --vkey 客戶端與服務端建立連接時校驗的加密key怕敬,簡單的。
如果按我上述的端口設定帘皿,分別在客戶端和服務端運行程序东跪。
然后在其他機器用瀏覽器訪問106.\_.\_.\_:43006
就會先通過外網的43006端口,轉發(fā)到外網的8818端口鹰溜,再轉發(fā)到內網的8876虽填,達到了通過外網ip訪問內網8876端口上的服務的效果。
如果想讓終端關閉了曹动、進程還能繼續(xù)跑卤唉,可以使用nohup ./xxx.sh
運行程序
利用tunnel做ssh映射
由于rproxy沒法做ssh,其他的普通ssh方法鏈接效果有點不好仁期,雖然能成功桑驱,但是還是有掉線的問題。
可以選擇編譯項目跛蛋,然后運行tunnel和tunneld熬的,項目作者也直接提供了編譯好的文件,在這里赊级,可以直接在服務器運行tunneld和在客戶端運行tunnel押框,兩個命令解決。
- tunneld(服務器端)使用說明
執(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 就連接服務器成功了,address是映射到公網的IP和端口晋被,通過訪問address的IP和端口就可以訪問內部網絡服務了兑徘。
其他
ssh反向代理()
參考:
https://www.cnblogs.com/kwongtai/p/6903420.html
https://blog.csdn.net/sinat_27774177/article/details/76474834
問題描述:要讓外網的機器C通過阿里云上的B能連到內網的A,配置如下所示:
機器 | IP | user | pwd |
---|---|---|---|
局域網機器A | 192.168.. | student_docker | xxx |
阿里云機器B | 106._._._ | root | yyy |
先在A上操作:
ssh -fCNR 43005:localhost:22 root@106._._._
43005是指定B機器的端口羡洛,這里將B的43005和A的22映射
ssh -R 43004:localhost:22 root@106._._._
-
登去B挂脑,查看狀態(tài)
netstat -tnl
在B上操作:ssh -fCNL *:43004:localhost:43005 localhost
43004代表另一個映射,43005就是第一步指定的映射欲侮。在執(zhí)行ssh命令的時候崭闲,會讓輸入密碼,一個是遠程密碼威蕉,一個是內網密碼刁俭。
登去C,用ssh連接韧涨,
ssh -p 43004 student_docker@106._._._
輸入密碼xxx牍戚,成功登錄沙兰。
但是這種方式容易斷,然而我下載autossh又沒有成功翘魄,沒法開自動監(jiān)聽鼎天。
安裝ngrok實現(xiàn)內網穿透
參考:https://blog.csdn.net/truong/article/details/73250683
- 安裝依賴包
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
- 下載,配置暑竟,編譯斋射,啟動服務端
# 克隆ngrok git倉庫,
git clone https://github.com/inconshreveable/ngrok.git
cd ngrok
# 設定變量
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
# 復制秘鑰
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
# 服務端運行
bin/ngrokd -httpAddr=":8818"
- 啟動客戶端
mkdir ngrok
vi ngrok.cfg
# 輸入以下2行內容
server_addr: "106._._._:4443"
trust_host_root_certs: false
# 賦予權限
sudo chmod a+x ngrok
# 啟動客戶端但荤,將8080端口映射讓遠程監(jiān)聽
./ngrok -config=ngrok.cfg 8080