Linux SSH 与 FTP 服务

SSH

远程联机服务器有文字接口与图形接口两种方式:

  • 文字接口:SSH,采用密文传输
  • 图形接口:Xdmcp,VNC等

SSH 全程是 Secure SHell protocol 安全的壳程序协议,它可以透过数据封包加密技术,将等待传输的封包加密后再传输到网络上, 因此,数据信息当然就比较安全。

SSH 协议预设状态下,提供两个服务器功能:

  • ssh:远程联机使用 shell 的服务器
  • sftp:实现类似 FTP 服务的 sftp-server,更安全的 FTP 服务

启动 SSH 服务

有些Linux默认已安装SSH软件,有些需要安装,如下面的Ubuntu。
Ubuntu 安装 SSH 服务方法:

# 安装 SSH 服务,安装后默认已启动及开机自启
apt-get install openssh-server

# 开启、停止和重启 SSH
systemctl stop sshd
systemctl start sshd
systemctl restart sshd

# 查看 ssh 端口监听
netstat -tlunp | grep ssh

ssh 客户端 – Linux

Linux 系统默认已带有 ssh 所有命令,无需额外安装软件。
ssh [-f] [-o 参数项目] [-p 非默认端口] [账号@]IP [指令]

  • -f :需要配合后面的[指令],不登入远程主机直接发送一个指令过去
  • -o 参数项目:主要的参数项目有:
    • ConnectTimeout=秒数 :联机等待的秒数,减少等待的时间
    • StrictHostKeyChecking=[yes|no|ask]:预设是 ask,若要让 public key主动加入 known_hosts ,则可以设定为 no 即可
  • -p :如果你的 sshd 服务启动在非默认端口 (22),需使用此项目
# ssh 登录本机
ssh ubuntu@127.0.0.1

# 远程主机执行命令,不等待执行结束
ssh -f student@127.0.0.1 find / &> ~/find1.log

# 第一次联机远程主机,需要确认将对方公钥添加到本机的 ~/.ssh/known_hosts 文件
# 下面的参数,可以跳过确认直接写入
ssh -o StrictHostKeyChecking=no root@localhost

sftp 与 scp 可以实现从远程服务器下载或上传文件,也使用 ssh的端口。

sftp 登录主机:sftp student@localhost
sftp 指令与ftp类似,相关指令如下:

file

file

scp :直接上传或下载文件到远程服务器
上传命令 scp [-pr] [-l 速率] file [账号@]主机:目录名
下载命令 scp [-pr] [-l 速率] [账号@]主机:file 目录名

  • -p :保留原本档案的权限数据;
  • -r :复制来源为目录时,可以复制整个目录 (含子目录)
  • -l :可以限制传输的速度,单位为 Kbits/s ,例如 [-l 800] 代表传输速限100Kbytes/s
# sftp登录主机
sftp student@localhost

# 将本机的 /etc/hosts* 全部复制到 127.0.0.1 上面的 student 家目录内
scp /etc/hosts* student@127.0.0.1:~

# 将 127.0.0.1 这部远程主机的 /etc/bashrc 复制到本机的 /tmp 底下
scp student@127.0.0.1:/etc/bashrc /tmp

ssh 客户端 – Windows

Windows 系统的ssh客户端,我常用的有几种:

  • termius :第三方免费ssh客户端,https://termius.com/
    • 密钥登录:先在 termius >> Settings >> Keychain 生成一个key,然后连接ssh时使用 Set a Key
  • CMD :Windows自带的CMD命令行工具也支持 ssh命令,与Linux终端类似,此命令需要安装 openssh 软件
  • WinSCP :文件传输工具,支持 sftp、scp、ftp、webdav等协议

sshd 服务设置

修改 sshd 服务配置文件 vim /etc/ssh/sshd_config

# SSH 端口,可以指定多个,默认是 22
#Port 22
Port 2202

# 是否允许 root 登录,Ubuntu、Debian等最新版已默认no
#PermitRootLogin no

# 是否允许用户使用密钥登录及用户的公钥数据放置的位置
#PubkeyAuthentication yes
#AuthorizedKeysFile     .ssh/authorized_keys .ssh/authorized_keys2

# 密码验证当然是需要的,这里默认 yes
#PasswordAuthentication yes

# 联机成功后,服务器会一直发送 TCP 封包到客户端以判断对方在线,防止出现僵尸进程。
# 不过,若联机中网络中断几秒,联机也会中断。如果你的网络不太稳定,可以设置为 no
#TCPKeepAlive yes

修改配置文件后,需要重启 sshd 服务才能生效。systemctl restart sshd

ssh 密钥登录

ssh 可以不使用密码登录,而是将客户端的公钥提前放到服务端,然后免密码直接连接服务器。

# 客户端公钥
# 先查看本地是否生成过公钥,一般是 id_rsa.pub 文件,而 id_rsa 文件是私钥
ll ~/.ssh
# 客户端生成公钥,一直回车即可
ssh-keygen

# 将客户端公钥上传到服务器,也可以直接复制公钥内容
scp ~/.ssh/id_rsa.pub dmtsai@192.168.100.254:~
cat id_rsa.pub >> .ssh/authorized_keys

# 公钥上传后,就可以客户端ssh免密码登录了

ssh 安全设置

sshd 基础的安全设置是必要的,防止被恶意攻破。

  • 禁止 root 账号登录
  • /etc/hosts.allow 及 /etc/hosts.deny 设置允许登录ssh的客户端IP
  • iptables 防火墙增加 ssh 端口放行功能
# 禁止root登录
vim /etc/ssh/sshd_config
PermitRootLogin no

# 允许登录的客户端IP
vim /etc/hosts.allow
sshd: 127.0.0.1 192.168.1.0/255.255.255.0 192.168.100.0/255.255.255.0

vim /etc/hosts.deny
sshd: ALL

# iptables 防火墙
iptables -A INPUT -i $EXTIF -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i $EXTIF -s 192.168.100.0/24 -p tcp --dport 22 -j ACCEPT

代理连接 sshd

有时一些 sshd服务器无法在本地直连上去,比如远程 sshd 服务器被墙无法从国内访问。同时,本地开启clash代理,这时使用 ssh 命令联机时,可以增加代理操作。

# -x 后接clash代理端口,最后更换为远程服务器账号和IP
ssh -oProxyCommand="nc -x 127.0.0.1:7890 %h %p" root@2.2.2.2

另外,winscp 也可以在连接的高级设置里配置代理。

FTP

FTP 是文件传输协议 (File Transfer Protocol) 的简写,主要的功能是进行服务器与客户端的文件管理、传输等事项。
FTP 的服务器软件非常多,例如 WuFTP、Proftpd、vsftpd 等等,各种FTP服务器软件的发展理念并不相同,所以选择时请依照你的需求来决定所需要的软件。下面主要介绍 vsftpd服务器的使用。

主动与被动连接

FTP 是应用层协议,传输层还是TCP/IP协议。在客户端与服务端建立连接时,会存在两个联机通道,分别是命令通道与数据通道(ftp-data)。两个联机都需要经理TCP的三次握手连接。根据数据通道建立的方式,又分为主动连接和被动连接。

主动连接

file

  • 建立命令通道的联机:客户端随机取一个大于1024端口(Port AA)与FTP服务器的 21端口达成联机。此时客户端可以向FTP服务器下达指令,如查询文件、下载、上传等指令;
  • 客户端通知FTP服务器使用 Active(主动连接)方式且告知数据连接(ftp-data)的端口:客户端将随机的端口(Port BB)告知FTP服务器,并等待FTP服务器发起数据传输的联机;
  • FTP服务器主动向客户端联机:FTP服务器得知客户端需求后,会主动通过自己的 20端口向客户端的 Port BB 端口联机,并进行数据传输。

端口:FTP服务器的防火墙FILTER表INPUT入方向需开放21端口,OUTPUT出方向开放20端口(如果出方向是ACCEPT,一般不需要额外限制)

联机问题:主动连接时,如果客户端存在防火墙且屏蔽特定端口连接,可能会导致FTP服务端无法连接客户端。因此采用主动连接时需要保证客户端自身及其NAT路由器等不要有拦截20端口等防火墙设置。

被动连接

file

  • 客户端与服务器建立命令通道:与主动连接一致
  • 客户端发出 PASV(被动连接)的联机要求:客户端告知FTP服务器使用被动连接要求,并等待服务器回应
  • FTP服务器启动数据端口(ftp-data),并告知客户端联机:如果FTP服务器开启了允许被动连接方式,将会先启动一个被动连接的数据传输监听端口(此端口是随机的)。然后FTP服务器通过命令通道告知客户端刚才启动的ftp-data端口(port PASV),并等待客户端联机;
  • 客户端随机取用大于 1024端口进行连接:客户端会随机去一个大于 1024的端口来对FTP服务器的 port PASV 联机。

端口:FTP服务器防火墙INPUT入方向除了开放 21端口,还需要开放被动连接端口(此端口默认是随机的,可在配置文件中定义随机选取的端口范围),OUTPUT出方向不需要额外开放端口。

联机问题:被动连接对客户端更友好,一般是客户端软件默认采取的方式。FTP服务器要注意开放端口。

vsftpd 服务器

vsftpd 全称是 Very Secure FTP Daemon,它是在构建一个以安全为重的FTP服务器。

安装 vsftpd

vsftpd 很小巧,安装也很简单。

# Ubuntu内安装,安装后默认启动并加入开机自启
apt-get install vsftpd
vsftpd 配置项

常用的配置项如下,其他配置项通过命令 man 5 vsftpd.conf 可以查看。

系统配置

# 开启监听,以下配置只能开启一个,listen指IPv4监听,listen_ipv6指IPv4和IPv6同时监听(因此一般只需开启listen_ipv6)
listen=NO
listen_ipv6=YES

# 使用本地时间
use_localtime=YES

# 支持 TCP Wrappers 的防火墙机制,通过
tcp_wrappers=YES

匿名账号登录
默认是关闭匿名账号登录的,在测试FTP连接或开放一些公开资料下载时,可以开启匿名账号登录。

# 开启匿名账号登录
anonymous_enable=YES

# 设置匿名账号登录的目录,此目录也需要自己创建
anon_root=/var/ftp/pub

# 默认仅支持匿名登录的下载操作,其他还有一些设置,包括开放匿名账号的上传、创建、删除等权限

主动连接
vsftpd默认已开启

# 主动连接ftp-data端口,测试发现设置no,也可以正常连接,暂不清楚原因
connect_from_port_20=YES

被动连接
被动连接默认也是开启的,但一般需要设置被动连接端口范围。

# 开启被动连接支持,默认YES
pasv_enable=YES

# 被动连接的ftp-data数据传输端口范围,默认随机端口
pasv_min_port=65400
pasv_max_port=65410

实体账号
实体账号即是在Linux系统中创建的用户。默认是禁用的。

# 开启实体账号登录,默认NO
local_enable=YES

# 允许实体账号上传数据,默认NO
write_enable=YES

# 实体账号umask值
local_umask=022

# 开启vsftp账户管控,同时需创建 /etc/vsftpd.user_list 文件(根据userlist_file定义)
userlist_enable=YES
# 当userlist_enable设置YES后,通过下面配置定义userlist_file白名单或黑名单。
# 当设置YES,userlist_file内用户不允许登录,即黑名单;当设置NO,userlist_file内用户才允许登录,即白名单。默认YES
userlist_deny=YES
# 名单文件,每个用户名一行
userlist_file=/etc/vsftpd.user_list

# 开启chroot限制,当设置YES时,登录用户限制在自己的家目录内
chroot_local_user=YES
# 开启不受chroot限制的用户白名单。下面设置将允许chroot_list_file内用户不受chroot限制。
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
# vsftpd-3.0安全特性,用户chroot时不允许家目录具有写权限。可以增加下面的配置,或修改家目录权限 chmod a-w /home/USER
allow_writeable_chroot=YES

SSL加密
vsftpd默认是明文传输的,账户信息及数据明文在网上传输是很危险的。因此通过SSL加密,可以使ftp使用密文传输。

# 开启SSL加密
ssl_enable=YES

# 下面的密钥证书,是我在Ubuntu安装vsftpd时自带的可以直接使用。如果没有,可以自己生成pem证书。
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
防火墙

要实现主动和被动连接,需要开启端口21和65400-65410(被动数据传输端口)

iptables -A INPUT -p TCP -i ens33 --dport 21 --sport 1024:65534 -j ACCEPT
iptables -A INPUT -p TCP -i ens33 --dport 65400:65410 --sport 1024:65534 -j ACCEPT
应用demo

在Ubuntu 20 环境下实现一个FTP服务,主要实现需求如下:

  • 使用本地时间取代 GMT 时间
  • 实体账号可以进行上传、下载、建立目录及修改文件等操作
  • 用户新建文件、目录的 umask 设定为 002
  • 禁止匿名登录
  • 创建实体账号,仅在FTP使用,不允许登录SSH
  • 实体账号采用白名单限制,仅允许指定账号使用FTP
  • 所有实体用户新建文件、目录的所有者均为指定用户
  • 为实体用户指定家目录
  • 其他主机设定值保留默认值即可

vsftpd 配置
修改配置文件 vim /etc/vsftpd.conf

# 开启监听
listen=NO
listen_ipv6=YES

# 使用本地时间
use_localtime=YES

# 禁用匿名
anonymous_enable=NO

# 主动连接开启
connect_from_port_20=YES

# 被动连接开启
pasv_enable=YES
pasv_min_port=65400
pasv_max_port=65410

# 实体账号开启
local_enable=YES
write_enable=YES
local_umask=002

# 开启vsftp账户管控
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd.user_list

# 开启chroot
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
allow_writeable_chroot=YES

# 开启SSL加密,证书rsa_cert_file配置项自定义
ssl_enable=YES

编辑 userlist_file 文件 vim /etc/vsftpd.user_list

# 添加需要登录FTP的实体用户名单
ubuntu

编辑 chroot_list_file 文件 touch /etc/vsftpd.chroot_list

常见问题

  1. 创建的无需登录ssh的实体账号,可能会出现无法登录FTP的问题。解决办法:增加shell解释器 vim /etc/shells,增加一行 /sbin/nologin

防火墙

iptables -A INPUT -p TCP -i ens33 --dport 21 --sport 1024:65534 -j ACCEPT
iptables -A INPUT -p TCP -i ens33 --dport 65400:65410 --sport 1024:65534 -j ACCEPT

Pure-FTPd 服务器

Pure-FTPd 也是一个开源免费的FTP服务器,相比小巧的 vsftpd 功能更丰富,特别是对虚拟用户的支持更好。

安装
# 安装后已默认启动,并设置了开机自启
apt-get install pure-ftpd
配置

pure-ftpd 的配置文件方式比较独特,配置目录是在 /etc/pure-ftpd/conf,里面每项配置对应一个文件。
如 增加配置项 NoAnonymous 为 yes,可以用命令 echo "yes" > /etc/pure-ftpd/conf/NoAnonymous

下面罗列一般需要配置的部分:

# 开启被动连接,默认支持主动连接。端口范围要与MaxClientsNumber适应,端口太少会影响连接
PassivePortRange 46500 46550

# 禁止匿名
NoAnonymous yes

# 开启chroot
ChrootEveryone yes

# 服务器总共允许同时连接的最大用户数
MaxClientsNumber 50

# 新建目录及文件的掩码值。<文件掩码>:<目录掩码>
Umask 133:022

虚拟用户
创建的虚拟用户仅FTP使用,非系统用户,需要绑定一个系统用户,并可以指定虚拟用户的家目录。
pure-ftpd 的虚拟用户登录后被看到绑定的那个系统用户,创建文件所有者也是系统用户,同时又能将虚拟用户另外限制到指定目录。此功能可以满足我在 vsftpd 应用demo里划线掉的功能。

# 创建系统用户,用作虚拟用户的映射
useradd -m -s /sbin/nologin www

# 创建虚拟FTP用户
pure-pw useradd ftptest1 -u www -d /home/www/web1

# 更新PureDB数据库信息
pure-pw mkdb

# 虚拟用户的其他操作
# 修改密码
pure-pw passwd ftptest1 -m

# 删除用户
pure-pw userdel ftptest1 -m

# 查看用户
pure-pw show ftptest1

# 列出所有用户
pure-pw list

认证软链
使用 apt-get 方式安装的pure-ftpd,虚拟用户存在无法认证登录的问题。此时需要创建下认证的软链:

cd /etc/pure-ftpd/auth/

# 创建虚拟用户认证的软连接
sudo ln -s ../conf/PureDB 60puredb

# 还需要检查一下设置中虚拟用户方式是否是开启状态
cat 60puredb
# 结果为 /etc/pure-ftpd/pureftpd.pdb 。内容为虚拟用户数据库文件

做好设置后,重启服务 systemctl restart pure-ftpd

SSL 加密访问
默认的访问是不加密的,开启SSL加密更安全。

# 如果没有下面的目录,需要创建下
cd /etc/ssl/private

# 生成SSL密钥
openssl req -x509 -nodes -newkey rsa:2048 -keyout pure-ftpd.pem -out pure-ftpd.pem -days 365

# 设置权限
chmod 600 pure-ftpd.pem

# 配置pure-ftpd,开启TLS
echo "2" > /etc/pure-ftpd/conf/TLS

# 重启并查看服务状态
systemctl restart pure-ftpd
systemctl status pure-ftpd

FTP 客户端

Windows 系统可以使用的FTP客户端:

  • WinSCP:免费的FTP软件。在FTP连接配置界面里,点击【高级】>>【连接】,通过勾选或取消勾选【被动模式】,来切换主动或被动连接。加密连接时选择“显式加密”

参考资料

未经作者允许,禁止转载。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇