frp 是一个流行的内网穿透工具,可以帮助用户将内网服务暴露到公网上,使用简单,功能强大。
最近需要将 frp 部署在本地并连接到一台位于日本的服务器上,那么抗神秘干扰也是一个重要的考虑因素,因此选择使用 nginx 作为反向代理,并通过 ssl 加密传输来抗干扰,缺点则是降低了 frp 的性能。
以下基于 frp v0.65.0 版本,介绍如何使用 nginx + ssl
来部署 frp。
首先,在日本服务器上安装 frp,并配置 frps.toml
文件:
bindAddr = "127.0.0.1"
bindPort = 47000
# 代理仅在本机监听,避免对外暴露 remote_port,按需开启
# proxyBindAddr = "127.0.0.1"
[webServer]
addr = "127.0.0.1"
port = 47500
user = ""
password = ""
pprofEnable = false
[auth]
method = "token"
token = ""
用 supervisor 管理 frps 服务:
[program:frps]
directory=/opt/frp/frp_0.65.0_linux_amd64
command=/opt/frp/frp_0.65.0_linux_amd64/frps -c /opt/frp/frp_0.65.0_linux_amd64/frps.toml
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stdout_logfile_maxbytes=16MB
redirect_stderr=true
user=app
用 ss 确认 frps 在本地监听:
ss -tnlp | grep 47
接着安装 nginx,并配置反向代理:
sudo apt update
sudo apt install nginx
在 nginx 配置文件中添加以下内容,编辑 /etc/nginx/sites-available/frps.conf
:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name frps.example.com;
access_log /var/log/nginx/frps.log;
error_log /var/log/nginx/frps.log;
# 你的 SSL 证书路径
ssl_certificate /path/to/your/fullchain.pem;
ssl_certificate_key /path/to/your/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# ======= Dashboard(管理面板)=======
location / {
proxy_pass http://127.0.0.1:47500/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# ======= WebSocket(frp 主服务)=======
location /~!frp {
proxy_pass http://127.0.0.1:47000;
proxy_http_version 1.1;
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 Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
接着回到本地服务器上配置 frpc.toml
文件:
# ========== 基本信息 ==========
serverAddr = "frps.example.com" # 你的远程 frps 地址或域名
serverPort = 443
# ========== 认证 ==========
auth.method = "token"
auth.token = ""
# ========== 传输层 ==========
transport.protocol = "wss"
# ========= 代理配置 ==========
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 22
使用 supervisor 管理 frpc 服务:
[program:frpc]
directory=/docker/frp/frp_0.65.0_linux_amd64
command=/docker/frp/frp_0.65.0_linux_amd64/frpc -c /docker/frp/frp_0.65.0_linux_amd64/frpc.toml
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stdout_logfile_maxbytes=16MB
redirect_stderr=true
user=app
查看 frpc 日志,确认连接成功:
tail -f /var/log/supervisor/frpc.log