当客户端使用被动模式连接到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>
这是未经测试的,但可能有所帮助。
这是基于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.<Cloud Service Name>.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