hoochanlon 发表于 2023-3-2 13:28

Linux云服务器一键搭建自用FTP脚本

在水区做了调查,大家普遍对Linux FTP搭建很简单,不过从我自己的实际搭建过程中却不太容易。为此特意做了开源与笔记化的一键脚本,注释全面,方便后续的学习与交流。

* 安全:
* 虽说FTP爆破频率没有SSH登录那么高,但为了安全起见还是先限定自己的公网IP访问
* 限制用户出逃共享目录之外的目录,可读写。
* 自定义用户名,密码符合Linux常规创建用户就行。
* 对获取客户端IP进行了优化,从本机登录信息获取IP信息,彻底杜绝了从监听SSH端口抓取IP被混淆的风险。

scp上传与下载也挺方便,但不方便目录的整体管理。而且刚入手学习Linux的人来说知道宝塔、Zfile各种面板的人也是少数,做一键脚本的目的也是帮助新人少走弯路。

起手方式不需要了解虚拟用户映射及FTP验证、PAM模块原理,一键搞定FTP。 [源码Git仓地址](https://github.com/hoochanlon/ihs-simple/blob/main/d-shell/lite_vsftpd.sh)

```
sudo bash -c"$(curl -fL https://ghproxy.com/https://raw.githubusercontent.com/hoochanlon/ihs-simple/main/d-shell/lite_vsftpd.sh)"
```

最后在阿里云服务器的安全组,或腾讯云的防火墙放行21000端口,搞定。效果图如下:

图床由 https://cdn.jsdelivr.net 提供支持。

放行阿里云安全组/腾讯云防火墙

![](https://cdn.jsdelivr.net/gh/hoochanlon/ihs-simple/AQUICK/catch2023-02-28%2021.26.91.png)

已可读写

![](https://cdn.jsdelivr.net/gh/hoochanlon/ihs-simple/AQUICK/catch2023-03-01%2015.39.06.png)

策略生效状态查看

![](https://cdn.jsdelivr.net/gh/hoochanlon/ihs-simple/AQUICK/catch2023-03-01%2022.10.10.png)


后续的自定义,可略览如下相关文件,进行此方面相关的深入学习与研究。

* 共享目录:/var/ftp/share
* 访问配置文件 /etc/security/access.conf
* FTP配置文件: /etc/vsftpd/vsftpd.conf
* FTP模块支持文件: /etc/pam.d/vsftpd

最后,附源码:

```
# ********** 核心的五篇文档,csdn博主整理思绪排版较为清晰易读。************
## (https://www.cnblogs.com/Caiyundo/p/9979442.html)
## (https://blog.csdn.net/qq_36205206/article/details/125808803)
## (https://blog.csdn.net/zdc1228/article/details/128428207)
## (https://blog.csdn.net/qq_40787608/article/details/123411675)
## [腾讯云-Linux 轻量应用服务器搭建 FTP 服务](https://cloud.tencent.com/document/product/1207/47638)
## (https://www.zhihu.com/question/268255821/answer/622810196?utm_id=0)
##
## 往后可以用这款了,配置web云盘分享:https://github.com/zfile-dev/zfile
## 共享文件格式NFS、SMB、FTP、WebDAV 各有何优势:https://blog.csdn.net/hdxx2022/article/details/127490158
#*******************************************************************

#********* 腾讯云文档提醒解读***************************
#
# FTP 可通过主动模式和被动模式与客户端机器进行连接并传输数据。
# 由于大多数客户端机器的防火墙设置及无法获取真实 IP 等原因,建议您选择被动模式搭建 FTP 服务。
# 如下修改以设置被动模式为例,您如需选择主动模式,请前往 设置 FTP 主动模式。
#
# 主动模式和被动模式的不同简单概述为:
# 主动模式传送数据时是“服务器”连接到“客户端”的端口(客户端开启数据端口);
# 被动模式传送数据是“客户端”连接到“服务器”的端口(服务端开启数据端口)。
# (https://blog.csdn.net/weixin_42039228/article/details/124338444)
#****************************************************


#-----------下载安装,专属用户创建与限定目录------------

# 添加用户,普通用户是没有权限登录SSH的,需要额外授权,不要紧。
# 完善起见,已 usermod -s /sbin/nologin ftpuser

yum install -y vsftpd
yum install lsof -y
sudo systemctl enable vsftpd
# 启动成功,默认开启匿名访问,但无权限修改或上传。
# 需提前打开否则在后面配置会报错。
sudo systemctl start vsftpd

sudo groupadd ftpusers
# 接收用户输入流,并创建ftpusers组用户
read -p "请输入创建FTP共享的用户名:" user_name && sudo useradd -g ftpusers $user_name

echo -e "$user_name 用户创建已完成 \n"

echo "⚠️注意:Linux初始密码规则,创建密码需要符合大小写及特殊字符等各项要求 ‼️"
echo -e "若已配置密码策略,可无视上面这条提示信息。"
echo -e "◉ 注:显示明文,方便密码核对后确认 \n"

# -s: 隐藏输入的数据,适用于机密信息的输入
read -p "请输入密码:" pass_word

# 将 P@ssw0rd 密码传递至passwd的标准输入(stdin)
echo $pass_word | passwd --stdin $user_name

# 限制登录终端
sudo usermod -s /sbin/nologin $user_name

# 创建FTP共享的特定目录
sudo sudo mkdir /var/ftp/share
echo "hello world " > /var/ftp/share/test.txt
# 授权 -R 递归;属主名:属组名
sudo chown -R ftpuser:ftpusers /var/ftp/share

#----------备份vsftpd.conf文件,与获取本机公网IP----------

# 这里配置修改以被动模式为例。
# 修改:查找与替换。先sed不加参数匹配试试水,配置完加个中文注释,方便理解。
# 源目录文件备份 vsftpd.conf.bak
cp -rp /etc/vsftpd/vsftpd.conf{,.bak}

# 获取Linux的本机公网IP
# 详情:https://blog.csdn.net/doris_9800/article/details/104620510
linux_public_ip=$(curl -s http://ip.tool.chinaz.com/ |grep 'class="fz24"' | awk -F '>|<' '{print$3}')


# 这获取IP的方式,有被混淆的风险,毕竟有ssh插队的风险,注释掉
# get_my_ip=$(netstat -n|grep -i :22|awk '{print $5}'|cut -d":" -f1|sed -n '1p')

# 新的获取IP方式,获取Windows或Mac电脑的IP 客户端
get_my_ip=$(who|awk '{print $5}'| cut -d '(' -f2 | cut -d ')' -f1|sed -n '1p')


# cut
# -d 表示需要需要使用自定义切割符
# -f2 表示对切割后的几块内容选择第2部分输出
# -f1 表示对切割后的几块内容选择第1部分输出

#------------------------------------------------------


#************************说明性文档***************************************
#
# local_enable=YES         #支持本地用户登录
# chroot_local_user=YES    #全部用户被限制在主目录
# chroot_list_enable=YES   #启用例外用户名单
# chroot_list_file=/etc/vsftpd/chroot_list#指定用户列表文件,该列表中的用户不被锁定在主目录
#
#*********************************************************************


#-----------配置用户基本策略:禁匿名、将访问限制在规定目录、ipv4----------

# 在12行全局换成anonymous_enable=NO
sed -i '12canonymous_enable=NO' /etc/vsftpd/vsftpd.conf


## 100、101、103行去掉注释,配置chroot如上各项。
sed -i '100,101s/^#//' /etc/vsftpd/vsftpd.conf
sed -i '103s/^#//' /etc/vsftpd/vsftpd.conf

# 将Listen=NO换成Listen=YES
sed -i 's/listen=NO/listen=YES/' /etc/vsftpd/vsftpd.conf

# 在123行首追加注释,即关闭IPv6 sockets
sed -i '123s/^/# /' /etc/vsftpd/vsftpd.conf

# 在52行首取消注释,打开日志记录
sed -i '52s/^#//' /etc/vsftpd/vsftpd.conf

# 开启被动模式 pasv_enable=YES
# pasv连接模式时的最小端口、最大连接端口
# 这里只要把最小端口号和最大端口号配置成一样的,就成了开放固定端口了
# allow_writeable_chroot=YES 在限制目录下可写入
echo -e "
local_root=/var/ftp/share
allow_writeable_chroot=YES
pasv_enable=YES
pasv_address=$linux_public_ip
pasv_min_port=21000
pasv_max_port=21000
" >> /etc/vsftpd/vsftpd.conf

# 创建文件,否则会即使有用户也登录不上,不需要其他权限,ftpuser不访问这个文件
# 推测程序编写的逻辑是靠这一“小文件”来对策略进行决策的,配置开启了这功能,然后又没有文件自然乱套了。(编码人员没想那么多吧,可能不想管...)
touch /etc/vsftpd/chroot_list
## chroot_list_file=/etc/vsftpd/chroot_list 打开限制名单文件配置


# 注释第4行 auth required pam_shells.so 模块认证。
sudo sed -i '4s/^/#/' /etc/pam.d/vsftpd


#------pam_access.so是模块,会调用到配置文件/etc/security/access.conf------
# (https://blog.csdn.net/weixin_58400622/article/details/126438957)

# /etc/pam.d/vsftpd (模块配置文件)
## 备份/etc/pam.d/vsftpd
cp -rp /etc/pam.d/vsftpd{,.bak}
# 在第7行前插入模块
sudo sed -i '7i\account    required   pam_access.so' /etc/pam.d/vsftpd

# access.conf
## 备份access.conf文件
cp -rp /etc/security/access.conf{,.bak}
## 将最后一个规则定义为全部拒绝,表示只有自己允许的例外条件
## 经测试网上的文章提到的‘@用户组名’配置已过时
echo-e "
+:ftpusers:$get_my_ip
-:ALL:ALL

" >> /etc/security/access.conf

#---------------------------------------------------



# 启动ftp服务。
sudo systemctl restart vsftpd

echo -e "***调试专用代码***"
echo 'scp /Users/chanlonhoo/Desktop/1.sh root@101.xxx.xxx.xxx:${HOMEPATH}'
echo -e "rm -rf ~/.ssh/known_hosts && rm -rf ~/.ssh/known_hosts.old"
echo -e "查看所有用户信息:cat /etc/passwd"
echo -e "新建用户,添加FTP共享组:useradd -G ftpusers <用户名称>"
echo -e "已有用户,添加FTP共享组:usermod -a -G ftpusers <用户名称>"
echo -e "***************** \n"

echo -e "\n ****************FTP基本说明与概况******************** \n"
echo -e "FTP专属用户已创建完成:$user_name ;密码:$pass_word"
echo -e "FTP共享目录位置:cat /var/ftp/share"
echo -e "重要 ‼️ :注意在阿里云安全组,或腾讯云服务器防火墙,放行21000端口。"

echo -e "\n至此,FTP搭建已完成,下面是FTP相关配置简览"
echo -e "查看FTP历史访问记录:/var/log/xferlog"
echo -e "核心配置文件:vi /etc/vsftpd/vsftpd.conf"
echo -e "FTP限制用户及IP访问文件:vi /etc/security/access.conf\n"
echo -e "Windows可以用文件管理器访问,就可以上传下载了。"
echo -e "Mac推荐使用Cyberduck、FileZilla、ForkLift访问,自带访达对FTP功能支持不完善。\n"

# 删除自身
rm -rf $0


# 可能该项说明对初次上手的用户是干扰
# echo -e "用户访问其他目录限制配置文件:/etc/vsftpd/chroot_list"
# echo -e "具体操作方法为:填写想要随意访问路径的用户名,一个用户名,占据一行。\n"


#*********参考***********************

## ftp
### (https://blog.csdn.net/blueheartstone/article/details/127045442)
### (https://blog.csdn.net/qq_29060627/article/details/126471917)
### (https://www.cnblogs.com/Caiyundo/p/9979442.html)
### (https://blog.csdn.net/qq_36205206/article/details/125808803)
### (https://blog.csdn.net/chipiqiao3947/article/details/100857760)
### (https://zhuanlan.zhihu.com/p/77325423)

## python http server
### [【SimpleHTTPServer】Linux/上使用 python -m SimpleHTTPServer 快速搭建http服务](https://blog.csdn.net/michaelwoshi/article/details/102991018)
### (https://blog.csdn.net/hotpotbo/article/details/88227301)
### [知晓号-linux开端口命令(服务器开启端口命令)](https://www.dkper.com/27137.html)

## smb
### (https://www.cnblogs.com/Ridiculer/p/15333284.html)
### (https://blog.csdn.net/qq_46839776/article/details/119939755)
### (https://www.cnblogs.com/Ridiculer/p/15333284.html)

## 字符串处理
#### (https://blog.51cto.com/u_4296776/5369128)
#### (https://blog.csdn.net/heimao0307/article/details/79757274)
#### (https://blog.csdn.net/doris_9800/article/details/104620510)

#****************插曲***********************************

## [灰信网-VSFTPD 启动异常 (CODE=EXITED, STATUS=2)](https://www.freesion.com/article/6269698160/),忘记sed 加 -i 了...
## 组创建失败也会出现登录异常,服务器上不存在该共享。请检查该共享的名称,然后再试一次
## (https://blog.csdn.net/shenyunsese/article/details/124449334)
## (https://blog.csdn.net/qq_42276808/article/details/104145927)


## Linux查看用户所属组 groups ftpuser 创建组:groupadd ftpusers
## 新建用户并将其加入指定用户组,作为其主用户组(每个用户有且只有一个主用户组)
## 新建用户,并关联组
## useradd -g <用户组名称> <用户名称>
## 或者 新建用户并将其加入指定附属用户组,附属用户组可以有多个,多个附属组名称用逗号分隔即可
## useradd -G <用户组名称> <用户名称>
## 已有用户
## -a 代表append,和 -G 一起使用,将用户添加到新用户组中而不必离开原有的其他用户组
## usermod -a -G <用户组名称> <用户名称>

## 谷歌云,默认开启selinux的。国内机器,默认关闭内部的防火墙。
## 如果您服务器内部启用了防火墙,那是要两边一起做策略的。
## 腾讯默认是放开端口的,除非额外限制,目前的策略来看。

# 来自 (https://blog.csdn.net/weixin_39166924/article/details/98754038)
# 默认的应该是不防护已开放端口了,端口是否打开的根本是取决于你开的服务或者是应用,
# 这些才会去打开原本没有打开的端口,防火墙只不过在开启的时候会对这些端口做防护而已,并不是防火墙开的这些端口。
# 比如80端口,你只有做了web应用,如iis等服务器上才会打开80端口,这时候防火墙可能会保护80端口,
# 使外面的用户无法访问,但关闭了防火墙,防护取消就可以正常访问了,所以防火墙并不是打开80的根本
```

hoochanlon 发表于 2023-4-4 15:40

本帖最后由 hoochanlon 于 2023-4-5 15:53 编辑

mali8127 发表于 2023-3-5 08:45
没有抬杠,只是研究一种可行的方法。确实是有这样的需求。
另外,我想了其他方法
1,服务器假设ftp,其 ...

这思路可以啊。不过我没有实际环境,也不知道可行不可行。正好有时间,今晚顺便看看资料。

4.5 15:38 关于同步备份的资料补充:

* [简易百科-一文看懂rsync实现ftp数据定时同步过程](https://www.isolves.com/it/wl/js/2019-10-25/6686.html)
* (https://blog.csdn.net/shgh_2004/article/details/120049771)
* [码农家园-rsync基本命令和操作](https://www.codenong.com/cs106159085/)
* [阮一峰的网络日志 -rsync 用法教程](https://www.ruanyifeng.com/blog/2020/08/rsync.html)
* (http://www.dbs724.com/146870.html)

看完了这些资料,基本上就能有个大概的思路了,剩下动手的事情,可根据自身环境调整。

coolcalf 发表于 2023-3-2 14:57

本帖最后由 coolcalf 于 2023-3-2 14:59 编辑

如果你没有互联网IP且开放了FTP的“反射”端口序列,FTP的反射端口问题会很麻烦。建议改用SSFTP

在CentOS 7上搭建SSFTP的步骤:
1.首先,确保您的CentOS 7系统已经安装了OpenSSH服务器和vsftpd软件包。如果没有安装,可以使用以下命令进行安装:
sudo yum install -y openssh-server vsftpd


2.创建SSFTP用户并设置密码。使用以下命令创建用户:
sudo useradd ssftpuser


然后,设置密码:
sudo passwd ssftpuser


3.创建SSFTP目录。使用以下命令创建目录:
sudo mkdir /home/ssftpuser/ssftp


4.修改SSFTP目录的权限。使用以下命令将目录权限更改为ssftpuser用户和群组的所有者:
sudo chown ssftpuser:ssftpuser /home/ssftpuser/ssftp


5.配置vsftpd服务器。使用以下命令编辑vsftpd.conf文件:
sudo vi /etc/vsftpd/vsftpd.conf

b15517313524 发表于 2023-3-2 14:38

之后玩的话用得上,谢谢

ranbo 发表于 2023-3-2 15:05

很实用,感谢大佬

hoochanlon 发表于 2023-3-2 15:09

coolcalf 发表于 2023-3-2 14:57
如果你没有互联网IP且开放了FTP的“反射”端口序列,FTP的反射端口问题会很麻烦。建议改用SSFTP

在CentO ...

建议不错哦,{:301_993:},我这个主要面向个人玩云的,拿着我的代码改改,其实也差不多了。

IDLFF 发表于 2023-3-2 15:17

有点难度

rhci 发表于 2023-3-2 15:40

其实可以试试CuteHttpFileServer,简称chfs,或者iFileSpace,这两款软件,都还不错,虽然不是开源的,但是只用足够了
特别是 两款都支持webdav协议。

hoochanlon 发表于 2023-3-2 15:52

rhci 发表于 2023-3-2 15:40
其实可以试试CuteHttpFileServer,简称chfs,或者iFileSpace,这两款软件,都还不错,虽然不是开源的,但是 ...

个人用也还好,综合性的学习来说,我觉得不如ftp。不过,感谢推荐。

笨蛋先森 发表于 2023-3-2 16:00

收藏下,。

rhci 发表于 2023-3-2 16:04

hoochanlon 发表于 2023-3-2 15:52
个人用也还好,综合性的学习来说,我觉得不如ftp。不过,感谢推荐。

我也在用FTP,但是FTP出现了很多问题,你只映射FTP主端口,WIN浏览器登陆不上,各种报错,你用FTP软件,传输异常,原因就是FTP被动传输模式,具体的可以百度下相关知识,所以我放弃了FTP,走WEB模式。不过,萝卜白菜,各有所爱吧。
页: [1] 2 3
查看完整版本: Linux云服务器一键搭建自用FTP脚本