内网穿透加nginx转发实现本地服务远程访问

  • 前言
  • 一.关于内网穿透
    • 介绍
    • 内网穿透常用工具
  • 二.安装nginx(docker方式)
    • 拉取镜像并启动
    • 创建文件挂载目录(老规矩了)
    • 重新创建并启动nginx容器
    • 写个页面?抱歉我不会
  • 三.折腾natpp
    • 准备工作
    • 配置natapp及自主域名
    • 启动natapp实现内网穿透
    • 使用nginx监听转发泛域名到对应服务

前言

这个系列主要是我在manjaro(linux)系统下安装部署java向研发环境的过程 其实更准确讲是使用docker安装部署一些常用工具!顺便记录分享给大家
想要尝试使用manjaro(linux)系统研发的朋友可以参考我另一篇安装以及基本配置博客:
manjaro i3wm安装配置全记录
经过几天晚上的努力,终于把本地研发环境搭建过程整理完毕,以下是系列目录:
docker安装配置及常用命令(dokcer系列一)
docker安装配置mysql8.0.16(dokcer系列二)
docker安装redis并配置远程访问和密码(dokcer系列三)
docker安装gitlab并调优性能(docker系列四)
docker安装jenkins(docker系列五)
docker安装nacos并配置mysql数据库(docker系列六)
大致需要使用到的环境和工具已经安装部署完成,最后这篇记录如何通过内网透传搭配nginx转发实现本地环境资源远程访问的过程。

一.关于内网穿透

介绍

内网穿透,也即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机。下面就相互通信的主机在网络中与 NAT 设备的相对位置介绍内网穿透方法。
UDP 内网穿透的实质是利用路由器上的NAT 系统。NAT 是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型 Internet 接入方式和各种类型的网络中。NAT可以完成重用地址,并且对于内部的网络结构可以实现对外隐

内网穿透常用工具

常用工具:别人家的介绍~
为什么我要使用内网穿透呢?
0.云服务器到期了!
1.更方便的远程访问本地资源,实现远程协作开发
2.给有本地服务器,但是没有公网IP的公司使用
3.暂时没想好

我这里选型有考虑三种:ngrok,花生壳,其他
ngrok如果自己搭建服务器就很折腾,而且我没有云服务器 ,虽然也有商业版
花生壳个人不是太喜欢用,给不起钱
所以最终我选择使用natapp
项目主页:https://natapp.cn/
项目介绍:基于ngrok的国内收费内网穿透工具,类似花生壳,有免费版本,比花生壳好。免费版本:提供http,https,tcp全隧道穿透,随机域名/TCP端口,不定时强制更换域名/端口,自定义本地端口
使用原因:支持泛域名解析,支持TPC,UDP以及http/https,支持阿里云域名解析,操作简单不用折腾,比花生壳便宜!

二.安装nginx(docker方式)

拉取镜像并启动

因为前面几篇博客都是安装各种docker镜像,所以安装过程我尽量简单,只记录几个重要点
拉镜像
docker pull nginx
跑起来(挂载文件及参数后面再加)
docker run -d –name nginx -p 80:80 nginx
如果80端口有用,也可以用其他端口
命令解释如下(还是加上吧,毕竟我是完美的):

命令 功能
docker run 创建并启动容器
–name 指定一个容器名称
-d 后台运行容器,并返回容器ID
-p 指定端口
nginx 需要启动的镜像
符号左边为宿主机,右边为容器空间
测试效果
查看启动情况:docker ps
访问:localhost:80
看到下图这样的页面基本就搞定了~一点点
内网穿透+nginx转发-编程知识网

创建文件挂载目录(老规矩了)

个人比较习惯将容器内重要文件挂载到宿主机方便查看修改
进入
cd /opt/

创建mysql挂载目录
sudo mkdir nginx_docker

进入创建的目录
cd nginx_docker/
创建挂载文件夹
sudo mkdir conf
sudo mkdir html
sudo mkdir logs
拷贝nginx文件到宿主机
docker cp nginx:/etc/nginx/nginx.conf ./
dokcer cp nginx:/etc/nginx/conf.d/default.conf ./conf/
然后ls一下查看拷贝是否成功
干掉nginx容器
干点它的目的是为了我们编辑配置文件后重新创建容器并启动,因为一开始是直接跑的没有配置参数这些东西~
好吧我其实只是想要它的配置文件,真渣~
docker stop nginx
docker rm nginx

重新创建并启动nginx容器

docker run -d –name nginx -m 512M –memory-swap=1024M –restart always -p 80:80 -v $PWD/nginx.conf:/etc/nginx/nginx.conf -v $PWD/logs:/var/log/nginx -v $PWD/html:/usr/share/nginx/html -v $PWD/conf:/etc/nginx/conf.d –privileged=true nginx
命令解释如下:

命令 功能
docker run 创建并启动容器
–name 指定一个容器名称
-m 指定容器内存大小
–memory-swap 指定虚拟内存大小
-v 将容器内部文件挂载到宿主机目录
$PWD 输出当前所在目录名称,等同于/opt/nginx_docker
-d 后台运行容器,并返回容器ID
-p 指定端口
–privileged 容器内部对挂载的目录拥有读写等特权
–restart always 随docker启动
nginx 需要启动的镜像(名称+版本)
符号左边为宿主机,右边为容器空间

关于privileged:
使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。甚至允许你在docker容器中启动docker容器

写个页面?抱歉我不会

到了这一步,你就可以通过:localhost:80访问到一个403页面了,哈哈!其实是因为你的/opt/nginx_docker/html目录下还没有html页面,自己随便写个丢进去看看效果吧
本着对完美的追求:
sudo vim /opt/nginx_docker/html/index.html
加入:hello nginx
保存退出:wq
docker restart nginx
拿去不谢!
nginx安装参考地址,感谢大佬!

三.折腾natpp

准备工作

1.首先你得有个通道(natapp对内网穿透服务的称呼)
通道大概就是这样,可以使用免费的!但是带宽低,域名和端口随即,并且不支持绑定域名(还想要求啥呢 )!如果需要绑定自主域名配合nginx实现内网多个服务远程访问,9块钱买一个试试?
内网穿透+nginx转发-编程知识网

内网穿透+nginx转发-编程知识网

2.再次你需要有个备案域名(没备案可以用香港通道,哈哈

配置natapp及自主域名

第一步
购买通道后进入后台配置自主域名
内网穿透+nginx转发-编程知识网
第二步
进入我的隧道配置:域名,本ip以及端口!如果需要配置开机自启动请关闭web管理界面优化性能
内网穿透+nginx转发-编程知识网
第三步
进入阿里云域名管理解析域名,我这里使用泛域名解析
内网穿透+nginx转发-编程知识网

启动natapp实现内网穿透

下载客户端测试效果
首先你需要下载一个客户端,我这里是manjaro(linux)所以下载linux版本
内网穿透+nginx转发-编程知识网
我把natapp放在了/opt目录下
内网穿透+nginx转发-编程知识网
在Linux/Mac 下 需要先给执行权限
sudo chmod a+x natapp
然后再运行
./natapp -authtoken=xxxxx
xxxxx代表你的authtoken,在我的隧道查看
内网穿透+nginx转发-编程知识网
运行成功得到如下效果,现在可以直接通过你的自主域名访问到我们的80端口了,也就是前面写的hello nginx页面

后台启动
现在的效果如果关闭终端窗口就会断开连接
想要后台启动需要执行如下命令:
nohup ./natapp -authtoken=xxxx -log=stdout &
启动成功后可以通过如下命令查看:
ps -ef|grep natapp
内网穿透+nginx转发-编程知识网

开机自启
开机自启natapp有linux下的方案,不过需要在github下载文件,然后经过一系列复杂的配置!我觉得太麻烦 ,所以选择自己把后台启动的命令写入到系统配置文件~~
我使用的是i3wm桌面,直接在i3配置文件加入以下配置
sudo vim ~/.i3/config
加入一行:
exec –no-startup-id nohup /opt/natapp -authtoken=xxxx -log=stdout &

到这里natapp内网透传就完成了,可以通过域名直接访问本地80断开,也就是nginx

使用nginx监听转发泛域名到对应服务

首先编辑nginx配置文件
cd /opt/nginx_docker
sudo vim nginx.conf
我的配置如下

user  nginx;
worker_processes  auto;
error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;
events {worker_connections  1024;
}
http {include       /etc/nginx/mime.types;default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;keepalive_timeout  65;// 监听80端口的web二级域名到我们写的hello nginx页面server {listen     80;server_name web.XXX.com;location / {root /usr/share/nginx/html;index index.html index.htm;}}// 监听80端口的gitlab二级域名到我们部署的gitlab服务server {  listen       80;                                                         server_name  gitlab.XXX.com;                                               client_max_body_size 1024M;location / {proxy_pass http://192.168.101.3:8888;proxy_set_header Host $host:$server_port;}}}// 监听80端口的jenkins二级域名到我们部署的jenkins服务server {listen    80;server_name jenkins.XXX.com;client_max_body_size 1024M;location / {proxy_pass http://192.168.101.3:8080;proxy_set_header Host $host:$server_port;}}// 监听80端口的nacos二级域名到我们部署的nacos服务server {listen	80;server_name nacos.XXX.com;client_max_body_size 1024M;location /{proxy_pass http://192.168.101.3:8848;proxy_set_header Host $host:$server_port;}	}
}

注意你的nginx默认配置文件中有一行:include /etc/nginx/conf.d/*.conf; 这是代表引入这个文件中的配置到nginx.conf主配置,include /etc/nginx/conf.d/*.conf;文件的宿主机映射地址在/opt/nginx_docker/conf.d目录下,我这里是注释掉这一行直接在主配置文件nginx.conf配置的,如果你有不同环境需求,不注释掉这一行,修改这个文件夹下的配置文件效果一样

修改配置文件后docker restart nginx 重启容器就可以通过域名访问你对应的服务了,如果你还有TPC访问需求(如SSH,mysql等)需要在natapp购买TCP通道(如果已经通过web通道绑定域名,那只需要配置好TPC访问通道启动后,可以直接通过xxx.xxx.com:端口的方式访问)

到这里整个系列就结束了,话说以后如果要配置研发环境,我是不是可以抄我自己的博客啊,哈哈哈哈!真方便