An odd IPv6 application issue

George Bonser gbonser at seven.com
Sat Dec 11 06:06:34 CET 2010


I have an odd IPv6 application issue and wonder if anyone else has seen
this before.

So imagine I have a machine with both an IPv4 and an IPv6 address on an
interface:

Say 10.1.2.3 and 2620:0:5103:1234::3

I have a small java program that I am using for testing.

In /etc/hosts, there is an entry for both the v4 and v6 addresses with
the local hostname.

The issue I am sorting out here is that there are going to be several
IPv6 addresses in real life so I need to tell the application
specifically which one to pick as the source IP when it binds the
socket.

So lets say I have:

10.1.2.3	host-a.mydomain.com
2620:0:5103:1234::3 host-a.mydomain.com

So I have this little java application and tell it to connect to a
remote host that has only an IPv6 address.  I tell it to bind to
"host-a.mydomain.com"

When it does so, it sources traffic from ::ffff:10.1.2.3  rather than
2620:0:5103:1234::3

It creates an IPv6 socket and communicates with the server via IPv6 but
the source address it selects is the converted v4 address.

If I don't give it a specific local name to bind to, it uses what I
expect.  If I rename the v6 address to something ike
host-a-v6.mydomain.com, then it works as expected if I also bind the
socket to that name.  In other words, as long as there is only a v6
address associated with the local name, it selects the correct source
IP.  If there are both v4 and v6 IPs associated with a name, it uses the
converted v4 address to source traffic to v6 destinations.  

The problem is that there are going to be several applications in
production on a given server.  Each application must use a different
source IP when it sends traffic out so each application must be
configured with which IP to bind to.  The configuration must be the same
for v4 or v6, I can't tell it "bind to the IP for this name for v6
sockets and bind to the IP for this other name for v4 sockets because I
don't know in advance if I am going to get a v4 or v6 address for the
destination of the socket.  I just need to tell it to connect to
"foo.com" using "host-a.mydomain.com" as the local address and expect
the OS (Linux in this case) to do the right thing.

This is making dual stacking an application a nightmare.




More information about the ipv6-ops mailing list