Setup n2n-edge » Historie » Version 2
Jeremias Keihsler, 12.01.2017 10:04
1 | 1 | Jeremias Keihsler | h1. Install n2n-Edgenode |
---|---|---|---|
2 | |||
3 | h2. Requirements |
||
4 | |||
5 | To install n2n you will need the following: |
||
6 | * a installed and supported operating system (e.g. CentOS 6.x) |
||
7 | * root-access |
||
8 | * EPEL repository |
||
9 | * a fast internet connection |
||
10 | |||
11 | h2. Preliminary note |
||
12 | |||
13 | most of this is taken from |
||
14 | * [[http://www.ntop.org/products/n2n/]] |
||
15 | * [[https://github.com/lukablurr/n2n_v2_fork/blob/master/doc/multiple-supernodes.pdf]] |
||
16 | * [[http://listgateway.unipi.it/mailman/listinfo/n2n]] |
||
17 | * [[http://listgateway.unipi.it/pipermail/n2n/2009-October/000300.html]] |
||
18 | |||
19 | h2. Install |
||
20 | |||
21 | The EPEL-Repository is a requirement. |
||
22 | |||
23 | [[repo_epel|Install EPEL repository]] |
||
24 | <pre><code class="bash"> |
||
25 | yum install n2n |
||
26 | </code></pre> |
||
27 | |||
28 | h2. manual testing |
||
29 | |||
30 | h3. starting Edgenode |
||
31 | |||
32 | maybe simple as |
||
33 | <pre><code class="bash"> |
||
34 | edge -a 10.1.2.5 -c mynetwork -k mypwd -l 94.136.160.87:5644 |
||
35 | </code></pre> |
||
36 | |||
37 | <pre><code class="bash"> |
||
38 | edge -d n2n0 -c mynetwork -k encryptme -u 99 -g 99 -m DE:AD:BE:EF:01:23 -a 192.168.254.7 -p 50001 -l 123.121.120.119:7654 |
||
39 | </code></pre> |
||
40 | |||
41 | Start edge with TAP device n2n0 on community "mynetwork" with community supernode at 123.121.120.119 UDP port 7654 and bind the locally used UDP port to50001. Use "encryptme" as the single permanent shared encryption key. Assign MACaddress DE:AD:BE:EF:01:23 to the n2n interface and drop to user=99 and group=99 after the TAP device is successfull configured. |
||
42 | |||
43 | Add the -f option to stop edge running as a daemon. |
||
44 | |||
45 | Somewhere else setup another edge with similar parameters, eg. |
||
46 | <pre><code class="bash"> |
||
47 | edge -d n2n0 -c mynetwork -k encryptme -u 99 -g 99 -m DE:AD:BE:EF:01:21 -a 192.168.254.5 -p 50001 -l 123.121.120.119:7654 |
||
48 | </code></pre> |
||
49 | |||
50 | Now you can ping from 192.168.254.5 to 192.168.254.7. |
||
51 | |||
52 | 2 | Jeremias Keihsler | The MAC address (-m <MAC>) and virtual IP address (-a <addr>) must be different on all edges in the same community. |
53 | 1 | Jeremias Keihsler | |
54 | h2. running n2n-EdgeNode as a service |
||
55 | |||
56 | if everything is working as expected we maybe want n2n-edgenode to survive a system-reboot. |
||
57 | |||
58 | The following should work without modification: |
||
59 | |||
60 | Create a folder /etc/n2n and create configuration files (as described below) using following file name format: |
||
61 | |||
62 | <pre><code class="bash"> |
||
63 | mkdir /etc/n2n |
||
64 | </code></pre> |
||
65 | |||
66 | <pre><code class="bash"> |
||
67 | edge-host1.example.com |
||
68 | edge-host2.example.com |
||
69 | edge-*.example.com |
||
70 | </code></pre> |
||
71 | |||
72 | The interesting contents of 'edge-host1.example.com' would look similar to this: |
||
73 | |||
74 | <pre><code class="bash"> |
||
75 | vim /etc/n2n/edge-host1.example.com |
||
76 | </code></pre> |
||
77 | |||
78 | <pre> |
||
79 | # == edge configuration values parsed by /etc/rc.d/init.d/edged == |
||
80 | # Each value is read by the init script - do not modify variable names. |
||
81 | # Read 'man edge' for details about these values... |
||
82 | |||
83 | # Uncomment N2N_FORWARD if you want to route packets via VPN... |
||
84 | # N2N_FORWARD="-r" |
||
85 | # N2N_DAEMONISE="-f" |
||
86 | N2N_TUN_IF="tun10" |
||
87 | N2N_IP="10.10.10.11" |
||
88 | N2N_NETMASK="255.255.255.0" |
||
89 | N2N_KEY="MySecretCode" |
||
90 | N2N_COMMUNITY="MyCommunityName" |
||
91 | |||
92 | # Better to use numeric public IP rather than DNS hostname, but... |
||
93 | N2N_SUPERNODE="gw1.example.com" |
||
94 | N2N_PORT="8765" |
||
95 | N2N_UID="99" |
||
96 | N2N_GID="99" |
||
97 | # Other options... |
||
98 | # N2N_OPTIONS="-p 1234 -M 1200 -t -b -v" |
||
99 | N2N_OPTIONS="" |
||
100 | # === end edge-host1.example.com config. file =================== |
||
101 | </pre> |
||
102 | |||
103 | Read comments in the scripts below to make more sense out of how they work. |
||
104 | |||
105 | Here is the init-script that works when used with configuration files as described above: |
||
106 | |||
107 | <pre><code class="bash"> |
||
108 | vim /etc/init.d/edged |
||
109 | </code></pre> |
||
110 | <pre> |
||
111 | #!/bin/sh |
||
112 | # $Id: n2n-edge.init,v 1.9 2009/10/23 12:34:56 |
||
113 | # n2n edge startup script. |
||
114 | # |
||
115 | # chkconfig: 345 97 25 |
||
116 | # processname: edge |
||
117 | # pidfile: /var/run/n2n-edge.pid |
||
118 | # |
||
119 | # short-description: Provides client-to-client VPN access via Internet |
||
120 | # description: This is startup script for n2n 'edge', |
||
121 | # n2n edge + supernode provide internet connection for vpn peers |
||
122 | # |
||
123 | # SEE: |
||
124 | # for more options n2n 'man edge' and 'man supernode' |
||
125 | # |
||
126 | # NOTE: |
||
127 | # Option to enter 'debug' as second var: e.g 'supernode start debug' |
||
128 | # Using grep -w switch searches for whole word reduces ambiguity |
||
129 | # Comment in/out the 'echo' stuff depending if things work as expected |
||
130 | # Config files located/named in: /etc/n2n/edge-your.example.com |
||
131 | # Assumes CentOS init scripts located in /etc/rc.d/init.d/ |
||
132 | # |
||
133 | # Created: FOOFORCE RB 2009-10-24 |
||
134 | # License GPL: free to copy, improve and use. |
||
135 | # =========================================================== |
||
136 | # ==== main init script variables =========================== |
||
137 | # Make sure you include path where 'edge' + sh + tools are installed.. |
||
138 | # PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin" |
||
139 | PATH="/sbin:/bin:/usr/sbin:/usr/bin" |
||
140 | |||
141 | # The name + path to the executable program/daemon file... |
||
142 | NAME="edge" |
||
143 | DAEMON="/usr/sbin/${NAME}" |
||
144 | |||
145 | # Modify $NAME to filter on 'grep -w [s]supernode' - faster than 'grep -v grep'... |
||
146 | GREPNAME=$(echo "[e]${NAME#e}") |
||
147 | |||
148 | # Enable some simple debug messages when running this script... |
||
149 | if [[ "${2}" == "debug" ]]; then |
||
150 | echo "DEBUG: ${GREPNAME} ${2}" |
||
151 | fi |
||
152 | |||
153 | PIDFILE="/var/run/edge.pid" |
||
154 | LOGFILE="/var/log/n2n-${NAME}.log" |
||
155 | STAMP=$(/bin/date +%T) |
||
156 | |||
157 | # Get the host/domain name to identify local configfile.. |
||
158 | HOST=$(/bin/hostname) |
||
159 | FQDN=$(/bin/hostname -f) |
||
160 | |||
161 | # Initialise configfile variable to empty value... |
||
162 | CONFIGDIR="/etc/n2n" |
||
163 | |||
164 | # Initialise configfile variable to empty value... |
||
165 | CONFIGFILE="" |
||
166 | |||
167 | # Load values from configfile using our local domain name: |
||
168 | # Example: |
||
169 | # Our local FQDN = 'myhost.example.com' |
||
170 | # Our configfile = 'edge-myhost.example.com' |
||
171 | # |
||
172 | if [[ "${HOST}" == "" ]]; then |
||
173 | #if [[ "${FQDN}" == "" ]]; then |
||
174 | #echo " ERROR: Missing ${FQDN} hostname in config file /etc/rc.d/init.d/${NAME}" |
||
175 | echo " ERROR: Missing ${HOST} hostname in config file /etc/rc.d/init.d/${NAME}" |
||
176 | exit 1 |
||
177 | else |
||
178 | #CONFIGFILE="${CONFIGDIR}/edge-${FQDN}" |
||
179 | CONFIGFILE="${CONFIGDIR}/edge-${HOST}" |
||
180 | fi |
||
181 | |||
182 | if [[ -f "${CONFIGFILE}" ]]; then |
||
183 | # Get values from local configuration file... |
||
184 | echo " Found config file: ${CONFIGFILE}" |
||
185 | . ${CONFIGFILE} |
||
186 | else |
||
187 | echo "ERROR: Missing config file ${CONFIGFILE}" |
||
188 | exit 1 |
||
189 | fi |
||
190 | |||
191 | # See if pid file exists and get pid number... |
||
192 | if [[ -f "${PIDFILE}" ]]; then |
||
193 | CURPID=$(cat ${PIDFILE}) |
||
194 | fi |
||
195 | |||
196 | # Quit if we can't find application... |
||
197 | test -f ${DAEMON} || exit 0 |
||
198 | |||
199 | set -e |
||
200 | |||
201 | # Set any value to enable this script... |
||
202 | # N2N_RUN=1 |
||
203 | # |
||
204 | # test -n "${N2N_RUN}" || exit 0 |
||
205 | |||
206 | # Optionaly change into n2n config directory... |
||
207 | if [[ -d "${CONFIGDIR}" ]]; then |
||
208 | cd ${CONFIGDIR} |
||
209 | fi |
||
210 | # ========================================================= |
||
211 | |||
212 | # Should not need to change much below here... |
||
213 | |||
214 | # ==== see how we were called + act accordingly ========== |
||
215 | case "${1}" in |
||
216 | start) |
||
217 | # echo " ${NAME} ${1} process is ${0} on pid: ${$})..." |
||
218 | echo "${STAMP} start n2n /etc/rc.d/init.d/${NAME}" > ${LOGFILE} |
||
219 | |||
220 | if [[ -n "${CURPID}" ]]; then |
||
221 | echo " A PID:${CURPID} already exists for ${0}:" |
||
222 | echo " To re-start with current config settings, run '$0 stop' then '$0 start' ..." |
||
223 | else |
||
224 | if [ -d /var/lock/subsys ] ; then |
||
225 | touch /var/lock/subsys/${NAME}; |
||
226 | fi |
||
227 | |||
228 | # ===================================================== |
||
229 | # If using third-part tools to set tun device.. |
||
230 | # tunctl -t ${N2N_TUN_IF} |
||
231 | |||
232 | # All variables read from ${CONFIGFILE}... |
||
233 | # Use configfile ${FORWARD} = '-r' switch to enable packet forwarding/routing |
||
234 | # Use configfile ${DAEMONISE} = '-f' switch to daemonise in background.... |
||
235 | # |
||
236 | # Uncomment to display all the variable source values... |
||
237 | # echo "DEBUG: ${DAEMON} ${FORWARD} ${N2N_DAEMONISE}\ |
||
238 | # -d ${N2N_TUN_IF} -c ${N2N_COMMUNITY} -k ${N2N_KEY} -u ${N2N_UID} -g ${N2N_GID} \ |
||
239 | # -a ${N2N_IP} -s ${N2N_NETMASK} -p ${N2N_UDP} -l ${N2N_SUPERNODE}:${N2N_PORT} ${N2N_OPTIONS}" |
||
240 | # If variable value not empty then add command-line switch to variable... |
||
241 | if [[ -n "${N2N_TUN_IF}" ]]; then N2N_TUN_IF="-d ${N2N_TUN_IF}"; fi |
||
242 | if [[ -n "${N2N_IP}" ]]; then N2N_IP="-a ${N2N_IP}"; fi |
||
243 | if [[ -n "${N2N_NETMASK}" ]]; then N2N_NETMASK="-s ${N2N_NETMASK}"; fi |
||
244 | if [[ -n "${N2N_COMMUNITY}" ]]; then N2N_COMMUNITY="-c ${N2N_COMMUNITY}"; fi |
||
245 | if [[ -n "${N2N_KEY}" ]]; then N2N_KEY="-k ${N2N_KEY}"; fi |
||
246 | if [[ -n "${N2N_UID}" ]]; then N2N_UID="-u ${N2N_UID}"; fi |
||
247 | if [[ -n "${N2N_GID}" ]]; then N2N_GID="-g ${N2N_GID}"; fi |
||
248 | if [[ -n "${N2N_SUPERNODE}" ]]; then N2N_SUPERNODE="-l ${N2N_SUPERNODE}"; fi |
||
249 | if [[ -n "${N2N_PORT}" ]]; then N2N_PORT=":${N2N_PORT}"; fi |
||
250 | |||
251 | if [[ "${2}" == "debug" ]]; then |
||
252 | echo "DEBUG: display values for ${DAEMON} from configfile:" |
||
253 | echo " ${FORWARD} ${N2N_DAEMONISE} ${N2N_TUN_IF} ${N2N_IP} ${N2N_NETMASK} ${N2N_COMMUNITY}" |
||
254 | echo " ${N2N_KEY} ${N2N_UID} ${N2N_GID} ${N2N_SUPERNODE}${N2N_PORT} ${N2N_OPTIONS}" |
||
255 | fi |
||
256 | |||
257 | # Execute the command + switches + values sources from config file... |
||
258 | ${DAEMON} ${FORWARD} ${N2N_DAEMONISE} ${N2N_TUN_IF} ${N2N_IP} ${N2N_NETMASK} ${N2N_COMMUNITY} \ |
||
259 | ${N2N_KEY} ${N2N_UID} ${N2N_GID} ${N2N_SUPERNODE}${N2N_PORT} ${N2N_OPTIONS} |
||
260 | |||
261 | # ==================================================== |
||
262 | echo " NOTICE: Starting:${NAME}" |
||
263 | rm -f ${PIDFILE} |
||
264 | touch ${PIDFILE} |
||
265 | |||
266 | for PID in $(ps ax | grep -w "${GREPNAME}" | grep -v "(restart|stop|start)" | awk '{ print $1 }') |
||
267 | do |
||
268 | echo " Setting PID: ${PID}" |
||
269 | echo ${PID} >> ${PIDFILE} |
||
270 | done |
||
271 | fi |
||
272 | ;; |
||
273 | stop) |
||
274 | # echo " DEBUG: Searching for at least one live process id..." |
||
275 | PID=$(ps ax | grep -w "${GREPNAME}" | grep -v "(restart|stop|start)" | awk '{ print $1 }') |
||
276 | |||
277 | if [[ "${2}" == "debug" ]]; then |
||
278 | echo " ${NAME} ${1} process is ${0} on pid: ${$}) for ${PID}..." |
||
279 | fi |
||
280 | |||
281 | echo "${STAMP} stop /etc/rc.d/init.d/${NAME}" >> ${LOGFILE} |
||
282 | |||
283 | # echo " NOTICE: Kill name:${NAME} pid:${pid} before stopping..." |
||
284 | # kill -9 $(cat /var/run/${NAME}_pid) && rm /var/run/${NAME}_pid |
||
285 | |||
286 | # If a pid value found in file or in process id, then kill it... |
||
287 | if [[ -n "${PID}" ]]; then |
||
288 | echo " Stopping; ${NAME} pid:${PID}..." |
||
289 | # kill -9 $(cat /var/run/${NAME}.pid) && rm /var/run/${NAME}.pid |
||
290 | kill ${PID} |
||
291 | sleep 2s |
||
292 | rm -f ${PIDFILE} |
||
293 | else |
||
294 | # Else assume stale pid... |
||
295 | if [[ "${2}" == "debug" ]]; then |
||
296 | echo " NOTICE: No current active process ${PID}..." |
||
297 | fi |
||
298 | |||
299 | if [[ -f "${PIDFILE}" ]]; then |
||
300 | echo "removing stale pidfile..." |
||
301 | rm -f ${PIDFILE} |
||
302 | fi |
||
303 | fi |
||
304 | |||
305 | # Indiscriminate pid killer... |
||
306 | # for PID in $(ps ax | grep -w ${NAME} | grep -v grep | awk '{ print $1 }') |
||
307 | # do |
||
308 | # echo " Killing currently active ${NAME} pid(s): ${PID}" |
||
309 | # # kill -HUP $PID |
||
310 | # kill ${PID} |
||
311 | # done |
||
312 | |||
313 | if [[ -f /var/lock/subsys/${NAME} ]]; then |
||
314 | echo " Removing stale lock file..." |
||
315 | rm -f /var/lock/subsys/${NAME} |
||
316 | fi |
||
317 | |||
318 | if [[ -f "${PIDFILE}" ]]; then |
||
319 | echo " Removing stale pid file..." |
||
320 | rm -f /var/lock/subsys/${NAME} |
||
321 | fi |
||
322 | ;; |
||
323 | restart) |
||
324 | echo "* Re-start ${NAME}..." |
||
325 | ${0} stop ${2} |
||
326 | |||
327 | # Not a race.... |
||
328 | sleep 4s |
||
329 | |||
330 | ${0} start ${2} |
||
331 | ;; |
||
332 | status) |
||
333 | # status ${NAME} |
||
334 | PID=$(ps ax | grep -w "${GREPNAME}" | grep -v "status" | awk '{ print $1 }') |
||
335 | |||
336 | if [[ "${2}" == "debug" ]]; then |
||
337 | echo " This ${NAME} ${1} init query is ${0} running on pid: ${$})..." |
||
338 | fi |
||
339 | |||
340 | # If at least one active session, look for more... |
||
341 | if [[ -n "${PID}" ]]; then |
||
342 | for PID in $(ps ax | grep -w "${GREPNAME}" | grep -v "status" | awk '{ print $1 }') |
||
343 | do |
||
344 | if [[ -n "${PID}" ]]; then |
||
345 | echo " * Found current active ${GREPNAME} pid(s): ${PID}" |
||
346 | else |
||
347 | echo " * No active session found for ${0}" |
||
348 | fi |
||
349 | done |
||
350 | else |
||
351 | echo " * No active session(s) found for ${0}" |
||
352 | fi |
||
353 | ;; |
||
354 | *) |
||
355 | echo " Usage: ${0} {start|stop|status|restart|any debug}" >&2 |
||
356 | exit 1 |
||
357 | ;; |
||
358 | esac |
||
359 | exit 0 |
||
360 | # === end edged ============================================= |
||
361 | </pre> |
||
362 | |||
363 | make init-script executeable |
||
364 | <pre><code class="bash"> |
||
365 | chmod +x /etc/init.d/edged |
||
366 | </code></pre> |
||
367 | |||
368 | Using CentOS tools to activate the sys.v init scripts: |
||
369 | <pre><code class="bash"> |
||
370 | chkconfig --add edged |
||
371 | chkconfig edged on |
||
372 | </code></pre> |
||
373 | |||
374 | Command line syntax: |
||
375 | <pre><code class="bash"> |
||
376 | service edged [start|stop|restart|any debug] |
||
377 | </code></pre> |
||
378 | For example: |
||
379 | <pre><code class="bash"> |
||
380 | service edged restart |
||
381 | </code></pre> |
||
382 | …OR… |
||
383 | <pre><code class="bash"> |
||
384 | service edged restart debug |
||
385 | </code></pre> |
||
386 | provides some extra clues. |