Пересылка экземпляра TeamSpeak

473
LDericher

Я пытаюсь настроить сервер TeamSpeak3 в моей домашней сети "net1.mydomain". Он использует подсеть IPv4 10.0.0.0/8 в локальной сети; доступ в Интернет с использованием IPv4 возможен через CGN. Это делает слушателей только для IPv4 (как и TeamSpeak) недоступными для клиентов за пределами «net1.mydomain».

Чтобы обойти этот единственный недостаток, я нашел socat(SOcket CAT; многоцелевое реле) полезным, так как у меня также есть доступ к машине fwbox.net2.mydomainс полным соединением двух стеков IPv4 и IPv6.

Пусть сервер работает на машине tsbox.net1.mydomain, порты 1234/UDP4(голос), 1234/TCP4(запрос), 1235/TCP(файл). После запуска следующего набора команд я могу использовать TS3-клиент для подключения, fwbox.net2.mydomain:1234как если бы мой TS3-сервер работал там.

ldericher@fwbox$ socat TCP4-LISTEN:1234,fork TCP6:tsbox.net1.mydomain:61234 &# queryport ldericher@fwbox$ socat TCP4-LISTEN:1235,fork TCP6:tsbox.net1.mydomain:61235 &# fileport ldericher@fwbox$ socat UDP4-LISTEN:1234,fork TCP6:tsbox.net1.mydomain:61236 &# voiceport  ldericher@tsbox$ socat TCP6-LISTEN:61234,fork TCP4:localhost:1234 &# queryport ldericher@tsbox$ socat TCP6-LISTEN:61235,fork TCP4:localhost:1235 &# fileport ldericher@tsbox$ socat TCP6-LISTEN:61236,fork UDP4:localhost:1234 &# voiceport 

Ну, почти.

Из-за FIFO-фиксации голосового (UDP-) потока высокий процент пакетов теряется, и соединение становится непригодным для использования. Таким образом, в идеале, он будет просто передавать UDP-пакеты через IPv6 - но использование следующих команд вместо этого просто создает «Отказано в доступе» для tsbox

ldericher@fwbox$ socat UDP4-LISTEN:1234,reuseaddr,fork UDP6:tsbox.net1.mydomain:61234 &# voiceport ldericher@tsbox$ socat UDP6-LISTEN:61234,reuseaddr,fork UDP4:localhost:1234 &# voiceport 

... за что я виню в отсутствии соединений UDP. Я пытался возиться с вариантами socat, но безрезультатно. «UDP-RECVFROM» / «UDP-SENDTO» не выдает ошибок, но, похоже, только для однонаправленной пересылки. Я читал о том, что stone(приложение TCP / IP-повторитель) находится там, что может служить альтернативой, но не подходит socatмне больше.
Либо я полностью упустил какой-то момент в отношении UDP, либо просто невозможно выполнить переадресацию UDP вообще, или это мой набор инструментов.

Так есть ли какой-либо способ, какой-либо инструмент или любой фрагмент кода, который может удовлетворить мои потребности? Может быть, даже набор socatвариантов, которые я еще не придумал?

ДОБАВИТЬ 03/06/2015

Это является возможным пересылать трафик UDP, как я хочу. Даже при использовании SOCAT, есть это путь. Я успешно проверил это, используя другую коробку testbox.net1.mydomain:

# File- and Query- portforwards omitted for irrelevance ldericher@testbox$ socat UDP4-LISTEN:1234,fork UDP4:tsbox:61234 & ldericher@tsbox$ socat UDP4-LISTEN:61234,fork UDP4:localhost:1234 & 

Это работает без потери производительности, но не решает проблему невозможности использования IPv4 извне.

# File- and Query- portforwards omitted for irrelevance ldericher@testbox$ socat UDP4-LISTEN:1234,fork UDP6:tsbox:61234 & ldericher@tsbox$ socat UDP6-LISTEN:61234,fork UDP4:localhost:1234 & 

Это не работает так же, как пересылка через fwbox.
Итак, я просто упускаю важный момент об IPv6?
Это ошибка? В сокате? В линуксе ?!

0

2 ответа на вопрос

0
Michael Hampton

You may find this impossible to get working, as the TeamSpeak protocol embeds IP address in the (poorly encrypted) payloads, and as such, forwarding the data to other hosts will likely result in connection failures as either the client, server, or both, completely ignore where the data is coming from and attempt to use the IP addresses they think the data should be coming from.

Тогда почему он работает только с пересылкой через UDPv4? И почему я могу получить доступ к серверам TeamSpeak через простые маршрутизаторы NAT DSL (динамический DNS), которые явно не работают на IP-адресе маршрутизатора? LDericher 9 лет назад 0
0
LDericher

Adding the -T option to socat somehow solves the problem.

-T<timeout> Total inactivity timeout: when socat is already in the transfer loop and nothing has happened for <timeout> [timeval] seconds (no data arrived, no interrupt occurred...) then it terminates. Useful with protocols like UDP that cannot transfer EOF. 

Updated commands:

ldericher@fwbox$ socat TCP4-LISTEN:1234,reuseaddr,fork TCP6:tsbox.net1.mydomain:61234 &# queryport ldericher@fwbox$ socat TCP4-LISTEN:1235,reuseaddr,fork TCP6:tsbox.net1.mydomain:61235 &# fileport ldericher@fwbox$ socat -T15 UDP4-LISTEN:1234,reuseaddr,fork UDP6:tsbox.net1.mydomain:61234 &# voiceport ldericher@tsbox$ socat TCP6-LISTEN:61234,reuseaddr,fork TCP4:localhost:1234 &# queryport ldericher@tsbox$ socat TCP6-LISTEN:61235,reuseaddr,fork TCP4:localhost:1235 &# fileport ldericher@tsbox$ socat -T15 UDP6-LISTEN:61234,reuseaddr,fork UDP4:localhost:1234 &# voiceport 

I don't fully understand why this works (as there obviously never pass 15 seconds), but I'm happy it does.