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

Я пытаюсь настроить сервер 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?
Это ошибка? В сокате? В линуксе?!

2 ответа

Решение

Добавление -T возможность socat как-то решает проблему.

-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.

Обновленные команды:

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

Я не до конца понимаю, почему это работает (поскольку, очевидно, никогда не проходит 15 секунд), но я счастлив, что это работает.

Это может оказаться невозможным для работы, поскольку протокол TeamSpeak встраивает IP-адрес в (плохо зашифрованные) полезные данные, и, как таковая, пересылка данных на другие хосты, вероятно, приведет к сбоям соединения в качестве клиента, сервера или обоих, полностью игнорируйте, откуда поступают данные, и пытайтесь использовать IP-адреса, которые, по их мнению, должны поступать.

Другие вопросы по тегам