部署 frp 内网穿透

IT, 其他
没有评论

有关使用 frp 进行内网穿透的设置教程其实已经有不少了,但是由于每个人有自己不同的使用环境,设置方法也不尽相同,因此这篇日志仅用于记录我自己的设置方式,更加复杂的用法可以直接参考官方文档。

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/

, , , ,
上一篇文章
利用 Systemd 为服务进程设置优先级
下一篇文章
Markdown 转 PDF 小记

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Fill out this field
Fill out this field
请输入正确的电子邮件地址。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

菜单