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.
Пересылка экземпляра 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 ответа на вопрос
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.
Похожие вопросы
-
2
Windows 7 Home Premium запоминает пароли общего доступа к сети?
-
5
Поделитесь XP сетевым подключением без перезагрузки?
-
5
Как мне сказать Windows использовать 802.11 вместо 3G?
-
-
4
Есть ли способ поделиться сканером многофункционального принтера?
-
3
Есть ли способ соединить два компьютера через USB?
-
3
Как сохранить несколько подключений к интернету?
-
4
iPod-Touch для воспроизведения фильмов с ПК на PS3?
-
2
Mac не присоединится к рабочей группе Windows
-
1
Как я могу повысить безопасность своего портала?
-
1
Как подключить к сети Windows XP и Ubuntu Linux?