Пример организации STUN вручную
TODO дописать и обмазать примерами
Пример организации STUN вручную (не успеем).
- Терминология:
Iip, Iport — соответственно, IP-адрес клиента (внутренний) и порт отправителя на клиенте, которые транслируются NAT-омв Eip и Eport, внешний IP-адрес новый порт отправилтея.
клиент1 и клиент2 (или время от времени) поддерживают связь с координатором, получая от него информацию. Таки образом, координатор отслеживает таблицу вида Iip1 ⇒ Eip1; Iip2 ⇒ Eip2 (и всех остальных зарегистрированных абонентов).
Протокол установдения «соединения» между клиентом1 и клиентом2 (все «пакеты» далее — UDP):
клиент1 сообщает координатору, что хочет установить соединение с клиентом2; клиент2 (который тоже на связи с координатором) узнаёт от этом
клиент2 отправляет пакет Iip2:Iport2 → координатор
На сервере2 образуется запись в conntrack
Iip2:Iport2 ⇒ координатор:… / Eip2:Eport2
координатор получает этот пакет и отправляет клиенту1 информацию о Eip2:Eport2
клиент1 отправляет пакет Iip1:Iport1 → координатор
На сервере1 образуется запись в conntrack
Iip1:Iport1 → координатор:… / Eip1:Eport1
координатор получает этот пакет и отправляет клиенту2 информацию о Eip1:Eport1
клиент2 отправляет пакет Iip2:Iport2 → Eip1:Eport1
На сервере2 образуется запись в conntrack
Iip2:Iport2 → Eip1:Eport1 / Eip2:Eport2
клиент1 отправляет пакет Iip1:Iport1 → Eip2:Eport2
На сервере1 образуется запись в conntrack
Iip1:Iport1 → Eip2:Eport2 / Eip1:Eport1
Этот пакет доходит до сервера2, и согласно записи в conntrack передаётся клиенту2 как «ответ» на пакет (5)
клиент2 отправляет пакет Iip2:Iport2 → Eip1:Eport1
Этот пакет доходит до сервера1, и согласно записи в conntrack передаётся клиенту1 как «ответ» на пакет (6)
- …
Если клиент1 и клиент2 не будут тупить дольше времени жизни записи в conntrack, процесс будет продолжаться без участия координатора
По концам такого туннеля можно организовать ip over UDP с помощью ip fou
Простой пример для linux iptables … -j MASQUERADE, в котором
EPort по умолчанию совпадает с IPort, если нет конфликтов (и известен заранее)
«Стартовый» пакет (5) и (6) создаёт conntrack-запись не должен дойти до абонента (иначе отправителю вернётся либо «ответ», либо icmp-reject, и правило удалится), для этого выcтавляем ttl=2
Никакого обмена с координатором не происходит; он нужен только для того, чтобы пакеты с ttl=2 не доходили
client - nat2[NAT:10.3.0.4] - stun - [NAT:10.2.0.2]nat1 - srv
srv:
# echo QQ | socat - UDP:10.3.0.4:1234,sourceport=4321,ttl=2; socat -d -d -v PIPE UDP-RECVFROM:4321,fork
client:
socat - UDP:10.2.0.2:4321,sourceport=1234