msgr2 and NAT

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



msgr1 has some super cludgey behavior that's used to detect what IP 
address the client or daemon should identify as.  If the daemon hasn't 
explicitly binded to a specific IP (i.e., it bound to 0.0.0.0, [::], or 
didn't bind at all) then the first time it connects to another peer the 
peer will send the IP we appear to be connecting from in the initial 
banner.

It seems to have worked out mostly okay, but it's definitely a bit weird.  
The first connection is always to the monitor, so this means that the IP 
that an OSD or MDS daemon uses is always the one that on the same network 
as the monitor (or whichever IP the kernel decides to use to route to it).

A side-effect of this is that, in theory, a client that is behind NAT 
could connect to a ceph cluster.  It will end up being identified by the 
NATed IP that the cluster sees and the random 64-bit nonce.

Note that (to my knowledge) this has never been tested, so it only 
theoretically works.. 

The initial msgr2 implementation simplifies this by instead calling 
getsockname(2) on the first outgoing connection to see what IP we're 
connecting from.  That removes the weird dependency on the other end tell 
us who we are, but it means that NAT won't work.

So... should we try to make the NAT scenario work in msgr2?

We can do it with a minor-ish change to have the accepting end share our 
apparent IP sooner in teh exchange (probably after the initial banner).  
(The current code shares it as part of the server_ident, but that's too 
late in the exchange to serve the same role it did in msgr1.)

sage




[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux