python内网穿透 开源_内网穿透系列——ngrok (老牌开源内网穿透工具)

一.前言

内网穿透,对于大部分的人来说其实没啥用,毕竟他们只要能上网就行,连路由器都是运营商上门配置完就万年不去动的。不过,总有一些喜欢折腾的人需要用到,毕竟运营商要么是不给公网IP,要么是懒得搞DDNS,要么是大部分端口都不让使用,在这种情况下,如果你还需要出门在外访问自己的路由器,自己的NAS,亦或是控制自家的设备上的Aria2来远程下载,那么你可能确实需要内网穿透工具了。

当然,对于开发者来说这个需求也是挺常见的,毕竟很多情况下开发网站啥的都会在本地调试,这时候如果要给你的老板或者客户演示,你肯定不能先找个环境去部署然后半天之后再给他们看,这时候一波内网穿透,把本地服务映射到公网上去,马上就能演示了。

二.介绍

内网穿透因为需求越来越多吧,所以现在也有了很多选择,既有许多服务商提供付费的服务,比如NAT123或者花生壳之类的,也有支持自建的比如ngrok,frp等等,本次我介绍的就是ngrok了,毕竟这个应该算是历史比较悠久,知道的人较多的了。

ngrok目前支持自建的开源版本是1.x版,这个版本的话怎么说呢,除了有内存、文件描述符泄漏的蛋疼BUG外(作者是这么说的),其实还是能用的,作者自己又搞了个2.x版本,不过不开源而是在自己的ngrok.com上用,不过么……这个貌似在国内访问貌似有问题来着,所以么,要么用公开的ngrok服务器,要么就是自己搭。本次我们介绍的就是自己搭(1.x版)

三.安装配置

因为ngrok也是用Go写的,所以需要安装Go,这里是为了稳妥配置了环境变量,你也可以试试直接通过yum来安装,我懒得试了

yum groupinstall "Development tools" -y

wget https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz

tar xzf go1.8.3.linux-amd64.tar.gz -C /usr/local

mkdir /usr/local/gopackage

vi /etc/profile

#在profile中加入下面的环境变量,PATH如果原来就有请自行合并

GOROOT=/usr/local/go

GOPATH=/usr/local/gopackage

PATH=$PATH:$GOROOT/bin:$GOPATH/bin

export GOROOT GOPATH PATH

source /etc/profile

git clone https://github.com/inconshreveable/ngrok.git ngrok

cd ngrok

#然后我们生成下新的证书替换默认的,最后的cp选y来覆盖

NGROK_DOMAIN="ngrok.miku.one"

openssl genrsa -out base.key 2048

openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.pem

openssl genrsa -out server.key 2048

openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr

openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt

cp base.pem assets/client/tls/ngrokroot.crt

make release-server release-client

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

yumgroupinstall"Development tools"-y

wgethttps://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz

tarxzfgo1.8.3.linux-amd64.tar.gz-C/usr/local

mkdir/usr/local/gopackage

vi/etc/profile

#在profile中加入下面的环境变量,PATH如果原来就有请自行合并

GOROOT=/usr/local/go

GOPATH=/usr/local/gopackage

PATH=$PATH:$GOROOT/bin:$GOPATH/bin

exportGOROOTGOPATHPATH

source/etc/profile

gitclonehttps://github.com/inconshreveable/ngrok.git ngrok

cdngrok

#然后我们生成下新的证书替换默认的,最后的cp选y来覆盖

NGROK_DOMAIN="ngrok.miku.one"

opensslgenrsa-outbase.key2048

opensslreq-new-x509-nodes-keybase.key-days10000-subj"/CN=$NGROK_DOMAIN"-outbase.pem

opensslgenrsa-outserver.key2048

opensslreq-new-keyserver.key-subj"/CN=$NGROK_DOMAIN"-outserver.csr

opensslx509-req-inserver.csr-CAbase.pem-CAkeybase.key-CAcreateserial-days10000-outserver.crt

cpbase.pemassets/client/tls/ngrokroot.crt

makerelease-serverrelease-client

OK,如果没有报错的话你会在bin目录下看到服务端和客户端的可执行文件了,还有个go-bindata不知道有啥用,别管它了

./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="ngrok.miku.one" -httpAddr=":8081" -httpsAddr=":8082" -tunnelAddr=":4443"

1

./bin/ngrokd-tlsKey=server.key-tlsCrt=server.crt-domain="ngrok.miku.one"-httpAddr=":8081"-httpsAddr=":8082"-tunnelAddr=":4443"

这样就把服务端跑起来了

好了,之前生成了Linux下的客户端,很多情况下我们用的是Windows或者macOS,这就需要我们编译其它平台的客户端了

#编译Mac的客户端

GOOS=darwin GOARCH=amd64 make release-client

#编译Windows的客户端

GOOS=windows GOARCH=amd64 make release-client

1

2

3

4

5

#编译Mac的客户端

GOOS=darwinGOARCH=amd64makerelease-client

#编译Windows的客户端

GOOS=windowsGOARCH=amd64 makerelease-client

在bin下会多出文件夹,里面就是你的客户端了,这样我们就能继续了

在你的客户端保存目录下创建配置文件ngrok.cfg,内容如下(其实下面的那些参数也能写在配置文件里,看你需要吧)

server_addr: ngrok.miku.one:4443

trust_host_root_certs: false

1

2

3

在你的客户端保存目录下创建配置文件ngrok.cfg,内容如下(其实下面的那些参数也能写在配置文件里,看你需要吧)

server_addr:ngrok.miku.one:4443

trust_host_root_certs:false

如果要全写在一个配置文件里,参照下面的,更多的可以自己琢磨

(这种情况下启动用)

ngrok -config ngrok.cfg start localweb ssh

1

ngrok-configngrok.cfgstartlocalwebssh

server_addr: ngrok.miku.one:4443

trust_host_root_certs: false

tunnels:

localweb:

proto:

http: "80"

ssh:

remote_port: 8022

proto:

tcp: "22"

1

2

3

4

5

6

7

8

9

10

server_addr:ngrok.miku.one:4443

trust_host_root_certs:false

tunnels:

localweb:

proto:

http:"80"

ssh:

remote_port:8022

proto:

tcp:"22"

然后在CMD或者PowerShell或者终端内执行如下命令

subdomain指定的是子域名(tcp下无效),proto指定协议(tcp、http、https),config指定配置文件,最后是你要映射出去的本地端口(如果前面加了IP地址那就是映射其它IP的对应端口)

ngrok -subdomain test -proto=http -config=ngrok.cfg 80

1

ngrok-subdomaintest-proto=http-config=ngrok.cfg80

(-httpauth "user:password" 这个可以添加简单的http验证)

当显示为online的时候我们就连上服务器了,Forwarding后面的即是映射地址—>本地地址

而Web Interface后面的则是本地的一个WebGUI用于查看转发的数据

这里举的是http转发的栗子,如果我们要搞https转发,建议搞张正规的证书,省得红锁了,可以用let's encrypt签,这儿就不说了。

当然tcp转发会更灵活,可以用于把本地路由器啊,树莓派啥的给映射出去,玩法更多了,这儿我就不介绍了

四.附

这俩是ngrok的客户端,一个是c写的,一个是Python写的,适用于特定环境(比如路由器这种存储空间很小,尽量节省资源啥的)

你可能感兴趣的:(python内网穿透 开源_内网穿透系列——ngrok (老牌开源内网穿透工具))