Nginx和Frp做内网穿透,实现外网访问内网的几个环境

使用Nginx和Frp实现二级域名访问内网的不同环境

本教程的目标:

  1. 浏览器访问 dev.zxd.cn 能访问到内网部署在9081端口的程序
  2. 浏览器访问 uat.zxd.cn 能访问到内网部署在9082端口的程序
  3. 离开内网仍然能够 ssh到内网的机器 进行管理。

最终结果示意图如下:
Nginx和Frp做内网穿透,实现外网访问内网的几个环境_第1张图片


1.软硬件准备

(1) 机器准备
  • 注册一个域名且备案,本教程使用的是:zxd.cn这个域名
  • 准备一台有公网IP的服务器,本教程使用的是腾讯云的低配服务器,一个月10块钱。
  • 准备一台内网电脑/服务器,本片教程内网机器是Linux,后面要访问的程序就部署在这台机器上。
(2) 软件准备
  • Frp: 本教程内网穿透使用Frp,官方地址:https://github.com/fatedier/frp
  • Nginx: 虽然Frp本身就能实现二级域名穿透转发,还是在公网服务器上装一个Nginx来实现不同二级域名的转发吧,以方便后面进行拓展。
  • 两个程序: 内网服务器部署两个程序,分别部署在9081端口和9082端口上。

2.域名配置

申请的域名进行备案后,对域名添加记录,这样就建好了两个二级域名:

  • dev.zxd.cn
  • uat.zxd.cn

访问这两个地址,因为记录指向了公网服务器IP,不严谨的说,可以看作是访问公网服务器IP:80
Nginx和Frp做内网穿透,实现外网访问内网的几个环境_第2张图片


3.公网服务器安装Frp服务端

(1) 下载Frp

查看自己公网服务器的内核架构,下载对应版本的压缩包,上传到公网服务器的 /data/frp/ 目录下,解压。
https://github.com/fatedier/frp/releases
在这里插入图片描述

(2) 启动Frp服务端
cd /data/frp

# 创建开机启动文件
vim frps.service

# 拷贝配置文件
cp frps.service /etc/systemd/system

# 刷新服务列表、设置开机自启、启动Frp服务端
systemctl daemon-reload
systemctl enable frps
systemctl start frps

frps.service文件内容如下:

[Unit]
Description=frps
After=network.target

[Service]
ExecStart=/data/frp/frp_0.35.0_linux_386/frps -c /data/frp/frp_0.35.0_linux_386/frps.ini 

[Install]
WantedBy=multi-user.target
(3) 配置Frp服务端

编辑 frps.ini 文件

  • 配置bind_port为17000,用于Frp服务端与客户端的通信
  • 配置vhost_http_port为18000,用于Http请求的转发
  • 配置dashboard相关,用于Frp仪表盘的访问
[common]
bind_port = 17000
vhost_http_port = 18000

dashboard_port = 17080
dashboard_user = root
dashboard_pwd = 123654@#*!

重启Frp服务端,使配置生效

systemctl restart frps

4.内网机器安装Frp客户端

(1) 下载Frp

下载对应版本的压缩包,上传到内网机器的 /data/frp/ 目录下,解压。
在这里插入图片描述

(2) 启动Frp客户端
cd /data/frp

# 创建开机启动文件
vim frpc.service

# 拷贝配置文件
cp frpc.service /etc/systemd/system

# 刷新服务列表、设置开机自启、启动Frp客户端
systemctl daemon-reload
systemctl enable frpc
systemctl start frpc

frpc.service文件内容如下:

[Unit]
Description=frpc
After=network.target

[Service]
ExecStart=/data/frp/frp_0.35.0_linux_386/frpc -c /data/frp/frp_0.35.0_linux_386/frpc.ini 

[Install]
WantedBy=multi-user.target
(3) 配置Frp客户端

编辑 frpc.ini 文件

  • 配置server_addr,指向Frp服务端的公网IP
  • 配置server_port,指向Frp服务端配置的通信端口
  • 配置ssh相关,以使服务器管理员可以通过公网服务器IP:17022访问内网机器的22端口进行管理内网服务器。
  • 配置dev.zxd.cn相关
  • 配置uat.zxd.cn相关
server_addr = 182.254.179.78
server_port = 17000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 17022

[dev]
type = http
local_port = 9081
custom_domains = dev.zxd.cn

[uat]
type = http
local_port = 9082
custom_domains = uat.zxd.cn

重启Frp客户端,使配置生效

systemctl restart frpc

5.公网服务器安装nginx

主要是用于对不同的二级域名进行转发,虽然Frp本身就支持不同的二级域名转发,但是考虑到后续拓展的和其他环境转发等因素,还是在Frp前置一个Nginx,目前两个环境都是转发到Frp服务端的转发Http端口上。

经过配置后,访问两个不同的域名应该会是这个流程:

  • dev.zxd.cn -> 182.165.78.12:80 -> frp服务端Http转发端口 -> 内网机器的Frp客户端 -> 内网dev程序
  • uat.zxd.cn -> 182.165.78.12:80 -> frp服务端Http转发端口 -> 内网机器的Frp客户端 -> 内网uat程序
	server {
     
        listen 80;
        server_name dev.zxd.cn;
        location / {
     
            proxy_pass http://182.165.78.12:18000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header REMOTE-HOST $remote_addr;
        }
    }

    server {
     
        listen 80;
        server_name uat.zxd.cn;
        location / {
     
            proxy_pass http://182.165.78.12:18000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header REMOTE-HOST $remote_addr;
        }
    }

6.测试

(1) Http访问测试

浏览器访问两个二级域名,应该能访问到内网机器上部署的两个不同的程序。

(2) ssh测试

使用Xshell等工具,连接公网服务器IP:17022,就能ssh到内网机器了。
Nginx和Frp做内网穿透,实现外网访问内网的几个环境_第3张图片

你可能感兴趣的:(Linux)