Files
Asger Weirsøe 8652fcfbba
release / release (push) Successful in 1m15s
Initial commit
2026-05-27 15:02:44 +02:00

96 lines
3.2 KiB
Bash

#!/bin/bash
# Bringer én tunnel-namespace op.
# - opretter (eller genbruger) bridge br-weircon i hoved-netns
# - opretter netns proxy<id>
# - laver veth-par mellem hoved-netns og proxy<id>, attacher hoved-siden til bridge
# - flytter et frisk wg0-interface ind i ns'en og applikerer WG-config
# - sætter default-route via wg0 inde i ns'en
# Idempotent: river først evt. tidligere state for samme id ned.
set -euo pipefail
ID="${1:?usage: $0 <id 0..N>}"
NS="proxy${ID}"
WG="wg0" # interfacenavn inde i ns'en
VETH_MAIN="vp${ID}a"
VETH_NS="vp${ID}b"
BRIDGE="br-weircon"
BRIDGE_IP="10.99.0.1"
BRIDGE_CIDR="${BRIDGE_IP}/24"
NS_IP="10.99.0.$((10 + ID))"
NS_CIDR="${NS_IP}/24"
CONF="/etc/weircon-random-proxy/wg/proxy${ID}.conf"
RESOLV_DIR="/etc/netns/${NS}"
if [[ ! -f "$CONF" ]]; then
echo "missing wg config at $CONF" >&2
exit 1
fi
# --- 1. river eventuel tidligere state ned --------------------------------
ip link delete "$VETH_MAIN" 2>/dev/null || true
ip netns delete "$NS" 2>/dev/null || true
rm -rf "$RESOLV_DIR"
# --- 2. bridge (delt af alle tunneler) ------------------------------------
if ! ip link show "$BRIDGE" >/dev/null 2>&1; then
ip link add "$BRIDGE" type bridge
ip addr add "$BRIDGE_CIDR" dev "$BRIDGE"
ip link set "$BRIDGE" up
fi
# --- 3. per-netns resolver fra DNS-feltet i WG-conf'en --------------------
mkdir -p "$RESOLV_DIR"
: > "${RESOLV_DIR}/resolv.conf"
DNS_LINE=$(awk -F'=' '/^[[:space:]]*DNS[[:space:]]*=/ {print $2; exit}' "$CONF" || true)
if [[ -n "${DNS_LINE:-}" ]]; then
IFS=',' read -ra dns_arr <<< "$DNS_LINE"
for d in "${dns_arr[@]}"; do
d="${d// /}"
[[ -n "$d" ]] && echo "nameserver $d" >> "${RESOLV_DIR}/resolv.conf"
done
fi
# --- 4. ns + loopback ------------------------------------------------------
ip netns add "$NS"
ip -n "$NS" link set lo up
# --- 5. veth-par, hoved-siden til bridge ----------------------------------
ip link add "$VETH_MAIN" type veth peer name "$VETH_NS"
ip link set "$VETH_MAIN" master "$BRIDGE"
ip link set "$VETH_MAIN" up
ip link set "$VETH_NS" netns "$NS"
ip -n "$NS" addr add "$NS_CIDR" dev "$VETH_NS"
ip -n "$NS" link set "$VETH_NS" up
# --- 6. WG-interface: opret + konfigurer i hoved-netns, flyt så ind -------
# Endpoint-hostname (hvis WG-config'en bruger ét) skal resolves *inden*
# interfacet flyttes — netns'en har kun upstream-DNS, som kun virker når
# tunnelen allerede er oppe. Klassisk chicken-and-egg.
ip link add "$WG" type wireguard
TMPCONF=$(mktemp)
trap 'rm -f "$TMPCONF"' EXIT
wg-quick strip "$CONF" > "$TMPCONF"
wg setconf "$WG" "$TMPCONF" # resolves via hoved-netns DNS
ip link set "$WG" netns "$NS"
# Interface-adresser fra [Interface] Address = ...
while read -r ADDR; do
[[ -z "$ADDR" ]] && continue
ip -n "$NS" addr add "$ADDR" dev "$WG"
done < <(awk -F'=' '
/^[[:space:]]*Address[[:space:]]*=/ {
gsub(/[[:space:]]/, "", $2);
n = split($2, a, ",");
for (i = 1; i <= n; i++) print a[i];
}' "$CONF")
ip -n "$NS" link set "$WG" up
# --- 7. default route via wg (egress til internettet) --------------------
ip -n "$NS" route add default dev "$WG"
echo "netns $NS oppe; socks5 vil lytte på ${NS_IP}:1080"