frp learning notes及相关配置操作

什么是frp

大多数时候,我们的主机都会在局域网内而且通过DHCP协议获取动态IP。 那么我想通过外网获取局域网内的主机/服务器提供的服务, 但是局域网内的所有主机/服务器的外网IP只有路由器上的那一个,这个时候该则怎么定位到我要的内网服务器和服务呢?

当我们有这样一个需求的时候(即内网穿透),frp就可以派上用场。

frp (Fast Reverse Proxy)是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。 可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 frp可以把NAT/防火墙后面的本地服务器端口转发到公共服务器。

如何用frp实现内网穿透?

Prerequisites

  1. 有公网IP的服务器,现在一般上可以买一个云服务器(以腾讯云为例)
  2. 一个本地服务器(PC、树莓派等等)

云服务器侧(frp server)

  1. 购买云服务器拿到一个公网IP
  2. 在云服务器上下载FRP
wget https://github.com/fatedier/frp/releases/download/v0.44.0/frp_0.44.0_linux_amd64.tar.gz
tar -zxvf frp_0.44.0_linux_amd64.tar.gz
cd frp_0.44.0_linux_amd64

该文件夹中的文件有

.
├── LICENSE
├── frpc --- 客户端侧的可执行程序
├── frpc.ini --- 客户端侧的配置文件
├── frpc_full.ini
├── frps --- 服务端侧的可执行程序
├── frps.ini --- 服务端侧的配置文件
└── frps_full.ini
  1. 在云服务器上配置文件frps.ini(frp server)
[common]
# 监听端口
bind_port = 7002
# 面板端口
dashboard_port = 7500
# 登录面板账号设置 (自定义)
dashboard_user = <your username>
dashboard_pwd = <your password>
# 设置http及https协议下代理端口(非重要)
vhost_http_port = 7080
vhost_https_port = 7081

# 身份验证 token换一个安全点的
token = <your token>

配置好后,运行客户端程序 ./frps -c frps.ini

  1. 在浏览器中输入<your public IP>:7500,输入dashboard_user和dashboard_pwd,即可访问frp的管理界面
  2. 在管理界面可以查看frp连接情况,此时没有frp的连接,我们需要在本地服务器上配置frp客户端

本地服务器侧(frp client)

  1. 与云服务器上的操作一样,在本地服务器上下载FRP
wget https://github.com/fatedier/frp/releases/download/v0.44.0/frp_0.44.0_linux_amd64.tar.gz
mkdir /usr/local/bin/frp/
tar -zxvf frp_0.44.0_linux_amd64.tar.gz  --strip-components 1 -C /usr/local/bin/frp/
cd /usr/local/bin/frp/
  1. 在本地服务器上配置文件frpc.ini(frp client)
[common]
server_addr = <云服务器地址>
authentication_method = token
token = <写在frps.ini中的token>
server_port = 7002 # 写在frps.ini中的bind_port
admin_addr =127.0.0.1 
admin_port = 7400

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 20022

# add more port if needed.
  1. 设置 Linux Service 开机自启动frp 新建一个frpc.service文件vi /etc/systemd/system/frpc.service 在该文件中输入以下内容
Description=Frp Client Daemon
After=syslog.target network.target
Wants=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/frp/frpc -c /usr/local/bin/frp/frpc.ini
ExecStop=/usr/bin/killall frpc
#启动失败1分钟后再次启动
RestartSec=1min
KillMode=control-group
#重启控制:总是重启
Restart=always

[Install]
WantedBy=multi-user.target

保存该文件后,通过管理员权限(sudo)执行以下内容

systemctl daemon-reload
systemctl enable frpc
systemctl start frpc
systemctl status frpc
  1. 以上操作完成后,访问<your public IP>:7500,即访问frp的管理界面,此时可以看到在frpc.ini中配置的端口信息。此时可以看到 frp
  2. !注意,此步骤在云服务器的管理界面上完成。 我们需要在云服务器上需要暴露相应的端口(此处为20022),云服务厂商一般都会有端口规则的管理界面(防火墙)
  3. 在所有操作完成后,通过公网IP以及设置的端口号,即可访问本地服务器的服务。 此处可以通过ssh username@publicIP -p 20022访问本地服务器。

frp的原理

Reverse proxy…之后有时间会分析他们的代码。 architect

Reference

  1. Exposing your local server to the internet over NAT using FRP
  2. 感谢cjl提供的文档支持~



Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • Solana Core Concepts: Accounts, Programs, and PDAs
  • Python3 Concurrency: asyncio module/async/await
  • Python Cheat Sheet
  • MIT6.824 Lab2A Raft Leader Election
  • Linux中的top command