在我们需要与外界联调接口的时候,常常需要用到第三方通过公网来访问我们的内网服务,省的我们频繁部署。比如在对接第三方支付或者第三方接口路由的时候。
方式一:
下载工具
ngrok github地址:https://github.com/inconshreveable/ngrok
mac版本下载地址:https://ngrok.com/download下载后是个zip,直接解压,进入到指定目录执行你的要映射的内网端口命令
./ngrok http localhost:20020
执行后视图如下,直接访问上图即可映射到本地服务
方式二:
- 登陆官网:https://www.ngrok.cc/ 注册一个账号,点击隧道管理,开通一个免费的隧道,输入你要映射的地址即可,便可以获得对应的隧道id
- 再本机上下载对应的客户端,如果是windows点击bat方式启动,输入对应的隧道id即可。具体可参考:https://www.ngrok.cc/_book/start/ngrok_windows.html,但是有一个不好就是便宜的得不到保障会被踢下线。
方式三:
为了解决上述痛点,我决定自己买个服务器,淘宝很便宜三年200块。一行命令解决:在内网机器执行,在输入远端服务器密码
名词解释:ssh -NTf -R 30020:192.168.1.103:30020 root@腾讯云ip
- 正向代理(-L):相当于 iptable 的 port forwarding
- 反向代理(-R):相当于 frp 或者 ngrok
再本地机器执行 netstat -ntlp:查看机器ssh通道服务,是否通没有
在通过浏览器输入:腾讯云ip:30020 执行即可访问到内网中去
方式四(推荐):
访问内网web服务
服务端启动
采用frp方式实现内网穿透。具体参考:网站 或者github,或者中文文档
下载最新的frp服务端文件:(在外网服务器执行)
➜ wget https://github.com/fatedier/frp/releases/download/v0.37.0/frp_0.37.0_linux_amd64.tar.gz
➜ tar -zxvf frp_0.37.0_linux_amd64.tar.gz #解压
进入到解压目录后,因为我们是作为服务端删除客户端的文件,并且启动
- rm -f frpc
- rm -f frpc.ini
- rm -f frpc_full.ini
- 接下来要修改服务器配置文件,即frps.ini文件。因为我这里主要是为了做回调用(比如微信支付回调、第三方接口抄送回调),所以使用比较简单,增加了一行服务端监听端口vhost_http_port,用于监听接收 HTTP 请求,并通过下面命令启动。
➜ ./frps -c ./frps.ini
当然也可以通过docker的方式去启动
frps:
image: snowdreamtech/frps:0.37.0
container_name: frps
restart: always
ports:
- 7000:7000
- 6000:6000
- 30020:30020
volumes:
- ./volume/frps.ini:/etc/frp/frps.ini
客户端启动
客户端我是windows机器,所以需要到github上下载同版本的。下载好之后同样删除无效的服务端文件,并且再frpc.ini配置上对应的配置,如下。
[common]
server_addr = 腾讯云外网ip
server_port = 7000
[web]
type = http
local_ip = 192.168.1.148 #我没加这一行,docker-compose无法连接,非docker可运行
local_port = 30020
custom_domains = 腾讯云外网ip
在浏览器输入:http://腾讯云外网ip:30020/ 就可以看接口是否通畅。但是这样不是以后台方式运行的,所以改进下上面客户端和服务端方式启动命令:
nohup ./frps -c ./frps.ini > log.txt 2>&1 &
nohup ./frpc -c ./frpc.ini > log.txt 2>&1 &
如果要停止:ps -aux|grep frp| grep -v grep
,找到pid,然后kiil -9 pid
当然服务端也可以通过docker-compose部署
version: '3.1'
services:
frp:
image: snowdreamtech/frpc:0.37.0
volumes:
- ./volume/frpc.ini:/etc/frp/frpc.ini
ports:
- 7000:7000
restart: always
container_name: frpc
通过 ssh 访问公司内网机器
服务端启动
修改下外网机的绑定端口,打开fprs.ini文件,修改完毕后启动即可./frps -c ./frps.ini
[common]
bind_port = 7000
客户端启动
修改下内网机的绑定端口,打开fprc.ini文件,修改完毕后启动即可./frpc -c ./frpc.ini
。修改 frpc.ini 文件,假设 frps 所在服务器的公网 IP 为 x.x.x.x:
[common]
server_addr = x.x.x.x
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
注意,local_port(客户端侦听)和 remote_port(服务器端暴露)是用来出入 frp 系统的两端,server_port 则是服务器用来与客户端通讯的。
访问ssh内内网机器
ssh -oPort=6000 root@x.x.x.x
如果出现权限被拒绝的情况,SSH 权限被拒绝(publickey、gssapi-keyex、gssapi-with-mic)请参考这篇文章解决。
实际应用:
需要说到的一点就是我在我们公司有个需求就是通过此ssh来实现生产环境内网部署的。大致过程如下:在148深圳服务器打完镜像后,要远程到武汉111机器,然后通过kubectl apply -f xx.yaml发布。于此同时,它需要从148的harbor私有仓库拉取代码。所以具备以下技术要求
- 148服务器能够远程到111机器 (实现了)
- 111机器能从148拉取代码 (实现不了,折中取巧)
但是发现内网拉取内网是很难实现,于是我就通过自己的外网搭建了私库harbor,中间去了个巧,也就是说我部署实在148内网机jenkins部署,提交代码也是提交到148的gitlab。但是我推送镜像是推送到公网111,然后通过148jenkinsssh部署打镜像到111,然后通过ssh外网机来连接内网111机器,期间是将生成的模板文件推送到外网101,然后在通过111下载101模板文件apply即可。
#!/bin/bash
template="k8s_simone-getway.yaml"
ssh -tt -oPort=6000 root@101外网ip "
set -ex;
pwd;
ls;
kubelet --version;
scp -P 22 -r root@101.34.86.4:/root/project-server/deploy/workspace/simone-getway/${template} /root/project-server/deploy;
cat /root/project-server/deploy/${template};
kubectl apply -f /root/project-server/deploy/${template}
" >> b.log
备注:有条件的最好使用宽带好一点外网服务器,否则拉取镜像会很慢喔