有关使用 frp 进行内网穿透的设置教程其实已经有不少了,但是由于每个人有自己不同的使用环境,设置方法也不尽相同,因此这篇日志仅用于记录我自己的设置方式,更加复杂的用法可以直接参考官方文档。
Contents
Part 1 必要的条件:
首先使用这个服务至少需要一台公网服务器,如果需要用 http/https 服务,那么最好再备一个域名并且解析到服务器上,如果可以的话泛解析一个二级域名到服务器会用起来更加方便 (比如添加一个 *.frp.example.com 的 A 记录,设置为 frp 穿透服务器)。对于服务器的选择,frp 在一般使用环境中,并不需要太多资源,但是最好有一个稳定,并且相对低延迟的网络环境。这次我选择的服务器到本地延迟大约只有 20ms,基本可以流畅的操作。影响操作流畅度的除了服务器以外还有本地的上行,如果上行不稳定,而且带宽比较小的话也不值得折腾穿透。
Part 2 系统的选择:
这里其实没有什么太麻烦的地方,frp 本身是可以跨平台编译的,同时也在项目中提供了各种平台的预编译可执行代码。因此不管你是使用 windows、linux、还是其他 unix 系统,通常情况下都可以使用此穿透服务。这也使得路由器运行 frp 客户端成为可能,也就是说,可以不用额外添加设备来进行穿透。
Part 3 部署服务端:
服务端部署其实非常简单,我这里以一台运行 ubuntu 18.04 的服务器为例,我首先将二级域名 *.frp.example.com 指向这台服务器,那么我访问的任何域名例如 “openwrt.frp.example.com” 或者是 “mynas.frp.example.com” 都会直接跳转到这台服务器。
在 root 账户下运行以下内容:
cd /tmp curl -s -k https://api.github.com/repos/fatedier/frp/releases/latest \ | grep "browser_download_url.*linux_amd64.tar.gz" \ | cut -d '"' -f 4 \ | wget -qi - tar zxvf frp_*_linux_amd64.tar.gz mkdir -p /usr/local/frp cp -a frp_*_linux_amd64/* /usr/local/frp/
创建 systemd 服务
touch /etc/systemd/system/frps.service cat > /etc/systemd/system/frps.service << EOF [Unit] Description=frps daemon After=syslog.target network.target Wants=network.target [Service] Type=simple ExecStart=/usr/local/frp/frps -c /etc/frp/frps.ini Restart= always RestartSec=1min ExecStop=/usr/bin/killall frps [Install] WantedBy=multi-user.target EOF
创建配置文件/etc/frp/frps.ini,并且写入需要的信息
[common] bind_port = xxxx subdomain_host = frp.example.com privilege_token = token dashboard_port = xxxx dashboard_user = xxxx dashboard_pwd = xxxxxxxx
启动服务以及自启动
systemctl start frps systemctl enable frps
Part 4 部署客户端:
客户端的部署与服务端很类似,frpc -c frpc.ini 即可启动服务,关键是要保证以下信息的正确性
server_addr
server_port
privilege_token
这些信息必须与服务端配置的信息对应,设定好以后就可以设置需要转发流量的服务了,首先要明确自己需要使用的是什么协议,tcp/udp协议基本是万能的,就像在路由器设置端口转发一样,http,https 会略有区别,它默认监听 80/443 端口,并且可以根据不同的 subdomain 指向内网地址。
[Router-Web] type = http local_ip = 192.168.0.1 local_port = 80 subdomain = router [Web] type = https local_ip = 192.168.0.2 local_port = 443 subdomain = www
这些网页实际上也可以利用 nginx 再次进行反代,并且再服务器上添加 SSL 加密。
server { listen 80; server_name frp.example.com; rewrite ^(.*) https://www.frp.example.com$1 permanent; } server { listen 443; server_name www.frp.example.com; location / { proxy_pass http://127.0.0.1:6800; proxy_set_header Host $host:443; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_hide_header X-Powered-By; } #------SSL BEGIN ssl on; ssl_certificate YOUR CERT PATH; ssl_certificate_key YOUR KEY PATH; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #------SSL END }
由于 frp 主要使用 ini 作为配置文件,参数比较明确,因此相对容易上手。
参考资料:
https://github.com/fatedier/frp
https://lfire.github.io/2017/11/15/deploy-the-frp-server/
https://www.centos.bz/2018/06/nginx-%E5%92%8C-frp%E5%85%B1%E7%94%A880%E7%AB%AF%E5%8F%A3/