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