Projekt

Allgemein

Profil

Setup n2n-supernode » Historie » Revision 2

Revision 1 (Jeremias Keihsler, 12.01.2017 09:56) → Revision 2/3 (Jeremias Keihsler, 12.01.2017 09:59)

h1. Install n2n-Supernode 

 h2. Requirements 

 To install n2n you will need the following: 
 * a installed and supported operating system (e.g. CentOS 6.x) 
 * root-access 
 * EPEL repository 
 * a fast internet connection 

 h2. Preliminary note 

 most of this is taken from  
 * [[http://www.ntop.org/products/n2n/]] 
 * [[https://github.com/lukablurr/n2n_v2_fork/blob/master/doc/multiple-supernodes.pdf]] 
 * [[http://listgateway.unipi.it/mailman/listinfo/n2n]] 
 * [[http://listgateway.unipi.it/pipermail/n2n/2009-October/000300.html]] 

 h2. Install 

 <pre><code class="bash"> 
 yum install n2n 
 </code></pre> 

 h2. manual testing 

 h3. starting Supernode 

 <pre><code class="bash"> 
 supernode -l 5422 
 </code></pre> 

 h3. setting up firewall 

 in order to access the supernode from one of the edge-clients the given UDP-port must be accessible from outside. Therefore we need to open the firewall. 
 <pre><code class="bash"> 
 system-config-firewall-tui 
 </code></pre> 

 

 h2. running n2n-Supernode as a service 

 if everything is working as expected we maybe want n2n-Supernode to survive a system-reboot. 

 The following should work without modification for RHEL/CentOS linux and similar: 

 Create a folder /etc/n2n and create configuration files (as described below) using following file name format: 

 <pre><code class="bash"> 
 mkdir /etc/n2n 
 </code></pre> 

 <pre><code class="bash"> 
 supernode-gw1.example.com 
 supernode-gw2.example.com 
 supernode-*.example.com 
 </code></pre> 

 The interesting contents of supernode-gw1.example.com would look similar to this: 

 <pre><code class="bash"> 
 vim /etc/n2n/supernode-gw1.example.com 
 </code></pre> 
 <pre> 
 # == supernode config values parsed by /etc/rc.d/init.d/edged == 
 # Read 'man supernode' for details about these values... 
 # 
 # Example port number to listen on... 
 N2N_PORT="8765" 

 # Verbose or not (-v logs to std out)... 
 #     N2N_OPTS="-v" 
 N2N_OPTIONS="" 
 # === end supernode-gw1.example.com config file 
 ========== 
 </pre> 

 Read comments in the scripts below to make more sense out of how they work. 

 Here are copies of some scripts that work when used with configuration files as described above: 

 <pre><code class="bash"> 
 vim /etc/init.d/supernoded 
 </code></pre> 
 <pre> 
 #!/bin/sh 
 # $Id: supernoded.init,v 1.9 2009/10/23 12:34:56 
 # n2n supernode startup script. 
 # 
 # chkconfig:      345 96 26 
 # processname:    supernode 
 # pidfile:        /var/run/n2n-supernode.pid 
 # 
 # short-description: Provides client-to-client VPN access via Internet 
 # description: This is startup script for n2n 'edge', 
 #     n2n edge + supernode provide internet connection for vpn peers 
 # 
 # SEE: 
 #     for more options n2n 'man edge' and 'man supernode' 
 # 
 # NOTE: 
 #     Option to enter 'debug' as second var: e.g 'supernode start debug' 
 #     Using grep -w switch searches for whole word reduces ambiguity 
 #     Comment in/out the 'echo' stuff depending if thigs work as expected 
 #     Config files located/named in: /etc/n2n/supernode-your.example.com 
 #     Assumes CentOS linux init scripts located in /etc/rc.d/init.d/ 
 # 
 # Created: FOOFORCE RB 2009-10-24 
 # License GPL: free to copy, improve and use. 
 # http://fuji.unipi.it/pipermail/n2n/2009-October/000300.html 
 # =============================================================== 
 ========================================================= 

 # ==== main init script variables =============================== 
 ========================= 
 # Make sure you include path where 'supernode' + sh + tools are installed.. 
 # PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin" 
 PATH="/sbin:/bin:/usr/sbin:/usr/bin" 

 # The name + path to the program/daemon... 
 NAME="supernode" 
 DAEMON="/usr/sbin/${NAME}" 

 # Modify $NAME to filter on 'grep -w [s]supernode' - faster than 'grep -v grep'... 
 GREPNAME=$(echo "[s]${NAME#s}") 

 # Enable some simple debug messages when running this script... 
 if [[ "${2}" == "debug" ]]; then 
     echo "DEBUG: ${GREPNAME}" 
 fi 

 PIDFILE="/var/run/supernode.pid" 
 LOGFILE="/var/log/n2n-${NAME}.log" 
 STAMP=$(/bin/date +"%d/%b/%Y %H:%M:%S") 

 # Get the host/domain name to identify local configfile.. 
 HOST=$(/bin/hostname) 
 FQDN=$(/bin/hostname -f) 

 # Initialise configfile variable to empty value... 
 CONFIGDIR="/etc/n2n" 

 # Initialise configfile variable to empty value... 
 CONFIGFILE="" 

 # Source function library. 
 . /etc/rc.d/init.d/functions 

 # Load values from configfile using our local domain name: 
 # Example: 
 #     Our local FQDN = 'myhost.example.com' 
 #     Our configfile = 'supernode-myhost.example.com' 
 # 
 # if [[ "${HOST}" == "" ]]; then 
 if [[ "${FQDN}" == "" ]]; then 
     echo " ERROR: Missing ${FQDN} hostname in config file /etc/rc.d/init.d/${NAME}" 
     exit 1 
 else 
     CONFIGFILE="/etc/n2n/supernode-${FQDN}" 
 fi 

 if [[ -f "${CONFIGFILE}" ]]; then 
     # Get values from local configuration file... 
     if [[ "${2}" ==    "debug" ]]; then 
         echo " Found config file: ${CONFIGFILE}" 
     fi 
     . ${CONFIGFILE} 
 else 
     echo "ERROR: Missing config file ${CONFIGFILE}" 
     exit 1 
 fi 

 # See if pid file exists and get pid number... 
 if [[ -f "${PIDFILE}" ]]; then 
     CURPID=$(cat ${PIDFILE}) 
 fi 

 # Quit if we can't find application... 
 test -f ${DAEMON} || exit 0 

 set -e 

 # Set any value to enable this script... 
 # N2N_RUN=1 
 # 
 # test -n "${N2N_RUN}" || exit 0 

 # Optionaly change into n2n config directory... 
 if [[ -d "${CONFIGDIR}" ]]; then 
     cd ${CONFIGDIR} 
 fi 
 # ============================================================== 
 ======================================================== 
 # Should not need to change much below here... 
 # ==== see how we were called    + act accordingly =============== 
 ========= 

 if [ "${N2N_PORT}" == "" ]; then 
     N2N_PORT="1304" 
     echo "No port specified in ${CONFIGFILE} - using    default port: ${N2N_PORT}" 
 fi 

 case "${1}" in 
     start) 
         # echo " ${NAME} ${1} process is ${0} on pid: ${$})..." 
         echo "${STAMP} start n2n /etc/rc.d/init.d/${NAME}" >> ${LOGFILE} 

         if [[ -n "${CURPID}" ]]; then 
             echo " A PID:${CURPID} already exists for ${0}:" 
             echo " To re-start with current config settings, run '$0 stop' then '$0 start' ..." 
         else 
         if [ -d /var/lock/subsys ] ; then 
             touch /var/lock/subsys/${NAME}; 
         fi 

             # ==================================================== 
 ============================================== 
             # All variables read from ${CONFIGFILE}... 
             # If variable value not empty then add command-line switch to variable... 
             if [[ -n "${N2N_PORT}" ]]; then 
                 N2N_PORT="-l ${N2N_PORT}"; 
             fi 

             # next line for debug: 
             if [[ "${2}" == "debug" ]]; then 
                 echo " DEBUG: ${DAEMON} ${N2N_PORT} ${N2N_OPTIONS}" 
             fi 

             # Execute the command + switches + values sources from config file... 
             echo -n $"Starting $NAME: " 
             ${DAEMON} ${N2N_PORT} ${N2N_OPTIONS} >> ${LOGFILE} & 
             RETVAL=$? 

             [ $RETVAL -eq 0 ] && echo_success 
             [ $RETVAL -ne 0 ] && echo_failure 
             echo 

             # ================================================= 
 =========================================== 
             if [[ "${2}" ==    "debug" ]]; then 
                 echo " NOTICE: Creating new ${NAME} pidfile - deleting old ${CURPID}..." 
             fi 

             rm -f ${PIDFILE} 
             touch ${PIDFILE} 

             for PID in $(ps ax | grep -w "${GREPNAME}" | grep -v "(restart|stop|start)" | awk '{ print $1 }'); do 
                 if [[ "${2}" ==    "debug" ]]; then 
                     echo " Saving into pidfile - new pid: ${PID}" 
                 fi 
                 echo ${PID} >> ${PIDFILE} 
             done 
         fi 
         ;; 
     stop) 
         # echo " DEBUG: Searching for at least one live process id..." 
         PID=$(ps ax | grep -w "${GREPNAME}" | grep -v "(restart|stop|start)" | awk '{ print $1 }') 

         if [[ "${2}" == "debug" ]]; then 
             echo " This ${NAME} ${1} init query ${0} is running on pid: ${$}) for ${PID}..." 
         fi 

         # echo " ${NAME} ${1} process is ${0} on pid: ${$})..." 
         echo "${STAMP} stop /etc/rc.d/init.d/${NAME}" >> ${LOGFILE} 

         # echo "    NOTICE: Kill name:${NAME} pid:${pid} before stopping..." 
         # kill -9 $(cat /var/run/${NAME}_pid) && rm /var/run/${NAME}_pid 

         # If a pid value found in file or in process id, then kill it... 
         if [[ -n "${PID}" ]]; then 
             echo -n    $"Stopping ${NAME}: " 
             # kill -9 $(cat /var/run/${NAME}.pid) && rm /var/run/${NAME}.pid 
             kill ${PID} 
             RETVAL=$? 
             sleep 4s 
             rm -f ${PIDFILE} 
             if [ $RETVAL -eq 0 ] ; then 
                 echo_success 
                 echo 
             else 
                 echo_failure 
                 echo 
             fi 
         else 
             # Else assume stale pid... 
             if [[ "${2}" == "debug" ]]; then 
                 echo " NOTICE: No current active process ${PID}..." 
             fi 

             if [[ -f "${PIDFILE}" ]]; then 
                 rm -f "${PIDFILE}" 
             fi 
         fi 

         # Indiscriminate pid killer... 
         # for PID in $(ps ax | grep -w ${NAME} | grep -v stop | awk '{ print $1 }'); do 
         #      echo " Killing currently active ${NAME} pid(s): ${PID}" 
         #      # kill -HUP $PID 
         #      kill ${PID} 
         # done 

         if [ -f /var/lock/subsys/${NAME} ]; then 
             if [[ "${2}" ==    "debug" ]]; then 
                 echo " Removing stale lock..." 
             fi 
             rm -f /var/lock/subsys/${NAME} 
         fi 

         if [ -f "${PIDFILE}" ]; then 
             echo " Removing stale pidfile..." 
             rm -f ${PIDFILE} 
         fi 
         ;; 
     restart) 
         echo "* Re-start ${NAME}..." 
         ${0} stop ${2} 

         # Not a race... 
         sleep 4s 

         ${0} start ${2} 
         ;; 
     status) 
         # status ${NAME} 

         if [[ "${2}" == "debug" ]]; then 
             echo " This init script ${NAME} ${1} query ${0} is running on pid: ${$})..." 
         fi 

         PID=$(ps ax | grep -w "${GREPNAME}" | grep -v status | awk '{ print $1 }') 

         # If at least one active session then find all... 
         if [[ -n "${PID}" ]]; then 
             for PID in $(ps ax | grep -w "${GREPNAME}" | grep -v status | awk '{ print $1 }'); do 
                 if [[ -n "${PID}" ]]; then 
                     echo "${NAME} (pid ${PID}) is running..." 
                 else 
                     echo "${NAME} is stopped" 
                 fi 
             done 
         else 
             echo "${NAME} is stopped" 
         fi 
         ;; 
     *) 
         echo " Usage: ${0} {start|stop|status|restart|any debug}" >&2 
         exit 1 
         ;; 
 esac 
 exit 0 
 # === end supernoded ====================================== 
 ================================ 
 </pre> 

 make init-script executeable 
 <pre><code class="bash"> 
 chmod +x /etc/init.d/supernoded 
 </code></pre> 

 Using CentOS tools to activate the systemV init scripts: 
 <pre><code class="bash"> 
 chkconfig --add supernoded 
 chkconfig supernoded on 
 </code></pre> 

 Command line syntax: 
 <pre><code class="bash"> 
 service supernoded [start|stop|restart|any debug] 
 </code></pre> 
 For example: 
 <pre><code class="bash"> 
 service supernoded restart 
 </code></pre> 
 … OR… 
 <pre><code class="bash"> 
 service supernoded restart debug 
 </code></pre> 
 provides some extra clues.