Azure 云服务嵌入式 FTP 服务器
Azure cloud service embedded FTP server
我想在 Azure 云服务工作者角色中托管一个嵌入式 FTP 服务器。
为了提供对 FTP 服务器的被动访问,它使用端口范围 20000-21000。
在 ServiceDefinition.csdef
中,我定义了所有需要的端口(见屏幕截图)。
主要问题是端口数量庞大。如果我尝试将服务上传到云端,我会收到以下错误。
Validation error: Invalid number of input endpoints - current 1002,
max. 25
如何使用云服务获取此作品?
当客户端使用被动模式连接到 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 文件中定义一个public 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>
之后,您可以使用 nslookup 获取分配给实例的 public IP。如果您有多个实例,则需要将 0 更改为 1、2、3 等。
nslookup WebPublicIP.0.<Cloud Service Name>.cloudapp.net
然后您可以在实例的Windows防火墙中打开本地端口,您将能够直接从互联网连接本地端口。
您可以创建一个启动任务来打开云服务防火墙中的本地端口。
以下是如何配置防火墙规则的示例。每次实例rebooted/reimaged时都会执行启动任务。
如下所示:
netsh advfirewall firewall add rule name="TCP ports" protocol=TCP dir=in localport=1000-2000 action=allow
我想在 Azure 云服务工作者角色中托管一个嵌入式 FTP 服务器。
为了提供对 FTP 服务器的被动访问,它使用端口范围 20000-21000。
在 ServiceDefinition.csdef
中,我定义了所有需要的端口(见屏幕截图)。
主要问题是端口数量庞大。如果我尝试将服务上传到云端,我会收到以下错误。
Validation error: Invalid number of input endpoints - current 1002, max. 25
如何使用云服务获取此作品?
当客户端使用被动模式连接到 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 文件中定义一个public 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>
之后,您可以使用 nslookup 获取分配给实例的 public IP。如果您有多个实例,则需要将 0 更改为 1、2、3 等。
nslookup WebPublicIP.0.<Cloud Service Name>.cloudapp.net
然后您可以在实例的Windows防火墙中打开本地端口,您将能够直接从互联网连接本地端口。
您可以创建一个启动任务来打开云服务防火墙中的本地端口。 以下是如何配置防火墙规则的示例。每次实例rebooted/reimaged时都会执行启动任务。
如下所示:
netsh advfirewall firewall add rule name="TCP ports" protocol=TCP dir=in localport=1000-2000 action=allow