SOCAT для перенаправления UDP не работает! - PullRequest
3 голосов
/ 11 мая 2011

Я пытаюсь передать данные в дейтаграммах UDP на внешний клиент на компьютер в моей локальной сети. Но моя сеть через модем ADSL отправляет на компьютер со Slackware, этот компьютер перенаправляет пакеты в другие устройства. Я использую socat для перенаправления UDP:

socat -v udp-listen:1935,fork,reuseaddr udp:192.168.0.40:37000

В локальной сети соединение в порядке, но внешние IP не работают. Кто-нибудь поможет?

1 Ответ

7 голосов
/ 21 января 2013

Я не думаю, что socat является виновником, однако рассмотрим использование stone вместо socat, потому что использование fork() для каждого полученного пакета немного странно. Камень в твоем случае называется так (думаю):

stone -n -d -d -d -d 192.168.0.40:37000/udp 1935/udp

Теперь, почему внешние IP-адреса, возможно, не работают. К сожалению, ваш текст мало что говорит о вашей настройке, поэтому я должен догадаться:

Это зависит от вашего брандмауэра / модема / маршрутизатора, может ли он пересылать UDP-пакеты. Обычно, если вы инициируете запросы UDP изнутри, маршрутизатор открывает соединение NAT, что часто означает, что меняется не только исходный IP-адрес пакетов, но и порт-источник. Поскольку UDP не использует соединения, соединения UDP NAT обычно очень быстро отключаются, например, через 5 минут, если по ним не передаются данные.

Если UDP должен быть открыт в противоположном направлении (из Интернета в Интранет), маршрутизатор обычно отбрасывает все UDP-пакеты, поступающие из Интернета, потому что он не знает, куда направить их. Маршрутизатор не может просто выбрать какую-то произвольную машину, это будет дырой в безопасности. Поэтому в «Интернет-соединении с машиной за маршрутизатором» вы должны открыть порт UDP на маршрутизаторе и отправить его на нужный компьютер. В этом случае пакеты, отправленные с вашей внутренней машины, получат свой исходный IP-адрес, а исходный порт будет перезаписан, машина в Интернете всегда будет видеть пакеты, поступающие с вашего маршрутизатора. Таким образом, за исключением дополнительного правила в маршрутизаторе, этот случай такой же, как и в исходящем случае.

Обратите внимание, что есть несколько разных способов, как сделать NAT (симметричный и т. Д.), И несколько способов, как открыть порт на маршрутизаторе (Config, UPnP и т. Д.), Так что всегда есть способы пробить некоторые дыры в нем. зависит от ваших аппаратных возможностей. Здесь все нельзя ответить.

Некоторые другие идеи, которые также могут пойти не так:

  • Некоторые протоколы UDP кодируют IP-адреса в полезной нагрузке. В этом случае недостаточно просто пересылать пакеты, вы должны также изменить полезную нагрузку, чтобы исправить обмениваемые IP-адреса, чтобы все машины могли общаться друг с другом. В любом случае, такие протоколы UDP плохо спроектированы, потому что вы никогда не должны предполагать, что две произвольные машины могут напрямую общаться друг с другом, поэтому все хорошие протоколы должны поддерживать простое проксирование.

  • Некоторые интернет-провайдеры фильтруют определенные порты UDP по произвольной причине. Если у вас проблемы с подключением к Интернету через DSL, попробуйте подключить две внешние машины, напрямую подключенные к разным ISP. Если они могут общаться через UDP, проверьте, можете ли вы общаться из вашей интрасети с одной из внешних машин. Если это все еще работает, это означает, что вы также можете общаться в обратном направлении, так как обычно UDP не является направленным протоколом, но если задействован какой-то NAT, вы так или иначе должны убедиться, что порты связи остаются открытыми.

  • Планы мобильного интернета часто не поддерживают P2P. Это, вероятно, означает, что эти планы вообще не поддерживают Интернет, так как IP, по определению, является P2P. Что провайдеры действительно хотят сказать «без P2P», так это (я думаю), что соединения из Интернета с мобильным устройством не поддерживаются. В этом случае вы всегда должны инициировать соединение с мобильного устройства, поэтому вы не можете использовать методы push (Internet to Mobile), мобильное устройство всегда должно извлекать данные (данные из Интернета). Некоторые провайдеры широкополосного / кабельного телевидения могут сделать то же самое. Обычно вы можете увидеть это, если ваш провайдер раздает вам IP в диапазоне 10.x.y.z.

Может быть еще одна хитрость, как заставить работать соединение:

Попросите вашего интернет-провайдера получить IPv6. Возможно использовать 6to4 . С IPv6 вы полностью исключаете NAT, ваша локальная локальная сеть затем напрямую подключается к Интернету по IPv6. Обязательно активируйте брандмауэр / iptables на хосте интрасети с интерфейсом IPv6, иначе вы можете очень быстро увидеть злоумышленников.

НТН

...