Azure云服务嵌入式FTP服务器

5
我想在Azure云服务工作角色中托管一个嵌入式FTP服务器。为了提供被动访问FTP服务器,它使用20000-21000端口范围。在ServiceDefinition.csdef内,我定义了所有必要的端口(见截图)。

ServiceDefinition.cscfg

主要问题是端口数量太多。如果我尝试将服务上传到云中,我会收到以下错误信息。
验证错误:无效的输入端点数-当前为1002,最大为25
如何在云服务中解决这个问题?

1
这个repo的自述文件说PASV模式不起作用。可能是因为WorkerRole仅支持25个端口。您可以创建一个VM可用的IIS FTP服务器集合,并挂载共享存储。 - CSakura
是的,我们的产品现在正在运行。但我们明确希望切换到具有自定义嵌入式FTP服务的工作角色。我知道FTP2Azure,但他们甚至没有实现被动连接。所以很抱歉,这对我的问题没有任何帮助。 - Steffen Mangold
2个回答

0

这里是基于 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://learn.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.<Cloud Service Name>.cloudapp.net 然后,您可以在实例的Windows防火墙中打开本地端口,并能够直接从互联网连接本地端口。
您可以创建一个启动任务来打开云服务防火墙中的本地端口。以下是如何配置防火墙规则的示例。每次实例重新启动/重新映像时都会执行启动任务。

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

类似下面这样的东西: netsh advfirewall firewall add rule name="TCP 端口" protocol=TCP dir=in localport=1000-2000 action=allow

-1

当客户端使用被动模式连接FTP服务器时,它将建立两个连接。一个使用端口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>

这个还没有经过测试,但可能会有所帮助。


这是一个云服务工作角色,没有防火墙这样的东西。 - Steffen Mangold
我已经更新了我的答案,并且提供了一个例子,以及对防火墙的解释。 - Sir Crusher
那么我的FTP服务器需要监听9002端口以进行被动连接吗? - Steffen Mangold
是的,当客户端尝试连接时,负载均衡器将把所有20000-21000端口转发到9002端口。这就是理论上的工作原理。我无法测试,但可以确认InstanceInputEndpoint与Worker Roles兼容。 - Sir Crusher
问题在于每个端口只能绑定一次。因此,如果我有多个并行的被动数据连接,它将无法工作。 - Steffen Mangold
好的,那么转发将不得不在客户端进行。 - Sir Crusher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接