¿Cómo comunicarse entre dos máquinas con IP pública pero ambas detrás de LAN (solución Python)?

Buscando una solución Python simple para esto:

Suponga que la IP local de la Máquina A es 192.168.1.5 y la IP pública es 111.11.111.11, la IP local de la Máquina B es 10.0.0.5 y la IP pública es 222.22.222.22, ahora necesito comunicarme entre estas dos máquinas, ¿cómo hace eso?

He visto muchos ejemplos de progtwigción de socket con el servidor y el cliente en la misma red, pero ¿cómo se conectan las máquinas detrás de redes diferentes sin cambiar las configuraciones del enrutador (reenvío de puertos, etc.)?

EDITAR:

¿Qué pasa si la máquina A está detrás de LAN: IP local 192.168.1.5, IP pública 111.11.111.11; La Máquina B es un servidor HTTP con una IP pública de 222.22.222.22; ahora puede acceder fácilmente a B desde A a través de solicitudes HTTP, pero ¿cuál es la mejor solución para llegar a la máquina A desde la máquina B?

La perforación de agujeros es una forma de lograr esto. La perforación de orificios es una técnica transversal de NAT, que permite la comunicación directa entre dispositivos detrás de los NAT. No todos los NAT soportan perforaciones. Pero un buen porcentaje de NAT lo permiten.

http://www.brynosaurus.com/pub/net/p2pnat/

Este enlace lo explica en detalle. Han dado las estadísticas también.

Para el primer caso, cuando los dos dispositivos están detrás de NAT, debe hacer perforaciones o usar una biblioteca UPnP python para reenviar puertos si no desea reenviarlos manualmente.

Para el segundo caso, el progtwig en la máquina A debe inicializar la conexión. El NAT en este extremo creará una entrada de traducción en su tabla. Básicamente, todos los paquetes enviados desde la máquina B en la dirección IP pública de su red ahora se reenviarán a la máquina como dirección IP local.