Давайте разберём на примере шпионов. В городе N работают два глубоко законспирированных шпиона - Агент Икс и Агент Игрек. Каждый из них не знает, где живёт другой (серые адреса). Им и не полагается знать, чтобы если провалится один, он не смог выдать другого. Но для выполнения задания им нужно обменяться информацией. Для этого Агент Икс берёт свою рацию и связывается с Центром (сервер Hamachi, AnyDesk, AmmyyAdmin, TeamViewer и т.п., который имеет белый адрес и всегда готов к сеансу связи с любым агентом), передаёт (в зашифрованном виде, конечно), что у него такая-то информация для Агента Игрек. Через некоторое время Агент Игрек берёт свою рацию и связывается с Центром, ему говорят, что для него есть информация от агента Икс, он очень быстро обдумывает новые сведения (шпион должен быстро соображать) и передаёт (в зашифрованном виде, конечно), что у него такой-то ответ для Агента Икс. Через некоторое время Агент Икс берёт свою рацию... и т.д.
Вот так могут общаться через Центр, хотя Центр не может сам с ними связаться и они напрямую не могут друг с другом связаться.
А еще есть другой вариант. Агент Икс говорит Центру: назначаю рандеву Агенту Игрек в понедельник в час дня в цветочном магазине возле Эмпайр Стейт Билдинг; Агент Игрек выходит на связь, Центр передаёт ему место и время встречи и они встречаются напрямую, Центр уже не знает о чём они говорят или какими документами обмениваются. Это называется "пробитие NAT", для этого используются методы TURN или STUN и подобные, при которых Центр нужен только в момент установки связи, а дальше агенты общаются напрямую, пока не разорвут соединение. Как разорвали - им снова потребуется Центр для связи.