1.frp介绍
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
2.frp原理
frp 主要由 客户端(frpc) 和 服务端(frps) 组成:服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在的机器上。
内网服务由于没有公网 IP,不能被非局域网内的其他用户访问。
用户通过访问服务端的 frps,由 frp 负责根据请求的端口或其他信息将请求路由到对应的内网机器,从而实现通信。
frp 支持的代理类型。
类型 | 描述 |
---|
tcp | 单纯的 TCP 端口映射,服务端会根据不同的端口路由到不同的内网服务。 |
udp | 单纯的 UDP 端口映射,服务端会根据不同的端口路由到不同的内网服务。 |
http | 针对 HTTP 应用定制了一些额外的功能,例如修改 Host Header,增加鉴权。 |
https | 针对 HTTPS 应用定制了一些额外的功能。 |
stcp | 安全的 TCP 内网代理,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。 |
sudp | 安全的 UDP 内网代理,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。 |
xtcp | 点对点内网穿透代理,功能同 stcp,但是流量不需要经过服务器中转。 |
tcpmux | 支持服务端 TCP 端口的多路复用,通过同一个端口访问不同的内网服务。 |
3.frp代理自定义域名web服务(systemd管理)
3.1 systemd 控制 Frps启动
如Linux服务端上没有安装 systemd,可以使用 yum 或 apt 安装 systemd
# yum
yum install -y systemd
# apt
apt install -y systemd
3.2 下载
https://github.com/fatedier/frp/releases
3.3 服务端(公网)
mkdir /usr/local/frp
tar -zxvf frp_0.47.0_linux_amd64.tar.gz
mv frp_0.47.0_linux_amd64 /usr/local/frp
cd /usr/local/frp
vim frps.ini
[common]
bind_port = 5680
dashboard_port = 5681
token = 554554
dashboard_user = root
dashboard_pwd = Theshy554
enable_prometheus = true
vhost_http_port = 5682
log_file = /usr/local/frp/frps.log
log_level = info
log_max_days = 3
mkdir /usr/local/frp system
cd system
vim frps.service
[Unit]
Description=Frp Server Service
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.ini
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
sudo cp frps.service /usr/lib/systemd/system/
sudo systemctl daemon-reload
sudo systemctl start frps.service
sudo systemctl enable frps.service
3.4 客户端(内网)
mkdir /usr/local/frp
tar -zxvf frp_0.47.0_linux_amd64.tar.gz
mv frp_0.47.0_linux_amd64 /usr/local/frp
cd /usr/local/frp
vim frpc.ini
[common]
server_addr = *****
server_port = 5680
authentication_method = token
token = 554554
[web]
type = http
local_ip = 127.0.0.1
local_port = 80
remote_port = 5682
custom_domains = *****
mkdir /usr/local/frp system
cd system
vim frpc.service
[Unit]
Description=Frp Client Service
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/frp/frpc \
-c /usr/local/frp/frpc.ini
ExecReload=/usr/local/frp/frpc reload \
-c /usr/local/frp/frpc.ini
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
sudo cp frpc.service /usr/lib/systemd/system/
sudo systemctl daemon-reload
sudo systemctl start frpc.service
sudo systemctl enable frpc.service
3.5 访问
域名访问
http://<your_vps_ domain>/
IP访问
http://IP:5682/
4.frp代理自定义域名web服务(docker)
4.1 服务端(公网)
docker pull snowdreamtech/frps
mkdir frps
cd frps
vim frps.ini
[common]
bind_port = 5680
dashboard_port = 5681
token = 554554
dashboard_user = root
dashboard_pwd = Theshy554
enable_prometheus = true
vhost_http_port = 5682
version: '3.0'
services:
service_frps:
image: snowdreamtech/frps:latest
container_name: container_frps
environment:
TZ: Asia/Shanghai
volumes:
- ./frps/frps.ini:/etc/frp/frps.ini
- /etc/localtime:/etc/localtime
privileged: true
restart: always
network_mode: host
docker-compose up --build -d
docker logs --tail -n -f container_frps
4.2 客户端(内网)
docker pull snowdreamtech/frpc
mkdir frpc
cd frpc
vim frpc.ini
[common]
server_addr = *****
server_port = 5680
authentication_method = token
token = 554554
[web]
type = http
local_ip = 127.0.0.1
local_port = 80
remote_port = 5682
custom_domains = *****
version: '3.0'
services:
service_frps:
image: snowdreamtech/frpc:latest
container_name: container_frpc
environment:
TZ: Asia/Shanghai
volumes:
- ./frpc/frpc.ini:/etc/frp/frpc.ini
- /etc/localtime:/etc/localtime
privileged: true
restart: always
network_mode: host
docker-compose up --build -d
docker logs --tail -n -f container_frpc