If you are using C* 2.1 or greater, you can configure
broadcast_rpc_address. If you configure
broadcast_rpc_address to be public IP, and
rpc_address to private ip, the system.peers table will contain the public ip (
broadcast_rpc_address) for the
rpc_address column.
Cassandra uses the
broadcast_address/listen_address for internode connectivity and
broadcast_rpc_address/rpc_address for the rpc interface (client -> coordinator (C* node) requests). In your case it sounds like you will probably want to use
listen_address (and also your seeds) as private ip ,
rpc_address as private ip, and
broadcast_rpc_address as public ip. You don't need to worry about
broadcast_address unless you are setting up a cluster across regions. If you are indeed setting up a multi DC-region ring, you might want to consider using
EC2MultiRegionAddressTranslator which will translate public ips into private ones if your driver client is in the same region as the C* node it's trying to talk to.