307 lines
9.2 KiB
Bash
Executable File
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 "$@"
|