Um roteador UDP de baixa qualidade para o ano de 2020 e além.
Então, estou brincando com Roon e tenho uma rede doméstica complicada que confunde Roon. Comecei a depurar as coisas e descobri que Roon envia mensagens de difusão para UDP/9003. Meu firewall/roteador não encaminhará essas mensagens, é claro, porque essa é a coisa certa a fazer.
Infelizmente, eu realmente quero que essas mensagens de transmissão sejam encaminhadas para outras VLAN/sub-redes na minha rede local. Comecei a usar o udp-proxy-relay-redux, que funcionou muito bem no início.
Mas também gosto muito dessas mensagens encaminhadas pelas minhas conexões OpenVPN que utilizam o driver tun
, que é uma interface ponto a ponto e explicitamente não suporta transmissões. Isso não funcionou bem com udp-proxy-relay-redux porque Roon se comporta mal e ainda tenta enviar "transmissões" para o endereço .255, que são descartadas porque meu servidor VPN não tem o endereço xxx255. Basicamente, em uma interface ponto a ponto, essas “transmissões” eram tratadas como um pacote destinado a outro host e legitimamente ignoradas.
Em vez de usar um soquete UDP normal para escutar mensagens de transmissão, udp-proxy-2020
usa libpcap para "farejar" as mensagens de transmissão UDP. Isso significa que ele pode ser muito mais flexível sobre quais pacotes ele "vê", para que possa enviá-los via injeção de libpcap/packet para todas as outras interfaces configuradas. Se isso faz você ficar “eca”, bem, bem-vindo a 2020.
Estou escrevendo isso em GoLang, então pelo menos a compilação cruzada em seu roteador/firewall Linux/FreeBSD aleatório é razoavelmente fácil. Nada de compilação cruzada C feia ou tentativa de instalar Python/Ruby e um monte de bibliotecas.
Além disso: HAHAHAHAHAHAHA! Nada disso é verdade! A necessidade de usar libpcap significa que tenho que compilar cruzadamente usando CGO porque gopacket/pcapgo suporta apenas Linux para leitura e gravação em interfaces de rede (ethernet?).
Praticamente qualquer sistema semelhante ao Unix é suportado porque a lista de dependências é apenas libpcap
e golang
. Eu desenvolvo em MacOS e tenho como alvo específico pfSense/FreeBSD e Ubiquiti USG, EdgeRouter e DreamMachine/Pro, pois são bastante comuns entre a comunidade de usuários Roon.
Se você estiver usando uma distribuição Linux RedHat ou Debian, a maneira mais fácil de instalar é pegar o arquivo .rpm
ou .deb
apropriado e instalá-lo com seu gerenciador de pacotes. Em seguida, edite /etc/udp-proxy-2020.conf
e inicie via: systemctl start udp-proxy-2020
.
Há também uma imagem docker disponível para Linux em AMD64 e ARM64 (como o Ubiquiti UDM).
Observe que para implantações do Docker, você deve usar rede de host.
Eu lanço binários para Linux, FreeBSD (pfSense) e MacOS para hardware Intel, ARM e MIPS.
Agora existem instruções e scripts de inicialização disponíveis no diretório startup-scripts. Se você descobrir como adicionar suporte para outra plataforma, envie-me uma solicitação de pull!
Execute udp-proxy-2020 --help
para obter uma lista atual de opções de linha de comando.
Além disso, observe que em muitos sistemas operacionais você precisará executá-lo como usuário root
. Os sistemas Linux podem conceder opcionalmente o recurso CAP_NET_RAW
.
Atualmente, existem apenas alguns sinalizadores com os quais você provavelmente precisa se preocupar:
--interface
-- Especifique duas ou mais interfaces de rede para escutar.--port
— Especifique uma ou mais portas UDP para monitorar.--level
-- Especifique o nível de log: [trace|debug|warn|info|error]Opções avançadas:
--fixed-ip
--Codifique um @ para sempre enviar tráfego. Útil para coisas como OpenVPN no modo site a site.--timeout
-- Número de ms para o valor de tempo limite do pcap. (o padrão é 250 ms)--cache-ttl
-- Número de minutos para armazenar IPs em cache. (o padrão é 180min/3 horas) Este valor pode precisar ser aumentado se você tiver problemas para passar tráfego para clientes em túneis OpenVPN se não puder usar --fixed-ip
porque os clientes não têm um ip fixo.--no-listen
-- Não escuta na(s) porta(s) UDP especificada(s) para evitar conflitos--deliver-local
-- Entrega pacotes localmente na interface de loopback Existem outros sinalizadores, é claro, execute ./udp-proxy-2020 --help
para obter uma lista completa.
Exemplo:
udp-proxy-2020 --port 9003 --interface eth0,eth0.100,eth1,tun0 --cache-ttl 300
Encaminharia pacotes udp/9003 em quatro interfaces: eth0, eth1, VLAN100 em eth0 e tun0. Os IPs do cliente em tun0 seriam lembrados por 5 minutos depois de aprendidos.
Nota: "aprendizado" requer que o cliente envie primeiro uma mensagem udp/9003! Se o seu aplicativo exigir que uma mensagem seja enviada primeiro ao cliente, você precisará especificar --fixed-ip=1.2.3.4@tun0
onde 1.2.3.4
é o endereço IP do cliente em tun0.
Testei as configurações de VPN do "road warrior" com o cliente Roon em execução no meu laptop e conectando-me ao firewall doméstico via OpenVPN e Wireguard. Eu pessoalmente uso o Wireguard em vez do OpenVPN porque é mais seguro e tem melhor desempenho.
Também testei VPN site-to-site usando Wireguard + pfSense. Segui as instruções do Wireguard VPN site a site do pfSense e instalei udp-proxy-2020
em ambos os firewalls. Você deve configurar a opção --interface
para incluir as interfaces de rede LAN e Wireguard.
Se você estiver construindo para a mesma plataforma que pretende executar udp-proxy-2020
, então você só precisa ter certeza de ter libpcap
e os cabeçalhos necessários (você pode precisar de um pacote -dev
para isso) e executar make
ou gmake
conforme apropriado ( precisamos do GNU Make, não do BSD Make).
Se você precisar construir plataformas cruzadas, um dos seguintes alvos pode ajudá-lo:
make linux-amd64
via Dockermake linux-mips64
(Linux/MIPS64 big-endian para Ubiquiti USG/EdgeRouter) via Dockermake linux-arm
via Docker:make freebsd
(pfSense 2.6) via Vagrant e VirtualBoxmake docker
Você pode obter uma lista completa de alvos make e informações básicas sobre eles executando: make help
.
A partir da v0.0.11, udp-proxy-2020
agora, por padrão, cria um soquete de escuta UDP na(s --port
s) especificada(s). Isso evita que o sistema operacional subjacente emita mensagens ICMP de porta inacessível que podem interromper determinados clientes (principalmente o cliente Roon iOS).
A única vez que você precisará usar o sinalizador --no-listen
é se houver outro software em execução no mesmo host que udp-proxy-2020
.
A partir da v0.1.0, sim. Você precisa especificar as opções --deliver-local
e --no-listen
para que ele entregue pacotes por meio da interface de loopback.
Esses sinalizadores são para depuração de problemas com udp-proxy-2020
. Você deve usar esses sinalizadores quando eu instruí-lo a fazer isso como parte de um ticket que você abriu para udp-proxy-2020
.
Na página de lançamentos no Github.
Não, não é um proxy. É mais como um roteador. Você não precisa fazer nenhuma alteração além de executá-lo em seu roteador/firewall doméstico.
Sinceramente, não pensei muito no nome e essa foi a primeira coisa que me veio à cabeça. Além disso, nomear é difícil.
tun
, como aquelas usadas pelo OpenVPNraw
, como aquelas usadas pelo Wireguardvti
para IPSec site a siteObserve que os túneis VPN L2TP no Linux não são compatíveis com udp-proxy-2020 porque o kernel do Linux expõe essas interfaces como Linux SLL, que não fornece uma decodificação precisa dos pacotes.
Então, eu não fiz isso sozinho, mas Bart Verhoeven, nos fóruns da comunidade Roon, escreveu um tutorial bem detalhado.
udp-proxy-2020 foi desenvolvido para vários sistemas operacionais e plataformas de hardware:
darwin-amd64
linux-amd64
linux-arm64
(RasPi 2 V1.2 e superior, Ubiquiti UniFi Dream Machine)linux-armv7
(RasPi 2 V1.1 e inferior)linux-armv6
linux-armv5
linux-mips64
(Ubiquiti USG/EdgeRouter)freebsd-amd64
(funciona com pfSense em x86)freebsd-arm64
(Netgate SG-1100 e SG-2100)freebsd-armv7
(Netgate SG-3100)Honestamente, basta me enviar um e-mail agradecendo ou "marcar com estrela" este projeto no GitHub é o suficiente, obrigado.
Ocasionalmente, alguém pergunta se posso me dar algum dinheiro, mas eu realmente não preciso de dinheiro algum. Se ainda quiseres atirar alguns dólares para mim, prefiro que does para o Second Harvest Food Bank, que é local para mim e poderia colocar o teu dinheiro num trabalho melhor do que eu.