#!/bin/bash # Setup TAP/Bridge networking for QEMU VM # Defaults: # BRIDGE_NAME=br-rego-vpn # TAP_NAME=tap0 # BRIDGE_CIDR=100.100.0.1/24 # VM_NET_IP=100.100.0.2 # VM_SUBNET=100.100.0.0/24 set -e BRIDGE_NAME="${BRIDGE_NAME:-br-rego-vpn}" TAP_NAME="${TAP_NAME:-tap0}" BRIDGE_CIDR="${BRIDGE_CIDR:-100.100.0.1}" VM_NET_IP="${VM_NET_IP:-100.100.0.2}" VM_SUBNET="${VM_SUBNET:-100.100.0.0}" TARGET_IP="${TARGET_IP:-10.35.33.230}" if [[ "$BRIDGE_CIDR" != */* ]]; then BRIDGE_CIDR="$BRIDGE_CIDR/24" fi if [[ "$VM_SUBNET" != */* ]]; then VM_SUBNET="$VM_SUBNET/24" fi # Pick the outbound interface based on the container's default route. # (In Docker, this is not always eth1 when multiple networks are attached.) WAN_IF="$(ip route show default 0.0.0.0/0 2>/dev/null | awk '{for(i=1;i<=NF;i++) if($i=="dev"){print $(i+1); exit}}')" if [ -z "${WAN_IF}" ]; then WAN_IF="eth1" fi # Ensure bridge exists if ! ip link show "$BRIDGE_NAME" &>/dev/null; then ip link add "$BRIDGE_NAME" type bridge fi # Ensure bridge has address and is up ip addr show dev "$BRIDGE_NAME" | grep -qF "$BRIDGE_CIDR" || ip addr add "$BRIDGE_CIDR" dev "$BRIDGE_NAME" 2>/dev/null || true ip link set "$BRIDGE_NAME" up # Ensure TAP exists if ! ip link show "$TAP_NAME" &>/dev/null; then ip tuntap add "$TAP_NAME" mode tap fi # Ensure TAP is attached and up ip link set "$TAP_NAME" master "$BRIDGE_NAME" 2>/dev/null || true ip link set "$TAP_NAME" up # Enable IP forwarding echo 1 > /proc/sys/net/ipv4/ip_forward # Setup NAT/masquerade for outbound traffic from VM iptables -t nat -C POSTROUTING -s "$VM_SUBNET" -o "$WAN_IF" -j MASQUERADE 2>/dev/null || \ iptables -t nat -A POSTROUTING -s "$VM_SUBNET" -o "$WAN_IF" -j MASQUERADE # Ensure forwarding between the VM bridge and outbound interface iptables -C FORWARD -i "$BRIDGE_NAME" -o "$WAN_IF" -j ACCEPT 2>/dev/null || \ iptables -A FORWARD -i "$BRIDGE_NAME" -o "$WAN_IF" -j ACCEPT iptables -C FORWARD -i "$WAN_IF" -o "$BRIDGE_NAME" -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 2>/dev/null || \ iptables -A FORWARD -i "$WAN_IF" -o "$BRIDGE_NAME" -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # Forward traffic destined for VPN networks to VM (TARGET_IP defaults to IBM i) # The VM will route this through its VPN tunnel iptables -C FORWARD -d "$TARGET_IP" -j ACCEPT 2>/dev/null || iptables -A FORWARD -d "$TARGET_IP" -j ACCEPT iptables -C FORWARD -s "$TARGET_IP" -j ACCEPT 2>/dev/null || iptables -A FORWARD -s "$TARGET_IP" -j ACCEPT # Route to TARGET_IP through VM ip route add "$TARGET_IP" via "$VM_NET_IP" 2>/dev/null || true echo "Network setup complete" echo "Bridge: $BRIDGE_NAME = $BRIDGE_CIDR" echo "TAP: $TAP_NAME attached to $BRIDGE_NAME" echo "Route: $TARGET_IP via $VM_NET_IP (VM)" echo "Outbound interface: ${WAN_IF}"