步骤/目录： 0.Samba的陷阱 1.需求介绍 2.Samba与frp 3.ftp 4.webdav本文首发于个人博客https://lisper517.top/index.php/archives/59/，转载请注明出处。本文的目的是使用树莓派搭建可公网访问的NAS，并且比较Samba, ftp与webdav这三种方式的异同。本文实验日期为2022年10月11日。使用的是树莓派4B（内存8G版），系统为Pi OS 64位桌面版（2022年4月4日更新，镜像名 2022-04-04-raspios-bullseye-arm64.img ）。0.Samba的陷阱当你在windows中打开 我的电脑 ，此时打开的东西叫文件管理器（Windows Explorer）。从文件管理器向其它地方拷贝东西，WE会要求目标硬盘先创建一个同等大小的空镜像（内容全部为0的镜像），再填充数据；Samba会调用 ftruncate() 函数来创建，而该函数在FAT文件系统上运行奇慢，需要花很长时间才能创建好空白镜像，WE以为Samba卡死了，最终会返回0x8007003B错误（ 参考回答 ）。FAT文件系统创建空镜像这么慢，归根结底是不支持sparse file（稀疏文件），所以它创建空镜像时真的会在硬盘上挨个写入0；而支持sparse file的，直接指定空镜像文件的头尾区块、存在metadata中即可，不用管这些区块上原本是1还是0。在Samba的设置中有一项隐藏的默认值 strict allocate = no ，如果改成yes，当单个文件大小超过500MB，Samba自己就会要求先生成空镜像再填充数据（参考 wiki-Samba 的 SMB/SMB2 write activities 一节）。综上所述，不需要改Samba的配置，只要保证Samba挂载的不是FAT文件系统（exFAT、FAT32）而是ext4、NTFS就行了（ 参考回答 ）。先创建空镜像再写入，本意是好的，只是FAT执行坏了。1.需求介绍在之前 树莓派+Samba+frp搭建NAS（网络云存储） 一文中，曾介绍过使用Samba在局域网内搭建NAS，并且使用千兆路由器后达到了不错的内网分享速度。在那篇文章中还将samba使用的445端口通过frp映射到公网ip，试图在公网也能访问NAS，但实际上并没有成功。本文将再次尝试，并且除了Samba之外，还尝试使用ftp与webdav方式搭建。需要注意的是，文中提到的所有方法都是树莓派直连硬盘，也就是说用linux把硬盘分享为NAS；如果你用windows电脑直连硬盘分享NAS，本文可能帮不了你。最后，本文中使用的都是云服务器+frp，这样NAS的带宽会被严重限制为云服务器的带宽，有条件的建议还是用DDNS，见之前的文章 路由器与DDNS （如果你家用的是移动的宽带，也可以不用看那篇文章，就用云服务器+frp）。2.Samba与frp在之前的文章中，成功在树莓派上搭建了Samba，内网已经能流畅访问，千兆路由器下，文件读写最快能达到113MB/s，而机械硬盘的最高读写速度也才150MB/s左右，已经很不错了。后来试着用frp开放到公网，怀疑因为云服务器带宽不够（640KB/s），导致windows上连接超时。之后换用 3.75MB/s 的云服务器，还是无法连接，这时才怀疑是否操作有些问题。最终，通过一番寻找，笔者成功解决了Samba开放到外网、用windows连接的问题。这里就跳过Samba的搭建，直接讲如何配置frp，windows如何连接。云服务器、frps和frpc的其他配置见前文，frpc配置好后添加一个samba的映射即可：[samba] type = tcp local_ip = localhost local_port = 445 remote_port = 44500这里 remote_port 选择44500而不是445，主要是因为安全性。445端口本来就是windows用来共享文件夹的，据有些文章说以前 永恒之蓝 病毒针对445、139等端口搞了一些事情，导致现在445、139等端口被全网封禁（139、138、137也和文件共享有关，据说如果445走不通就会尝试这些端口）。所以现在映射445到服务器其他端口，你可以自己选一个大一点的，这里以44500为例。设置完frpc.ini后，在云服务器的防火墙中打开44500端口。到这里，其实已经可以连接到Samba了，mac、linux都可以指定端口号，在文件浏览器中输入 smb://云服务器ip或域名:44500/共享名 即可，然后输入用户名密码即可；linux用命令行挂载时，需要如下操作：apt install -y cifs-utils #CentOS把apt换成yum即可 mkdir /mnt/test mount -t cifs -o username="用户名",password="密码",port=44500 //云服务器ip或域名/共享名 /mnt/test但是windows不支持把Samba换到其他端口，只能使用445端口交流。好在有其他的方法，比如将云服务器的44500端口在windows电脑上连接到445端口。用管理员模式运行cmd，进行如下操作（这里参考了 这篇文章 ）：netstat -aon | findstr "445"如果有输出任何字符的话，说明系统占用了445端口，一般这个进程的pid为4，相关的服务名为Server。cmd中输入 services.msc ，按Enter打开，出现一个管理服务的界面，找到一个名称为 Server 的服务，右键单击，选择属性，在 常规 分页中把它的 启动类型 从 自动 改为 禁用 。这个Server服务估计是管理一些共享文件夹的，不过笔者实验时docker desktop也需要用它（但是windows想要连接Samba必须关掉Server）。之后重启电脑，再次用管理员模式打开cmd，再次输入 netstat -aon | findstr "445" ，确认这次没有输出任何字符、只输出了空行。然后运行以下命令：netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=445 connectaddress=云服务器ip或域名 connectport=44550 netsh interface portproxy show all #查看一下 #之后使用netsh interface portproxy delete v4tov4 listenaddress=127.0.0.1 listenport=445即可删除这条端口转接设置那么现在云服务器的44500端口就接到windows电脑的445端口上，你往本机的445端口发送什么东西，都会被转发到云服务器的44500端口（像iptables配置的端口转发一样）。此时你在文件浏览器中输入 \\localhost\共享名 ，或者用之前文章提到的 此电脑 -> 计算机 -> 映射网络驱动器 也可以，同样填 \\localhost\共享名 ，之后输入用户名密码即可。如果Samba开放到公网后想用android手机连接，ES文件浏览器不能用（可能需要开会员才能连公网SMB，不是很想开），笔者找到的其他android的SMB客户端又要用Google Play下载。如果需要用android连NAS，建议看后面的内容，或者你把手机刷成其他海外版固件。3.ftpftp是一项上古技术了，很早期就被用于计算机间分享文件，现在也有很多镜像站的网站名称中有ftp。早期的ftp不需要验证，后来发展出了vsftp，即 very secure ftp ，所以拿来做公网开放的NAS也还行。在树莓派上进行如下操作：apt-get install vsftpd nano /etc/vsftpd.conf把vsftpd的配置文件进行如下修改：在最开头加上两行： pasv_enable=YES 和 port_enable=YES 再加上两行： pasv_min_port=65000 和 pasv_max_port=65001 把 #write_enable=YES 前面的#去掉 把 #local_umask=022 前面的#去掉然后重启一下vsftpd服务：service vsftpd restart和samba一样，ftp也需要用户名、密码登录，而且ftp用户、密码对应同名的系统用户、密码（但是samba虽然用户同名，密码却独立于系统密码）；默认情况下，使用某个系统用户的用户名、密码登录，登录后就会看到该用户的家目录，所以这里可以创建一个系统用户ftp_user：useradd -m -s /bin/bash ftp_user passwd ftp_user然后你可以挂上需要共享的硬盘，把硬盘mount到/home/ftp_user下。如果有防火墙的话，打开20、21、65000、65001端口（比如ufw、iptables），就可以用客户端连接了。在windows机器上，打开资源管理器，直接在地址栏输入 ftp://ftp机器ip地址:21/ 即可连接，会提示输入用户名密码（ftp_user和 passwd ftp_user 设置的密码）。在linux机器上，带图形界面的话也可以在资源管理器输入 ftp://ftp机器ip地址:21/ ；在命令行界面，可以使用 curlftpfs 扩展：yum install -y curlftpfs #ubuntu是apt mkdir /mnt/ftp_test curlftpfs -o codepage=utf8 ftp://用户名:密码@ftp机器ip地址:端口号 /mnt/ftp_test即可把ftp文件系统挂载到/mnt/ftp_test下。在Mac上，笔者太过贫穷没有Mac，但是估计也是在地址栏输入 ftp://ftp机器ip地址:21/ 就行了。ftp最重要的缺陷可能是无法实时播放。笔者在内网实验时，很多视频播放器都支持播放ftp视频（即从URL打开），比如开源的SMPlayer；但是输入URL时，如果你的FTP有密码（不允许匿名连接），则可能还要在URL中加上用户名密码，比较麻烦；据说用WebDrive（收费）等软件可将FTP服务器挂载到一个驱动器号下、实时打开视频，但是笔者没有继续实验。ftp也有优点，比如ES文件浏览器可以轻松支持公网FTP；开放到公网时，从windows客户端连接时可以随意换端口（从21换成2121或者其他），不像samba那样只能在windows客户端上把本机的445和公网ip的samba端口连接。单从传输速度看，ftp和samba差不多。但是综合考虑，笔者还是推荐samba。关于ftp公网开放，使用之前文章提到的frp可以实现，笔者没有继续深究。最后稍微讲解一下ftp的配置。ftp的连接方式分为2种，PORT主动方式和PASV被动方式，默认使用PORT方式。客户端使用21端口（或者其他自行设置的端口）连接到服务器后，需要传输文件时，PORT方式是客户端打开一个随机端口（这个端口在一定范围内）、服务器端用20端口向客户端建立连接（受客户端防火墙影响），PASV方式则是服务器打开一个随机端口（用pasv_max_port和pasv_min_port确定上下限）、客户端连接到服务器的这个随机端口（受服务器端防火墙影响）。从方便的角度考虑，PASV不需要客户端在每次连接时放行端口，应该更好一点。更多ftp的配置可参考 这篇文章 。4.webdav关于在树莓派上设置webdav的内容，可参考 这篇文章 。据说webdav在开放到公网后，从windows客户端连接时比samba简单一点，笔者没有验证，主要是samba确实已经够用了，而且兼容性上samba也是最优选，参考笔者的命令可很方便地随时随地打开samba的NAS，实时查看、编辑文件，很多电视盒子、机顶盒等设备都支持SMB。
步骤/目录： 1.准备工作 2.编写frpc.ini和compose模板 3.运行并验证 附录： 1.让frps的dashboard使用https （1）tls介绍 （2）生成证书并运行 （3）访问的注意事项 2.frp双向验证 （1）介绍 （2）准备工作 （3）修改配置并运行本文首发于个人博客https://lisper517.top/index.php/archives/21/，转载请注明出处。本文的目的是使用docker、docker-compose在云服务器上运行frps、在树莓派上运行frpc。本文实验日期为2022年7月27日。本文使用的是树莓派4B（内存8G版），系统为Pi OS 64位桌面版（2022年4月4日更新，镜像名 2022-04-04-raspios-bullseye-arm64.img ）。之前的文章中曾介绍过frp，详见 在树莓派上设置frp穿透 。简单来说，frp的运行需要一台有公网ip的机器和另一台机器（比如没有公网ip的内网机器）；frp的作用是把另一台机器的端口映射到公网机器，使得从公网机器也能访问到另一台机器的端口（即内网穿透）。在docker官方仓库网页可以搜索到很多frp镜像，这里frpc选用的是snowdreamtech/frpc镜像，其下载量为10M+，两个月前更新。frps镜像也是该作者的。1.准备工作首先准备云服务器。笔者这里使用的是阿里云，镜像为Docker 19.03。在云服务器上进行如下操作：docker pull snowdreamtech/frps mkdir -p /docker/frps/conf mkdir /docker/frps/ssl_certificate #存放tls相关证书 #安装docker-compose。使用env命令发现PATH里没有/usr/local/bin，就放在/usr/bin里了 curl -L https://github.com/docker/compose/releases/download/v1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/bin/docker-compose chmod +x /usr/bin/docker-compose docker-compose -v #编辑frps配置 vim /docker/frps/conf/frps.ini笔者使用的初始frps配置如下：[common] bind_port = 7000 #frpc上也要有相同的token值 token = 你的密码 #frps统计板 dashboard_port = 7500 dashboard_user = wuhuqifei dashboard_pwd = wuhuqifei #kcp据说是多消耗15%流量、降低tcp延迟。端口可和bind_port相同 kcp_bind_port = 7000使用初始配置时的运行命令：docker run -d --name frps -v /docker/frps/conf/frps.ini:/etc/frp/frps.ini --network host --restart=always snowdreamtech/frps为了让dashboard使用tls协议加密，笔者将frps.ini修改为：[common] bind_port = 7000 #frpc上也要有相同的token值 token = 你的密码 #frps统计板 dashboard_port = 7500 dashboard_user = wuhuqifei dashboard_pwd = wuhuqifei #kcp据说是多消耗15%流量、降低tcp延迟。端口可和bind_port相同 kcp_bind_port = 7000 #dashboard使用tls的相关配置 dashboard_tls_mode = true dashboard_tls_cert_file = /ssl_certificate/server.crt dashboard_tls_key_file = /ssl_certificate/server.key关于.crt、.key、ca.crt文件的介绍与自己生成的方法见 附录1. ，或者参考 gofrp文档 。然后更改命令，加上挂载证书存放目录的部分：docker run -d --name frps -v /docker/frps/conf/frps.ini:/etc/frp/frps.ini -v /docker/frps/ssl_certificate:/ssl_certificate --network host --restart=always snowdreamtech/frps记得把.crt（这里不是指ca.crt）、.key文件放到云服务器的/docker/frps/ssl_certificate目录，至此云服务器设置完毕。接下来对树莓派进行操作。在树莓派上准备目录，拉取镜像：mkdir -p /docker/frpc/conf docker pull snowdreamtech/frpc2.编写frpc.ini和compose模板nano /docker/frpc/conf/frpc.ini写入以下内容：[common] server_addr = 云服务器ip地址 server_port = 7000 token = 你的密码 login_fail_exit = false [pi4B-ssh-1] type = tcp local_ip = localhost local_port = 22 remote_port = 50022其中pi4B-ssh-1这一项映射是为了之后验证。另外由于这项映射要使用到服务器的50022端口，还需要登录到云服务器主页、在防火墙设置里打开该端口（勿用ufw或iptables打开）。再为树莓派编写compose模板：nano /docker/frpc/docker-compose.yml写入以下内容：version: "3.9" services: frpc: image: snowdreamtech/frpc network_mode: host volumes: - /docker/frpc/conf/frpc.ini:/etc/frp/frpc.ini logging: driver: syslog restart: always3.运行并验证cd /docker/frpc docker-compose config docker-compose up #输出结果 frpc_1 | 2022/07/27 03:23:33 [I] [service.go:301] [50829e63df489f3f] login to server success, get run id [50829e63df489f3f], server udp port [0] frpc_1 | 2022/07/27 03:23:33 [I] [proxy_manager.go:144] [50829e63df489f3f] proxy added: [pi4B-ssh-1] frpc_1 | 2022/07/27 03:23:33 [I] [control.go:180] [50829e63df489f3f] [pi4B-ssh-1] start proxy success这时可以登录到frps的dashboard（云服务器ip:7500/），输入设置的用户名密码，在 Proxies-TCP 中，可看到一项名为 pi4B-ssh-1 的服务，说明成功设置了frp。想进一步实验，可以试着用putty连接到 云服务器ip:50022 ，即通过公网ip连接到树莓派ssh。再次提醒，记得在云服务器的设置里打开50022端口。最后，若要后台运行docker-frpc，可使用docker-compose up -d命令。最后提醒一下，关于ufw的使用。用frp把树莓派端口映射到服务器，或者使用docker把容器端口映射到宿主机树莓派时，即使没有用ufw打开端口，也能从树莓派本地以外访问到这些端口。所以为了安全起见，请谨慎设置端口映射。另外，关于dashboard开启https的进一步内容，可阅读 附录1. 。附录：1.让frps的dashboard使用https在云服务器上开启frps的dashboard是挺简单的，但是由于云服务器有公网ip，暴露dashboard端口其实不太安全。笔者之后了解到，frps的dashboard可以通过一些设置来使用tls协议、走https，于是查找了一些资料后配置成功。（1）tls介绍SSL/TLS是一种密码通信框架，其中SSL出现较早，TLS出现较晚，TLS可以说是SSL的后续版本。在 Docker树莓派实践——Typecho 一文中，nginx配置其实就出现了SSL/TLS：ssl_protocols TLSv1 TLSv1.1 TLSv1.2;实际上，HTTPS、SMTP服务都可由SSL/TLS承载。SSL/TLS的具体原理就不介绍了。从使用上来说，使用TLS，可以身份验证、信息加密，使得信息传输更加安全，这样访问服务器端口、使用frp或其他软件时就更加保险。（2）生成证书并运行这里主要参考了 gofrp文档 。笔者使用的阿里云，虽然为自己的域名申请了一个免费证书，但该证书下载下来后，其apache版本的crt文件分为chain和public，nginx版则只有pem文件，而且都没有ca.crt。实际上，dashboard使用的证书最好还是自己生成。在树莓派上使用如下命令：mkdir ~/ssl_cert cd ~/ssl_cert find / -name "openssl.cnf" #查找openssl.cnfopenssl.cnf是openssl的配置文件，需要拷贝到~/ssl_cert下。在树莓派上找到了/usr/lib/ssl/openssl.cnf和/etc/ssl/openssl.cnf，但内容与 gofrp文档 有些差异。于是笔者直接复制了 gofrp文档 中的配置：nano ~/ssl_cert/my-openssl.cnf写入以下内容：[ ca ] default_ca = CA_default [ CA_default ] x509_extensions = usr_cert [ req ] default_bits = 2048 default_md = sha256 default_keyfile = privkey.pem distinguished_name = req_distinguished_name attributes = req_attributes x509_extensions = v3_ca string_mask = utf8only [ req_distinguished_name ] [ req_attributes ] [ usr_cert ] basicConstraints = CA:FALSE nsComment = "OpenSSL Generated Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer [ v3_ca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = CA:true接下来生成默认ca（CA即Certification Authority，颁发证书的机构）：openssl genrsa -out ca.key 2048 openssl req -x509 -new -nodes -key ca.key -subj "/CN=www.lisper517.top" -days 5000 -out ca.crt其中可以把www.lisper517.top改成自己的域名，或者也可以乱写。然后使用以下命令生成证书：#第一条命令 openssl genrsa -out server.key 2048 #第二条命令 openssl req -new -sha256 -key server.key \ -subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN=server.com" \ -reqexts SAN \ -config <(cat my-openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:localhost,IP:47.98.39.236,DNS:lisper517.top")) \ -out server.csr #第三条命令 openssl x509 -req -days 365 \ -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \ -extfile <(printf "subjectAltName=DNS:localhost,IP:47.98.39.236,DNS:lisper517.top") \ -out server.crt注意把第二、三条命令中的IP:47.98.39.236,DNS:lisper517.top修改一下，IP改成自己云服务器的ip，DNS改成自己的域名。这些文件里需要的是server.crt和server.key，而ca.crt在 附录2. 中需要用到，并且可以用于关闭浏览器警告。可以使用如下命令压缩并转移：zip cert.zip ca.crt server.crt server.key cd .. mv ssl_cert /home/pi #或者其他用户，只要能用WinSCP登录。如果设置了root可登录，也可以不mv因为用WinSCP把server.key转移到win10机器上时出现Permisson denied，所以先压缩一下才能转移。之后解压一下，还是通过WinSCP放到云服务器上（笔者放到了/docker/frps/ssl_certificate目录下，ca.crt可以不放到云服务器上）。另外，如果想通过配置使得win10或linux接受自己颁发的证书，还要记得转移一下ca.crt，这个文件用于确认颁发证书的机构。最后记得删除临时文件夹：rm -r /home/pi/ssl_cert至此就生成并转移了需要的三个文件。然后在浏览器访问 https://域名:7500 ，就会发现dashboard已经使用了https。但是由于证书是自己生成的，浏览器会发出警告。关于警告的解决方法见下一节 （3）访问的注意事项 。（3）访问的注意事项对自己生成的证书，浏览器会认为证书颁发机构不可信任。笔者一般是强行访问，但也可以通过设置来添加到可信任的颁发机构。在linux上，笔者并未实操，但据说将ca.crt放到/usr/local/share/ca-certificates目录下，然后update-ca-certificates即可。在win10上，可按win+r键，输入mmc并运行，在 文件-添加/删除管理单元 中，在左侧单击 证书 ，点击 添加 ，然后可以为本用户或计算机所有用户添加，点击完成、确定，然后点击 证书 - 当前用户 （或 证书 - 计算机用户） 的下拉菜单，点击 受信任的根证书颁发机构-证书 ，在中间会出现许多颁发机构。在中间空白处右键单击，然后选择 所有任务-导入 ，最后把自己的ca.crt导入即可。最后关闭，将设置存入 控制台1.msc 即可。之后重启电脑，就不会出现安全警告了。2.frp双向验证（1）介绍详见 gofrp文档 。简单来说，frp可以使用use_encryption或STCP等功能让传输过程安全，但无法判断对方身份是否合法。而使用tls、双向验证，不仅能加密，还能验证身份。（2）准备工作刚才介绍dashboard使用https时提到过，ca.crt代表了证书颁发机构，如果server.crt和server.key是ca签发或在ca的信任链中，则server.crt和server.key是合法的。也可以理解为，ca.crt为server.crt和server.key提供合法性，只要验证了ca.crt颁发了这两个文件，那么这两个文件就可以信任。frp双向验证的双向，指的就是frpc和frps对彼此的身份都要验证。在前文中笔者演示了自己颁发证书，生成了ca.crt、server.crt和server.key，这里我们称为server_ca.crt、server.crt和server.key；使用类似的方法生成client_ca.crt、client.crt和client.key，那么frpc端上存放server_ca.crt、client.crt和client.key，其中server_ca.crt用来对frps端进行验证，client.crt和client.key则提供给frps端以使frps端对frpc端进行验证；对称地，frps端上存放client_ca.crt、server.crt和server.key，其中client_ca.crt用来对frpc端进行验证，server.crt和server.key则提供给frpc端以使frpc端对frps端进行验证。前文已经生成了server_ca.crt、server.crt和server.key，虽然是给dashboard用的，但也能用于双向验证。接下来只演示生成client_ca.crt、client.crt和client.key。之前的步骤见前文，这里只有最后三条命令有改动：#第一条命令 openssl genrsa -out client.key 2048 #第二条命令 openssl req -new -sha256 -key client.key \ -subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN=client.com" \ -reqexts SAN \ -config <(cat my-openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:lisper517.top,DNS:www.lisper517.top")) \ -out client.csr #第三条命令 openssl x509 -req -days 365 \ -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial \ -extfile <(printf "subjectAltName=DNS:lisper517.top,DNS:www.lisper517.top") \ -out client.crt同样注意把DNS:lisper517.top,DNS:www.lisper517.top改成自己的域名，或者乱写也可以。同样，转移client.key的时候提示Permisson denied，也用zip压缩后转移。另外，转移ca.crt的时候务必分清，最好是像下文中一样改个名字。最后，记得删除临时文件夹。（3）修改配置并运行vim /docker/frps/conf/frps.inifrps配置新增四行：[common] bind_port = 7000 token = 你的密码 dashboard_port = 7500 dashboard_user = wuhuqifei dashboard_pwd = wuhuqifei kcp_bind_port = 7000 dashboard_tls_mode = true dashboard_tls_cert_file = /ssl_certificate/server.crt dashboard_tls_key_file = /ssl_certificate/server.key #新增内容 tls_only = true tls_cert_file = /ssl_certificate/server.crt tls_key_file = /ssl_certificate/server.key tls_trusted_ca_file = /ssl_certificate/client_ca.crt然后把三个文件放到/docker/frps/ssl_certificate文件夹中。注意这里的ca.crt是生成client.crt、client.key时生成的，即client_ca.crt。最后重启docker-frps，服务器端配置完毕：docker restart frps然后对树莓派进行如下修改：mkdir /docker/frpc/ssl_certificate nano /docker/frpc/conf/frpc.ini同样增加四行内容：tls_enable = true tls_cert_file = /ssl_certificate/client.crt tls_key_file = /ssl_certificate/client.key tls_trusted_ca_file = /ssl_certificate/server_ca.crt同样把三个文件放到文件夹中，同样注意这里的ca.crt是生成server.crt、server.key时生成的，即server_ca.crt。然后挂载/docker/frpc/ssl_certificate：nano /docker/frpc/docker-compose.yml在volumes下新增：- /docker/frpc/ssl_certificate:/ssl_certificate由于新增了挂载，需要删除容器、重新生成：docker stop frpc_frpc_1 docker container rm frpc_frpc_1 cd /docker/frpc docker-compose up查看一下日志，是否成功连接。成功连接后使用-d后台运行：docker stop frpc_frpc_1 docker-compose up -d
步骤/目录： 0.Samba的陷阱 1.树莓派下载安装samba 2.配置samba 3.为samba绑定系统用户 4.其他客户端连接到共享文件夹 （1）linux （2）Windows （3）安卓手机 （4）投影仪、电视 附：ES文件浏览器 连接Samba 5.frp+samba 6.加快读写速度 （0）分析瓶颈、测试硬盘 （1）网线直连 （2）换路由器 （3）修改smb.conf （4）其他 （5）后续 （6）总结 7.自动挂载硬盘 8.使用qBittorrent离线下载 附录：小米手机开启FTP服务器本文首发于个人博客https://lisper517.top/index.php/archives/16/，转载请注明出处。本文的目的是使用树莓派搭建NAS，可以远程访问云硬盘上的文件，并可进行离线下载。本文实验日期为2022年2月19日。使用的是树莓派4B（内存8G版），系统为Pi OS 32位桌面版（2022年1月28日更新，镜像名 2022-01-28-raspios-bullseye-armhf.img ）。frps运行在阿里云服务器（系统镜像Ubuntu 20.04）。本文使用Samba搭建NAS，而且并没有涉及UPS电源、RAID等，属于入门级NAS，感兴趣的可自行深造。Samba可以替换为FTP，或者懒得自建NAS也可以购买群晖等现成NAS。0.Samba的陷阱当你在windows中打开 我的电脑 ，此时打开的东西叫文件管理器（Windows Explorer）。从文件管理器向其它地方拷贝东西，WE会要求目标硬盘先创建一个同等大小的空镜像（内容全部为0的镜像），再填充数据；Samba会调用 ftruncate() 函数来创建，而该函数在FAT文件系统上运行奇慢，需要花很长时间才能创建好空白镜像，WE以为Samba卡死了，最终会返回0x8007003B错误（ 参考回答 ）。FAT文件系统创建空镜像这么慢，归根结底是不支持sparse file（稀疏文件），所以它创建空镜像时真的会在硬盘上挨个写入0；而支持sparse file的，直接指定空镜像文件的头尾区块、存在metadata中即可，不用管这些区块上原本是1还是0。在Samba的设置中有一项隐藏的默认值 strict allocate = no ，如果改成yes，当单个文件大小超过500MB，Samba自己就会要求先生成空镜像再填充数据（参考 wiki-Samba 的 SMB/SMB2 write activities 一节）。综上所述，不需要改Samba的配置，只要保证Samba挂载的不是FAT文件系统（exFAT、FAT32）而是ext4、NTFS就行了（ 参考回答 ）。先创建空镜像再写入，本意是好的，只是FAT执行坏了。1.树莓派下载安装samba输入apt install samba即可。一共安装了16个包（如果没有samba-common-bin则需手动下载）：attr libcephfs2 liburing1 python3-dnspython python3-gpg python3-markdown python3-requests-toolbelt python3-samba python3-tdb python3-yaml samba-common samba-common-bin samba-dsdb-modules samba-vfs-modules tdb-tools2.配置sambasamba的配置文件为/etc/samba/smb.conf。在其中底部添加：[shared] path = /home/samba_user/shared #共享文件夹目录 valid users = samba_user writable = yes read only = no create mask = 0755 #创建文件时，权限为755（测试时发现不管改成什么，创建的文件都是755） directory mask = 0755 #创建目录权限为755（同上） #browseable = yes #无权限的人可看到资源名称另外在[global]下添加：security = user #设定安全等级保存退出，使用testparm检测samba设置有无语法错误。关于samba配置更多信息可参考这篇文章。安全方面，还可用hosts allow设置允许访问的主机、write list设置仅哪些用户可进行写操作。3.为samba绑定系统用户创建用户的命令可以参考 提升树莓派安全性 。这里新建一个用户samba_user，并创建共享文件夹：mkdir -p /home/samba_user/shared useradd -d /home/samba_user samba_user passwd samba_user chown -R samba_user:samba_user /home/samba_user然后为samba指定该用户及设置该用户的SMB密码，激活该用户，并重启服务：smbpasswd -a samba_user #后面更改SMB密码也用这个命令 smbpasswd -e samba_user #-d可disable指定SMB用户 service smbd restart #服务名也可能不叫smbd。service --show-all查看所有服务注意SMB密码和用户的系统密码可能不同，连接到samba共享文件夹只需要SMB密码。但是添加其他SMB用户时，还需要先创建一个同名的系统用户（否则 smbpasswd 时会提示 Failed to add entry for user），即需要添加SMB用户时，要先添加一个系统用户，然后添加同名SMB用户，设置SMB密码，连接时用SMB密码。增加用户的范例：useradd -d /dev/null -s /sbin/nologin samba_user2如上设置的samba_user2系统用户，没有家目录，也无法登录，只是为了添加SMB用户而创建，安全性好一点。然后用 smbpasswd 添加SMB用户即可。最后使用ufw打开samba使用的445端口：ufw allow 445。4.其他客户端连接到共享文件夹（1）linux以树莓派为例（这里顺便测试一下刚才的Samba设置），在资源管理器的地址栏输入 smb://树莓派ip ，按回车键后出现两个文件夹：print$与shared，其中shared就是刚才设置的共享文件夹，print$则是samba设置文件自带的。双击shared文件夹后提示需要输入密码，选择已注册用户，用户名为samba_user，密码为SMB密码，下面可以选是否记住密码、记住多久，然后即可进入共享文件夹。接下来插上u盘模拟硬盘，将u盘挂载到shared文件夹下：df -h #输出结果 #/dev/sda1 ...... /media/pi/xxxxx umount /media/pi/xxxxx cd /home/samba_user/shared mkdir usb_1 mount -o uid=samba_user,gid=samba_user /dev/sda1 usb_1 #指定挂载后文件夹所属用户及组用root身份时会默认挂载到root:root下，这里指定挂载到samba_user下才可对共享文件夹有rwx的权限（默认755）。然后在资源管理器中查看，可以成功看到u盘里的文件，也可修改、删除、新增文件。最后这里说明一下samba的权限问题：用smbpasswd -a 用户名可添加一个SMB用户，该用户必须是系统用户。读写权限有两个地方受到限制，一是登录SMB的系统用户对共享文件夹有无rwx权限，二是在smb.conf里设置共享文件夹的读写权限（writable = yes、read only = no都是可写入）。所以挂载硬盘时要挂载到SMB用户同名的系统用户下（要不然就在挂载时设置权限为xx7），且[shared]里面要指定可以读写共享文件夹。如果在命令行下，也可以挂载，但是要安装一些samba客户端或扩展。以CentOS为例：yum install -y cifs-utils mkdir /mnt/shared mount -t cifs -o username="用户名",password="密码" //树莓派ip/共享名 /mnt/shared #如 //192.168.1.190/shared cd /mnt/shared ls -al可以看到挂载成功。还可以设置开机自动挂载，参考 这篇文章 ，在linux上使用fstab自动挂载SMB网络存储，命令如下：vim /etc/fstab写入一行：//树莓派ip/共享名 /mnt/shared cifs defaults,username=用户名,password=密码,iocharset=utf8,nofail,auto 0 0然后可以试验一下：ls -al /mnt/shared umount /mnt/shared mount -a ls -al /mnt/shared没有报错，能正常挂载。（2）Windows在资源管理器的 此电脑 界面（就是显示C盘和其他盘符的界面），左上角点击 计算机-映射网络驱动器-映射网络驱动器 ，驱动器随便选，文件夹 写\\树莓派局域网ip\shared，点击连接，需要输入凭证。输入samba_user和对应的SMB密码后成功登录，也可增、删、改文件。如果windows上无法连接，可试试打开SMB功能：在设置中搜 启用或关闭Windows功能 ，找到 SMB 1.0/CIFS 文件共享支持 ，勾选上后确定，等组件下载完（带客户端、服务器端、自动删除），重启。但是这个可能是1.0的Samba协议，不知道对读写速度有无影响。笔者测试时没有开启此功能也可连接到共享文件夹。测试速度：树莓派4B无线连接，接口和u盘都支持usb3.0，百兆路由器，写入速度5-6MB/s（不含创建镜像的时间），读取速度5-6MB/s。这里使用的是exFAT格式的u盘，写入大文件时会花较长的时间生成镜像，再写入数据；写入10GB的大文件时，由于镜像迟迟未创建完毕，windows上还出现了0x8007003B错误。下一节中尝试加快读写速度。（3）安卓手机可用 ES文件浏览器 。但是据说其可能使用老的Samba协议，导致传输速度低。其他应用也有能连samba的。另外，有的手机自带ftp服务器，也可以方便地与电脑传输文件，详见附录。（4）投影仪、电视在投影仪、电视自带的应用市场一般也能找到 ES文件浏览器，下载即可。另外，据说SMB在播放高码率视频时，不时卡顿，不如NLDA，笔者没有进行比较。附：ES文件浏览器 连接Samba以安卓手机为例，选择 网络-局域网-新建， 服务器 填 树莓派ip:445，用户名、密码填SMB用户名、密码即可。5.frp+sambafrps和frpc的初始搭建参考 frp+云服务器搭建能从外网访问的redis、mysql。这里默认已经配置好了frps、frpc，仅在frpc.ini增加一项映射。samba默认使用445端口，在树莓派的frpc.ini中添加：[pi4B-samba-server-1] type = tcp local_ip = localhost local_port = 445 remote_port = 44550之后树莓派上重启frpc：service frpc restart，然后到frp服务器的防火墙打开44550端口（云服务器不要用ufw打开）。在树莓派上，资源管理器输入 smb://frp服务器ip:44550 ，即可看到print$和shared两个文件夹；但点开shared时显示 挂载windows共享失败 : 连接超时，可能是由于云服务器的带宽只有5Mbps（640KB/s）。在windows上，映射网络驱动器 不能写\\云服务器ip:44550\shared，只能用默认的445端口。不过可以使用netsh命令将云服务器的44550端口接到本地的端口445（参考文章）。打开cmd，输入：netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=445 connectaddress=云服务器ip connectport=44550 netsh interface portproxy show all #查看一下 #最后使用netsh interface portproxy delete v4tov4 listenaddress=127.0.0.1 listenport=445即可删除这条端口转接设置确认无误后，在 映射网络驱动器 的 文件夹 一栏直接填\\127.0.0.1\shared即可。可能由于云服务器带宽问题，测试时一直卡在尝试连接界面。注意，以上流程稍微有些问题，具体参考新的文章：Samba, ftp与webdav 。6.加快读写速度（0）分析瓶颈、测试硬盘首先测试一下瓶颈可能在哪里。从windows机器到树莓派，数据需要经过：硬盘读写->树莓派内存->树莓派网卡->有线时通过网线，无线通过无线网卡->路由器->有线或无线->客户端（暂不考虑客户端变化）。可以控制的地方主要有：硬盘或u盘读写速度；硬盘或u盘是否通过usb3.0连到树莓派；树莓派内存是否够用（本文中是8G版，测试时内存消耗不大）；网线传输速度/树莓派网卡速度；路由器网口是百兆还是千兆。首先测试一下u盘。安装hdparm（apt install hdparm），输入下面的命令：hdparm -Tt /dev/sda1 #输出结果 Timing cached reads: 1688 MB in 2.00 seconds = 844.54 MB/sec Timing buffered disk reads: 342 MB in 3.01 seconds = 113.62 MB/sec可以看出u盘的读取还是很快的（hdparm更详细的教程见runoob-hdparm）。然后使用dd命令测试u盘写入速度：cd /home/samba_user/shared/usb_1 dd if=/dev/zero of=./testwritefile bs=4KB count=131072 #写入5GB的文件，测试前要确保有这么大的空间 # 输出结果 ... 5242880000字节（5 GB，4.9 GiB）已复制，178.29 s，29.4 MB/s #rm testwritefile写入速度为30MB/s左右。更多关于dd命令测试硬盘的内容可参考这篇文章。（1）网线直连用买路由器送的免费网线直连树莓派到路由器，写入速度提升到11.5MB/s，已经达到路由器百兆上限（12.5MB/s），提升明显。（2）换路由器测试时的路由器只有百兆网口，换成千兆网口后估计速度可进一步提升；换成千兆网口后理论上支持125MB/s读写，但u盘的读写只有113 / 30 MB/s，将成为新的瓶颈。（3）修改smb.conf在[global]下添加： read raw = yes write raw = yes aio read size = 0 #关闭异步读取 aio write size = 0 #关闭异步写入 large readwrite = yes由于测试时瓶颈是路由器，修改samba配置后读写速度还是11.5MB/s。（4）其他挂载的硬盘最好不用NTFS格式，若用的是NTFS注意使用ntfs-3g挂载（据说树莓派默认即ntfs-3g）。树莓派上格式化设备为指定格式：mkfs -t 格式 /dev/sdxx，也可以用其他工具。windows上可试试DiskGenius。据说换网线也可提升速度。当然，前提是瓶颈在网线；若路由器只支持百兆，换网线应该也没用。另外，有些设备可能用的还是比较老的samba协议，若要添加对老samba协议的支持，可以在smb.conf中的[global]下添加：min protocol = NT1NT1为Samba v1，SMB2、SMB3分别是v2、v3。最后，从windows10机器上向共享文件夹拷贝文件时会先生成等大的镜像，再写入数据；写入10GB的大文件时，由于镜像迟迟未创建完毕，windows上还出现了0x8007003B错误。所以目前还不能从windows机器上写入大文件。（5）后续使用希捷硬盘（exFAT格式），通过带USB3.0的硬盘盒连接到树莓派的USB3.0接口，树莓派和windows电脑都通过网线直连到路由器的1000M网口，smb.conf的[global]下添加相应内容。测试读写速度为80-100MB/s，写入单个文件、高峰时可达113MB/s，已经达到硬盘写入速度极限。（6）总结使用samba共享树莓派挂载的硬盘，可以实现Pi OS、windows间共享文件（android未测试），进行一些设置后甚至可达硬盘读写速度上限。但是从windows向硬盘写入10G以上的大文件时会报错（因为linux系统下写入一般是先创建空白镜像，而windows系统在这段时间内无法得到反馈，误以为写入操作卡死），算是一个缺陷。7.自动挂载硬盘修改/etc/fstab文件，添加一行：设备名 挂载点 硬盘格式 设置 是否备份 是否检测及检测顺序 /dev/sdxx /home/samba_user/shared/1 exfat defaults,uid=1003,gid=1004,nofail,auto,noatime 0 0（这里的挂载点为/home/samba_user/shared/1，而smb.conf中设置的是path = /home/samba_user/shared，两处不一致会导致windows下显示共享盘的大小为派的sd卡大小而不是硬盘大小，但是对实际使用几乎没问题。如果只有一张NAS硬盘就可以把两处改一样）其中uid和gid可通过id samba_user查看；设备名推荐换成UUID=xxxxxx，不会挂错地方。硬盘的UUID可插上硬盘后通过 blkid 或 ls -l /dev/disk/by-uuid 查看；关于nofail，auto，noatime的解析参考浅析 fstab 与移动硬盘挂载方法。最后，使用raspbian带桌面的系统，会发现系统识别到存储介质时会自动挂载，一般是在/media/pi/目录下，所属用户和组都是pi。若要关闭这个功能，需要以pi用户的身份登录桌面，在文件管理器中，左上角 编辑-偏好设置-卷管理 ，第一个选项是开机自动挂载，第二个选项是插入移动存储时自动挂载。8.使用qBittorrent离线下载也可以用aria2代替，但是据说aria2没有公网ip时下载较慢。以下参考了利用树莓派进行挂机下载。apt install qbittorrent qbittorrent-nox（下载qBittorrent-Enhanced-Edition可自动封禁迅雷吸血鬼ip，见上述参考文章）下载完成后，使用qbittorrent-nox即可开启qBittorrent的Web UI，在 树莓派ip:8080 可访问到网页qBittorrent，十分方便。默认用户密码为admin和adminadmin，在 设置-Web UI 中修改。接下来把qbittorrent-nox注册到开机自启：nano /etc/systemd/system/qbittorrent-nox.service服务文件中写入以下内容：[Unit] Description=qBittorrent-nox_WebUI After=network.target [Service] User=root Type=simple RemainAfterExit=yes ExecStart=/usr/bin/qbittorrent-nox -d ExecStop=/bin/kill $MAINPID Restart=on-failure RestartSec=5 StartLimitInterval=0 [Install] WantedBy=multi-user.target允许自启，并开启qBittorrent-nox：systemctl enable qbittorrent-nox systemctl start qbittorrent-nox附录：小米手机开启FTP服务器在 文件管理器-分类-远程管理 中可开启FTP服务器，设置里还可以修改连接的用户名和密码。开启后手机显示 ftp://手机ip:2121 ，在windows的资源管理器输入 ftp://手机ip:2121 、用户名密码 即可查看手机文件。测试了一下，写入速度1.9-2.5MB/s，读取速度3MB/s，勉强能用。后续：更换为千兆路由器后，写入速度在16-40MB/s，提升明显。
步骤/目录： 1.静态博客 （1）windows机器安装hexo （2）树莓派安装nginx并在局域网访问 （3）修改frpc.ini并开放端口、公网访问 （4）写作并发布博文 （5）使用https协议与ssl证书 2.可评论的博客 （1）安装typecho依赖项并配置 （2）安装typecho （3）https设置 3.其他 （1）md生成摘要 （2）typecho添加备案号 （3）调整允许上传的附件大小本文首发于个人博客https://lisper517.top/index.php/archives/13/，转载请注明出处。本文的目的是搭建能从外网访问的个人博客。本文实验日期为2022年2月11日。使用的是树莓派4B（内存8G版），系统为Pi OS 32位桌面版（2022年1月28日更新，镜像名 2022-01-28-raspios-bullseye-armhf.img ）。frps运行在阿里云服务器（系统镜像Ubuntu 20.04）。1.静态博客由于树莓派性能较弱、不太适合部署hexo（当然也可以这样干），所以选择在windows机器上写作，生成静态网页后上传到树莓派用于访问。（1）windows机器安装hexo到nodejs官网下载安装node.js，注意不要额外安装其他工具，其中有新版python等，容易搞乱环境。然后在cmd中输入以下命令安装hexo：npm install -g hexo-cli（2）树莓派安装nginx并在局域网访问树莓派安装nginx：apt install nginx设置自开启并检查一下服务开启情况：systemctl enable nginx systemctl status nginxnginx已成功开启，状态为active。接下来打开80端口（若如后文一样使用了frp则这里也可以不打开，不过笔者需要从局域网访问，这里就打开了）：ufw allow 80 #没有装ufw的用其他工具打开访问默认界面：win10机器与树莓派连接到同一wifi下，win10机器在浏览器输入 树莓派本地ip 或 树莓派本地ip:80 即可看到nginx默认页面：#默认页面内容 Welcome to nginx! If you see this page, the nginx web server is successfully installed and working. Further configuration is required. For online documentation and support please refer to nginx.org. Commercial support is available at nginx.com. Thank you for using nginx.该页面文件在树莓派的/var/www/html下，名为index.nginx-debian.html。之后自己生成的静态页面也放在该文件夹下（不同的设备可能不一样，如果是刚装上的nginx，这个文件夹在/etc/nginx/sites-available/default中查看，root后）。（3）修改frpc.ini并开放端口、公网访问在树莓派上开启frpc、在云服务器上开启frps参考 树莓派+云服务器，gogs+frp搭建私有git 。其他教程中教的比较复杂，这里用最简单的方法设置frp。另外，以下操作前最好买一个域名（记得及时在工信部和公安局网站备案）。在树莓派的frpc.ini中添加服务：[pi4B-blog-http-1] type = tcp local_ip = localhost local_port = 80 remote_port = 80本例中的云服务器80端口并没有使用，所以可以直接用于frp穿透。之后检查一下端口，云服务器的80端口需要开放。记得云服务器的端口在防火墙中添加规则，不要直接运行ufw allow。另外，禁用树莓派的80端口只会使得局域网访问不可用，frp穿透还是在的（frp使得树莓派以为从公网访问80端口就是在本地访问80端口）。最后验证一下：浏览器访问买的域名（该域名已经绑定到服务器ip。没买域名就直接访问 服务器ip ），出现nginx默认页面即可。（4）写作并发布博文这里介绍一下hexo初次使用的步骤。在win10机器上打开命令行，进行如下操作：d: #进入D盘。想放在其他盘也可以 mkdir myblog #放博客的文件夹 cd myblog hexo init #开始搭建。可能会提示vulnerabilities，不用管。该命令只需要运行这一次 hexo new 标题 #新建一篇博文。所有博文都在myblog\source\_posts中 hexo s #开启hexo服务器，默认使用本地4000端口（用于查看网页）。需要在D:\myblog中使用输入hexo s后这个cmd界面不要关，浏览器输入 localhost:4000 即可在本地访问个人博客。然后就是编辑.md文件、写博客。笔者使用的是vscode，加以下扩展：Auto Rename Tag #自动更改成对的html标签名 Draw.io Intergration #好用的画图软件。博客中需要思维导图时可以用 Markdown All in One #.md扩展排行榜第一位 Markdown Preview Enhanced #.md预览，在右上角会出现 MPE:打开侧边预览 的选项。不过这个和hexo网页看到的有些地方不一样，也可以不装，直接在网页查看Markdown语法可查看Markdown 官方教程，之后就可以愉快地写作。写作完成，在本地hexo网页查看觉得效果不错，就可以生成静态网页、传到树莓派上了。win10机器上新开一个命令行：d: cd myblog hexo g #生成静态页面。在myblog\public中接下来就需要将public文件夹下的所有文件传到树莓派上了。这里使用WinSCP（下载地址）。也可以用scp命令或PuTTY带的pscp命令，但是比较麻烦，还是图形化的工具好用。上传之前用PuTTY登录树莓派看一下目录在不在，并修改权限：#这里使用root用户 cd /var/www/html chmod -R 755 /var/www/html之后打开WinSCP，连接到树莓派上有sudo权限的用户。将win10机器上public文件夹下的所有文件复制到树莓派的/var/www/html/文件夹下。然后就可以在浏览器输入域名访问个人博客。最后，WinSCP上传完成后，可以再次修改/var/www/html的权限。经过测试，705即可访问：chmod -R 705 /var/www/html最后提醒一下，上文中介绍的方法只用到了http协议，网页内容比较容易被篡改等（比如修改网页链接为恶意链接），所以不建议长期使用。下面介绍https协议与ssl证书。（5）使用https协议与ssl证书简单地说，https比http更安全。ssl证书是配置https需要用到的，在阿里云购买域名后可以顺便购买ssl证书（1700￥一年）。由于太贵，这里在阿里云上选择免费的ssl证书（建议仅用于个人或测试使用），即 DV单域名证书【免费试用】 ，一年能领20张证书（1张证书=1个域名的1年认证），个人来说已经够用了。申请完成后，下载证书（选择Nginx类型）并解压，得到.key文件和.pem文件。接下来到树莓派上进行配置。首先查看ssl模块：nginx -V如果configure arguments:后出现了--with-http_ssl_module就说明已安装。如果没有，建议重新apt install nginx一下，或者参考其他文章从源码安装nginx。然后需要把.key文件和.pem文件上传到树莓派。这里先新建一个文件夹：mkdir /home/www-data/ssl_cert这里的www-data是nginx默认使用的用户（在/etc/nginx/nginx.conf中user对应的），没有这个文件夹就mkdir并chmod和chown。接着就用WinSCP将两个文件传到该文件夹中（记得chown和chmod 444一下）。然后在树莓派的frpc.ini中添加服务：[pi4B-blog-https-1] type = tcp local_ip = localhost local_port = 443 remote_port = 443最后配置nginx，目标是通过域名访问时，http请求会重定向到https（参考了nginx从http跳转到https）。nginx的其中一个默认配置文件为/etc/nginx/nginx.conf：cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf_backup #改动之前先备份 nano /etc/nginx/nginx.conf在http的{}里，最后加上一个server： server { listen 80; listen 443 ssl; server_name www.lisper517.top; ssl on; ssl_certificate .pem文件路径; ssl_certificate_key .key文件路径; charset UTF-8; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { root /var/www/html; } error_page 497 https://$host$request_uri; #http请求发送到https端口会产生nginx 497错误，这里改写了请求的协议 }记得把 www.lisper517.top 换成自己的域名。然后把/etc/nginx/sites-available/default里的内容都注释掉（记得备份。如果后面出错可以试试把这个文件还原）。最后使用nginx -t检测一下配置文件有无问题（每次更改nginx配置后都推荐使用这个命令测试一下），有问题该命令会自动提示。一切顺利的话，这时访问 https（或http）://自己的域名 就可以看到/var/www/html下自己的博客了，都会跳转到https，左上角提示为安全网站。配置https时，由于证书上的域名要和访问的域名匹配，所以访问本地的树莓派ip会提示链接不安全（不知道为什么，局域网访问http地址不会跳到https）。如果从公网访问时也提示链接不安全，就要看一下server_name和浏览器上看到的ssl证书提供的域名是否一致，是不是忘加www.等细节。最后，刚开始使用nginx时nginx.conf最好原版备份一份，这里能访问hexo的也备份一份。2.可评论的博客上一种方法可以概括如下：win10机器上用hexo生成静态网页文件，上传到nginx的网页根目录。优点是消耗树莓派资源少，缺点是不可交互（Hexo的评论功能稍微麻烦一点）。博客毕竟还是要有评论功能才感觉热闹一点。下面介绍一款动态博客搭建软件：typecho。其十分轻量级（下文下载的tar.gz包大小只有470k左右），在树莓派上运行正合适。下面的流程主要参考了树莓派搭建个人博客服务器（Nginx+PHP+mysql+typecho）。顺便解释一下LNMP环境，即linux+nginx+mysql+php，linux是系统，nginx负责请求和响应，mysql是数据库，php解释动态网页。另外，也可以不在树莓派上运行typecho，而在github上托管一个博客，这里就不介绍了。（1）安装typecho依赖项并配置typecho是基于php的，需要nginx、php、mysql环境。nginx安装参考上文，mysql安装参考 树莓派+云服务器，gogs+frp搭建私有git ，提醒一下现版Pi OS只能下mariadb-server，没有mysql了，不过二者可以说是同卵双胞胎。typecho也可以用sqlite，不过笔者之前为gogs安装过mariadb了，所以这里就不换了。安装php-fpm及其他依赖，并重启php-fpm：apt install php-fpm #此处信息提示安装的是php7.4系列另外，还要安装php-mysql（使用sqlite就安php-sqlite）：apt install php-mysql #提示安装的也是php7.4-mysql service php-fpm restart #重启一下服务安装完成后，开始配置，记得修改前最好备个份。这里只配置了nginx（这里的nginx是重新下的，其他配置没改），php配置不变。输入nano /etc/nginx/sites-available/default，将： index index.html index.htm index.nginx-debian.html;改为： index index.php index.html index.htm index.nginx-debian.html;在这个server的{}最后加上： location ~ .*\.php(\/.*)*$ { fastcgi_pass unix:/run/php/php7.4-fpm.sock; #注意自己的php-fpm版本 include fastcgi_params; set $path_info ""; set $real_script_name $fastcgi_script_name; if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") { set $real_script_name $1; set $path_info $2; } fastcgi_param SCRIPT_FILENAME $document_root$real_script_name; fastcgi_param SCRIPT_NAME $real_script_name; fastcgi_param PATH_INFO $path_info; }保存后退出，配置完成。这时可以测试一下，重启nginx，service nginx restart，在/var/www/html下新建一个myweb.php文件，内容为：<?php phpinfo(); ?>然后在浏览器输入 树莓派ip/myweb.php ，就会显示经典的php信息页面。从这里也可以看出动态页面的意思，整个页面只有一个函数，交给php解释后，返回给nginx，显示在浏览器上的就是一大堆信息。（2）安装typechotypecho跑在/var/www/html中（也可以自己设置其他文件夹，新手建议按本文配置），这样就可直接访问到博客。进行如下操作：chmod 755 -R /var/www/html #之前把html设成了705 rm -r /var/www/html/* #清空html前记得备份 cd /var/www/html wget https://typecho.org/downloads/1.1-17.10.30-release.tar.gz tar -zxvf 1.1-17.10.30-release.tar.gz rm 1.1-17.10.30-release.tar.gz mv ./build/* . rmdir build service nginx restart接下来在网页输入 树莓派ip ，会自动跳转到 树莓派ip/install.php 页面（没有自动跳转可能是因为没有在nginx的index后加上index.php，这时可以手动输入 树莓派ip/install.php 进入该页面），开始配置typecho。数据库适配器选择mysql适配器（这里显示空可能是因为没有安装php-mysql），数据库用户就是root，库名为默认的typecho。如果不放心也可以自己新建用户，在这里改上（mysql新建用户的命令参考 frp+云服务器搭建能从外网访问的redis、mysql）。网站地址填自己的域名，填完其他的。然后记得登录mariadb，创建typecho库：CREATE DATABASE typecho;。最后点击 开始安装 。提示安装程序无法自动创建 config.inc.php 文件，需要手动创建，这是因为/var/www/html的others权限为5（r-x），自己用root创建/var/www/html/config.inc.php即可，最后安装成功。补充一点typecho的说明：插件位置在 /var/www/html/usr/plugins（或者自己设置了其他根目录，这里用的是/var/www/html/）；主题位置在 网页根目录/usr/themes；附件位置在 网页根目录/usr/uploads。最后把网站风格设置成喜欢的，就可以开始写博客了，未注册的用户也可以在博文下面发表评论，促进交流。（3）https设置最后，想让typecho搭建的php网页也使用https协议，就在nginx中如上文 1-（5）.使用https协议与ssl证书 类似设置，区别是/etc/nginx/nginx.conf中最后加的server稍微改了一下： server { listen 80; listen 443 ssl; root /var/www/html; server_name www.lisper517.top; ssl on; ssl_certificate .pem文件路径; ssl_certificate_key .key文件路径; charset UTF-8; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; index index.php index.html index.htm index.nginx-debian.html; location ~ .*\.php(\/.*)*$ { fastcgi_pass unix:/run/php/php7.4-fpm.sock; #同样注意php-fpm版本 include fastcgi_params; set $path_info ""; set $real_script_name $fastcgi_script_name; if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") { set $real_script_name $1; set $path_info $2; } fastcgi_param SCRIPT_FILENAME $document_root$real_script_name; fastcgi_param SCRIPT_NAME $real_script_name; fastcgi_param PATH_INFO $path_info; } error_page 497 https://$host$request_uri; }记得把 www.lisper517.top 换成自己的域名。同样注释掉/etc/nginx/sites-available/default，之后就可以访问https的博客，并且所有http请求会自动跳到https。3.其他（1）md生成摘要如果不做处理，主页默认会显示文章全文，太长了。在文章中添加一行 <!-more-> （一个短横线换为两个短横线）即可指示文章的摘要处。比如在每篇文章的目录后加，那么主页只会显示文章的标题和目录，更加方便。（2）typecho添加备案号如果有域名，需要在页面底部加备案号。在typecho后台，点击 控制台-外观，编辑footer.php（或者直接改源文件），在页面底部标签（footer标签）里添加一个div标签： <?php $this->options->bei(); ?> 然后在functions.php中的themeConfig里添加2个函数：$bei = new Typecho_Widget_Helper_Form_Element_Text('bei', NULL, NULL, _t('工信部备案号'), _t('留空则不显示')); $form->addInput($bei->addRule('xssCheck', _t('工信部备案号不能使用特殊字符')));之后就可以在后台的 设置外观-设置外观 里找到输入工信部备案号的地方，输入即可。（3）调整允许上传的附件大小需要修改php-fpm和nginx的设置。修改/etc/php/7.4/fpm/php.ini，将下面三个参数修改为：upload_max_filesize = 50M; #上传文件上限 post_max_size = 50M; #post请求上传文件上限 max_execution_time = 600; #php页面最长执行时间修改/etc/nginx/nginx.conf，将： server { listen 80;改为： server { client_max_body_size 50m; listen 80;这样在typecho中最大能上传50M的附件。
步骤/目录： 1.购买阿里云服务器，安装frp并配置frps服务器端 2.树莓派下载frp并配置frpc客户端 3.其他 4.设置frpc开机自启并开启服务 5.验证本文首发于个人博客https://lisper517.top/index.php/archives/11/，转载请注明出处。本篇文章的目的是使用公网ip地址访问树莓派的ssh和vnc。本文实验日期为2022年2月10日。使用的是树莓派4B（内存8G版），系统为Pi OS 32位桌面版（2022年1月28日更新，镜像名 2022-01-28-raspios-bullseye-armhf.img ）；云服务器为阿里云，系统镜像为Ubuntu 20.04。本文中的大多数操作在前文已经进行过，此处仅做总结。唯一新增之处是穿透vnc。另外要提醒，因为frp修改使得对被穿透端口的操作都发生在本地，所以即使禁用本地端口，还是可以从公网ip访问到本地端口。1.购买阿里云服务器，安装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端口查看是否成功开启。设置frps开机自动开启参考 不同系统下的开机自动运行 。2.树莓派下载frp并配置frpc客户端安装方法同上（版本是arm非64版，树莓派4B的CPU是64位但使用的Pi OS为32位。下载链接）。安装完成之后修改一下frpc.ini文件（frp文件夹放在/bin下为例）：[common] server_addr = 云服务器ip地址 server_port = 7000 token = 你的密码 login_fail_exit = false #下面的log部分也可以不加 log_file = /var/logs/frpc.log log_level = info log_max_days = 3 [pi4B-ssh-1] type = tcp local_ip = localhost local_port = 22 remote_port = 50022 #若之前设置过gogs-ssh则不用再加[pi4B-ssh-1] [pi4B-vnc-1] type = tcp local_ip = localhost local_port = 3389 remote_port = 59023.其他检查一下端口开放情况：服务器需要开放50022和5902端口（不要用ufw，要在 安全-防火墙 中添加规则）；树莓派开放3389和22端口（本例用ufw添加规则。也可以不打开树莓派的本地端口，笔者需要在局域网中使用，所以打开）。另外，记得删除一下安装包。最后，为了降低风险，平时可以关闭树莓派vnc端口，需要时通过ssh打开。4.设置frpc开机自启并开启服务frp在systemd文件夹中放了.service文件。拷贝到/etc/systemd/system下即可：cd /bin/frp/systemd cp frpc.service /etc/systemd/system/frpc.service然后打开/etc/systemd/system/frpc.service，把其中的User=nobody删掉，ExecStart和ExecReload改一下即可（放在其他路径就改成其他的）:ExecStart=/bin/frp/frpc -c /bin/frp/frpc.ini ExecReload=/bin/frp/frpc reload -c /bin/frp/frpc.ini最后enable+start：systemctl enable frpc.service systemctl start frpc.service5.验证若之前在树莓派的/etc/ssh/sshd_config中设置了不允许密码登录，这里验证时需改为yes：PasswordAuthentication yes另外注意登录的用户是否被禁止登录。使用windows自带的 远程桌面连接 连接到 服务器ip:5902，显示出桌面；使用PuTTY连接到 服务器ip:50022 端口，成功连接到树莓派ssh服务。
步骤/目录： 1.搭建局域网内的gogs （1）安装gogs的依赖项 （2）为gogs设置mariadb （3）为gogs新建系统用户并安装gogs （4）gogs初次登录设置 a. 数据库设置 b. localhost改为树莓派的局域网ip c. 设置管理员 d. 后续设置 （5）gogs最新版的问题 2.使用frp将gogs映射到外网 （1）购买阿里云服务器，安装frp并配置frps服务器端 （2）树莓派下载frp并配置frpc客户端 （3）其他 （4）设置frpc开机自启并开启服务 3.验证本文首发于个人博客https://lisper517.top/index.php/archives/8/，转载请注明出处。本篇文章的目的是搭建一个能从外网访问的，自己的git服务。本文实验日期为2022年2月5日。使用的是树莓派4B（内存8G版），系统为Pi OS 32位桌面版（2022年1月28日更新，镜像名 2022-01-28-raspios-bullseye-armhf.img ）；云服务器为阿里云，系统镜像为Ubuntu 20.04。1.搭建局域网内的gogs这里选用gogs，轻量级、适合树莓派。gitlab太大；gitea据说对树莓派也不错。（1）安装gogs的依赖项包括MySQL服务器和Git（顺便安装unzip）。简单介绍一下：Pi OS现在好像只有mariadb版的mysql，没有原版mysql了。即apt install能找到的只有mariadb-server而没有mysql-server。不过maria-mysql和mysql用起来可以说差别不大，都是一家兄弟。通过PuTTY登录树莓派，输入以下命令：apt install mariadb-server git unzip发现git和unzip已经默认安装且都是最新版，但mariadb出现问题。考虑到实验时间（2022年2月5日）距离4B系统发布时间（2022年1月28日）很近，估计是清华的源没来得及更新。添加上默认源后apt update一下，然后mariadb-server安装成功。（2）为gogs设置mariadb首先对mariadb进行基础设置：mysql_secure_installation首先需要输入root密码，但第一次进还没设置root密码，根据提示直接按回车。剩下的全选y，注意途中要设置root密码。感兴趣的可以仔细读一下。然后可以进入mysql，为gogs创建一个用户及database了：mysql -uroot -p输入密码，进入mysql命令行后，进行以下四步操作（创建gogs数据库，创建gogs用户，刷新权限，退出mysql命令行）：CREATE DATABASE gogs; GRANT ALL PRIVILEGES ON gogs.* TO 'gogsuser'@'localhost' IDENTIFIED BY '你的密码'; #只开放了gogsuser对gogs库的权限 FLUSH PRIVILEGES; QUIT另外，mariadb-server默认使用3306端口。我安装过ufw，使用ufw allow 3306打开该端口。如果不希望mariadb对外网开放，也可以不开放此端口（若使用了frp映射了树莓派的3306端口，则本地打不打开3306的意义不大，除非需要局域网访问）。（3）为gogs新建系统用户并安装gogs退出mysql命令行后，新建无法登录的用户git：adduser --disabled-login git这里还可以添加全名、电话等，此处全部留空。gogs默认需要用3000端口，我已预先安装过ufw，开放一下3000端口：ufw allow 3000（因为需要从本地查看gogs网页）。进入git用户的根目录，下载gogs（用cat /proc/cpuinfo命令发现树莓派CPU为ARM v7）：cd /home/git wget https://dl.gogs.io/0.12.3/gogs_0.12.3_linux_armv7.zip #建议不要下载最新版，可以选次新版 unzip gogs_0.12.3_linux_armv7.zip确保git用户对/home/git目录的权限：chown -R git:git /home/git设置gogs开机自启动，并重启gogs服务：cp /home/git/gogs/scripts/systemd/gogs.service /etc/systemd/system/gogs.service systemctl enable gogs.service systemctl restart gogs.service最后检查一下gogs服务是不是active：systemctl status gogs.service不要忘了删除.zip文件：rm /home/git/gogs_0.12.3_linux_armv7.zip（4）gogs初次登录设置gogs网页默认在3000端口，如果见不到网页可以看看是不是该端口没有开放。接下来在浏览器输入 树莓派本地ip:3000 ，出现gogs初次设置界面。主要分下面三个部分：a. 数据库设置数据库类型为MySQL，数据库用户和数据库用户密码就是刚才设置的gogsuser和密码。注意到下面的提示：如果您使用 MySQL，请使用 INNODB 引擎以及 utf8_general_ci 字符集。登录mariadb，输入show engines;检查，InnoDB为DEFAULT；输入show character set;，发现utf8和utf8mb4（utf8对应utf8_general_ci），输入show variables like "%char%";，发现其中character_set_database和character_set_server对应的都是utf8mb4。退出mariadb，不知道配置文件在哪里，使用find / -name "*.cnf"找到/etc/mysql/mariadb.conf.d/50-server.cnf，找到其中两行：character-set-server = utf8mb4 collation-server = utf8mb4_general_ci改为character-set-server = utf8 collation-server = utf8_general_ci保存退出，重新进入mariadb，输入show variables like "%char%";，发现其中character_set_database和character_set_server对应的都是utf8。b. localhost改为树莓派的局域网ip在 应用基本设置 中将2个localhost改为树莓派的局域网ip。如果gogs想部署在云服务器而非树莓派上，可以改成云服务器的ip，如果还买了域名也可以换成域名。c. 设置管理员在 可选设置-管理员账号设置 中设置一个管理员账号。d. 后续设置设置完后即可创建一个仓库试试。之后写了什么代码要在树莓派跑，就可以笔记本上传，树莓派使用git下载（邮箱中的@用%40代替）：git clone http://邮箱或用户名:密码@仓库url如使用gogs_root下载该用户名下名为test的仓库：git clone http://gogs_root:对应密码@树莓派本地ip:3000/gogs_root/test另外，刚才完成的都是基础的设置。如果需要完整设置，可以调整文件/home/git/gogs/custom/conf/app.ini（该文件需要初次设置后才出现）。由于本文创建的是私有git，所以进行以下设置（另外一些设置用于以后可能开放）：DISABLE_REGISTRATION = true #只能由管理员创建账号 REQUIRE_SIGNIN_VIEW = true #必须登录才能查看页面 REGISTER_EMAIL_CONFIRM = true #注册时邮箱确认 [mailer] ENABLED = true #开启邮件服务 [log] ROOT_PATH = /var/logs/gogs_logs #习惯写到此文件夹下创建一下gogs_logs：mkdir /var/logs #之前没创建过这个文件夹 mv /home/git/gogs/log /var/logs/gogs_logs（5）gogs最新版的问题一开始我下载的是0.12.4版armv7压缩包，systemctl start gogs.service后systemctl status gogs.service发现状态为failed，检查gogs.service看到ExecStart=/home/git/gogs/gogs web，于是试着手动启动gogs网页/home/git/gogs/gogs web，报错bash:gogs: No such file or directory，出现这个报错一般是gogs版本不对（生产环境可以看看原来是不是跑在docker下的）。试了0.12.4的其他版本还是不行，最后换成0.12.3版armv7包可以手动开启。感觉每次gogs最新版本都有点问题。下面给出操作过程：（从1.-（3）新建git用户后开始）cd /home/git wget https://dl.gogs.io/0.12.4/gogs_0.12.4_linux_armv7.zip unzip gogs_0.12.4_linux_armv7.zip cd gogs #解压后文件夹名为gogs chown -R git:git /home/git systemctl enable /home/git/gogs/scripts/systemd/gogs.service systemctl restart gogs.service systemctl status gogs.service #发现状态为failed nano /home/git/gogs/scripts/systemd/gogs.service #看到ExecStart=/home/git/gogs/gogs web ./gogs web #试试手动启动，结果报错bash:gogs: No such file or directory # 停止服务，删除文件 systemctl stop gogs.service systemctl disable gogs.service cd .. rm -r gogs rm gogs_0.12.4_linux_armv7.zip2.使用frp将gogs映射到外网之前 frp+云服务器搭建能从外网访问的redis 一文中使用同一阿里云服务器，已经配置过frps了。下面粘贴一下：（1）购买阿里云服务器，安装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，这时可以访问 服务器ip:7500 查看是否成功开启。设置frps开机自动开启参考 不同系统下的开机自动运行 。（2）树莓派下载frp并配置frpc客户端安装方法同上（版本是arm非64版，树莓派4B的CPU是64位但使用的Pi OS为32位。下载链接）。安装完成之后修改一下frpc.ini文件（frp文件夹放在/bin下为例）：[common] server_addr = 云服务器ip地址 server_port = 7000 token = 你的密码 login_fail_exit = false #下面的log部分也可以不加 log_file = /var/logs/frpc.log log_level = info log_max_days = 3 [pi4B-gogs-web-1] type = tcp local_ip = localhost local_port = 3000 remote_port = 8181 [pi4B-gogs-ssh-1] type = tcp local_ip = localhost local_port = 22 remote_port = 50022（3）其他检查一下端口开放情况：服务器需要开放8181和50022端口（不要用ufw，要在 安全-防火墙 中添加规则）；树莓派需要开放3000和22端口（本例用ufw添加规则；如果不需要局域网访问也可以不加）。另外，记得删除一下安装包。（4）设置frpc开机自启并开启服务frp在systemd文件夹中放了.service文件。拷贝到/etc/systemd/system下即可：cd /bin/frp/systemd cp frpc.service /etc/systemd/system/frpc.service然后打开/etc/systemd/system/frpc.service，把其中的User=nobody删掉，ExecStart和ExecReload改一下即可（放在其他路径就改成其他的）:ExecStart=/bin/frp/frpc -c /bin/frp/frpc.ini ExecReload=/bin/frp/frpc reload -c /bin/frp/frpc.ini最后enable+start：systemctl enable frpc.service systemctl start frpc.service3.验证systemctl status frpc.service查看一下frpc状态为active。浏览器访问 服务器ip:8181 ，出现gogs网页。查看dashboard（服务器ip:7500），pi4B-gogs-web-1和pi4B-gogs-ssh-1已上线。git clone试验成功。
步骤/目录： 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-serverredis官方不建议在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即可。