frp+nginx内网穿透,反向代理

frp原理

  1. 服务端运行,监听一个主端口,等待客户端的连接;
  2. 客户端连接到服务端的主端口,同时告诉服务端要监听的端口和转发类型;
  3. 服务端fork新的进程监听客户端指定的端口;
  4. 外网用户连接到客户端指定的端口,服务端通过和客户端的连接将数据转发到客户端;
  5. 客户端进程再将数据转发到本地服务,从而实现内网对外暴露服务的能力。

部署frp服务器

打开 frp下载页面,下载最新版的 frp_0.58.1_linux_amd64.tar.gz,然后上传到服务器。

也可以ssh连接到服务器后用wget下载:

wget https://github.com/fatedier/frp/releases/download/v0.58.1/frp_0.58.1_linux_amd64.tar.gz    

解压安装包

tar -zxvf frp_0.58.1_linux_amd64.tar.gz

进入解压后的目录:cd frp_0.58.1_linux_amd64,编辑frps.ini文件填入下面的内容:

[common]
# frp监听的端口,默认是7000,可以改成其他的
bind_port = 7000
# 授权码,请改成更复杂的
token = 12345678
vhost_http_port = 7080
vhost_https_port = 7443
 
# frp管理后台端口,请按自己需求更改
dashboard_port = 7500
# frp管理后台用户名和密码,请改成自己的
dashboard_user = admin
dashboard_pwd = admin
enable_prometheus = true
 
# frp日志配置
log_file = /var/log/frps.log
log_level = info
log_max_days = 3

设置frp服务:

mkdir -p /etc/frp
cp frps.ini /etc/frp
cp frps /usr/bin

新建/usr/lib/systemd/system/frps.service

并填入以下内容

[Unit]
Description=Frp Server Service
After=network.target
 
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frps -c /etc/frp/frps.ini
 
[Install]
WantedBy=multi-user.target

启动frp服务:

sudo systemctl enable frps
sudo systemctl daemon-reload
sudo systemctl start frps

防火墙放行端口:

# 添加监听端口
firewall-cmd --permanent --add-port=7000/tcp
# 添加管理后台端口
firewall-cmd --permanent --add-port=7500/tcp
firewall-cmd --reload

配置frp客户端

还是打开 frp下载页面,下载最新版的客户端

解压缩下载的压缩包,进入文件夹内

编辑frpc.ini,按照自己的需求设置转发。下面是一个示例:

# 服务端配置
[common]
server_addr = 193.163.19.55
# 请换成设置的服务器端口
server_port = 7000
token = 151646248sdy
 
# 配置http服务,可用于小程序开发、远程调试等
[nas]
type = http
local_ip = 127.0.0.1
local_port = 5244
custom_domains = nas.networkinker.top
 
[blog]
type = http
local_ip = 127.0.0.1
local_port = 8080
custom_domains = networkinker.top

配置nginx

server {
    listen 80;
    server_name 域名;

        location / {
            proxy_pass http://127.0.0.1:8080;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_max_temp_file_size 0;
            proxy_redirect off;
            proxy_read_timeout 240s;
        }
}