内网穿透 Frp 与 NGINX 配置
这是我日常部署 frp 的一些配置方法,可以实现把 frp 的 http 映射到某个域名下的 80 端口,甚至可以简单实现支援证书。一次配置,支援所有 http 服务的内网穿透。
安装 Frp
首先,我们要安装 frp 到我们的服务器。到 GitHub 的 release 拉取最新版本即可https://github.com/fatedier/frp/releases 。比如我是 64 bit Ubuntu 系统,那么就在服务器下执行:
# 下载 frp
wget https://github.com/fatedier/frp/releases/download/v0.48.0/frp_0.48.0_linux_amd64.tar.gz
# 解压 frp
tar xzf frp_*.tar.gz
# 将 frp 拷贝到 /usr/local/src/ 目录下
sudo mv frp_0.48.0_linux_amd64 /usr/local/src/frp
# 创建 server 端 link 到 /usr/local/sbin/ 这样就可以全局直接调用
sudo ln -s /usr/local/src/frp/frps /usr/local/sbin/frps
# 创建 server config link 到 /etc/
sudo ln -s /usr/local/src/frp/frps.ini /etc/frps.ini
接着创建一个 frp 的 service,可以做到服务守护,开机自启。执行:
sudo vim /etc/systemd/system/frps.service
将如下内容贴入:
[Unit]
Description=FRP Server Daemon
[Service]
Type=simple
ExecStartPre=-/usr/sbin/setcap cap_net_bind_service=+ep /usr/local/sbin/frps
ExecStart=/usr/local/sbin/frps -c /etc/frps.ini
Restart=always
RestartSec=20s
User=nobody
PermissionsStartOnly=true
LimitNOFILE=infinity
[Install]
WantedBy=multi-user.target
配置 Frp
再编辑 /etc/frps.ini
,修改内容如下:
[common]
vhost_http_port=6002
bind_port = 7000
dashboard_port = 7500
dashboard_user = username
dashboard_pwd = password
token=your_token
subdomain_host=frp.domain.com
将 username 和 password 按照你们自己的需要修改,然后就可以启动服务了。token
不是必须的,如果想要加上认证避免被别人盗连,则可以加上。
sudo systemctl start frps
# 开机自启
sudo systemctl enable frps
后面有修改 frps.ini ,就只需要执行 sudo systemctl restart frps
注意,如果你在使用云服务器,需要在安全组将 bind_port 的端口打开。
配置 NGINX
接着,我们再来配置 NGINX。假设我们的服务器上绑定的域名是 domain.com
,那么我们将 frp.domain.com
及其子域都分配用于 frp 的 http 服务。如果你要支援 HTTPS,那么要需要申请一个 frp.domain.com
的证书和 *.frp.domain.com
的证书。现在假设你已经具备这两个证书,那么就只需要在 NGINX 中创建一个配置如下:
server {
# 配置监听所有子域请求
server_name ~^(?<subdomain>[^.]+)\.frp\.domain\.com$;
listen 443 ssl http2;
# *.frp.domain.com 域名证书
ssl_certificate /etc/letsencrypt/live/frp.domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/frp.domain.com/privkey.pem;
listen 80;
# 此处填写你服务器的 dns 或其他可以解析你域名的 dns
resolver 8.8.8.8;
# 反向代理 frp 内网穿透的 http 服务器
location / {
proxy_pass http://$subdomain.frp.domain.com:6002;
proxy_buffering off;
proxy_redirect http://$subdomain.frp.domain.com:6002/ http://$subdomain.frp.domain.com/;
proxy_redirect ~^http://([^.]+)\.frp\.domain\.com:6002/(.*?)$ http://$1.frp.domain.com/$2;
proxy_set_header X-Forwarded-For $proxy_protocol_addr;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header User-Agent $http_user_agent;
proxy_set_header Accept-Encoding '';
proxy_set_header referer "http://$proxy_host$request_uri";
}
}
# 这个是反向代理 dashboard 。这样安全组就无需再打开 7500 端口
server {
server_name frp.domain.com;
listen 443 ssl http2;
# frp.domain.com 域名证书
ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
listen 80;
location / {
proxy_pass http://frp.domain.com:7500;
}
}
添加配置后,重启 NGINX 服务。现在你就可以使用了。
使用示例
假设你现在有个 3000 端口的本地 http 服务。那么就只需要创建一个 frp 的 Client 配置如下:
[common]
server_addr = domain.com
server_port = 7000
[local01_http]
type = http
local_ip = 127.0.0.1
local_port = 3000
subdomain = local01
然后执行 frpc -c frpc.ini
即可。连接成功后,就可以通过 local01.frp.domain.com
来访问了。
之前一直用nps 结果不知道为啥停更了 frp看了代码和文档 用了用感觉还行 就是每次改动都需要改本地的客户端配置 不能服务端统一配置
太强了