Microsoft Internet Information Services 支持 Web Server 和 FTP Server,需要注意的是,IIS 的 FTP Server 使用的是 Windows 系统账号和密码来登录,而不是像 Filezilla Server 等 FTP 服务器一样使用服务器软件定义的用户名和密码来登录,IIS FTP Server 也支持 SSL 加密,而且默认要求 SSL 连接。在配置 IIS FTP 时会遇到很多问题,而微软文档又语焉不详,让人很容易掉进坑里出现很多奇怪的问题。
问题一、服务器策略要求 SSL 连接- Response: 534 Policy requires SSL.
- Error: Could not connect to server
复制代码 534 Policy requires SSL. 是因为 IIS FTP 站点的默认 SSL 配置是 controlChannelPolicy 和 dataChannelPolicy 都是 SslRequire,即要求 SSL 连接,如果要创建一个不使用 SSL 加密的 FTP 站点,需要将 SslRequire 改成 SslAllow,意思是可以加密连接,也可以不加密连接,这两个属性没有专门禁用 SSL 的属性值,如果使用默认值,又没有配置 SSL 证书,客户端连接服务器时会被拒绝。需要修改 IIS C:\windows\System32\inetsrv\config\applicationHost.config 配置文件中的以下两个 ssl 配置元素的 controlChannelPolicy 和 dataChannelPolicy 属性值为 SslAllow,其中 site 是指要配置证书的那个 FTP 站点。
- system.applicationHost/sites/siteDefaults/ftpServer/security/ssl
- system.applicationHost/sites/site/ftpServer/security/ssl
复制代码 也可以使用 Internet Information Services Manager 交互操作来设置,设置路径是 Server Home -> FTP SSL settings -> Allow SSL Connections,或者在指定 FTP 站点的视图中选择 FTP SSL settings -> Allow SSL Connections。本文基于英文版 Windows Server 2022,中文界面请以实际显示为准,下同。
问题二、给 FTP 站点绑定域名后,不能连接服务器,无法登录。- Response: 530 Valid hostname is expected.
- Error: Could not connect to server
复制代码 IIS FTP server 530 Valid hostname is expected. 是很经典的问题,如果 FTP 站点绑定了域名,IIS FTP 服务器要求以 <域名>|<用户名> 的格式指定 FTP 用户名,比如,如果域名是 wuxiancheng.cn,用户名是 wuxiancheng,那么登录 IIS FTP 时需要将用户名设置为- wuxiancheng.cn|wuxiancheng
复制代码 问题三、FTP 站点根目录不能访问,用户无法登录。- Response: 530 User cannot log in, home directory inaccessible.
- Error: Critical error: Could not connect to server
复制代码 530 User cannot log in, home directory inaccessible. 是因为没有授权 Windows 用户登录 IIS FTP Server。修改 IIS applicationHost.config 配置文件中的 configuration/system.ftpServer/security/authorization,如果它没有 add 配置元素就添加 add 配置元素,指定允许登录 IIS FTP 服务器的 Windows 用户名。users 的值可以使用逗号分隔来指定多个用户名,permissions 指定用户的权限,Read 是读权限,Write 是写权限,可以根据需要设置为其中一个,或者都写上,add 元素可以有多个。以下内容是配置文件内容摘录,不相关的内容已经省略,只是为了展示结构。请按需要修改配置文件,不要用下面的代码覆盖原来的配置内容。
- <system.ftpServer>
- <security>
- <authorization>
- <add accessType="Allow" users="wuxiancheng" permissions="Read, Write" />
- </authorization>
- </security>
- </system.ftpServer>
复制代码 以上方法是设置服务器级别的用户授权,也可以设置 FTP 站点级别的用户授权,站点级别的用户授权只对站点生效。
配置代码如下。path="wuxiancheng" 中的 wuxiancheng 是 FTP 站点名称,需要按实际情况改写。
- <configuration>
- <location path="wuxiancheng">
- <system.ftpServer>
- <security>
- <authorization>
- <add accessType="Allow" users="wuxiancheng" permissions="Read, Write" />
- </authorization>
- </security>
- </system.ftpServer>
- </location>
- </configuration>
复制代码 使用 Internet Information Services Manager 可以可视化设置用户授权,操作路径是 Server Home -> FTP Authorization Rules -> Add Allow Rule 或者在指定的站点视图中选择 FTP Authorization Rules -> Add Allow Rule。
问题四、服务器本地策略不允许TLS安全连接
- Response: 220 Microsoft FTP Service
- Command: AUTH TLS
- Response: 534 Local policy on server does not allow TLS secure connections.
复制代码 IIS FTP server 534 Local policy on server does not allow TLS secure connections. 是没有正确配置服务器证书导致的,需要导入申请到的证书,或者生成一个自签证书,然后将 IIS FTP server 的 serverCertHash 设置为这个证书的 Thumbprint,serverCertStoreName 要设置为正确的证书位置,如果证书在 Cert:\LocalMachine\My,serverCertStoreName 就要设置成 MY,证书信息可以通过以下 Powershell 命令查看。- Get-ChildItem -Path Cert:\LocalMachine\My
复制代码- Get-ChildItem -Path Cert:\LocalMachine\WebHosting
复制代码 需要注意的是,证书信息要设置到 IIS applicationHost.config 的 system.applicationHost/sites/siteDefaults/ftpServer/security/ssl 配置元素上去,它是服务器级别的证书配置,不能只设置到站点上去而在服务器级别不配置证书。最终配置如下。以下内容是摘录,不相关的内容已经省略,只是为了展示结构,按需要配置 ssl 配置元素的属性值即可,不要使用下面这个配置代码直接覆盖原来的内容。- <system.applicationHost>
- <sites>
- <siteDefaults>
- <ftpServer>
- <security>
- <ssl serverCertHash="BB4473D65E9D7D2FDB83121E0BCC3166A7227254" serverCertStoreName="My" ssl128="false" controlChannelPolicy="SslAllow" dataChannelPolicy="SslAllow" />
- </security>
- </ftpServer>
- </siteDefaults>
- </sites>
- </system.applicationHost>
复制代码 站点级别的证书配置在以下配置元素上,其中 site 是指要配置证书的那个 FTP 站点。- system.applicationHost/sites/site/ftpServer/security/ssl
复制代码 使用 Internet Information Services Manager 可以可视化设置服务器证书,操作路径是 Server Home -> FTP SSL Settings -> SSL Certificate,或者在指定的 FTP 站点视图中选择 FTP SSL Settings -> SSL Certificate,选择匹配的 SSL 证书,保存即可。
问题四、证书不匹配
- Error: Certificate of connection does not match expected certificate.
- Error: The data connection could not be established: ECONNABORTED - Connection aborted
- Response: 226 Transfer complete.
- Error: Failed to retrieve directory listing
复制代码 Certificate of connection does not match expected certificate. 是证书不匹配导致的,同时指定了服务器级别的证书和站点级别的证书而且证书不相同时,客户端连接服务器时因为证书混乱导致了冲突。去掉站点级别的证书即可。
问题五、客户端不能连接到服务器- Status: Connection attempt failed with "ETIMEDOUT - Connection attempt timed out".
- Error: Could not connect to server
复制代码 如果网络没有断开,那应该是防火墙阻断了客户端和服务器之间的通信。FTP server 有控制端口和数据端口,默认情况下,控制端口为21,主动模式数据端口为20,被动模式数据端口在一个范围内随机分配,IIS FTP Server 中被动模式的默认数据端口范围是 1024-65535,在设置服务器绑定的时候,指定的端口号会作为 FTP 站点的控制端口号,要想服务器被正常访问,需要将这些端口全部放行。
以下 PowerShell 命令可以用来创建防火墙规则。
- New-NetFirewallRule -DisplayName server-ftp -Enabled true -Action Allow -Direction Inbound -Protocol tcp -LocalPort 20,21,1024-65535 -Program "%windir%\system32\svchost.exe"
复制代码 以下配置代码可以用来修改 IIS FTP Server 的被动模式数据端口范围,其中 lowDataChannelPort 是最小端口号,highDataChannelPort 是最大端口号,取值必须是正整数并且不能大于 65535.- <system.ftpServer>
- <firewallSupport lowDataChannelPort="1024" highDataChannelPort="65535" />
- </system.ftpServer>
复制代码 使用 Internet Information Services Manager 可以可视化设置被动模式数据端口范围,操作路径是 Server Home -> FTP Firewall Support -> Data Channel Port Range.
更改配置后建议重启 FTP 服务。配置 IIS 有很多种方式,包括但不限于 Powershell 的 WebAdministration/IISAdministration 模块命令,appcmd,GUI工具IIS管理器,直接修改配置文件,无论以哪种方式修改,最终都会反映在配置文件中,如果你不是老手你对 IIS 配置文件结构和各种配置元素不熟悉,请不要轻易修改配置文件,修改 IIS 配置之前最好对配置文件做好备份,可以将 C:\windows\System32\inetsrv\config 文件夹全部拷贝出去备份。
参考链接 微软官方文档 ssl配置元素 用户授权 被动模式端口范围 |
|