Fixed it.  It seems this is just a zealous security quirk with FreeBSD, due to 
a security risk mentioned here: 
http://tools.ietf.org/id/draft-itojun-v6ops-v4mapped-harmful-02.txt

Because of this, IPv4 socket mapping on IPv6 with AF_INET6 is disallowed by 
default in FreeBSD.  

I added  ipv6_ipv4mapping="YES" in /etc/rc.conf (which a /etc/netstart to 
reload changes) and everything works now.  The socket shows up as tcp46.

Here is my reference: http://www.trend-watcher.org/post/1/115

-A

On Jan 14, 2010, at 2:47 PM, David Reiss wrote:

> It's not expected behavior.  It is highly unlikely to be related to the 
> generated code
> (TSocket is not generated).  I assume the TServerSocket code is doing 
> something to make
> FreeBSD think it only wants IPv6.  I'm not sure what the fix is, though.
> 
> --David
> 
> Aaron Bernard wrote:
>> I coded up a test program in Thrift with a python client and server.
>> 
>> When the server is on my Mac OSX machine and the client is on FreeBSD, 
>> everything works as expected.  I can see the server side print statements 
>> and the return data on the client.
>> 
>> However, if I try to serve from the FreeBSD machine, the client cannot 
>> connect with the following error:
>> 
>> -----------------
>> python test_client.py 
>> /usr/lib/python2.6/site-packages/thrift/Thrift.py:58: DeprecationWarning: 
>> BaseException.message has been deprecated as of Python 2.6
>>  self.message = message
>> test_client.py:32: DeprecationWarning: BaseException.message has been 
>> deprecated as of Python 2.6
>>  print '%s' % (tx.message)
>> Could not connect to 192.168.50.79:9090
>> -----------------
>> 
>> The server code is almost identical to the tutorial PythonServer.py code, 
>> with the TServerSocket registered on port 9090 as well.  The code is 
>> identical on both machines, with the exception of swapped IPs in the TSocket 
>> call:
>> 
>> test_client.py:
>> -----------------
>> ... imports, sys.path, etc. .....
>> 
>> try:
>>  transport = TSocket.TSocket('192.168.50.79', 9090) # this IP is switched on 
>> the other machine
>>  transport = TTransport.TBufferedTransport(transport)
>>  protocol = TBinaryProtocol.TBinaryProtocol(transport)
>>  client = Test.Client(protocol)
>>  transport.open()
>> 
>>  client.ping()
>>  print 'ping()'
>> 
>>  val = client.number(5)
>>  print 'number back: %d' % (val)
>> 
>>  transport.close()
>> 
>> except Thrift.TException, tx:
>>  print '%s' % (tx.message)
>> -----------------
>> 
>> I ran a FreeBSD `sockstat -4 -l' to confirm that the socket was running 
>> under the right port (or at all), but saw nothing.  When I removed the -4 
>> flag to see all sockets, not just IPv4, the service showed up.
>> 
>> When I run `netstat -an' on the FreeBSD machine, here is the relevant output:
>> 
>> netstat -an | grep 9090
>> -----------------
>> tcp6       0      0 *.9090                 *.*                    LISTEN     
>>      
>> -----------------
>> 
>> As you can see, the server is running tcp6 sockets on the 9090 python server.
>> 
>> However, when I run this command on my Mac OSX machine, I get the following:
>> 
>> netstat -an | grep 9090
>> -----------------
>> tcp46      0      0  *.9090                 *.*                    LISTEN
>> -----------------
>> 
>> The Mac OSX is flexibly serving sockets on both IPv4 and IPv6.
>> 
>> I have no firewall running on the FreeBSD machine.  As bi-directional 
>> communication works just fine when the server roles are reversed, I don't 
>> think it has anything to do with that.
>> 
>> So, my question is: is this expected behavior? Am I doing something wrong?  
>> Or is this perhaps a platform bug involving the generated python TSocket 
>> code and FreeBSD?  Is this even relevant?
>> 
>> Any help would be much appreciated.
>> 
>> Thanks,
>> Aaron

Reply via email to