Дрянной UDP-маршрутизатор 2020 года и далее.
Итак, я играю с Roon, и у меня есть сложная домашняя сеть, которая запутывает Roon. Я начал отлаживать вещи, и оказалось, что Roon отправляет широковещательные сообщения на UDP/9003. Мой брандмауэр/маршрутизатор, конечно, не будет пересылать эти сообщения, потому что это правильно.
К сожалению, я действительно хочу, чтобы эти широковещательные сообщения пересылались в другие VLAN/подсети моей локальной сети. Я начал использовать udp-proxy-relay-redux, который поначалу работал отлично.
Но мне также очень нравятся эти сообщения, пересылаемые через мои соединения OpenVPN, которые используют драйвер tun
, который представляет собой двухточечный интерфейс и явно не поддерживает широковещательные рассылки. Это не сработало с udp-proxy-relay-redux, потому что Roon плохо себя ведет и все еще пытается отправлять «широковещательные рассылки» на адрес .255, которые затем сбрасываются на пол, потому что у моего VPN-сервера нет адреса xxx255. По сути, в интерфейсе «точка-точка» эти «широковещательные рассылки» рассматривались как пакеты, предназначенные другому хосту и по праву игнорировались.
Вместо использования обычного сокета UDP для прослушивания широковещательных сообщений udp-proxy-2020
использует libpcap для «обслушивания» широковещательных сообщений UDP. Это означает, что он может быть намного более гибким в отношении того, какие пакеты он «видит», чтобы затем отправлять их через libpcap/packet инъекции через все другие настроенные интерфейсы. Если это заставляет вас сказать «фу», что ж, добро пожаловать в 2020 год.
Я пишу это на GoLang, так что, по крайней мере, кросс-компиляция на вашем случайном маршрутизаторе/брандмауэре Linux/FreeBSD будет достаточно простой. Никакой уродливой кросс-компиляции C или попыток установить Python/Ruby и кучу библиотек.
А еще: ХАХАХАХАХАХАХА! Все это неправда! Необходимость использовать libpcap означает, что мне придется выполнять кросс-компиляцию с использованием CGO, поскольку gopacket/pcapgo поддерживает Linux только для чтения и записи в сетевые интерфейсы (Ethernet?).
Поддерживается практически любая Unix-подобная система, поскольку список зависимостей состоит только из libpcap
и golang
. Я разрабатываю для MacOS и специально нацелен на pfSense/FreeBSD и Ubiquiti USG, EdgeRouter и DreamMachine/Pro, поскольку они довольно распространены среди сообщества пользователей Roon.
Если вы используете дистрибутив Linux RedHat или Debian, самый простой способ установки — взять соответствующий файл .rpm
или .deb
и установить его с помощью менеджера пакетов. Затем отредактируйте /etc/udp-proxy-2020.conf
и запустите через: systemctl start udp-proxy-2020
.
Также доступен образ докера для Linux на AMD64 и ARM64 (например, Ubiquiti UDM).
Обратите внимание, что для развертываний Docker вам следует использовать сеть хоста.
Я выпускаю двоичные файлы для Linux, FreeBSD (pfSense) и MacOS для оборудования Intel, ARM и MIPS.
Теперь в каталоге сценариев запуска доступны инструкции и сценарии запуска. Если вы поймете, как добавить поддержку другой платформы, пришлите мне запрос на включение!
Запустите udp-proxy-2020 --help
, чтобы получить текущий список параметров командной строки.
Также обратите внимание, что во многих операционных системах вам придется запускать его от имени пользователя root
. Системы Linux могут дополнительно предоставлять возможность CAP_NET_RAW
.
В настоящее время есть только несколько флагов, о которых вам, вероятно, стоит беспокоиться:
--interface
— Укажите два или более сетевых интерфейса для прослушивания.--port
— Укажите один или несколько портов UDP для мониторинга.--level
-- Укажите уровень журнала: [trace|debug|warn|info|error]Расширенные параметры:
--fixed-ip
— жестко закодируйте @, чтобы всегда отправлять трафик. Полезно для таких вещей, как OpenVPN в режиме «сайт-сайт».--timeout
— количество мс для значения таймаута pcap. (по умолчанию 250 мс)--cache-ttl
— количество минут для кэширования IP-адресов. (по умолчанию 180 минут / 3 часа) Это значение может потребоваться увеличить, если у вас есть проблемы с передачей трафика клиентам по туннелям OpenVPN, если вы не можете использовать --fixed-ip
поскольку у клиентов нет фиксированного IP-адреса.--no-listen
-- Не прослушивать указанные порты UDP, чтобы избежать конфликтов--deliver-local
— доставлять пакеты локально через интерфейс обратной связи Конечно, есть и другие флаги. Запустите ./udp-proxy-2020 --help
для получения полного списка.
Пример:
udp-proxy-2020 --port 9003 --interface eth0,eth0.100,eth1,tun0 --cache-ttl 300
Пересылает пакеты udp/9003 на четыре интерфейса: eth0, eth1, VLAN100 на eth0 и tun0. IP-адреса клиентов на tun0 будут запоминаться в течение 5 минут после их изучения.
Примечание: «обучение» требует, чтобы клиент сначала отправил сообщение udp/9003! Если ваше приложение требует, чтобы сообщение сначала было отправлено клиенту , вам необходимо указать --fixed-ip=1.2.3.4@tun0
, где 1.2.3.4
— это IP-адрес клиента на tun0.
Я протестировал обе конфигурации VPN «дорожного воина» с клиентом Roon, работающим на моем ноутбуке и подключающимся обратно к домашнему брандмауэру через OpenVPN и Wireguard. Лично я использую Wireguard вместо OpenVPN, потому что он более безопасен и имеет лучшую производительность.
Я также протестировал Site-to-Site VPN с помощью Wireguard + pfSense. Я следовал инструкциям pfSense Site-to-Site Wireguard VPN и установил udp-proxy-2020
на обоих брандмауэрах. Необходимо настроить параметр --interface
, чтобы включить сетевые интерфейсы LAN и Wireguard.
Если вы создаете сборку для той же платформы, на которой собираетесь запускать udp-proxy-2020
, вам просто нужно убедиться, что у вас есть libpcap
и необходимые заголовки (для этого вам может понадобиться пакет -dev
) и запустить make
или gmake
, если это необходимо ( нам нужен GNU Make, а не BSD Make).
Если вам нужно создать кроссплатформенную платформу, вам может помочь одна из следующих целей:
make linux-amd64
через Dockermake linux-mips64
(Linux/MIPS64 с прямым порядком байтов для Ubiquiti USG/EdgeRouter) через Dockermake linux-arm
через Docker:make freebsd
(pfSense 2.6) через Vagrant и VirtualBoxmake docker
Вы можете получить полный список целей make и основную информацию о них, запустив: make help
.
Начиная с версии 0.0.11, udp-proxy-2020
теперь по умолчанию создает прослушивающий сокет UDP на указанном --port
(ах). Это не позволяет базовой ОС выдавать сообщения ICMP Port Unreachable, которые могут привести к поломке некоторых клиентов (в частности, клиента Roon iOS).
Флаг --no-listen
понадобится использовать только в том случае, если на том же хосте работает другое программное обеспечение, что и udp-proxy-2020
.
Начиная с версии 0.1.0, да. Вам необходимо указать параметры --deliver-local
и --no-listen
, чтобы пакеты доставлялись через интерфейс обратной связи.
Эти флаги предназначены для устранения проблем с udp-proxy-2020
. Вам следует использовать эти флаги, когда я попрошу вас сделать это в рамках заявки, которую вы открыли для udp-proxy-2020
.
Со страницы релизов на Github.
Нет, это не прокси. Это больше похоже на роутер. Вам не нужно вносить какие-либо изменения, кроме запуска на домашнем маршрутизаторе/брандмауэре.
Честно говоря, я особо не задумывался над названием и это было первое, что пришло мне на ум. Кроме того, назвать сложно.
tun
интерфейсы, подобные тем, которые используются OpenVPNraw
интерфейсы, подобные тем, которые используются Wireguardvti
для межсайтового IPSecОбратите внимание, что VPN-туннели L2TP в Linux несовместимы с udp-proxy-2020, поскольку ядро Linux предоставляет эти интерфейсы как Linux SLL, что не обеспечивает точного декодирования пакетов.
Так что я не делал этого сам, но Барт Верховен на форумах сообщества Roon очень подробно написал, как это сделать.
udp-proxy-2020 создан для нескольких ОС и аппаратных платформ:
darwin-amd64
linux-amd64
linux-arm64
(RasPi 2 V1.2 и выше, Ubiquiti UniFi Dream Machine)linux-armv7
(RasPi 2 V1.1 и ниже)linux-armv6
linux-armv5
linux-mips64
(Ubiquiti USG/EdgeRouter)freebsd-amd64
(работает с pfSense на x86)freebsd-arm64
(Netgate SG-1100 и SG-2100)freebsd-armv7
(Netgate SG-3100)Честно говоря, просто пришлите мне электронное письмо со словами «спасибо» или «звездочка» этому проекту на GitHub, и этого будет достаточно.
Время от времени кто-то просит дать мне несколько долларов, но мне действительно не нужны деньги. Если вы все еще хотите кинуть мне несколько долларов, я бы предпочел, чтобы вы сделали пожертвование в продовольственный банк Second Harvest Food Bank, который находится рядом со мной и может заставить ваши деньги работать лучше, чем я.