内网穿透加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 | |
看到下图这样的页面基本就搞定了~ |
|
创建文件挂载目录(老规矩了)
个人比较习惯将容器内重要文件挂载到宿主机方便查看修改
进入
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块钱买一个试试?
2.再次你需要有个备案域名(没备案可以用香港通道,哈哈 )
配置natapp及自主域名
第一步
购买通道后进入后台配置自主域名
第二步
进入我的隧道配置:域名,本ip以及端口!如果需要配置开机自启动请关闭web管理界面优化性能
第三步
进入阿里云域名管理解析域名,我这里使用泛域名解析
启动natapp实现内网穿透
下载客户端测试效果
首先你需要下载一个客户端,我这里是manjaro(linux)所以下载linux版本
我把natapp放在了/opt目录下
在Linux/Mac 下 需要先给执行权限
sudo chmod a+x natapp
然后再运行
./natapp -authtoken=xxxxx
xxxxx代表你的authtoken,在我的隧道查看
运行成功得到如下效果,现在可以直接通过你的自主域名访问到我们的80端口了,也就是前面写的hello nginx页面
后台启动
现在的效果如果关闭终端窗口就会断开连接
想要后台启动需要执行如下命令:
nohup ./natapp -authtoken=xxxx -log=stdout &
启动成功后可以通过如下命令查看:
ps -ef|grep natapp
开机自启
开机自启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:端口的方式访问)
到这里整个系列就结束了,话说以后如果要配置研发环境,我是不是可以抄我自己的博客啊,哈哈哈哈!真方便