#!/bin/sh

# 1. Interfaces
WLAN="wlp0s20f3"
MODEM="enx663e217cf456"

# 2. Dynamische Ermittlung der Gateways
GW_WLAN=$(ip route show dev "$WLAN" | grep default | awk '{print $3}' | head -n1)
GW_MODEM=$(ip route show dev "$MODEM" | grep default | awk '{print $3}' | head -n1)

# Falls kein Default-GW da ist, nehmen wir die IP des Interfaces als Anhaltspunkt (für Point-to-Point)
[ -z "$GW_WLAN" ] && GW_WLAN=$(ip -4 addr show "$WLAN" | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | sed 's/\.[0-9]*$/.1/')
[ -z "$GW_MODEM" ] && GW_MODEM=$(ip -4 addr show "$MODEM" | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | sed 's/\.[0-9]*$/.1/')

echo "Routing: HTTP/FTP -> $WLAN via $GW_WLAN | Rest -> $MODEM via $GW_MODEM"

# 2. Tabellen & Regeln komplett plattmachen
nft flush ruleset 2>/dev/null
ip rule flush
# Standard-Regeln wiederherstellen, aber mit niedriger Prio
ip rule add lookup main pref 30000
ip rule add lookup default pref 31000

# 3. PBR Regeln mit höchster Priorität (bevor main Tabelle greift)
# Regel für Mark 1 (HTTP/FTP) -> Tabelle 100
ip rule add fwmark 0x1 table 100 pref 10
# Regel für Mark 2 (Rest) -> Tabelle 200
ip rule add fwmark 0x2 table 200 pref 20

# 4. Routing Tabellen befüllen
ip route flush table 100
ip route flush table 200
ip route add default via "$GW_WLAN" dev "$WLAN" table 100
ip route add default via "$GW_MODEM" dev "$MODEM" table 200

# 5. nftables: Hier erzwingen wir die Markierung
nft -f - <<EOF
table inet pbr {
    chain mangle_pre {
        type filter hook prerouting priority -150; # Sehr früh prüfen!
        
        # Markiere alles, was vom Hotspot kommt
        tcp dport { 21, 80, 443 } counter mark set 0x1
        tcp dport != { 21, 80, 443 } counter mark set 0x2
        udp dport != { 21, 80, 443 } counter mark set 0x2
    }

    chain mangle_out {
        type route hook output priority -150;
        # Auch für lokale Anfragen auf dem Debian selbst
        tcp dport { 21, 80, 443 } counter mark set 0x1
        tcp dport != { 21, 80, 443 } counter mark set 0x2
        udp dport != { 21, 80, 443 } counter mark set 0x2
    }

    chain nat_post {
        type nat hook postrouting priority srcnat;
        oifname "$WLAN" masquerade
        oifname "$MODEM" masquerade
    }
}
EOF

# 6. Kernel Settings (RP Filter auf 0 ist kritisch!)
sysctl -w net.ipv4.ip_forward=1
for i in all default $WLAN $MODEM; do
    sysctl -w net.ipv4.conf.$i.rp_filter=0
    sysctl -w net.ipv4.conf.$i.accept_source_route=1
done

# Verbindungstracking leeren, damit alte Verbindungen nicht im "falschen" Modem hängen
conntrack -F 2>/dev/null 

echo "Check: 'ip rule' sollte jetzt 0x1 auf Tabelle 100 zeigen."
echo "Routing aktiv. Teste mit: nft list ruleset"