【问题标题】:Azure cloud service embedded FTP serverAzure 云服务嵌入式 FTP 服务器
【发布时间】:2019-04-12 11:12:08
【问题描述】:

我想在 Azure 云服务工作者角色中托管一个嵌入式 FTP 服务器。

为了提供对 FTP 服务器的被动访问,它使用端口范围 20000-21000。 在ServiceDefinition.csdef 中,我定义了所有需要的端口(见截图)。

主要问题是大量的端口。如果我尝试将服务上传到云中,我会收到以下错误。

验证错误:输入端点的数量无效 - 当前为 1002, 最大限度。 25

如何使用云服务完成这项工作?

【问题讨论】:

  • 这个 repo 的自述文件说 PASV 模式不起作用。也许是因为WorkerRole only supports 25 ports。您可以创建一个 VM 可用的一组 IIS FTP 服务器并安装共享存储。
  • 是的,我们的产品现在正在做。但我们明确希望通过自定义嵌入式 FTP 服务切换到工作角色。我知道 FTP2Azure,但他们甚至没有实现被动连接。所以很抱歉,但这对我的问题没有帮助。

标签: c# azure endpoint azure-cloud-services ftp-server


【解决方案1】:

这是基于 Azure 支持答案的解决方案。

您需要在 .cscfg 文件中定义一个公共 IP 并将其上传到云服务。

<?xml version="1.0" encoding="utf-8"?>
<ServiceConfiguration serviceName="ILPIPSample" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="4" osVersion="*" schemaVersion="2014-01.2.3">
  <Role name="WebRole1">
    <Instances count="1" />
      <ConfigurationSettings>
    <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="UseDevelopmentStorage=true" />
      </ConfigurationSettings>
  </Role>
  <NetworkConfiguration>
    <AddressAssignments>
      <InstanceAddress roleName="WebRole1">
    <PublicIPs>
      <PublicIP name="MyPublicIP" domainNameLabel="WebPublicIP" />
        </PublicIPs>
      </InstanceAddress>
    </AddressAssignments>
  </NetworkConfiguration>
</ServiceConfiguration>

更多信息:https://docs.microsoft.com/en-us/azure/virtual-network/virtual-networks-instance-level-public-ip#manage-an-ilpip-for-a-cloud-services-role-instance

之后,您可以使用 nslookup 获取分配给实例的公共 IP。如果有多个实例,则需要将 0 更改为 1、2、3 等。

nslookup WebPublicIP.0.&lt;Cloud Service Name&gt;.cloudapp.net

然后您可以在实例的 Windows 防火墙中打开本地端口,您将能够直接从 Internet 连接本地端口。

您可以创建启动任务来打开云服务防火墙中的本地端口。 以下是如何配置防火墙规则的示例。每次实例重新启动/重新映像时都会执行启动任务。

https://docs.microsoft.com/en-us/azure/cloud-services/cloud-services-startup-tasks-common#add-firewall-rules

如下所示:

netsh advfirewall firewall add rule name="TCP ports" protocol=TCP dir=in localport=1000-2000 action=allow

【讨论】:

    【解决方案2】:

    当客户端使用被动模式连接到 FTP 服务器时,它将进行 2 次连接。 一个使用端口 21,另一个用于传输数据。

    所以看起来您需要在 ServiceDefinition.csdef 中打开一个端口,然后在防火墙(负载平衡器)上创建一个端口转发规则,以将所有被动端口重定向到该单个端口。

    <Endpoints>
     <InputEndpoint name="FTP2Azure.Command" protocol="tcp" port="21" localPort="9003" /> 
     <InstanceInputEndpoint name="FTP2Azure.Passive" protocol="tcp" localPort="9002">
      <AllocatePublicPortFrom>
       <FixedPortRange max="21000" min="20000" />
      </AllocatePublicPortFrom>
     </InstanceInputEndpoint>
    </Endpoints>
    

    这是未经测试的,但可能会有所帮助。

    【讨论】:

    • 这是一个云服务工作者角色,没有防火墙。
    • 我已经用一个例子更新了我的答案,并澄清了我所说的防火墙的含义。
    • 所以我的 FTP 服务器需要监听 9002 端口来进行被动监听?
    • 是的,那么当客户端尝试连接时,负载均衡器会将所有 20000-21000 端口转发到端口 9002。理论上它是这样工作的。我无法测试,但可以确认 InstanceInputEndpoint 确实适用于 Worker Roles。
    • 问题是一次只能绑定一个端口。因此,如果我有多个并行的被动数据连接,它将无法正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    相关资源
    最近更新 更多