The router runs ARM64 (aarch64) Linux. Most binaries need to be cross-compiled from x86.
- Docker with buildx support
- Multi-platform emulation:
docker buildx create --use
git clone https://github.com/mullvad/udp-over-tcp.git
cd udp-over-tcpThe repo may require Rust 1.85+. Downgrade in Cargo.toml:
# Change:
edition = "2024"
rust-version = "1.85.0"
# To:
edition = "2021"
rust-version = "1.75.0"FROM rust:1.84-slim AS builder
RUN apt-get update && apt-get install -y \
musl-tools musl-dev gcc-aarch64-linux-gnu
RUN rustup target add aarch64-unknown-linux-musl
WORKDIR /src
COPY . .
ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=aarch64-linux-gnu-gcc
ENV CC_aarch64_unknown_linux_musl=aarch64-linux-gnu-gcc
RUN cargo build --release --target aarch64-unknown-linux-musl \
--features env_logger --features clap --bin udp2tcp
FROM scratch
COPY --from=builder /src/target/aarch64-unknown-linux-musl/release/udp2tcp /udp2tcpdocker buildx build --platform linux/arm64 -t udp2tcp-arm64 \
--output type=local,dest=/tmp/udp2tcp-out .Binary will be at /tmp/udp2tcp-out/udp2tcp (~2.3MB static)
Download pre-built ARM64 binary from releases: https://github.com/pufferffish/wireproxy/releases
Or cross-compile with Go:
GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -ldflags="-s -w" .git clone https://github.com/darkk/redsocks.git
cd redsocksFROM alpine:3.18 AS builder
RUN apk add --no-cache build-base libevent-dev libevent-static linux-headers musl-dev
WORKDIR /src
COPY . .
RUN make CFLAGS="-static -O2" LDFLAGS="-static -levent_core -levent_extra"
RUN strip redsocks
FROM scratch
COPY --from=builder /src/redsocks /redsocksdocker buildx build --platform linux/arm64 -t redsocks-arm64 \
--output type=local,dest=/tmp/redsocks-out .# Push binary to router
adb push /tmp/udp2tcp-out/udp2tcp /mnt/data/vpn/
adb shell chmod +x /mnt/data/vpn/udp2tcp
# Or via SCP
scp -P 2222 /tmp/udp2tcp-out/udp2tcp root@192.168.0.1:/mnt/data/vpn/# On router
file /mnt/data/vpn/udp2tcp
# Should show: ELF 64-bit LSB executable, ARM aarch64
/mnt/data/vpn/udp2tcp --help
# Should show usage