步骤/目录:
1.在windows笔记本上下载并配置redis-server
2.购买阿里云服务器,安装frp并配置frps服务器端
3.配置frpc客户端
4.开启服务并验证
5.附录:mysql+frp
    (1)修改配置
    (2)创建远程连接用户
    (3)赋予用户权限并刷新退出
    (4)打开端口
    (5)修改frpc.ini并开启frp

本文首发于个人博客https://lisper517.top/index.php/archives/3/,转载请注明出处。
本文实验日期2022年1月31日。采用windows笔记本(跑redis服务器)+阿里云服务器(系统镜像Ubuntu 20.04)

1.在windows笔记本上下载并配置redis-server

不建议在windows下运行redis,所以官方并未提供windows版redis下载。有一些其他大神更新了windows版redis,以下推荐2个:

首先是微软版redis。由微软方提供,于2016年7月1日更新了3.0.504版后停止更新。
其次是tporadowski版redis(推荐)。由github用户tporadowski提供,目前最新版本为2021年10月18日更新的Redis 5.0.14 for Windows。
(若遇到github网页无法打开,可在gitee上注册并导入仓库后下载)
(根据runoob网站,Redis5.0新增了Stream数据结构,所以还是下新版的好)
对于tporadowski版redis,下载.zip包,解压到安装目录即可。

解压完毕后,打开Redis文件夹,编辑redis.windows.conf文件,需要修改3处:

将bind 127.0.0.1行注释掉。这一行是仅允许从本地访问redis;用frp应该不用改,但是笔者需要在局域网中访问,所以还是打开了。
将protected-mode yes改为protected-mode no。老版本的redis可能没有这一行,如果没有则建议重新下载新版redis;
新增一行:requirepass 你的密码。由于redis的处理速度较快,建议密码设置的复杂一些。

配置完成后,打开cmd命令行,cd到redis文件夹(也可以将redis文件夹添加到系统路径),输入redis-server redis.windows.conf,正常显示redis服务器端界面,即可。
在linux下redis的配置也差不多,不同的是linux下redis的配置文件是redis.conf。

2.购买阿里云服务器,安装frp并配置frps服务器端

首先介绍一下frp。frp分为frps(server)和frpc(client),其中frps运行在有公网ip的云服务器上,frpc运行在内网中的机器上。frp主要用于把内网机器的端口映射到云服务器端口,比如把内网机器的22端口(一般用于ssh)映射到云服务器的6000端口,那么访问云服务器的6000端口即可接入内网机器的ssh服务。如果有其他方法搞到公网ip,也可以跳过这一步。

随便选择一个便宜的服务器,购买后安装镜像,这里选择的系统镜像是Ubuntu 20.04。在左侧 服务器运维-远程连接 中设置一下root账户密码,然后下载putty,通过putty连接:连接类型为SSH,端口为默认的22,主机地址填云服务器的ip地址。输入root和root密码后即登录到云服务器。

目前frp最新版本为0.38.0(2021年10月25更新)。这里安装frp到/bin目录下(wget github速度慢可以换成gitee上的仓库):

cd /bin
wget https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_amd64.tar.gz
tar -zxvf frp_0.38.0_linux_amd64.tar.gz
mv frp_0.38.0_linux_amd64 frp
cd frp
nano frps.ini

然后配置一下frps.ini:

[common]
bind_port = 7000
#frpc上也要有相同的token值
token = 你的密码
#配置log
log_file = /var/logs/frps.log
log_level = info
log_max_days = 3
#frps统计板
dashboard_port = 7500
dashboard_user = wuhuqifei
dashboard_pwd = wuhuqifei
kcp_bind_port = 7000

解读一下配置选项:bind_port是frp使用的端口;token是密码令牌;log是日志相关;dashboard是统计板,设置好以后,网页访问 服务器ip:7500 即可看到frps的统计情况,user和pwd分别设置统计板的用户名密码(不用太复杂,简单易记即可)。如果后面运行frps时显示没有frps.log文件,可以自己新建一个并chmod改一下权限(或者直接删掉log相关设置)。最后的kcp_bind_port是多消耗15%左右流量、降低tcp延迟的,不要也可以不加。
详细配置可以参考frps_full.ini。
配置完成后,需要打开云服务器相应端口。在 安全-防火墙 中新增规则,打开7000和7500端口(云服务器在此处打开,非云服务器则使用ufw、iptables等。云服务器用ufw会出问题)。
附带一些github上常见问题:

流量是否经过服务器中转?
目前除了 xtcp 外,其他类型的内网穿透模式的流量都需要经过 frps 所在服务器中转。

网络传输速度慢是什么原因?
由于流量需要经过服务器转发,所以传输速度的快慢取决于服务器的下行带宽和客户端的上行带宽,通常家用宽带的上行带宽较低,限制了出口的速度。
另外一种情况是服务器部署在国外的 VPS 上,丢包率较高,也会影响到传输速度。这种情况下可以考虑开启 kcp 传输模式。
开启加密和压缩会消耗一定的 cpu 资源,且影响到传输速度,具体影响情况取决于机器性能。

客户端连接失败,提示 authorization failed
出现这种情况说明鉴权失败,检查 frps 和 frpc 的配置文件中的 token 是否一致。

客户端连接失败,提示 authorization timeout
出现这种情况是因为 frps 所在服务器和 frpc 所在服务器的系统时间相差较大。如果不希望在身份校验时加入系统时间,可以将 frps 配置文件中的 authentication_timeout 设置为 0 来解决这个问题。

frpc 能否在系统启动阶段无网络时一直等待而不是直接退出?
在 frpc 的配置文件中将 login_fail_exit 设置为 false,则 frpc 启动后会不断尝试连接 frps,直到连接成功,而不是直接退出。

最后使用./frps -c ./frps.ini即可启动frps。启动后不能关闭putty,这时可以访问7500端口查看是否成功开启。

3.配置frpc客户端

linux安装frp同上。对于windows,在frp下载页面下载frp_0.38.0_windows_amd64.zip,解压到目标文件夹即可。windows安全中心可能会删掉frps.exe,因为用不到所以无妨。

配置一下frpc.ini:

[common]
server_addr = 云服务器ip地址
server_port = 7000
token = 你的密码
login_fail_exit = false

[frp-redis]
type = tcp
local_port = 6379
local_ip = localhost
remote_port = 16380

解读frpc.ini:[common]是基础设置,下面的[frp-redis]是一个映射。以后要添加新的映射就在下面加,不用改动[common],具体可以参考frpc_full.ini。要注意的是,如果有多个内网机器的多个端口需要映射,每个映射名要不同。比如多个redis要开放到外网,就可以写[frp-redis-1][frp-redis-2][frp-redis-3]等等。

然后打开云服务器的16380端口(同前),本地的6379端口不用打开(因为frp穿透时,被映射的本地端口接收的操作都会被frp改成从本地发起)。Ubuntu系统可以安装ufw,然后ufw allow 6379(其他发行版请自行搜索)。另外,windows打开端口,是在 控制面板-Windows防火墙-高级设置-入站规则-新建规则 ,新建一个tcp类型、6379端口的规则,之后有程序使用6379端口时即可使用netstat -na查看所有开放的端口。

以上都配置完后,使用frpc -c frpc.ini即可开启服务。这时访问dashboard地址,就能在 Proxies-TCP 中看到名为 frp-redis 的服务,其status为online。

4.开启服务并验证

验证时需要在云服务器上也安装redis。本例中云服务器的系统镜像是Ubuntu20.04,可以直接用apt下载:

apt install redis-server

开启frps:使用putty连接至云服务器,输入

frp路径\frps -c frp路径\frps.ini

开启后勿关闭putty。
开启frpc:在windows下,cmd中输入

frp路径\frpc -c frp路径\frpc.ini

开启后勿关闭cmd窗口。
开启redis-server:在windows下,cmd中输入

redis路径\redis-server redis路径\redis.windows.conf

开启后勿关闭cmd窗口。
这时用另一个putty窗口连接到云服务器,输入

redis-cli -h 云服务器ip -p 16380 -a redis密码

(也可省略-a,在redis命令行中使用auth命令)
其中redis密码即requirepass中自己设置的密码。
登录上后使用ping命令,服务器端会返回PONG。
之后为了方便,可以设置开机自动运行frps、frpc、redis-server。之后即可将redis用于scrapy-redis等其他用途。

5.附录:mysql+frp

这里假设windows10机器上已安装好mysql。

(1)修改配置

在mysql安装目录下找到配置文件my.ini,添加一行:

bind-address=*

允许从其他ip地址访问mysql数据库。用frp应该不用改,但是笔者需要在局域网中访问,所以还是打开了。

(2)创建远程连接用户

在mysql命令行中输入以下命令,可查看mysql用户及允许登录的地点:

select distinct concat('User: ''',user,'''@''',host,''';') as query from mysql.user;

如果想将root登录的地点改为任意ip,可使用:

RENAME USER 'root'@'localhost' TO 'root'@'%';

但允许root用户远程登录mysql比较危险,不如创建一个新用户专门用于远程连接:

CREATE USER 'mysql-remote1'@'%' IDENTIFIED BY '你的密码';

mysql 8.0后用户认证默认使用sha2,这里将该用户改为用原生密码认证:

ALTER USER 'mysql-remote1'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';

创建用原生密码认证的用户,只需将上述命令的ALTER改为CREATE。

(3)赋予用户权限并刷新退出

接着赋予该用户一定的权限。输入下面的命令可以给账号全局权限,包括创建(CREATE)、修改(ALTER)、删除(DROP) 数据库、表、用户,任意表的插入(INSERT)、更新(UPDATE)、删除(DELETE)操作权限。可以使用 SELECT 查询数据,使用 REFERENCES 建立外键关系权限,以及使用 RELOAD 权限执行 FLUSH 操作的权限。当然,你也可以根据自己都需求,对账号权限进行调整。

GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'mysql-remote1'@'%' WITH GRANT OPTION;

这里我需要能远程修改数据库,所以只赋予了部分权限:

GRANT ALTER, INSERT, DELETE, SELECT on *.* TO 'mysql-remote1'@'%' WITH GRANT OPTION;

然后刷新权限并退出:

FLUSH PRIVILEGES;
quit;

(4)打开端口

mysql默认用3306端口,但是本地端口不用打开。在云服务器上打开frp要用的端口(以16381为例)。

(5)修改frpc.ini并开启frp

在frpc.ini中添加:

[frp-mysql]
type = tcp
local_port = 3306
local_ip = localhost
remote_port = 16381

之后重启win10机器的frpc即可。

标签: frp, redis

添加新评论