Strictly speaking, it's no Python question, but... good ol' FTP.
socket.error: [Errno 113] No route to host
Your program is receiving an EHOSTUNREACH.
>>> import errno
>>> errno.errorcode[113]
'EHOSTUNREACH'
This occurs at precisely the moment that your program is trying to
initiate a data transfer. Every firewall administrator in the world loves
FTP for precisely this reason. (And, when I say "love", you can replace
this with a verb or <expletive/> of your choice.)
Without packet captures, I will merely guess (based on experience).
1. The receiving machine is running the Python program, builds a
connection on port 21 (this is called the FTP command
channel), you log in and all is well.
2. The moment you try to transfer any data, the FTP client (your
receiving machine) and the FTP server negotiate either FTP
passive mode or FTP active (retronym) mode. I'm guessing
that your FTP client is choosing passive mode. (Your FTP
client might produce logging of this negotiation.)
3. Using the connection information, the client attempts to build
an FTP data channel. So, your machine running the Python
program initiates a connection to the FTP server.
4. The FTP server is (probably) configured to allow connections
inbound to TCP/21 (FTP Command Channel), but doesn't know to
allow the connections to the ephemeral port(s) negotiated
during step 2 (above). So, the firewall on the FTP Server
sends an ICMP Type 3, Code 1 [0].
Figured it out. On the receiving machine I had to
# modprobe ip_conntrack_ftp
Right instinct! Try this same command on the FTP server side. Unless your
Python FTP client is negotiating active mode, the server will be the
"problem" in this case.
No, apparently I didn't figure it out. I thought I had as after the
modprobe I was getting a an EOFError, but now I'm getting the no route to
host error again. I can ping it, and as you can see from the original post,
I am able to establish a connection and log in, it's just when I try to
send a file it goes bollocks up. Still need ideas.
Hopefully, my idea #1 helps. (If not, you'll need to do some packet
captures and probably crank up the logging on the FTP server, too.)
I do have another idea, though. Have you ever wondered about the slow
demise of FTP? All of this command-channel, data-channel, PORT or PASV
nonsense goes away when you use a protocol that runs over a single TCP
port. Worked fine in the early days of the Internet before firewalls and
NAT.
Anyway, short idea #2:
If it's anonymous access, use HTTP.
If authenticated access, use ssh/scp/sftp.
Good luck,
-Martin
[0] http://www.networksorcery.com/enp/protocol/icmp/msg3.htm
--
Martin A. Brown
http://linux-ip.net/
_______________________________________________
Tutor maillist - Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor