script_polling.sh

 avatar
unknown
sh
a year ago
6.2 kB
19
Indexable
#!/bin/bash

# Configurazione
SSH_CONFIG="/etc/ssh/sshd_config"
TUNNEL_IFACE="tap0"
TUNNEL_IP="10.0.0.1"
TUNNEL_NETMASK="255.255.255.0"
REMOTE_USER="root"
REMOTE_IP="162.19.143.53" # Indirizzo pubblico del firewall di green
PROXY_ARP_FILE="/proc/sys/net/ipv4/conf/$TUNNEL_IFACE/proxy_arp"

# Rilevamento automatico dell'interfaccia di rete
NETWORK_INTERFACE=$(ip -o link show | awk -F': ' '{print $2}' | grep -E '^(ens160|eth0)$')
if [ -z "$NETWORK_INTERFACE" ]; then
    echo "Nessuna interfaccia ens160 o eth0 trovata."
    exit 1
fi

# Aggiornamento delle regole NAT con la variabile NETWORK_INTERFACE
NAT_RULE1="-A FORWARD -i $TUNNEL_IFACE -o $NETWORK_INTERFACE -j ACCEPT"
NAT_RULE2="-A FORWARD -i $NETWORK_INTERFACE -o $TUNNEL_IFACE -j ACCEPT"
MASQUERADE_RULE="-t nat -A POSTROUTING -o $NETWORK_INTERFACE -j MASQUERADE"

# Funzione per aggiornare sshd_config e riavviare il servizio SSH se necessario
update_sshd_config() {
    echo -e "\n\n\n\n\nVerifico la configurazione SSH..."
    local updated=0
    grep -q "^PermitTunnel yes" $SSH_CONFIG || { sed -i '/^#PermitTunnel yes/c\PermitTunnel yes' $SSH_CONFIG; updated=1; }
    grep -q "^PermitRootLogin yes" $SSH_CONFIG || { sed -i '/^#PermitRootLogin yes/c\PermitRootLogin yes' $SSH_CONFIG; updated=1; }
    if [ $updated -eq 1 ]; then
        echo "Aggiornamento della configurazione SSH necessario. Riavvio il servizio..."
        systemctl restart sshd
        echo "Servizio SSH riavviato."
    else
        echo "La configurazione SSH è già corretta."
    fi
}

# Funzione per configurare l'interfaccia tap
configure_tap_interface() {
    echo "Verifico l'interfaccia $TUNNEL_IFACE..."
    if ! ip addr show $TUNNEL_IFACE &>/dev/null; then
        echo "Creazione dell'interfaccia $TUNNEL_IFACE..."
        tunctl -t $TUNNEL_IFACE
        ifconfig $TUNNEL_IFACE $TUNNEL_IP netmask $TUNNEL_NETMASK up
        echo "Interfaccia $TUNNEL_IFACE creata."
    else
        echo "L'interfaccia $TUNNEL_IFACE è già configurata."
    fi
}

# Funzione per stabilire la VPN layer 2 se non è già attiva
:'
establish_vpn() {
    echo "Verifico la connessione VPN..."
    if ! ip link show $TUNNEL_IFACE | grep -q "state UP"; then
        echo "Stabilisco la connessione VPN..."
        # Legge la password da password.txt
        PASSWORD=$(</root/password.txt)
        # Utilizza expect per passare la password a SSH
        expect -c "
            set timeout -1
            spawn ssh -o Tunnel=ethernet -w 0:0 $REMOTE_USER@$REMOTE_IP true
            expect \"*?assword:*\" { send -- \"$PASSWORD\r\" }
            expect eof
        " &
        sleep 4
        # Verifica se la connessione è stata stabilita
        if ip link show $TUNNEL_IFACE | grep -q "state UP"; then
            echo "Connessione VPN stabilita."
        else
            echo "Errore nella stabilizzazione della connessione VPN."
            exit 1
        fi
    else
        echo "La connessione VPN è già attiva."
    fi

    echo -e "La connessione VPN è attiva. Monitoraggio in corso...\n\n\n"
    while ip link show $TUNNEL_IFACE | grep -q "state UP"; do
        sleep 5 # Controlla ogni 5 secondi se la connessione è ancora attiva
    done

    echo -e "\n\n\n\n\nERRORE!\nLa connessione VPN è stata interrotta!\n\n\n\n"
    exit 1
}
'



establish_vpn() {
    echo "Verifico la connessione VPN..."
    if ip link show $TUNNEL_IFACE | grep -q "state UP"; then
        echo "La connessione VPN è già attiva."
        return 0
    fi

    echo "Stabilisco la connessione VPN..."
    PASSWORD=$(</root/password.txt)
    expect -c "
        set timeout -1
        spawn ssh -o Tunnel=ethernet -w 0:1 $REMOTE_USER@$REMOTE_IP true
        expect \"*?assword:*\" { send -- \"$PASSWORD\r\" }
        expect eof
    "
    sleep 4

    if ip link show $TUNNEL_IFACE | grep -q "state UP"; then
        echo "Connessione VPN stabilita."
    else
        echo "Errore nella stabilizzazione della connessione VPN."
        exit 1
    fi
}



# Funzione per verificare lo stato dell'interfaccia tap
check_tap_interface() {
    echo "Controllo lo stato dell'interfaccia $TUNNEL_IFACE..."
    if ! ip link show $TUNNEL_IFACE | grep -q "state UP"; then
        echo "Errore: L'interfaccia $TUNNEL_IFACE non è su stato UP."
    else
        echo "L'interfaccia $TUNNEL_IFACE è attiva e su stato UP."
    fi
}

# Funzione per configurare le regole NAT
configure_nat_rules() {
    echo "Verifico le regole di NAT..."
    if ! iptables -C FORWARD -i $TUNNEL_IFACE -o $NETWORK_INTERFACE -j ACCEPT 2>/dev/null; then
        echo "Inserisco la regola di NAT per il traffico da $TUNNEL_IFACE a $NETWORK_INTERFACE..."
        iptables $NAT_RULE1
        echo "Regola di NAT inserita."
    else
        echo "La regola di NAT per il traffico da $TUNNEL_IFACE a $NETWORK_INTERFACE è già presente."
    fi
    if ! iptables -C FORWARD -i $NETWORK_INTERFACE -o $TUNNEL_IFACE -j ACCEPT 2>/dev/null; then
        echo "Inserisco la regola di NAT per il traffico da $NETWORK_INTERFACE a $TUNNEL_IFACE..."
        iptables $NAT_RULE2
        echo "Regola di NAT inserita."
    else
        echo "La regola di NAT per il traffico da $NETWORK_INTERFACE a $TUNNEL_IFACE è già presente."
    fi
    if ! iptables -t nat -C POSTROUTING -o $NETWORK_INTERFACE -j MASQUERADE 2>/dev/null; then
        echo "Inserisco la regola di masquerading per il traffico in uscita su $NETWORK_INTERFACE..."
        iptables $MASQUERADE_RULE
        echo "Regola di masquerading inserita."
    else
        echo "La regola di masquerading per il traffico in uscita su $NETWORK_INTERFACE è già presente."
    fi
}

# Funzione per abilitare il proxy ARP
enable_proxy_arp() {
    echo "Abilito il proxy ARP per l'interfaccia $TUNNEL_IFACE..."
    echo 1 > $PROXY_ARP_FILE
    echo "Proxy ARP abilitato."
}

# Esecuzione delle funzioni
update_sshd_config
configure_tap_interface
check_tap_interface
configure_nat_rules
enable_proxy_arp
establish_vpn

# Fine dello script
echo "Script completato."