2020년 이후에도 사용할 수 있는 형편없는 UDP 라우터입니다.
그래서 저는 Roon을 가지고 놀고 있는데 Roon을 혼란스럽게 만드는 복잡한 홈 네트워크가 있습니다. 디버깅을 시작했는데 Roon이 UDP/9003에 브로드캐스트 메시지를 보내는 것으로 나타났습니다. 물론 내 방화벽/라우터는 이러한 메시지를 전달하지 않을 것입니다. 왜냐하면 그렇게 하는 것이 옳은 일이기 때문입니다.
불행하게도 저는 이러한 브로드캐스트 메시지가 로컬 네트워크의 다른 VLAN/서브넷으로 전달되기를 정말로 원합니다. 나는 처음에는 훌륭하게 작동했던 udp-proxy-relay-redux를 사용하기 시작했습니다.
그러나 나는 또한 지점간 인터페이스이고 명시적으로 브로드캐스트를 지원하지 않는 tun
드라이버를 활용하는 OpenVPN 연결을 통해 전달되는 이러한 메시지를 정말 좋아합니다. Roon이 제대로 작동하지 않고 여전히 .255 주소로 "브로드캐스트"를 보내려고 시도하기 때문에 udp-proxy-relay-redux에서는 잘 작동하지 않았습니다. 내 VPN 서버에 주소 xxx255가 없기 때문에 해당 주소는 바닥에 떨어졌습니다. 기본적으로 지점간 인터페이스에서 이러한 "브로드캐스트"는 다른 호스트로 향하는 패킷으로 처리되어 정당하게 무시되었습니다.
브로드캐스트 메시지를 수신하기 위해 일반 UDP 소켓을 사용하는 대신, udp-proxy-2020
libpcap을 사용하여 UDP 브로드캐스트 메시지를 "스니핑"합니다. 이는 "보는" 패킷에 대해 훨씬 더 유연할 수 있으므로 libpcap/패킷 주입을 통해 다른 구성된 인터페이스로 패킷을 보낼 수 있음을 의미합니다. 이것이 당신을 "으으"하게 만든다면, 음, 2020년에 오신 것을 환영합니다.
나는 이것을 GoLang으로 작성하고 있으므로 최소한 임의의 Linux/FreeBSD 라우터/방화벽에 대한 크로스 컴파일이 비교적 쉽습니다. C를 크로스컴플링하거나 Python/Ruby 및 여러 라이브러리를 설치하려고 하지 않습니다.
또한: 하하하하하하하! 그 어느 것도 사실이 아닙니다! libpcap을 사용해야 한다는 것은 gopacket/pcapgo가 (이더넷?) 네트워크 인터페이스에 대한 읽기 및 쓰기를 위해 Linux만 지원하기 때문에 CGO를 사용하여 크로스 컴파일해야 한다는 것을 의미합니다.
종속 목록은 libpcap
및 golang
뿐이므로 거의 모든 Unix 계열 시스템이 지원됩니다. 저는 MacOS에서 개발하며 특히 Roon 사용자 커뮤니티에서 흔히 사용되는 pfSense/FreeBSD 및 Ubiquiti USG, EdgeRouter 및 DreamMachine/Pro를 대상으로 합니다.
Linux RedHat 또는 Debian 기반 배포판을 사용하는 경우 가장 쉬운 설치 방법은 적절한 .rpm
또는 .deb
파일을 가져와 패키지 관리자를 사용하여 설치하는 것입니다. 그런 다음 /etc/udp-proxy-2020.conf
편집하고 systemctl start udp-proxy-2020
통해 시작합니다.
AMD64 및 ARM64(예: Ubiquiti UDM)의 Linux에서 사용할 수 있는 도커 이미지도 있습니다.
Docker 배포의 경우 호스트 네트워킹을 사용해야 합니다.
Intel, ARM 및 MIPS 하드웨어용 Linux, FreeBSD(pfSense) 및 MacOS용 바이너리를 출시합니다.
이제 시작 스크립트 디렉토리에 지침과 시작 스크립트가 제공됩니다. 다른 플랫폼에 대한 지원을 추가하는 방법을 찾으신다면 제게 풀 요청을 보내주세요!
현재 명령줄 옵션 목록을 보려면 udp-proxy-2020 --help
실행하세요.
또한 많은 운영 체제에서는 root
사용자로 실행해야 합니다. Linux 시스템은 선택적으로 CAP_NET_RAW
기능을 부여할 수 있습니다.
현재 걱정해야 할 플래그는 몇 가지뿐입니다.
--interface
-- 수신할 네트워크 인터페이스를 두 개 이상 지정합니다.--port
-- 모니터링할 UDP 포트를 하나 이상 지정합니다.--level
-- 로그 수준을 지정합니다: [trace|debug|warn|info|error]고급 옵션:
--fixed-ip
-- 항상 트래픽을 보내도록 @를 하드코딩합니다. 사이트 간 모드의 OpenVPN과 같은 작업에 유용합니다.--timeout
-- pcap 시간 초과 값의 ms 수입니다. (기본값은 250ms)--cache-ttl
-- IP를 캐시하는 시간(분)입니다. (기본값은 180분/3시간) 클라이언트에 고정 IP가 없기 때문에 --fixed-ip
사용할 수 없는 경우 OpenVPN 터널에서 클라이언트에 트래픽을 전달하는 데 문제가 있는 경우 이 값을 늘려야 할 수 있습니다.--no-listen
-- 충돌을 피하기 위해 지정된 UDP 포트를 수신하지 않습니다.--deliver-local
-- 루프백 인터페이스에서 로컬로 패킷을 전달합니다. 물론 다른 플래그도 있습니다. 전체 목록을 보려면 ./udp-proxy-2020 --help
실행하세요.
예:
udp-proxy-2020 --port 9003 --interface eth0,eth0.100,eth1,tun0 --cache-ttl 300
4개의 인터페이스(eth0, eth1, eth0 및 tun0의 VLAN100)에서 udp/9003 패킷을 전달합니다. tun0의 클라이언트 IP는 학습된 후 5분 동안 기억됩니다.
참고: "학습"을 위해서는 클라이언트가 먼저 udp/9003 메시지를 보내야 합니다! 애플리케이션에서 클라이언트 에 먼저 메시지를 보내야 하는 경우 --fixed-ip=1.2.3.4@tun0
지정해야 합니다. 여기서 1.2.3.4
는 tun0에 있는 클라이언트의 IP 주소입니다.
저는 랩탑에서 Roon 클라이언트를 실행하고 OpenVPN 및 Wireguard를 통해 홈 방화벽에 다시 연결하는 "로드 워리어" VPN 구성을 모두 테스트했습니다. 저는 개인적으로 OpenVPN 대신 Wireguard를 사용합니다. 더 안전하고 성능도 더 좋기 때문입니다.
또한 Wireguard + pfSense를 사용하여 Site-to-Site VPN을 테스트했습니다. pfSense 사이트 간 Wireguard VPN 지침을 따르고 두 방화벽 모두에 udp-proxy-2020
을 설치했습니다. LAN 및 Wireguard 네트워크 인터페이스를 모두 포함하도록 --interface
옵션을 구성해야 합니다.
udp-proxy-2020
을 실행하려는 동일한 플랫폼용으로 빌드하는 경우 libpcap
과 필요한 헤더가 있는지 확인하고(이를 위해서는 -dev
패키지가 필요할 수 있음) 적절하게 make
또는 gmake
실행하면 됩니다( BSD Make가 아닌 GNU Make가 필요합니다.
크로스 플랫폼을 구축해야 하는 경우 다음 대상 중 하나가 도움이 될 수 있습니다.
make linux-amd64
.make linux-mips64
.make linux-arm
.make freebsd
.make docker
에서 udp-proxy-2020을 실행하기 위한 Docker 이미지 make help
실행하여 make 대상의 전체 목록과 이에 대한 기본 정보를 얻을 수 있습니다.
v0.0.11부터 udp-proxy-2020
이제 기본적으로 지정된 --port
에 UDP 수신 소켓을 생성합니다. 이는 기본 OS가 특정 클라이언트(특히 Roon iOS 클라이언트)를 손상시킬 수 있는 ICMP 포트 연결 불가 메시지를 발행하는 것을 방지합니다.
--no-listen
플래그를 사용해야 하는 유일한 경우는 udp-proxy-2020
과 동일한 호스트에서 실행 중인 다른 소프트웨어가 있는 경우입니다.
v0.1.0부터 그렇습니다. 루프백 인터페이스를 통해 패킷을 전달하도록 --deliver-local
및 --no-listen
옵션을 지정해야 합니다.
이 플래그는 udp-proxy-2020
의 문제를 디버깅하기 위한 것입니다. udp-proxy-2020
에 대해 개설한 티켓의 일부로 지시할 때 이 플래그를 사용해야 합니다.
Github의 릴리스 페이지에서.
아니요, 프록시가 아닙니다. 라우터와 비슷합니다. 홈 라우터/방화벽에서 실행하는 것 외에는 변경할 필요가 없습니다.
솔직히 저는 이름에 대해 별로 생각하지 않았는데, 이 이름이 가장 먼저 떠올랐습니다. 게다가 네이밍도 어렵다.
tun
인터페이스raw
인터페이스vti
인터페이스Linux의 L2TP VPN 터널은 udp-proxy-2020과 호환되지 않습니다. Linux 커널은 이러한 인터페이스를 패킷의 정확한 디코딩을 제공하지 않는 Linux SLL로 노출하기 때문입니다.
그래서 저는 이 작업을 직접 수행하지는 않았지만 Roon 커뮤니티 포럼의 Bart Verhoeven이 이 작업을 수행하는 방법을 매우 자세히 작성했습니다.
udp-proxy-2020은 여러 OS 및 하드웨어 플랫폼용으로 구축되었습니다.
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
(x86에서 pfSense와 함께 작동)freebsd-arm64
(Netgate SG-1100 및 SG-2100)freebsd-armv7
(Netgate SG-3100)솔직히 말해, 나에게 감사하다는 이메일을 보내거나 GitHub의 이 프로젝트에 "별표"를 표시하는 것만으로도 충분합니다.
가끔 누군가가 나에게 몇 달러를 주느냐고 물을 것입니다. 그러나 나는 실제로 돈이 전혀 필요하지 않습니다. 아직도 내 방식대로 몇 달러를 던지고 싶다면 나보다 더 나은 일에 돈을 쓸 수 있는 Second Harvest Food Bank에 기부하는 편이 낫습니다.