Пересылка экземпляра 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-адреса, которые, по их мнению, должны поступать.