FTP 防火墙支持 <firewallSupport>

概述

<system.ftpServer/firewallSupport> 元素用于配置端口范围,当您使用 FTP PASV 命令协商被动连接时,FTP 服务将使用该端口范围进行数据通道活动,其中包含服务器的 IP 地址和端口。

使用 FTP PASV 命令协商被动连接时,FTP 服务器会发送包含服务器的 IP 地址和端口的响应。 通过指定 lowDataChannelPorthighDataChannelPort 属性,可以指示 FTP 客户端与防火墙通信,该防火墙应将客户端流量路由到 FTP 服务器。

TCP/IP 端口的有效范围为 1025 到 65535。 (端口 1 到 1024 保留供系统服务使用。)可以输入特殊端口范围“0-0”以将 FTP 服务器配置为使用 Windows TCP/IP 临时端口范围。 在早期版本的 Windows 中,TCP/IP 临时端口范围设置为使用端口 1025 到 5000。 从 Windows Vista 和 Windows Server 2008 开始,TCP/IP 临时端口范围已更改为 49152 到 65535。 有关临时端口范围的详细信息,请参阅 Microsoft 知识库中的以下文章:

929851:Windows Vista 和 Windows Server 2008 中 TCP/IP 的默认动态端口范围已更改

注意

您可以使用 <ftpServer/firewallSupport> 为防火墙配置每个站点的外部 IP 地址。这允许您通过不同的防火墙路由每个站点的防火墙流量。

兼容性

版本 说明
IIS 10.0 <firewallSupport> 元素在 IIS 10.0 中未进行修改。
IIS 8.5 <firewallSupport> 元素在 IIS 8.5 中未进行修改。
IIS 8.0 <firewallSupport> 元素在 IIS 8.0 中未进行修改。
IIS 7.5 <system.ftpServer> 元素的 <firewallSupport> 元素作为 IIS 7.5 的功能提供。
IIS 7.0 <system.ftpServer> 元素的 <firewallSupport> 元素是在 IIS 7.0 的独立下载项 FTP 7.0 中引入的。
IIS 6.0 <firewallSupport> 元素替换 IIS 6.0 MSFTPSVC/PassivePortRange 元数据库属性。

注意

FTP 7.0 和 FTP 7.5 服务是 IIS 7.0 带外提供的,需要从以下 URL 下载和安装模块:

https://www.iis.net/expand/FTP

在 Windows 7 和 Windows Server 2008 R2 中,FTP 7.5 服务作为 IIS 7.5 的功能提供,因此无需再下载 FTP 服务。

安装

若要支持 Web 服务器的 FTP 发布,必须安装 FTP 服务。 为此,请按照以下步骤操作。

Windows Server 2012 或 Windows Server 2012 R2

  1. 在任务栏上,单击 “服务器管理器”。

  2. 在“服务器管理器”中,单击“管理”菜单,然后单击“添加角色和功能”。

  3. 在“添加角色和功能”向导中,单击“下一步”。 选择安装类型,然后单击“下一步”。 选择目标服务器,然后单击“下一步”。

  4. 在“服务器角色”页上,展开“Web 服务器(IIS)”,然后选择“FTP 服务器”

    注意

    若要支持 FTP 服务使用 ASP.Membership 身份验证或 IIS 管理器身份验证,除“FTP 服务”外还需选择“FTP 扩展性”
    Screenshot of F T P service and F T P Extensibility selected under F T P Server in the expanded Web Server (I I S) list.

  5. 单击“下一步”,然后在“选择功能”页上,再次单击“下一步”。

  6. “确认安装选择”页上,单击“安装”

  7. 在“结果” 页面中单击“关闭”

Windows 8 或 Windows 8.1

  1. 在“开始”屏幕上,将指针一直移动到左下角,右键单击“开始”按钮,然后单击“控制面板”

  2. 在“控制面板”中,单击“程序与功能”,然后单击“打开或关闭 Windows 功能”。

  3. 展开“Internet Information Services”,然后选择“FTP 服务器”

    注意

    若要支持 FTP 服务使用 ASP.Membership 身份验证或 IIS 管理器身份验证,还需选择“FTP 扩展性”
    Screenshot of F T P Extensibility and F T P Service selected in a Windows 8 interface.

  4. 单击“确定”。

  5. 单击“关闭” 。

Windows Server 2008 R2

  1. 在任务栏上,单击“开始”,指向“管理工具”,然后单击“服务器管理器”。

  2. 在“服务器管理器”层次结构窗格中,展开“角色”,然后单击“Web 服务器(IIS)”。

  3. 在“Web 服务器 (IIS)”窗格中,滚动到“角色服务”部分,然后单击“添加角色服务”。

  4. 在“添加角色服务向导”的“选择角色服务”页,展开“FTP 服务器”。

  5. 选择“FTP 服务”。

    注意

    若要支持 FTP 服务使用 ASP.Membership 身份验证或 IIS 管理器身份验证,还需选择“FTP 扩展性”
    Screenshot of F T P Service and F T P Extensibility selected under the expanded F T P server list.

  6. 单击 “下一步”

  7. “确认安装选择”页中,单击“安装”

  8. 在“结果” 页面中单击“关闭”

Windows 7

  1. 在任务栏上,单击“开始”,然后单击“控制面板”。

  2. 在“控制面板”中,单击“程序与功能”,然后单击“打开或关闭 Windows 功能”。

  3. 展开“Internet Information Services”,然后展开“FTP 服务器”

  4. 选择“FTP 服务”。

    注意

    若要支持 FTP 服务使用 ASP.Membership 身份验证或 IIS 管理器身份验证,还需选择“FTP 扩展性”
    Screenshot of F T P Extensibility and F T P Service selected in a Windows 7 interface.

  5. 单击“确定”。

Windows Server 2008 或 Windows Vista

  1. 从以下 URL 下载安装包:

  2. 按照以下演练中的说明安装 FTP 服务:

操作方式

如何为 FTP 服务配置全局防火墙设置

  1. 打开 Internet Information Services (IIS) 管理器:

    • 如果使用的是 Windows Server 2012 或 Windows Server 2012 R2:

      • 在任务栏上,单击“服务器管理器”,单击“工具”,然后单击“Internet Information Services (IIS) 管理器”
    • 如果使用的是 Windows 8 或 Windows 8.1:

      • 按住 Windows 键,按字母 X,然后单击“控制面板”。
      • 单击“管理工具”,然后双击“Internet Information Services (IIS) 管理器”。
    • 如果使用的是 Windows Server 2008 或 Windows Server 2008 R2:

      • 在任务栏上,单击“开始”,指向“管理工具”,然后单击“Internet Information Services (IIS) 管理器”
    • 如果使用的是 Windows Vista 或 Windows 7:

      • 在任务栏上,单击“开始”,然后单击“控制面板”。
      • 双击“管理工具”,然后双击“Internet Information Services (IIS) 管理器”。
  2. 在“连接”窗格中,单击服务器名称。

  3. 在“主页”窗格中,双击“FTP 防火墙支持”功能。

  4. 在“数据通道端口范围”框中,使用以下选项之一为被动数据通道连接输入端口范围:

    • 对端口范围使用 [低端口]-[高端口],其中每个端口必须介于 1025 和 65535 之间。 例如 5000-6000。
    • 使用“0-0”将 FTP 服务器配置为使用 Windows TCP/IP 临时端口范围。
      Screenshot of setting the F T P Firewall Support Data Channel Port Range to a value of 0 dash 0.
  5. 在“防火墙 的外部 IP 地址”框中,键入防火墙面向 Internet 的网络适配器的 IPv4 地址。

  6. 在“操作”窗格中,单击“应用”

有关如何配置 FTP 服务的防火墙设置的其他信息,请参阅 Microsoft IIS.net 网站上的以下主题:

配置 FTP 防火墙设置
https://www.iis.net/learn/publish/using-the-ftp-service/configuring-ftp-firewall-settings-in-iis-7

配置

<firewallSupport> 元素在 ApplicationHost.config 中的全局级别配置。

特性

属性 说明
lowDataChannelPort 可选 int 属性。

指定被动数据连接的数据通道活动的最低端口。

默认值为 0
highDataChannelPort 可选 int 属性。

指定被动数据连接的数据通道活动的最低端口。

默认值为 0

子元素

无。

配置示例

下面的示例演示了服务器的全局 <system.ftpServer> 元素中的若干配置设置。 更具体而言,此示例中的设置演示如何:

  • 启用 FTP 凭据缓存,并指定超时值为 10 分钟(600 秒)。

  • 对于数据通道通信,将低端口配置为 5000,高端口配置为 6000。

  • 启用日志记录,指定须按站点保留日志文件,并按 UTC 时间每天轮换日志文件。

  • 指定自定义 FTP 提供程序,并为该提供程序指定自定义参数。

  • 指定全局 IP 限制,以允许从本地主机进行 FTP 访问,并拒绝 IP 地址块 169.254.0.0 到 169.254.255.255 的访问。

  • 使用以下选项配置请求筛选:

    • 阻止 FTP 访问 _vti_bin 虚拟目录,此目录与 FrontPage 服务器扩展一起使用。
    • 阻止与可执行文件关联的多个文件类型。
    • 指定最大文件大小为 100MB。
  • 添加一个全局授权规则,用于为管理员组授予访问权限。

  • 指明可以将域名语法用于 FTP 虚拟主机名。

<system.ftpServer>
   <caching>
      <credentialsCache enabled="true" flushInterval="600" />
   </caching>
   <firewallSupport lowDataChannelPort="5000" highDataChannelPort="6000" />
   <log centralLogFileMode="Site">
      <centralLogFile period="Daily" localTimeRollover="false" enabled="true" />
   </log>
   <providerDefinitions>
      <add name="FtpXmlAuthentication"
         type="FtpXmlAuthentication, FtpXmlAuthentication, version=1.0.0.0, Culture=neutral, PublicKeyToken=426f62526f636b73" />
      <activation>
         <providerData name="FtpXmlAuthentication">
            <add key="xmlFileName" value="C:\Inetpub\XmlSample\Users.xml" />
         </providerData>
      </activation>
   </providerDefinitions>
   <security>
      <ipSecurity enableReverseDns="false" allowUnlisted="true">
         <add ipAddress="169.254.0.0" subnetMask="255.255.0.0" allowed="false" />
         <add ipAddress="127.0.0.1" allowed="true" />
      </ipSecurity>
      <requestFiltering>
         <hiddenSegments>
            <add segment="_vti_bin" />
         </hiddenSegments>
         <fileExtensions allowUnlisted="true">
            <add fileExtension="exe" allowed="false" />
            <add fileExtension="cmd" allowed="false" />
            <add fileExtension="com" allowed="false" />
            <add fileExtension="bat" allowed="false" />
         </fileExtensions>
         <requestLimits maxAllowedContentLength="104857600" />
      </requestFiltering>
      <authorization>
         <add accessType="Allow" roles="administrators" permissions="Read, Write" />
      </authorization>
   </security>
   <serverRuntime>
      <hostNameSupport useDomainNameAsHostName="true" />
   </serverRuntime>
</system.ftpServer>

代码示例

以下示例将 FTP 服务配置为在使用被动连接时,将端口范围 5000 到 6000 用于数据通道活动。

AppCmd.exe

appcmd.exe set config -section:system.ftpServer/firewallSupport /lowDataChannelPort:"5000" /commit:apphost

appcmd.exe set config -section:system.ftpServer/firewallSupport /highDataChannelPort:"6000" /commit:apphost

注意

使用 AppCmd.exe 配置这些设置时,必须确保将 commit 参数设置为 apphost。 这会将配置设置提交到 ApplicationHost.config 文件中的相应位置部分。

C#

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample
{
   private static void Main()
   {
      using (ServerManager serverManager = new ServerManager())
      {
         Configuration config = serverManager.GetApplicationHostConfiguration();

         ConfigurationSection logSection = config.GetSection("system.ftpServer/log");
         logSection["centralLogFileMode"] = @"Central";

         ConfigurationElement centralLogFileElement = logSection.GetChildElement("centralLogFile");
         centralLogFileElement["enabled"] = true;

         serverManager.CommitChanges();
      }
   }
}

VB.NET

Imports System
Imports System.Text
Imports Microsoft.Web.Administration

Module Sample
   Sub Main()
      Dim serverManager As ServerManager = New ServerManager
      Dim config As Configuration = serverManager.GetApplicationHostConfiguration

      Dim firewallSupportSection As ConfigurationSection = config.GetSection("system.ftpServer/firewallSupport")
      firewallSupportSection("lowDataChannelPort") = 5000
      firewallSupportSection("highDataChannelPort") = 6000

      serverManager.CommitChanges()
   End Sub
End Module

JavaScript

var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST";

var firewallSupportSection = adminManager.GetAdminSection("system.ftpServer/firewallSupport", "MACHINE/WEBROOT/APPHOST");
firewallSupportSection.Properties.Item("lowDataChannelPort").Value = 5000;
firewallSupportSection.Properties.Item("highDataChannelPort").Value = 6000;

adminManager.CommitChanges();

VBScript

Set adminManager = createObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST"

Set firewallSupportSection = adminManager.GetAdminSection("system.ftpServer/firewallSupport", "MACHINE/WEBROOT/APPHOST")
firewallSupportSection.Properties.Item("lowDataChannelPort").Value = 5000
firewallSupportSection.Properties.Item("highDataChannelPort").Value = 6000

adminManager.CommitChanges()