一些关于在 Windows 电脑上折腾 FTP 文件传输的记录。毕竟虽然但是,华科大内网的连接速度还是非常可以的,如果能够很好的借助 FTP 传输文件的话,倒也省得我带着移动硬盘在寝室和实验室来回跑了(
本文的服务器端仅使用 Windows 10 自带的 IIS 控制面板。
前置准备
一些开始教程之前的准备;
增加 Windows 功能
使用 Win + R 运行 optionalfeatures
,或者在搜索菜单中搜索“启用或关闭 Windows 功能”;
找到 Internet Information Services
,将其下的“FTP 服务器”的所有子选项勾选,并勾选“Web 管理工具”下的“IIS 管理控制台”。
打开设置,进入应用 ->
应用与功能,点击“可选功能”;搜索 OpenSSH
,找到并安装“OpenSSH 服务器”和“OpenSSH 客户端”。
现在,你应该可以通过计算机管理,或者搜索菜单找到“Internet Information Services (IIS) 管理器” 了。IIS 管理器就有点像之前的云服务器面板一样,不过是 Windows 自带的就是了(
但是因为 Windows 自身也是有防火墙的,我们要先允许 FTP 服务通过 Windows 的防火墙;在搜索菜单中搜索“允许应用通过 Windows 防火墙”,点更改设置,找到并勾选“FTP 服务器”;然后点击窗口右下角的“允许其他应用”按钮,浏览路径,找到 C:\Windows\System32\svchost.exe
,并添加,确定。
其实在配置远程桌面服务的时候也需要在这里配置这一项目
FTP & SFTP & FTPS
其实你要我说也说不太清楚,截至今天我总共已经翘了 2/2(100%)节计算机网络的课了;但是一些常识性的东西还是能简单的说说的:
协议类型 | 端口 | 备注 |
---|---|---|
FTP | 21 | Windows 资源管理器唯一支持的 FTP 形式;明文传输,安全性差,但是很方便 |
SFTP | 22 | 使用 sshd 作为守护进程;安全,但是传输效率较为低下 |
FTPS(Explicit) | 21 | 需要一个证书;客户端先发起一个明文的请求,然后再切换到加密连接进行 |
FTPS(Implicit) | 990 | 同样需要证书;全程加密连接,服务端会拒绝掉所有尝试不通过加密的请求 |
实际上 FTP 开放的端口并不止一个——有命令通道和数据通道,21 一般指命令通道;FTP 的连接分为主动模式(Standard)和被动模式(Passive):
- 主动模式下,客户端首先通过 TCP-21 端口和服务器连接;客户端需要接受数据的时候发送 PORT 命令告诉服务器客户端用来接收数据的端口,然后服务器使用 TCP-20 端口与客户端建立连接,也就是数据通道;
- 被动模式下,通过 TCP-21 建立连接后发送 PASV 命令;服务端接收命令后打开一个临时端口并通知客户端,客户端再连接服务器的此端口,进行数据传送;
一般来说,由于防火墙一般不允许接受外部发起的连接,所以外网的客户端可能无法使用 Passive 模式连接;
FTP 家族比较混乱,一般来说都用 SFTP 了;FTP 协议由于非常的不安全,近年来主流的浏览器都已经放弃了在浏览器中内置 FTP 的支持了——毕竟基础的支持 Windows 资源管理器也提供了。
配置服务器
对于 FTP、SFTP、FTPS 三种服务器的配置方法:
FTP
进入 IIS 管理器,在左侧的连接栏中找到“网站”,右键增加 FTP 站点;
在弹出的窗口中指定名称和映射的物理地址,点下一步:
关于 IP 地址,你可以填写你的 IP;如果你不知道填写哪一级别的 IP,你也可以默认“全部为分配”,相当于填入了通配符 *
;如果设置了其他的端口,那么访问时的 IP 地址需要带上端口号;如果提供了虚拟主机名,那么访问时还需要加上虚拟主机名,因为没有必要所以这里统统默认。
因为我们现在还不是配置 FTPS,所以选择“无 SSL”。
接下来是配置权限的页面;如果是作为一个公开的 FTP 服务器,可以勾选匿名身份验证,授权全部用户读写权限(当然,这是不可能的);否则需要进行配置密码:
Windows 专业版
用户组策略设置只有专业版的 Windows 10 才有;在计算机管理中的本地用户和组菜单中可以新建用户(组),并且进行细致的组策略管理。我们新建一个一般用户,并设置用户名和密码
注意需要取消勾选用户下次登陆时须更改密码,不然会比较麻烦。
然后我们回到 IIS 面板,进入我们刚才创建的服务器的主页;首先进入 FTP 身份验证页面,并且关闭匿名验证:
然后再进入到旁边的 FTP 授权规则页面,增加允许规则,并选择我们刚创建的用户(们):
不出意外,现在已经可以正常在 Windows 资源管理器里输入 ftp://localhost/
来输入密码访问了。
Windows 家庭版
Windows 10 家庭版不支持组策略管理,但是支持创建账户;我们可以直接在设置页面创建一个本地的标准账户,并赋予密码,也可以在这里设置允许规则;唯一的问题就是无法进行精细的权限管理,当然,作为一个实用派的萌新,倒也没有必要搞过于精细的权限管理;真要怕被日用时开不用时关就行了,而且 FTP 一个明晃晃的明文传输,人家要真想抓包搞你你也没有什么办法(
还有一种做法是在服务器主页的右侧栏中的基本设置里(如下)的连接为中设置用户名密码,而在服务器设置里设置允许所有用户:
但是因为我实在是不太理解微软的权限管理,所以这里也就没有尝试,不多废话了。
当然,如果你怕麻烦而且心很大,也可以使用你当前的账户直接连接到 FTP 服务器;此时你的账号名可以通过在 CMD
中运行 echo %username%
获得;如果你当前使用的账户连接到了 Microsoft 账户,那么也可以使用 MicrosoftAccount/your@email.com
作为你的用户名,登陆密码作为你的密码。
FTPS
FTPS 是 FTP over SSL 的简称,分为显式和隐式两种;很遗憾 XFTP 7 学生版并不支持似乎标准版也不支持,所以如果你想要通过 FTPS 连接你的 FTP 服务器,那么你需要下载合适的客户端:
- FileZilla 客户端
ES 文件浏览器
SSL 证书
当然,既然是走 SSL,那么你首先要有一个 SSL 证书;可以自签,也可以绑了域名后申请一个免费的;因为我有在 DNSpod 上托管腾讯云买的域名,所以可以直接方便地申请到免费的证书;下面介绍腾讯云的证书使用方法:
下载 SSL 证书压缩包后,可以看到其中包含了一个 IIS 专用证书的目录;我们进入 IIS 面板,选择计算机名称进入到服务器主页,进入服务器证书页面:
然后再右侧栏中选择导入证书,选择下载的证书文件;然后根据你的 SSL 证书提供商的说明来填入相应的信息。
增加完成后,你就可以在所有的需要使用 SSL 的证书的地方找到你刚增加的 SSL 证书了。当然,如果要使用这种来自运营商颁发的证书,建议在 DNS 处增加一条解析记录,这样访问也更加优雅。
修改服务器配置
进入你创建的 FTP 服务器的主页,打开 FTP SSL 设置:
进入之后就可以指定 SSL 策略了;如果选择允许 SSL 连接,那么使用 Windows 资源管理器等软件的基本 FTP 的访问将还可以进行(当然,它们依然不安全);如果选择需要 SSL 连接,等于强制 FTPS,此时只能通过支持 FTPS 协议的客户端来访问 FTP 服务器,当然,也相对更加安全。
隐式 FTPS
因为 FTPS 隐式是通过一个固定的端口 990
来确立安全连接的,所以我们需要使得我们的服务器允许来自 990 端口的连接;进入 FTP 服务器主页,在右侧的操作栏中找到“绑定”并进入;增加对 990 端口的监听,并将类型设置为 ftp,就像下面这样:
这样重启服务器后,我们就可以通过支持 FTPS 的客户端,使用隐式的方式访问 FTP 服务器了;当然,即使不做这一步操作,我们也可以通过显式的方式使用 FTPS 协议访问 FTP 服务器。
SFTP
SFTP 和 FTP 完全不是一个东西;它借助了 sshd
运行,是 SSH 套件中的一个。所以在使用它之前,我们首先要在设置菜单中增加 OpenSSH 服务器功能;
然后,我们可以在管理员权限下的 Powershell 中运行:
1 | net start sshd |
来启动 SSH 的守护进程;现在,我们应该可以在其他电脑上是用 SSH 或者客户端访问它了;使用支持 SFTP 的客户端(比如 Xftp 7)来访问它,可以直接访问到整个电脑的根目录。
当然,也可以像在 Linux 中修改 sshd
的配置文件一样修改;在 Windows 10 中,这个配置文件的绝对路径一般是 C:\ProgramData\ssh\sshd_config
;
限定某用户只能访问固定文件夹
比如我们限制 ftpuser
只能访问 D 盘
1 | Match User ftpuser |
可以把上面的内容增加到 sshd_config
的末尾。
限制本机 SSH 只能用来 SFTP
将下面这句话增加到配置文件的末尾:
1 | ForceCommand internal-sftp |
当然也可以配合缩进,限制特定用户的 SSH 功能(像上面那样)
一些吐槽
配置过程中出现的一些神秘问题的记录
XFTP 竟然不支持 FTPS,这是我万万没有想到的(
博主最开始尝试在 IIS 增加用户允许规则的时候甚至没有发挥作用,但是重新创建一个 FTP 服务器就没有问题了;只能说是十分神秘了(
SFTP 查看的文件列表似乎存在不全的情况,比如下图:
可以稳定地在各种客户端上复现,不知道是什么原因()不然就用 SFTP 算了,谁搁着 FTPS 呢==
哎,不能再折腾了,凑合着能用就要干活了,那这篇文章先到这里;如果有什么错误的话欢迎指正,如果可以解释上面的这些神秘问题的话也欢迎补充()