openvpn-endpoint-server/tools/gatewaysimulator.sh

307 lines
9.2 KiB
Bash
Executable File

#!/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 "$@"