12月18日更新 添加 frp 配置
内网穿透,无需多言,用处多多。首先强力推荐一款Sunny大大搭建的ngrok服务好用的不行,并且有免费选项,感受平时够用了。那么,为何本身还要搭建一个呢?可能刚刚看过两眼的docker入门,想来尝试一下吧。恩,也多是闲的吧┑( ̄Д  ̄)┍node
ps: ngrok 2版本已商业化,开源的只到1.7版本,据说会有些性能问题。还有一款基于go的开源的内网穿透工具frp 在末尾添加了frp 的配置linux
至于玩法,1)能够将本地的server的端口代理到外网可访问,便于微信开发或者暴露内网的服务器等。2)能够代理ssh 链接,好比能够链接家里的树莓派。nginx
ps:在使用docker-compose 集成Nginx反向代理时 发现暴露的端口有点多,何况nginx都是服务端的标配了,因此就去掉了。╮( ̄▽ ̄")╭ git
仍是直接上实在的吧(如下命令基于Ubuntu):github
域名golang
服务器web
容器化docker
$ cd /usr/local $ git clone https://github.com/inconshreveable/ngrok.git
$ export GOPATH=/usr/local/ngrok/ #目录位置 $ export NGROK_DOMAIN="ngrok.yourset.com" #你的ngrok服务二级域名
openssl genrsa -out rootCA.key 2048 openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.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 rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
cp rootCA.pem assets/client/tls/ngrokroot.crt cp server.crt assets/server/tls/snakeoil.crt cp server.key assets/server/tls/snakeoil.key
编译服务端的 ngrokd(客户端和服务端生成的文件均在/usr/local/ngrok/bin下)vim
$ GOOS=linux GOARCH=amd64 make release-server #根据平台选取
编译客户端 ngrok(可生成压缩包下载到本地而后放到网盘存起来?方便之后使用)windows
$ GOOS=darwin GOARCH=amd64 make release-client #mac 64 $ GOOS=windows GOARCH=amd64 make release-client #win64 $ GOOS=linux GOARCH=amd64 make release-client #linux64 $ GOOS=linux GOARCH=arm make release-client #arm平台如树莓派
$ /usr/local/ngrok/bin/ngrokd -domain="ngrok.yourset.com" -httpAddr=":2443" -httpsAddr=":3443" -tunnelAddr=":4443" 参数说明: -domain 访问ngrok是所设置的服务地址生成证书时那个 -httpAddr http协议端口 默认为80 -httpsAddr https协议端口 默认为443 (可配置https证书) -tunnelAddr 通道端口 默认4443
将客户端放到本身喜欢的位置并在当前目录下建立配置文件
$ vi ngrok.yml
写入以下内容
server_addr: "ngrok.yourset.com:4443" trust_host_root_certs: false
启动客户端命令
$ ./ngrok -config=./ngrok.yml -proto=http -subdomain=test 8080 #启动http转发 $ ./ngrok -config=./ngrok.yml -proto=tpc 22 #启动tcp转发 本地22端口,远程随机暴露大端口
参数说明:
trust_host_root_certs #是否信任系统根证书,若是是带自签名证书编译的 ngrok 客户端,这个值应该设置为 false;若是使用 CA 证书,或者用户添加了根证书,这个值应该设置为 true -proto #转发协议 不指定默认是 http+https -subdomain #访问本地时的三级域名 不指定就会随机生成 tcp不支持此参数 8080 #本地服务的端口号 -config #指定配置位置,默认为$HOME/.ngrok2/ngrok.yml
在ngrok中写入以下内容:
server_addr: "ngrok.yourset.com:4443" trust_host_root_certs: false tunnels: web: proto: http: "3000" web2: proto: http: "8080" tcp: proto: tcp: "3022" remote_port: 4444 tcp2: proto: tcp: "22" remote_port: 4445
启动单个服务如
$ ./ngrok -config=./ngrok.yml start web #启动web服务 使用的前缀域名为web $ ./ngrok -config=./ngrok.yml start tcp #启动tcp服务 使用远程端口3022
启动多个服务:
$ ./ngrok -config=./ngrok.yml start web tcp #同时启动两个服务 $ ./ngrok -config=./ngrok.yml start-all #启动全部服务
### docker 配置 和 Nginx配置
基本搭建到上面基本就能用了,可是对于暴露80端口的问题这时就须要使用Nginx作一个端口的反向代理。
而加入使用的vps更换了话,就要从新再来搭建一遍,想一想用docker的话,那不就很方便吗。
这次更新去掉了docker的配置,当初,刚学会点docker 便为了docker而docker,并无考虑是否合适当前的场景。ngrok 做为一个内网穿透的小工具,有时可能会时常更改配置等,因此做为本地的一个开机启动的小服务便可。
vim /usr/lib/systemd/system/ngrok.service ## 输入: [Unit] Description=ngrok After=network.target [Service] TimeoutStartSec=30 ExecStart=/usr/local/ngrok/bin/ngrokd -domain="ngrok.yourset.com" -httpAddr=":2443" -httpsAddr=":3443" -tunnelAddr=":4443" ExecStop=/bin/kill $MAINPID [Install] WantedBy=multi-user.target ## 命令 $ sudo systemctl enable ngrok # 设置开机启动 $ sudo systemctl start ngrok # 开启ngrok $ sudo systemctl status ngrok # 查看状态 $ sudo systemctl stop ngrok # 中止
相对于 ngrok 另外一款国内大牛作的 frp要显的更加轻量安全易配置些。
中文文档讲解的也是十分全面,如下是个人相关配置
服务器端:
将文件下载解压后的 frps 和 frps.ini 放到当前目录
编辑 frps.ini 文件
[common] bind_addr = 0.0.0.0 (yourip) bind_port = 7000 (frp通讯端口) dashboard_port = 8020 (web端查看端口 可省略) vhost_http_port = 8021 (http 端口) # dashboard user and pwd for basic auth protect, if not set, both default value is admin dashboard_user = yourusername dashboard_pwd = yourpass privilege_token = yourtoken
配置开机启动:
[Unit] Description=frps After=network.target [Service] TimeoutStartSec=30 ExecStart=/home/user/tool/frps/frps -c /etc/frp/frps.ini ExecStop=/bin/kill $MAINPID [Install] WantedBy=multi-user.target $ sudo systemctl enable frps # 设置开机启动 $ sudo systemctl start frps # 开启ngrok $ sudo systemctl status frps # 查看状态 $ sudo systemctl stop frps # 中止
同理设置客户端 添加自动启动便可经过域名或者ip 从外网访问或连接内网 frp 正处于开发阶段有不少实用的功能等你们去发现。
对比frp ngrok 的搭建要繁琐很多,但 ngrok 在的优点在于 方便本地调试,由于在开启本地服务的同时,也会开启一个本地的webserver 来监听 请求的相应 如 get 和 post 的具体数据 以及服务端返回的数据。对于本地调试来讲是十分方便的。而 frp 对于代理本地端的服务,ssh等仍是十分出色的,好比我调试的时候使用ngrok,而家里用来折腾的树莓派 就使用了frp。最后祝你们愉快的玩耍~