[
https://issues.apache.org/jira/browse/NET-346?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13105108#comment-13105108
]
Keigo Tanaka commented on NET-346:
----------------------------------
According to HEAD of FTPClient.java(rev 1126692), when _openDataConnection_()
called, it tries to open socket with createServerSocket on line 648, and it
causes java.net.BindException.
setActiveExternalIPAddress() set the address for PORT command, however, the
address is also used for binding the actual socket in _openDataConnection_().
This causes the problem when the client is inside of NAT.
When using NAT, the gateway has a global IP address, and the client has a
private IP address.
The Exception from setActiveExternalIPAddress is caused by the mismatch of the
global IP address and the private IP address.
Because the client host does not have the global IP address as the local
address, the client will fail to bind the address.
I believe this patch is useful for such situation. Please merge it into the
HEAD branch.
> FTP should support reporting NATed external IP address
> ------------------------------------------------------
>
> Key: NET-346
> URL: https://issues.apache.org/jira/browse/NET-346
> Project: Commons Net
> Issue Type: Improvement
> Components: FTP
> Affects Versions: 2.2
> Reporter: Kevin Samuel
> Attachments: FTPClient.java, ftpclient.patch
>
> Original Estimate: 1h
> Remaining Estimate: 1h
>
> When trying to do an active FTP transfer as client from behind a firewall
> with NAT, setActiveExternalIPAddress is not sufficient, as you can only
> report the internal IP of the client (e.g. 192.168.1.2 vs 72.14.X.X)
> FTPClient should support an additional function to set the REPORTABLE
> external active IP Address
> I created and successfully tested a fix for this:
> ADD PRIVATE MEMBER:
> private InetAddress __reportActiveExternalHost;
> IN __initDefaults():
> __reportActiveExternalHost = null;
> ADD PUBLIC FUNCTIONS:
> private InetAddress getReportHostAddress()
> {
> if (__reportActiveExternalHost != null)
> {
> return __reportActiveExternalHost ;
> }
> else if (__activeExternalHost != null)
> {
> return __activeExternalHost;
> }
> else
> {
> // default local address
> return getLocalAddress();
> }
> }
> public void setReportActiveExternalIPAddress(String ipAddress) throws
> UnknownHostException
> {
> this.__reportActiveExternalHost = InetAddress.getByName(ipAddress);
> }
> IN _openDataConnection_:
> if (isInet6Address)
> {
> if
> (!FTPReply.isPositiveCompletion(eprt(getReportHostAddress(),
> server.getLocalPort())))
> {
> server.close();
> return null;
> }
> }
> else
> {
> if
> (!FTPReply.isPositiveCompletion(port(getReportHostAddress(),
> server.getLocalPort())))
> {
> server.close();
> return null;
> }
> }
> will also attach changed file
> sorry I am not familiar with the correct way to submit patches, although I
> tried to model this on #NET-285 as much as possible
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira