Есть ещё вариант, но он сильно сложнее и в любом случае требует сервера, хотя и снижает нагрузку на него:
1. Все устройства, получившие доступ в Интернет, стучатся на сервер и регистрируются: "Я такой-то такой-то, выхожу на связь с IP такого-то. Заявка на проброс входящего порта UPnP прошла успешно, мой входящий порт такой-то."
2. Если устройство-клиент смогло пробросить себе порт для входящего подключения или этот порт явно был задан при настройке устройства местной службой IT и устройство сообщило порт, то сервер принимает попытку исходящего подключения от себя к устройству. Если устройство успешно приняло подключение и установило тестовое соединение, оно вносится в базу как полнофункциональное устройство с белым IP.
3. Если устройство на сервере регистрируется, но входящие подключения не принимает (находится за NAT без UPnP), то оно вносится в базу сервера как устройство без входящих подключений. В таком случае, сервер сообщает устройству белый IP из пула входящих VNP-подключений. И устройство без белого IP, устанавливает и поддерживает VPN-подключение к серверу на постоянной основе (если оно, в принципе, должно принимать подключения). Или не устанавливает, если не нужно принимать входящие.
4. Все устройства регулярно стучатся на сервер для учёта возможных изменений IP и контроля наличия связи - информация в базе постоянно обновляется, в частности, для обновления динамических белых IP (если такие ещё раздаются провайдерами).
5. Когда возникает необходимость в связи между устройствами, устройство, в первую очередь, обращается к своим настройкам - вдруг там явно прописан канал точка-точка с белым IP корреспондента. Если белый IP корреспондента явно не задан (стоит "Авто") или с ним нет связи, устройство обращается к серверу за информацией, как связаться с нужным корреспондентом в сети.
6. Сервер, в ответ на запрос устройства об установлении связи, даёт либо публичный IP устройства, известный с момента последнего периодического обновления, либо даёт белый IP из пула входящих подключений VPN на своей стороне и LAN-адрес требуемого корреспондента.
7. Устройство, инициирующее связь с другим устройством, подключается к своему корреспонденту либо напрямую (если удалось разрешить белый IP и корреспондент принимает входящие подключения), либо устанавливает VPN-туннель с сервером, через который и обменивается данными с корреспондентом.
8. После установления связи устройством без белого IP, устройство с белым IP, может запросить корреспондента переподключиться к себе напрямую, на свой входящий порт VPN, чтобы разгрузить сервер от трафика пар.
Так у вас получится своё облако, но с обходом трафика мимо сервера, если хотя бы одно из устройств канала связи имеет возможность принимать входящие подключения на публичный адрес.