在我们需要与外界联调接口的时候,常常需要用到第三方通过公网来访问我们的内网服务,省的我们频繁部署。比如在对接第三方支付或者第三方接口路由的时候。

方式一:

  1. 下载工具

    ngrok github地址:https://github.com/inconshreveable/ngrok
    mac版本下载地址:https://ngrok.com/download

  2. 下载后是个zip,直接解压,进入到指定目录执行你的要映射的内网端口命令

    1. ./ngrok http localhost:20020
  3. 执行后视图如下,直接访问上图即可映射到本地服务

image.png

方式二:

  1. 登陆官网:https://www.ngrok.cc/ 注册一个账号,点击隧道管理,开通一个免费的隧道,输入你要映射的地址即可,便可以获得对应的隧道id

image.png
image.png

  1. 再本机上下载对应的客户端,如果是windows点击bat方式启动,输入对应的隧道id即可。具体可参考:https://www.ngrok.cc/_book/start/ngrok_windows.html,但是有一个不好就是便宜的得不到保障会被踢下线。

    方式三:

    为了解决上述痛点,我决定自己买个服务器,淘宝很便宜三年200块。一行命令解决:在内网机器执行,在输入远端服务器密码
    1. ssh -NTf -R 30020:192.168.1.103:30020 root@腾讯云ip
    名词解释:
  • 正向代理(-L):相当于 iptable 的 port forwarding
  • 反向代理(-R):相当于 frp 或者 ngrok

再本地机器执行 netstat -ntlp:查看机器ssh通道服务,是否通没有
image.png
在通过浏览器输入:腾讯云ip:30020 执行即可访问到内网中去

方式四(推荐):

访问内网web服务

服务端启动

采用frp方式实现内网穿透。具体参考:网站 或者github,或者中文文档

  1. 下载最新的frp服务端文件:(在外网服务器执行)

    1. wget https://github.com/fatedier/frp/releases/download/v0.37.0/frp_0.37.0_linux_amd64.tar.gz
    2. tar -zxvf frp_0.37.0_linux_amd64.tar.gz #解压
  2. 进入到解压目录后,因为我们是作为服务端删除客户端的文件,并且启动

  • rm -f frpc
  • rm -f frpc.ini
  • rm -f frpc_full.ini
  1. 接下来要修改服务器配置文件,即frps.ini文件。因为我这里主要是为了做回调用(比如微信支付回调、第三方接口抄送回调),所以使用比较简单,增加了一行服务端监听端口vhost_http_port,用于监听接收 HTTP 请求,并通过下面命令启动。

image.png

  1. ./frps -c ./frps.ini

当然也可以通过docker的方式去启动

  1. frps:
  2. image: snowdreamtech/frps:0.37.0
  3. container_name: frps
  4. restart: always
  5. ports:
  6. - 7000:7000
  7. - 6000:6000
  8. - 30020:30020
  9. volumes:
  10. - ./volume/frps.ini:/etc/frp/frps.ini

客户端启动

客户端我是windows机器,所以需要到github上下载同版本的。下载好之后同样删除无效的服务端文件,并且再frpc.ini配置上对应的配置,如下。
image.png

  1. [common]
  2. server_addr = 腾讯云外网ip
  3. server_port = 7000
  4. [web]
  5. type = http
  6. local_ip = 192.168.1.148 #我没加这一行,docker-compose无法连接,非docker可运行
  7. local_port = 30020
  8. custom_domains = 腾讯云外网ip

image.png
在浏览器输入: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私有仓库拉取代码。所以具备以下技术要求

  1. 148服务器能够远程到111机器 (实现了)
  2. 111机器能从148拉取代码 (实现不了,折中取巧)

但是发现内网拉取内网是很难实现,于是我就通过自己的外网搭建了私库harbor,中间去了个巧,也就是说我部署实在148内网机jenkins部署,提交代码也是提交到148的gitlab。但是我推送镜像是推送到公网111,然后通过148jenkinsssh部署打镜像到111,然后通过ssh外网机来连接内网111机器,期间是将生成的模板文件推送到外网101,然后在通过111下载101模板文件apply即可。
image.png

#!/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

image.png
备注:有条件的最好使用宽带好一点外网服务器,否则拉取镜像会很慢喔