使用frp配置内网访问

背景:斥二十块巨资买了个最低的规格云服务,MySQL之类的常用软件都无法正常运行!想用出租屋内的主机安装数据库,云服务单纯的运行代码,但出租屋用的是共享宽带没有公网IP无法直接通过公共网络访问出租屋里自己的主机,于是找到了frp这个神器。

frp

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
配置非常简单易用,甚至直接看Release包解压出来的frps_full.ini和frpc_full.ini折腾一会也能配置起来。
官方文档: https://gofrp.org/docs/
frp源码地址: https://github.com/fatedier/frp
官方提供的frp架构图如下,由下图可知,需要一台具有公网IP的主机运行frps,如果没有可以花二三十块卖一个最低配置的云主机
frp框架图

下载frp到服务端主机和客户端主机上并分别解压

  1. Linux
wget https://github.com/fatedier/frp/releases/download/v0.49.0/frp_0.49.0_linux_amd64.tar.gz

tar -zxvf frp_0.49.0_linux_amd64.tar.gz

# 这里我将frp安装在/etc/frp下,也可以根据自己的喜好放在别的路径,后面的步骤改成相应的路径即可  
sudo mv frp_0.49.0_linux_amd64 /etc/frp

2.Windows下的frp软件包下载连接

https://github.com/fatedier/frp/releases/download/v0.49.0/frp_0.49.0_windows_amd64.zip

服务端

修改服务端配置

打开配置文件

vi /etc/frp/frps.ini

更新配置文件

[common]
# frp监听的端口,默认是7000,可以改成其他的
bind_port = 7000

# 授权码,我这里使用随机生成的UUID作为Token,客户端的Token要是这里的一致才可以正常通讯  
token = 35ee1664-8bfa-e1ed-3855-02963c81342a

# 启用TLS,如果不想使用TLS或者没有证书文件,注释掉这三行即可
# tls_only = true
# tls_cert_file = /home/cert/server.crt
# tls_key_file = /home/cert/server.key
# tls_trusted_ca_file = ca.crt


# frp管理后台端口,请按自己需求更改
dashboard_port = 7500
# frp管理后台用户名和密码,这里演示设置的弱密码,建议实际应用中尽可能设置复杂,虽然Web只是展示,但有暴露端口信息的风险  
dashboard_user = admin
dashboard_pwd = 123456
enable_prometheus = true

# frp日志配置
log_file = /var/log/frps.log
log_level = info
log_max_days = 3

运行服务端程序

./frps -c ./frps.ini

客户端

配置一个或多个客户端都,可根据自己的需求来配置,这里我配置了两个客户端:

  1. 运行在虚拟机的Linux
  2. 运行虚拟机的Windows主机(虚拟机遇到无法连接的问题的时候远程桌面来处理)

修改客户端配置(Linux)

vi /etc/frp/frpc.ini

以下我配置了[ssh]/[mysql]/[web] 三个代理,请根据自己实际的需求进行增加或删减代理配置,代理的名字可以自定义但要全局惟一。

[common]
server_addr = 这里修改成公网主机的IP
 # 与frps.ini的bind_port一致
server_port = 7000
 # 与frps.ini的token一致
token = 35ee1664-8bfa-e1ed-3855-02963c81342a

# 配置ssh服务
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
 # 这个自定义,之后再ssh连接的时候要用
remote_port = 6022 

[mysql]
use_encryption = true
type = tcp
local_ip = 127.0.0.1
local_port = 3306
remote_port = 6006

[web]
type = http
local_ip = 127.0.0.1
# 本地运行Web服务使用的端口号,我这里使用的是9095
local_port = 9095
custom_domains = 公网IP或者公网IP对应的域名
# 自定义的远程服务器端口,例如8081,那么访问的时候就可以通过: http://公网IP(或域名):8081  来访问内网的Web了。
remote_port = 8081

运行客户端(Linux)

  1. 运行frpc
sudo ./frpc -c frpc.ini
  1. 测试SSH是否能成功连接
    用ssh命令或者其它terminal工具连接测试
ssh username@公网IP -p 6022 

username: 虚拟机里的Linux系统用户名(即内网中需要穿透的系统登录用户)
6022:frpc.ini中remote_port配置的值。

cmd ssh

Windows客户端配置远程桌面及SSH

配置Windows主要是为:

  1. 当虚拟机遇到问题连不上的时候远程桌面到宿主机上排查。
  2. 只是虚拟机中的frpc出问题了,可以先SSH到Windows宿主机,再用本地IP地址二次SSH到虚拟机中的Linux操作frpc。

如无相关需要无需求请直接忽略这个步骤。

[common]
server_addr = 这里修改成公网主机的IP
#用于frp服务客户端和服务端通讯的端口,需要再服务器防火墙设置里面放行该端口,例如:7000,需要与服务端bind_port保持一致。
server_port = 7000 
# token要与服务端的保持一致,建议设置复杂一些。 
token = 35ee1664-8bfa-e1ed-3855-02963c81342a

# 内穿穿透的连接名称,可以自定义,但要全局惟一。
[mstsc]
type = tcp
local_ip = 127.0.0.1
# Windows远程连接端口
local_port = 3389
remote_port = 7003
#用于frp服务客户端和服务端通讯的端口,需要再服务器防火墙设置里面放行该端口,例如:7000,这个端口不能与服务端bind_port设置成同一个,且每一个内网穿透均需要单独设置一个remote_port。

# proxy name 可以自己定义但要求全局惟一,前面的Linux客户端已经使用了[ssh]这里使用[win_ssh]  
[win_ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 1022
  1. Windows默认是没有启用SSH Service的功能的,需要到:设置-> 应用-> 可选功能->添加可选功能->OpenSSH服务器
  2. 打开服务窗口(service)->OpenSSH Server->右键点击启动(右键属性启动类型修改成自动即可开机启动OpenSSH Server)

安装完后,已安装功能中会显示有OpenSSH服务器
Windows OpenSSH安装

启动和设置开机启动Open SSH Server
设置Open SSH Server启动

运行客户端(Windows)

  1. 在命令窗口进入到frp的解压目录下执行frpc
frpc.exe -c frpc.ini
  1. 测试SSH是否能成功连接
ssh username@公网IP:1022

username: 宿主机Windows系统的用户名(即内网中需要穿透的系统登录用户)
1022:frpc.ini中remote_port配置的值。

从目录结构和系统版本看,是Windows没错了!
SSH登录到Windows
3. 再测试一下远程桌面是否能登录
Windows远程桌面登录
看到这个页面基本可以确定可以连接上了
选择是

查看状态

frp运行成功后,可以通过浏览器访问查看所有客户端主机连接状态。

根据实际情况修改成对应的值即可。

http://公网主机IP:7500

注:

  1. 7500是frps.ini中配置的dashboard_port
  2. 账号密码就是前面配置的dashboard_user和dashboard_pwd的值

Overview

配置开机启动(可选)

(Linux)配置systemctl来控制frps

sudo vi /etc/systemd/system/frps.service

frps可执行文件和配置文件的路径改成你所安装的路径即可

[Unit]
Description = frps service
After = network.target syslog.target
Wants = network.target
 
[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart =/etc/frp/frps -c /etc/frp/frps.ini
 
[Install]
WantedBy = multi-user.target

systemctl 操作frps

# 启动frps
sudo systemctl start frps
# 开机自动启动frps
sudo systemctl enable frps
# 重启frps
sudo systemctl restart frps
# 停止frps
sudo systemctl stop frps
# 查看frps状态
sudo systemctl status frps

(Linux)配置systemctl来控制frpc客户端开机启动

sudo vi /etc/systemd/system/frpc.service

注意:

  1. frpc可执行文件和配置文件的路径改成你所安装的路径即可。
  2. 这里的配置与服务端的配置的区别只有frpcfrps和配置文件frpc.inifrps.ini的差异不要混淆了。
[Unit]
Description = frpc service
After = network.target syslog.target
Wants = network.target
 
[Service]
Type = simple
# 启动frpc的命令,需修改为您的frpc的安装路径
ExecStart =/etc/frp/frpc -c /etc/frp/frpc.ini
 
[Install]
WantedBy = multi-user.target

systemctl 操作frpc

# 启动frps
sudo systemctl start frpc
# 开机自动启动frps
sudo systemctl enable frpc
# 重启frps
sudo systemctl restart frpc
# 停止frps
sudo systemctl stop frpc
# 查看frps状态
sudo systemctl status frpc

Windows 设置开机启动frp

新建启动脚本D:\XXX\frp_0.49.0_windows_amd64\start.bat
:请根据实际情况修改脚本及的路径

@echo off
:home
D:\XXX\frp_0.49.0_windows_amd64\frpc -c D:\XXX\frp_0.49.0_windows_amd64\frpc.ini
goto home

Window开始按钮-> Windows管理工具-> 任务计划程序
Win

create frpc

创建触发器
操作
条件
设置

到此,已经完成了所有的配置

配置过程中遇到的问题列表

  1. new proxy [web] type [http] error: type [http] not support when vhost_http_port is not set
    解决:在服务端的配置加添加vhost_http_port,这里我使用端口号为8081,请根据实际情况修改对应端口号
vhost_http_port = 8081
  1. new proxy [web] type [http] error: proxy [web] domain conf check error: subdomain is not supported because this feature is not enabled in remote frps
    原因:因为服务端的配置frps.ini里没有配置subdomain_host ,但客户端的配置文件frpc.ini中配置了subdomain_host
    解决: 删除客户端中的subdomain_host,或者在服务端添加subdomain_host的配置。

  2. [http.go:119] do http proxy request [host: XXX.XXX.XXX.XXX:8081] error: no route found: XXX.XXX.XXX.XXX /login
    解决: 在客户端添加custom_domains = XXX.XXX.XXX.XXX ,其中是XXX.XXX.XXX.XXX公网IP,如果如果公网IP绑定有域名则可以直接使用域名代替(如果这里填写IP那只能通过IP访问,如果填写域名就只能通过域名访问)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值