一、安装并配置frp服务端
1.1 在服务器安装frps
在有公网ip的主机上,下载frp官方GitHub最新的frp二进制文件:
wget https://github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_amd64.tar.gz
#如果下载失败,前面加个:mirror.ghproxy.com
wget https://mirror.ghproxy.com/github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_amd64.tar.gz
解压到/bin/frp目录:
#先创建目录
mkdir -p /bin/frp
tar -xvf frp_0.61.0_linux_amd64.tar.gz -C /bin/frp
创建一个systemctl服务:
nano /lib/systemd/system/frps.service
内容如下:
[Unit]
Description=frps service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
#启动服务的命令(此处写你的frps的实际安装目录)
ExecStart=/bin/frp/frp_0.61.0_linux_amd64/frps -c /bin/frp/frp_0.61.0_linux_amd64/frps.toml
[Install]
WantedBy=multi-user.target
服务端frps的启动与停止
# 启动frps
sudo systemctl start frps
# 打开自启动
sudo systemctl enable frps
# 重启应用
sudo systemctl restart frps
# 停止应用
sudo systemctl stop frps
# 查看应用的日志
sudo systemctl status frps
# 停止开机自启动
systemctl disable frps
例如:
❯ systemctl start frps
❯ systemctl enable frps
Created symlink /etc/systemd/system/multi-user.target.wants/frps.service → /lib/systemd/system/frps.service.
❯ systemctl status frps
● frps.service - frp server
Loaded: loaded (/lib/systemd/system/frps.service; enabled; preset: enabled)
Active: active (running) since Sat 2024-11-30 21:01:07 CST; 15s ago
Main PID: 2565486 (frps)
Tasks: 4 (limit: 2153)
Memory: 8.7M
CPU: 141ms
1.2 配置服务端
编辑服务端配置文件/bin/frp/frp_0.61.0_linux_amd64/frps.toml
:
bindAddr = "0.0.0.0"
bindPort = 7000
subdomainHost = "frp.xxxxxx.xxx"
vhostHTTPPort = 7000
vhostHTTPSPort = 7000
auth.method = "token"
# token为客户端连接服务端的钥匙🔑
auth.token = "xxxxxx"
# 以下为在服务端启动该的web界面,可以查看客户端连接的详细信息,不配置也没关系
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "xxxxx"
webServer.password = "xxxxxxxx"
其中,只需要将 *.{subdomainHost}
解析到 frps 所在服务器。之后用户可以通过 subdomain 自行指定自己的 web 服务所需要使用的二级域名,通过 {subdomain}.{subdomainHost}
来访问自己的 web 服务。
例如,这里将*.frp.xxxxxx.xxx
解析到服务器,既可以通过xx.frp.xxxxxx.xxx访问。
最后 systemctl restart frps
重启服务。
二、nginx反向代理frp
2.1 申请并安装ssl证书
2.1.1 通过dns api申请ssl证书,支持泛域名及根域名
先到阿里云控制台获取key和secret,然后在服务器终端输入:
export Ali_Key="xxxxxxx"
export Ali_Secret="xxxxxxxxxxxx"
#注意引号,否者会报no matches found: *.frp.xxxxxxx.xxx 错误
acme.sh --issue --dns dns_ali -d frp.xxxxxx.xxx -d '*.frp.xxxxxx.xx'
经过等待后,提示Cert success.
即说明证书签发成功。
2.1.2 使用 --install-cert
命令安装证书
# 先新建证书目录
mkdir -p /etc/nginx/ssl/frp.xxxxxx.xxx
# 再安装证书到该目录
acme.sh --install-cert -d frp.xxxxxx.xxx \
--key-file /etc/nginx/ssl/frp.xxxxxx.xxx/key.pem \
--fullchain-file /etc/nginx/ssl/frp.xxxxxx.xxx/fullchain.pem \
--reloadcmd "nginx -s reload"
提示Reload successful
即安装成功。
2.1.3 配置 SSL 相关的设置
nano etc/nginx/snippets/ssl-params.conf
内容如下:
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 60m;
ssl_session_tickets on;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.4.4 8.8.8.8 valid=300s;
resolver_timeout 10s;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
# 以下配置来自 [提高安全性的最佳 Nginx 配置](https://godruoyi.com/posts/best-nginx-configuration-for-improved-security),建 议参考。
server_tokens off;
add_header Strict-Transport-Security "max-age=31536000;includeSubDomains;preload";
add_header X-Frame-Options deny;
add_header X-Content-Type-Options nosniff;
add_header x-xss-protection "1; mode=block";
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https:; connect-src 'self' https:; img-src 'self' data: https: blob:; style-src 'unsafe-inline' https:; font-src https:";
2.2 nginx反向代理frp
创建一个nginx站点配置文件
nano /etc/nginx/sites-available/frp.xxxxxx.xxx.conf
内容如下:
server {
listen 80;
server_name frp.xxxxxx.xxx *.frp.xxxxxx.xxx;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl fastopen=3 reuseport;
server_name frp.xxxxxx.xx *.frp.xxxxxx.xxx;
# 证书文件绝对路径
ssl_certificate /etc/nginx/ssl/frp.xxxxxx.xxx/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/frp.xxxxxx.xxx/key.pem;
# 引入ssl配置文件
include snippets/ssl-params.conf;
access_log /var/log/nginx/frp.xxxxxx.xxx.access.log;
error_log /var/log/nginx/frp.xxxxxx.xxx.error.log;
location / {
proxy_pass http://127.0.0.1:7000;
# 这个Host的header一定要加,不然转发后frp拿不到通过哪个域名访问的,导致转发失败
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
启用该站点
ln -s /etc/nginx/sites-available/frp.xxxxxx.xxx.conf /etc/nginx/sites-enabled 3
测试并重载:
❯ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
❯ nginx -s reload
三、安装并配置客户端
3.1 在内网主机安装frpc
在内网主机上,下载frp官方GitHub最新的frp二进制文件:
wget https://github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_amd64.tar.gz
#如果下载失败,前面加个:mirror.ghproxy.com
wget https://mirror.ghproxy.com/github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_amd64.tar.gz
解压到/bin/frp目录:
#先创建目录
mkdir -p /bin/frp
tar -xvf frp_0.61.0_linux_amd64.tar.gz -C /bin/frp
创建一个systemctl服务:
nano /lib/systemd/system/frpc.service
内容如下:
[Unit]
Description=frpc service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
#启动服务的命令(此处写你的frps的实际安装目录)
ExecStart=/bin/frp/frp_0.61.0_linux_amd64/frpc -c /bin/frp/frp_0.61.0_linux_amd64/frpc.toml
[Install]
WantedBy=multi-user.target
常见命令:
❯ systemctl start frpc
❯ systemctl enable frpc
Created symlink /etc/systemd/system/multi-user.target.wants/frps.service → /lib/systemd/system/frps.service.
❯ systemctl status frpc
● frpc.service - frpc service
Loaded: loaded (/lib/systemd/system/frpc.service; enabled; preset: enabled)
Active: active (running) since Sat 2024-11-30 23:28:16 HKT; 17s ago
Main PID: 84950 (frpc)
Tasks: 6 (limit: 19038)
Memory: 4.7M
CPU: 31ms
CGroup: /system.slice/frpc.service
3.2 配置客户端
编辑服务端配置文件/bin/frp/frp_0.61.0_linux_amd64/frpc.toml
:
serverAddr = "frp.xxxxxx.xxx"
serverPort = 7000
auth.method = "token"
#填在服务端设置的参数
auth.token = "xxxxxxxxxxxxx"
transport.tls.enable = true #是否和服务端之间启用TLS连接
transport.tls.disableCustomTLSFirstByte = false
#默认为true,当配置为true时,无法和vhostHTTPSPort端口复用,会报错:
# connect to server error: remote error: tls: unrecognized name
[[proxies]]
name = "xxxx"
type = "http"
# 可填写本地局域网内其他主机的ip,若本机则可以不填或者填127.0.0.1
localIp = "127.0.0.1"
#本地的端口
localPort = 80
# 填子域名
subdomain = "test"
最后,systemctl restart frpc
重启客户端。
这样,通过访问https://test.frp.xxxxxxx.xxx
就可以访问内网的服务啦。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容