Files
Server-scripts/network/networksettings.sh
T
2026-09-14 12:43:38 +02:00

436 lines
13 KiB
Bash
Executable File

#!/bin/bash
green="\e[32m"
red="\e[31m"
blue="\e[34m"
norm="\e[0m"
#IFS='\n'
hostname="$(hostname)"
export LOG_DIR="/home/lucas/.LOG"
export VPN_DIR="/home/lucas/Documents/Dokumente/Projekte/Server/VPN/"
export SCRIPTS_DIR="/home/lucas/Documents/Dokumente/Projekte/Server/scripts"
ls ${SCRIPTS_DIR} >>/dev/null 2>&1
if [ $? -ne 0 ]; then
export VPN_DIR="/home/lucas/Documents/Dokumente/Projekte/Server/VPN/"
export SCRIPTS_DIR="/home/lucas/Documents/Dokumente/Projekte/Server/scripts"
ls ${SCRIPTS_DIR} >>/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "Script Dir Not present"
exit
fi
fi
date=$(date +"%m%d%H%M%S")
SINGLE=false
EXPRESSVPN=false
SHARKVPN=true
LOG=false
DELUGE_MODE=false
GATEWAY_MODE=false
NORMAL_MODE=false;
QUIT=false;
LIST=false
usage(){
printf "Usage:
-n\t\tNormal Mode
-del\t\tDeluge Mode
-list\t\tList ovpn Files
-all\t\tUse all Files(FreeVPN)
-std\t\tTry a default vpn first
-gw\t\tGateway Mode(Raspberry)
-q\t\tQuit VPN
-l\t\tLog Output
-s <param>\tSearch Mode
-tu\t\tConnect to TU Wien VPN
-tud\t\tDisconnect from TU Wien VPN
-h\t\tHelp\n"
}
display_ip() {
if [ "$1" == "duser" ]; then
OBJ_duser_cmd="sudo -u deluge-user -i -- "
else
OBJ_duser_cmd=""
fi
echo whoami
OBJ_USER=$(${OBJ_duser_cmd}whoami)
OBJ_PUB_COUNTRY="Austria"
count=0
while true; do
sleep 1
OBJ_PUBIP=$(${OBJ_duser_cmd}wget -T 10 -qO- ifconfig.co)
OBJ_PUB_COUNTRY=$(${OBJ_duser_cmd}wget -T 10 -qO- ifconfig.co/country)
if [[ "${DELUGE_MODE}" == "true" ]] || [[ "${OBJ_PUB_COUNTRY}" != "Austria" ]] && [[ "${OBJ_PUB_COUNTRY}" != "" ]] || [[ "${OBJ_PUBIP}" != "${STDIP}" ]] && [[ "${OBJ_PUBIP}" != "" ]]; then
break
fi
printf ". "
if [ ${count} -gt 20 ]; then
echo "Timeout... VPN Failed"
break
fi
((count++))
done
printf "User: ${OBJ_USER}"
for ((i=${#OBJ_USER};i<20;i++)); do
printf " "
done
printf "IP: $OBJ_PUBIP\tCountry: $OBJ_PUB_COUNTRY\n"
}
connect_tuwien() {
if [ "$(pgrep openvpn)" != "" ]; then
printf "VPN already existing --- Killed\n"
kill $(pgrep openvpn)
sleep 1
pgrep openvpn
fi
printf "VPN \t\t\t\t[${green}DOWN${norm}]\n"
if [ $(/opt/cisco/anyconnect/bin/vpn state | grep Disconnected | wc -l) -gt 0 ]; then
sudo -u lucas /opt/cisco/anyconnect/bin/vpn -s < /home/lucas/.vpn_creds connect vpn.tuwien.ac.at
echo "Disconnect with vpn -tud"
else
echo "TU VPN not disconnected"
fi
}
disconnect_tuwien() {
/opt/cisco/anyconnect/bin/vpn disconnect
/home/lucas/Documents/Dokumente/Projekte/Server/scripts/network/networksettings.sh -std
}
get_config() {
while [[ ${1:0:1} == - ]]; do
echo "Param: $1"
[[ $1 == -n ]] && {
NORMAL_MODE=true;
shift 1;
continue;
};
[[ $1 == -del ]] && {
DELUGE_MODE=true;
shift 1;
continue;
};
[[ $1 == -std ]] && {
SINGLE=true
SEARCH="austria"
shift 1;
continue;
};
[[ $1 == -list ]] && {
LIST=true;
shift 1;
continue;
};
[[ $1 == -all ]] && {
EXPRESSVPN=false;
shift 1;
continue;
};
[[ $1 == -gw ]] && {
GATEWAY_MODE=true;
shift 1;
continue;
};
[[ $1 == -q ]] && {
QUIT=true;
shift 1;
continue;
};
[[ $1 == -l ]] && {
LOG=true;
shift 1;
continue;
};
[[ $1 == -h ]] && {
usage;
exit;
};
[[ $1 == -tu ]] && {
connect_tuwien;
exit;
};
[[ $1 == -tud ]] && {
disconnect_tuwien;
exit;
};
[[ $1 == -s ]] && {
if [ "$2" == "" ]; then
echo "Search Parameter Missing"
usage;
exit;
fi
SINGLE=true;
SEARCH="$2"
shift 2;
continue;
};
echo "Parameter $1 wrong"
usage
exit 1;
done
}
connect_vpn() {
export STDIP=$(wget -T 10 -qO- ifconfig.co)
export NETIF="$(lshw -class network | grep -A6 "Ethernet interface" | grep name | awk -F': ' '{print $2}')"
if [ "${hostname}" == "raspberry" ]; then
export NETIF="$(lshw -class network | grep -A6 "Wireless interface" | grep name | awk -F': ' '{print $2}')"
fi
find ${LOG_DIR}/log_* -mtime +1 -type f -delete
1>${LOG_DIR}/log_${hostname}_$date.log
IFS=$'\n'; set -f
if $EXPRESSVPN; then
SEARCH_EXPRESS="my_expressvpn_"
elif $SHARKVPN; then
SEARCH_EXPRESS="surfshark"
else
SEARCH_EXPRESS=""
fi
if $SINGLE; then
VPN_arr=($(find ${VPN_DIR} -name '*.ovpn' | grep "${SEARCH_EXPRESS}" | grep -i "${SEARCH}"))
filename="${VPN_arr[0]}"
else
VPN_arr=($(find ${VPN_DIR} -name '*.ovpn' | grep "${SEARCH_EXPRESS}"))
NUM=$(($RANDOM % ${#VPN_arr[@]}))
filename="${VPN_arr[${NUM}]}"
fi
unset IFS; set +f
export PUBIP=($(dig +short $(cat $filename | grep "remote " | cut -d' ' -f2)))
if [ "$(pgrep openvpn)" != "" ]; then
printf "VPN already existing --- Killed\n"
kill $(pgrep openvpn)
sleep 1
pgrep openvpn
fi
printf "VPN \t\t\t\t[${green}DOWN${norm}]\n"
while [ -z ${VPNIF} ] && [ ${#VPN_arr[@]} -ge 1 ] ; do
printf "OpenVPN: Connect to: $blue$( echo $filename | rev | cut -f1 -d'/' | rev)${norm}, ${NUM} of ${#VPN_arr[@]} VPNs\n"
if $DELUGE_MODE; then
filename_buffer="$(echo ${filename} | sed 's/\.ovpn/BUFF.ovpn/g')"
if $EXPRESSVPN; then
cat ${filename} | grep -v 'pull' | sed 's/dev tun/client\ndev tun/g' | sed 's/<cert>/route-nopull\nscript-security 2\ndown '$(echo ${SCRIPTS_DIR} | sed 's/\//\\\//g')'\/network\/rev_routing.sh\n<cert>/g' > ${filename_buffer}
elif $SHARKVPN; then
cat ${filename} | grep -v 'pull' | sed 's/<ca>/route-nopull\nscript-security 2\ndown '$(echo ${SCRIPTS_DIR} | sed 's/\//\\\//g')'\/network\/rev_routing.sh\n<ca>/g' > ${filename_buffer}
fi
filename=${filename_buffer}
fi
if ${LOG}; then
exec 3>&1 4>&2 1>>${LOG_DIR}/log_${hostname}_$date.log 2>&1
fi
echo "${SCRIPTS_DIR}/network/openvpn.sh $filename"
bash ${SCRIPTS_DIR}/network/openvpn.sh $filename
# if ${LOG}; then
# exec 1>&3 2>&4
# fi
printf "Load tun interface "
count=0
while [ -z ${VPNIF} ] && [ -z ${VPNIP} ] && [ -z ${P2PIP} ]; do
sleep 1
export VPNIF="$(ip -br link | cut -f1 -d' ' | grep -o tun[0-9])"
if [ ! -z ${VPNIF} ]; then
export VPNIP=$(ip addr show ${VPNIF} | grep -Po '(?<=inet )([0-9\.]+)')
export P2PIP=$(ip addr show ${VPNIF} | grep -Po '(?<=peer )([0-9\.]+)')
export P2PIP=$VPNIP
fi
printf ". "
if [ ${count} -gt 20 ]; then
echo "Timeout... VPN Failed"
break
fi
((count++))
done
echo ""
echo "VPN IF: ${VPNIF}, VPN IP: ${VPNIP}, P2P IP: ${P2PIP}"
export MARK_ID="0x32"
export VPNIF="$(ip -br link | cut -f1 -d' ' | grep -o tun[0-9])"
export VPNUSER="deluge-user"
export LOCALIP=$(ip addr show ${NETIF} | grep -Po '(?<= inet )([0-9\.]+)')
if [ ! -z ${VPNIF} ]; then
export VPNIP=$(ip addr show ${VPNIF} | grep -Po '(?<=inet )([0-9\.]+)')
export P2PIP=$(ip addr show ${VPNIF} | grep -Po '(?<=peer )([0-9\.]+)')
export P2PIP=$VPNIP
fi
if [ -z ${VPNIF} ] || [ -z ${VPNIP} ]; then
if ${LOG}; then
exec 1>&3 2>&4
fi
echo "VPN IF: ${VPNIF}, VPN IP: ${VPNIP}, P2P IP: ${P2PIP}"
printf "VPN\t\t\t\t[${red}FAIL${norm}]\n"
unset VPN_arr[${NUM}]
VPN_arr=("${VPN_arr[@]}")
if [ ${#VPN_arr[@]} -lt 1 ]; then break; fi
NUM=$(($RANDOM % ${#VPN_arr[@]}))
filename="${VPN_arr[$NUM]}"
echo "VPN arr size: ${#VPN_arr[@]}, NUM: $NUM, filename: $filename"
pkill openvpn
fi
if ${DELUGE_MODE}; then
rm ${filename_buffer}
if [ "$(ls $(echo ${filename_buffer} | rev | cut -f2- -d'/' | rev) | grep "BUFF\.ovpn")" != "" ]; then
rm $(echo ${filename_buffer} | rev | cut -f2- -d'/' | rev)/*BUFF.ovpn
fi
fi
done
if [ -z ${VPNIF} ] || [ -z ${VPNIP} ] ; then
printf "VPN\t\t\t\t[${red}FAIL${norm}]\n"
printf "VPN Script failed: IF: ${VPNIF}\n" >>${LOG_DIR}/log_${hostname}_$date.log
pkill openvpn
exit 0
fi
printf "VPN\t\t\t\t[${green}OK${norm}]\n"
if ${DELUGE_MODE}; then
printf "${LOCALIP} at ${NETIF}\n" >>${LOG_DIR}/log_${hostname}_$date.log
printf "${VPNIP} at VPN IP: ${VPNIF} and P2P IP: ${P2PIP}, User: $VPNUSER, Mark ID: $MARK_ID\n" >>${LOG_DIR}/log_${hostname}_$date.log
for PUB_IP_ADDR in ${PUBIP[@]}; do
echo "Public VPN IP: ${PUB_IP_ADDR}" >>${LOG_DIR}/log_${hostname}_$date.log
done
printf "${VPNIF}: ${VPNIP}\n";
if ${LOG}; then
exec 3>&1 4>&2 1>>${LOG_DIR}/log_${hostname}_$date.log 2>&1
fi
printf "Execute IPTables.sh\n"
bash ${SCRIPTS_DIR}/network/iptables_basic.sh -deluge-mode #>>${LOG_DIR}/log_${hostname}_$date.log
printf "Execute routing.sh\n"
bash ${SCRIPTS_DIR}/network/routing.sh #>>${LOG_DIR}/log_${hostname}_$date.log
printf "Modified IP Route List\n"
ip route list
printf "Modified ip route list table deluge-user\n"
ip route list table deluge-user
printf "Set reverse path source validation to lose mode\n"
sysctl_var=("net.ipv4.conf.all.rp_filter" "net.ipv4.conf.default.rp_filter" "net.ipv4.conf.${VPNIF}.rp_filter" "net.ipv4.conf.lo.rp_filter" "net.ipv4.conf.${NETIF}.rp_filter")
for ((i=0;i<${#sysctl_var[@]};i++)); do
echo $1: ${sysctl_var[$i]}, $(sysctl -n ${sysctl_var[$i]})
if [ $(sysctl -n ${sysctl_var[$i]}) -ne 2 ]; then
echo $i
sysctl -w ${sysctl_var[$i]}=2
fi
done
if ${LOG}; then
exec 1>&3 2>&4
fi
printf "IPtables:\t\t\t[${green}OK${norm}]\n"
printf "IProute:\t\t\t[${green}OK${norm}]\n"
printf "RPFilter:\t\t\t[${green}OK${norm}]\n"
if [ "$userIP" != "$duserIP" ] && [ "$duserIP" != "" ] ; then
printf "VPN Settings:\t\t\t[${green}OK${norm}]\n$(whoami)IP: $userIP\nduserIP: $duserIP \n"
fi
printf "deluged service:\t\t"
if [ "$(ps -elf | grep deluged | grep 'deluge-+')" == "" ]; then
sudo -u deluge-user -i -- deluged
sleep 0.3
if [ $(ip addr | grep "127.0.0.2" | wc -l) -eq 0 ]; then
ip addr add 127.0.0.2 dev lo
fi
fi
if [ "$(pgrep deluged)" != "" ]; then
printf "[${blue}UP${norm}]\n"
else
printf "[${red}FAIL${norm}]\n"
fi
elif ${GATEWAY_MODE}; then
SUBNETIF="eth0"
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o ${VPNIF} -j MASQUERADE
iptables -A FORWARD -i ${SUBNETIF} -o ${VPNIF} -j ACCEPT
iptables -A FORWARD -i ${VPNIF} -o ${SUBNETIF} -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -D FORWARD -i eth0 -o wlan0 -j ACCEPT
iptables -D FORWARD -i wlan0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
printf "${VPNIP} at VPN IP: ${VPNIF} \nP2P IP: ${P2PIP}\nUser: $VPNUSER\n"
for PUB_IP_ADDR in ${PUBIP[@]}; do
echo "Public VPN IP: ${PUB_IP_ADDR}"
done
printf "${VPNIF}: ${VPNIP}\n";
else
printf "${VPNIP} at VPN IP: ${VPNIF}\nP2P IP: ${P2PIP}\nUser: $VPNUSER\n"
for PUB_IP_ADDR in ${PUBIP[@]}; do
echo "Public VPN IP: ${PUB_IP_ADDR}"
done
printf "${VPNIF}: ${VPNIP}\n";
printf "IF: ${NETIF}\n"
fi
}
printf "Timestamp: $date\n"
get_config "$@"
if { [ "${NORMAL_MODE}" == "false" ] && [ "${DELUGE_MODE}" == "false" ] && [ "${GATEWAY_MODE}" == "false" ]; } || [ $# -eq 0 ]; then
echo "No Mode Argument passed, choose by host"
if [ "$(hostname)" == "quiethost" ]; then
NORMAL_MODE=true
fi
if [ "$(hostname)" == "serverhost" ]; then
DELUGE_MODE=true
fi
if [ "$(hostname)" == "raspberry" ]; then
GATEWAY_MODE=true
fi
fi
if ${QUIT}; then
if [ "$(pgrep openvpn)" == "" ]; then
printf "VPN not active\n"
else
echo "Disable VPN"
pkill openvpn
su - lucas -c "bash ${SCRIPTS_DIR}/profile_motd2.sh"
fi
display_ip
exit 0
fi
if ${LIST}; then
find ${VPN_DIR} -name '*.ovpn'
exit
fi
if ${DELUGE_MODE} && [ "$(hostname)" != "serverhost" ]; then
echo "Deluge Mode"
printf "Hostname is %s, continue?(y/*)" "$(hostname)"
read -t 10 -n 1 choice
if [ "$choice" != "y" ]; then
printf "\nAbort\n"
exit
fi
elif ${DELUGE_MODE}; then
printf "${blue}Deluge Mode${norm}\n"
fi
if ${GATEWAY_MODE} && [ "$(hostname)" != "raspberry" ]; then
echo "Gateway Mode"
printf "Hostname is %s, continue?(y/*)" "$(hostname)"
read -t 10 -n 1 choice
if [ "$choice" != "y" ]; then
printf "\nAbort\n"
exit
fi
elif ${GATEWAY_MODE}; then
printf "${blue}Gateway Mode${norm}\n"
fi
if ${NORMAL_MODE}; then
printf "${blue}Normal Mode${norm}\n"
fi
connect_vpn
sleep 2
display_ip
if ${DELUGE_MODE}; then
display_ip "duser"
if [[ "$(ps -elf | grep -v grep | grep noip)" == "" ]] ; then
if [[ "$(service noip-duc status | grep 'active (running)')" == "" ]]; then
#/usr/local/bin/noip2 &
# Install noip service
#
echo "Install noip service"
fi
fi
elif ${GATEWAY_MODE}; then
if [ "$(hostname)" == "quiethost" ]; then
bash "${SCRIPTS_DIR}/profile_motd2.sh"
fi
fi
if [ "$(hostname)" == "quiethost" ]; then
su - lucas -c "bash ${SCRIPTS_DIR}/quiethost/servertunnel.sh"
fi