Modify

Opened 22 months ago

Last modified 22 months ago

#22247 new defect

Cannot run multiple instances of n2n edge as a service - not supported by current implementation in OPENWRT.

Reported by: spam064@… Owned by: developers
Priority: normal Milestone:
Component: packages Version: Chaos Calmer 15.05
Keywords: n2n edge vpn Cc: spam064@…

Description

Hello,

Problems description

there are 2 issues which unable to start multiple (more than one) instances of n2n edge for 2 separate private networks on one router.

1. it is not possible to define tap name in openwrt n2n config file

which then would have to be propoerly handled by /etc/init.d/n2n then.

According to man page it should be possible to set up multiple tap devices http://linux.die.net/man/8/edge

Options

-d <name>

sets the TAP device name as seen in ifconfig. Only available on Linux.

With current implementation in OPENWRT setting the TAP device name is not supported in/via n2n config file.

Although edge application released for OPENWRT CC does support this option.

2. For some reason it is not possible to run multiple instances of "edge" as a service.

Once support for problem (1) is implemented, I realised that for some reason is not possible to run multiple instances of edge as a service.
To enable to run multiple instances of n2n edge to set up multiple tap devices edge has to be run not as a service but as an regular process.

Proposed tested and working solution on CC to address issue (1) and (2)

  1. introduce additional parameter "tapname" in n2n config file

example:

uci show n2n

n2n.@edge[0]=edge
n2n.@edge[0].netmask='255.255.255.0'
n2n.@edge[0].supernode='yoursupernode.com'
n2n.@edge[0].port='86'
n2n.@edge[0].community='community1'
n2n.@edge[0].key='yourkey1'
n2n.@edge[0].route='1'
n2n.@edge[0].httptunnel='1'
n2n.@edge[0].ipaddr='192.168.12.1'
n2n.@edge[0].tapname='edge0'
n2n.@edge[1]=edge
n2n.@edge[1].netmask='255.255.255.0'
n2n.@edge[1].supernode='yoursupernode.com'
n2n.@edge[1].port='86'
n2n.@edge[1].community='yourcommunity2'
n2n.@edge[1].key='yourkey2'
n2n.@edge[1].route='1'
n2n.@edge[1].httptunnel='1'
n2n.@edge[1].ipaddr='10.10.10.1'
n2n.@edge[1].tapname='edge1'
n2n.@supernode[0]=supernode
n2n.@supernode[0].port='86'

  1. change the /etc/init.d/n2n the way to
    1. support additional parameter "tapname" in n2n config file
    2. change execution of edge as a process not a service to enable multiple instances it on 1 host.

Here is a source of start_instance() function of /etc/init.d/n2n with bolded proposed changes:

#!/bin/sh /etc/rc.common

START=90

start_instance() {

local cfg="$1"

config_get type "$cfg" TYPE

case "$type" in
edge)

config_get ipaddr "$cfg" 'ipaddr'

[ -n "$ipaddr" ]
return 1

config_get netmask "$cfg" 'netmask' '255.255.255.0'
config_get supernode "$cfg" 'supernode'
config_get port "$cfg" 'port'
config_get community "$cfg" 'community'
config_get key "$cfg" 'key'
config_get_bool route "$cfg" 'route' '0'

config_get tapname "$cfg" 'tapname' 'edge0'

[ "$route" = "1" ] && args='-r'

#service_start /usr/sbin/edge $args -d $tapname -a $ipaddr -s $netmask -c $community -k $key -l ${supernode}:${port}
/usr/sbin/edge $args -d $tapname -a $ipaddr -s $netmask -c $community -k $key -l ${supernode}:${port} &

;;

supernode)

[ -e /usr/sbin/supernode ]
return 1

config_get port "$cfg" port

[ -n "$port" ]
return 1

service_start /usr/sbin/supernode -l $port
;;

esac

}

[CUT]

Above change has been successfuly tested on CC release.

Thanks.

Attachments (0)

Change History (1)

comment:1 Changed 22 months ago by spam064@…

Attaching cleaned up code proposal:

#!/bin/sh /etc/rc.common


 START=90

 start_instance() {
         local cfg="$1"

         config_get type "$cfg" TYPE

         case "$type" in
         edge)
                 config_get ipaddr "$cfg" 'ipaddr'
                 [ -n "$ipaddr" ] || return 1
                 config_get netmask "$cfg" 'netmask' '255.255.255.0'
                 config_get supernode "$cfg" 'supernode'
                 config_get port "$cfg" 'port'
                 config_get community "$cfg" 'community'
                 config_get key "$cfg" 'key'
                 config_get_bool route "$cfg" 'route' '0'
                 config_get tapname "$cfg" 'tapname' 'edge0'
                 [ "$route" = "1" ] && args='-r'
                 /usr/sbin/edge $args -d $tapname -a $ipaddr -s $netmask
 -c $community -k $key -l ${supernode}:${port} &'''
                 ;;
         supernode)
                 [ -e /usr/sbin/supernode ] || return 1
                 config_get port "$cfg" port
                 [ -n "$port" ] || return 1
                 service_start /usr/sbin/supernode -l $port
                 ;;
         esac
 }


[CUT]

Add Comment

Modify Ticket

Action
as new .
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.