#!/bin/bash # # Gateway Simulator Script # ======================== # Konfiguriert ein Linux-System als VPN-Gateway, das Traffic vom # VPN-Server ins lokale Netzwerk weiterleitet. # # Verwendung: # sudo ./gatewaysimulator.sh enable - Aktiviert Gateway-Funktion # sudo ./gatewaysimulator.sh disable - Deaktiviert Gateway-Funktion # sudo ./gatewaysimulator.sh status - Zeigt aktuellen Status # # Voraussetzungen: # - OpenVPN-Verbindung zum Server muss aktiv sein # - Script muss als root ausgeführt werden # set -e # Farben für Output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # Konfiguration - bei Bedarf anpassen VPN_INTERFACE="tun0" # OpenVPN TUN Interface LOCAL_INTERFACE="" # Wird automatisch erkannt (eth0, enp0s3, etc.) VPN_NETWORK="10.8.0.0/24" # VPN Netzwerk (muss zum Server passen) # ============================================================================= # Hilfsfunktionen # ============================================================================= log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } check_root() { if [[ $EUID -ne 0 ]]; then log_error "Dieses Script muss als root ausgeführt werden!" echo "Verwendung: sudo $0 {enable|disable|status}" exit 1 fi } detect_local_interface() { # Finde das Haupt-Netzwerkinterface (nicht lo, tun, docker, etc.) LOCAL_INTERFACE=$(ip route | grep default | head -1 | awk '{print $5}') if [[ -z "$LOCAL_INTERFACE" ]]; then log_error "Konnte lokales Netzwerkinterface nicht erkennen!" exit 1 fi log_info "Erkanntes lokales Interface: $LOCAL_INTERFACE" } get_local_network() { # Ermittle das lokale Netzwerk local ip_addr=$(ip -4 addr show "$LOCAL_INTERFACE" | grep -oP '(?<=inet\s)\d+(\.\d+){3}/\d+') echo "$ip_addr" } check_vpn_connection() { if ! ip link show "$VPN_INTERFACE" &>/dev/null; then log_warn "VPN Interface $VPN_INTERFACE nicht gefunden!" log_warn "Stelle sicher, dass die OpenVPN-Verbindung aktiv ist." return 1 fi local vpn_ip=$(ip -4 addr show "$VPN_INTERFACE" 2>/dev/null | grep -oP '(?<=inet\s)\d+(\.\d+){3}') if [[ -n "$vpn_ip" ]]; then log_info "VPN Interface aktiv: $VPN_INTERFACE mit IP $vpn_ip" return 0 fi return 1 } # ============================================================================= # Gateway-Funktionen # ============================================================================= enable_ip_forwarding() { log_info "Aktiviere IP Forwarding..." # Temporär aktivieren echo 1 > /proc/sys/net/ipv4/ip_forward # Permanent aktivieren if ! grep -q "^net.ipv4.ip_forward=1" /etc/sysctl.conf; then echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf log_info "IP Forwarding permanent in /etc/sysctl.conf eingetragen" fi # Auch für IPv6 (optional) echo 1 > /proc/sys/net/ipv6/conf/all/forwarding 2>/dev/null || true log_info "IP Forwarding aktiviert" } disable_ip_forwarding() { log_info "Deaktiviere IP Forwarding..." echo 0 > /proc/sys/net/ipv4/ip_forward echo 0 > /proc/sys/net/ipv6/conf/all/forwarding 2>/dev/null || true log_info "IP Forwarding deaktiviert" } setup_iptables() { log_info "Konfiguriere iptables Regeln..." local local_net=$(get_local_network) log_info "Lokales Netzwerk: $local_net" # Erstelle eigene Chain für Gateway-Regeln (falls nicht vorhanden) iptables -N MGUARD_GW 2>/dev/null || true # Lösche vorhandene Regeln in unserer Chain iptables -F MGUARD_GW # Füge Chain in FORWARD ein (falls nicht vorhanden) if ! iptables -C FORWARD -j MGUARD_GW 2>/dev/null; then iptables -I FORWARD -j MGUARD_GW fi # Erlaube Traffic vom VPN zum lokalen Netz iptables -A MGUARD_GW -i "$VPN_INTERFACE" -o "$LOCAL_INTERFACE" -j ACCEPT log_info " - VPN → Lokal: ACCEPT" # Erlaube Rückverkehr (established, related) iptables -A MGUARD_GW -i "$LOCAL_INTERFACE" -o "$VPN_INTERFACE" -m state --state ESTABLISHED,RELATED -j ACCEPT log_info " - Lokal → VPN (established): ACCEPT" # NAT/Masquerading für ausgehenden Traffic if ! iptables -t nat -C POSTROUTING -s "$VPN_NETWORK" -o "$LOCAL_INTERFACE" -j MASQUERADE 2>/dev/null; then iptables -t nat -A POSTROUTING -s "$VPN_NETWORK" -o "$LOCAL_INTERFACE" -j MASQUERADE fi log_info " - NAT/Masquerade für VPN-Traffic aktiviert" log_info "iptables Regeln konfiguriert" } remove_iptables() { log_info "Entferne iptables Regeln..." # Entferne NAT-Regel iptables -t nat -D POSTROUTING -s "$VPN_NETWORK" -o "$LOCAL_INTERFACE" -j MASQUERADE 2>/dev/null || true # Entferne FORWARD-Jump iptables -D FORWARD -j MGUARD_GW 2>/dev/null || true # Lösche und entferne Chain iptables -F MGUARD_GW 2>/dev/null || true iptables -X MGUARD_GW 2>/dev/null || true log_info "iptables Regeln entfernt" } # ============================================================================= # Status-Anzeige # ============================================================================= show_status() { echo "" echo "==========================================" echo " Gateway Simulator Status" echo "==========================================" echo "" # IP Forwarding local ip_fwd=$(cat /proc/sys/net/ipv4/ip_forward) if [[ "$ip_fwd" == "1" ]]; then echo -e "IP Forwarding: ${GREEN}Aktiviert${NC}" else echo -e "IP Forwarding: ${RED}Deaktiviert${NC}" fi # VPN Interface if check_vpn_connection 2>/dev/null; then local vpn_ip=$(ip -4 addr show "$VPN_INTERFACE" 2>/dev/null | grep -oP '(?<=inet\s)\d+(\.\d+){3}') echo -e "VPN Interface: ${GREEN}$VPN_INTERFACE ($vpn_ip)${NC}" else echo -e "VPN Interface: ${RED}Nicht verbunden${NC}" fi # Lokales Interface detect_local_interface 2>/dev/null local local_ip=$(ip -4 addr show "$LOCAL_INTERFACE" 2>/dev/null | grep -oP '(?<=inet\s)\d+(\.\d+){3}') echo -e "Lokales Interface: $LOCAL_INTERFACE ($local_ip)" # iptables Regeln echo "" echo "iptables MGUARD_GW Chain:" if iptables -L MGUARD_GW -n 2>/dev/null; then echo "" else echo -e "${YELLOW}Chain nicht vorhanden${NC}" fi echo "" echo "NAT/Masquerade Regeln:" iptables -t nat -L POSTROUTING -n | grep -E "MASQUERADE|$VPN_NETWORK" || echo "Keine Masquerade-Regeln" echo "" echo "==========================================" # Netzwerk-Test echo "" echo "Netzwerk-Erreichbarkeits-Test:" echo "------------------------------" # Test lokales Gateway (meist .1) local gateway_ip=$(ip route | grep default | awk '{print $3}') if ping -c 1 -W 2 "$gateway_ip" &>/dev/null; then echo -e " Default Gateway ($gateway_ip): ${GREEN}Erreichbar${NC}" else echo -e " Default Gateway ($gateway_ip): ${RED}Nicht erreichbar${NC}" fi echo "" } # ============================================================================= # Hauptprogramm # ============================================================================= main() { case "${1:-}" in enable) check_root detect_local_interface echo "" echo "==========================================" echo " Gateway Simulator wird aktiviert..." echo "==========================================" echo "" enable_ip_forwarding setup_iptables echo "" log_info "Gateway-Funktion aktiviert!" echo "" echo "Dieses System leitet nun Traffic vom VPN-Server" echo "ins lokale Netzwerk weiter." echo "" echo "VPN-Clients können jetzt auf folgende Geräte zugreifen:" echo " - Alle Geräte im Netzwerk $(get_local_network)" echo "" # Status anzeigen show_status ;; disable) check_root detect_local_interface echo "" echo "==========================================" echo " Gateway Simulator wird deaktiviert..." echo "==========================================" echo "" remove_iptables disable_ip_forwarding log_info "Gateway-Funktion deaktiviert!" echo "" ;; status) detect_local_interface 2>/dev/null || true show_status ;; *) echo "" echo "Gateway Simulator für mGuard VPN" echo "================================" echo "" echo "Verwendung: sudo $0 {enable|disable|status}" echo "" echo "Befehle:" echo " enable - Aktiviert IP Forwarding und iptables Regeln" echo " disable - Deaktiviert Gateway-Funktion" echo " status - Zeigt aktuellen Status" echo "" echo "Dieses Script konfiguriert ein Linux-System als Gateway," echo "das VPN-Traffic ins lokale Netzwerk weiterleitet." echo "" exit 1 ;; esac } main "$@"