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类似,相关指令如下:
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
。
- 密钥登录:先在 termius >> Settings >> Keychain 生成一个key,然后连接ssh时使用
- 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的三次握手连接。根据数据通道建立的方式,又分为主动连接和被动连接。
主动连接
- 建立命令通道的联机:客户端随机取一个大于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端口等防火墙设置。
被动连接
- 客户端与服务器建立命令通道:与主动连接一致
- 客户端发出 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
常见问题
- 创建的无需登录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连接配置界面里,点击【高级】>>【连接】,通过勾选或取消勾选【被动模式】,来切换主动或被动连接。加密连接时选择“显式加密”
参考资料
- https://blog.csdn.net/weixin_44901564/article/details/108059263
- https://www.pureftpd.org/project/pure-ftpd/
- https://bobcares.com/blog/install-pure-ftpd-ubuntu/
- https://wiki.ubuntu.org.cn/Pure-ftpd
- https://segmentfault.com/a/1190000015100129
- https://www.server-world.info/en/note?os=Ubuntu_20.04&p=ftp&f=8