Skip to content

Latest commit

 

History

History
129 lines (87 loc) · 2.48 KB

File metadata and controls

129 lines (87 loc) · 2.48 KB

Cross-Compilation for ARM64

The router runs ARM64 (aarch64) Linux. Most binaries need to be cross-compiled from x86.

Prerequisites

  • Docker with buildx support
  • Multi-platform emulation: docker buildx create --use

udp2tcp (Mullvad's UDP-over-TCP)

Clone and Prepare

git clone https://github.com/mullvad/udp-over-tcp.git
cd udp-over-tcp

Fix Rust Edition (if needed)

The 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"

Dockerfile

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 /udp2tcp

Build

docker 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)

wireproxy

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" .

redsocks

Clone

git clone https://github.com/darkk/redsocks.git
cd redsocks

Dockerfile

FROM 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 /redsocks

Build

docker buildx build --platform linux/arm64 -t redsocks-arm64 \
    --output type=local,dest=/tmp/redsocks-out .

Deploying to Router

# 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/

Verifying Binaries

# On router
file /mnt/data/vpn/udp2tcp
# Should show: ELF 64-bit LSB executable, ARM aarch64

/mnt/data/vpn/udp2tcp --help
# Should show usage