N2n
L2gvpn | ||
L2gvpn | ||
Developer | Richard Andrews, Luca Deri | |
First released | ||
Latest preview version | ||
Release date and age | ||
Frequently updated | yes | |
Programming language | C | |
Platform | Gnu/Linux, Windows | |
Language | English | |
Status | active | |
Genre | VPN Software | |
License | GNU General Public License v3 | |
Website | http://www.ntop.org/products/n2n/ | |
Download | http://www.ntop.org/get-started/download/ |
n2n
n2n is a small layer 2 vpn based on the ideas of modern p2p systems. It creates only shared key security, which should be enough for freifunk purposes and has a very small flash footprint. Currently we use n2n Protocolversion 2.
kamikaze
pre-compiled v1 package for kamikaze (trunk 11600) can be installed via: ipkg install http://downloads.leo34.net/fonera/packages/n2n_svn3561-1_mips.ipk
fritjoff built a small kamikaze trunk package, to be improved: http://builder.frithjof-hammer.de/n2n/
packet b0rken, use:
Index: openwrt/kamikaze/Makefile =================================================================== --- openwrt/kamikaze/Makefile (revision 3558) +++ openwrt/kamikaze/Makefile (working copy) @@ -1,9 +1,3 @@ -# -# Copyright (C) 2008 OpenWrt.org -# -# This is free software, licensed under the GNU General Public License v2. - - include $(TOPDIR)/rules.mk PKG_BRANCH:=trunk @@ -42,7 +36,7 @@ endef define Build/Compile - $(MAKE) -C$(PKG_BUILD_DIR) + $(MAKE) CC="$(TARGET_CC)" -C $(PKG_BUILD_DIR) endef
To have proper integration for uci, please use these fragments
/etc/config/n2n
config "n2n" "edge" option ifname 'n2n' option ip4address '77.87.48.x' option ip4netmask '255.255.255.192' # option ip6address 'fec0:babe:x/48' option community 'bbb' option key 'pass' option supernode 'vpn.berlin.freifunk.net:8718' option httptunnel '0' option routing '1' option verbose '0'
/etc/init.d/n2n
#!/bin/sh /etc/rc.common START=45 EDGE=/usr/sbin/edge SUPERNODE=/usr/sbin/supernode do_edge () { config_load n2n config_get dev edge ifname config_get ip4addr edge ip4address config_get ip4mask edge ip4netmask config_get community edge community config_get key edge key config_get supernode edge supernode config_get_bool httptunnel edge httptunnel config_get_bool routing edge routing config_get_bool verbose edge verbose } start() { include /lib/network scan_interfaces config_load /var/state/network do_edge $EDGE -f -d $dev -a $ipv4 -c $community -k $key -l $supernode -t $httptunnel -r $routing -v $verbose #hack for n2n ticket #48 ifconfig $dev $ip4addr netmask $ip4mask } stop () { killall edge }
add the following to /etc/config/network
config interface n2n option ifname n2n
deb based systems (debian, ubuntu)
/etc/init.d/edge
#!/bin/bash # /etc/init.d/edge: start and stop the n2n edge EDGE="/usr/local/bin/edge" IFNAME=n2n IP4ADDRESS=0.0.0.0 IP4NETMASK=255.255.255.255 COMMUNITY=bbb KEY=pass SUPERNODE=vpn.berlin.freifunk.net:8718 HTTPTUNNEL=0 ROUTING=1 VERBOSE=0 if test -f /etc/default/edge; then . /etc/default/edge fi . /lib/lsb/init-functions compile_opts() { EDGE_OPTS="-d $IFNAME -a $IP4ADDRESS -s $IP4NETMASK -c $COMMUNITY -k $KEY -l $SUPERNODE -f" if [ $HTTPTUNNEL = 1 ]; then EDGE_OPTS+=" -t"; fi if [ $ROUTING = 1 ]; then EDGE_OPTS+=" -r"; fi if [ $VERBOSE = 1 ]; then EDGE_OPTS+=" -v"; fi } case "$1" in start) compile_opts echo -n "Starting n2n VPN daemon: edge" # echo $EDGE $EDGE_OPTS start-stop-daemon --start --quiet --exec $EDGE -- $EDGE_OPTS echo "." #fix IP Address #ifconfig $IFNAME $IP4ADDRESS ;; stop) echo -n "Stopping n2n VPN daemon: edge" start-stop-daemon --stop --quiet --exec $EDGE -- $EDGE_OPTS echo "." ;; restart) $0 stop $0 start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 esac exit 0
Debian packages for n2n v1 with netmask patch:
Note: This package is not tested because I had no machine running Debian.
Seems to work properly on Debian Etch.
FreeBSD
I've created a Port of n2n v1 for FreeBSD.
It already includes my subnet patch.
It's not merged with the official FreeBSD Ports repository but this will be done soon.
You can check out the latest revision at
Send your feedback to <syso-n2n(at)no-route.org> or create a new ticket if you've found a bug.
Testbed
Supernode at vpn.berlin.freifunk.net, very secret password is "pass", community is bbb (case sensitive). We use this for connecting our CityMesh by VPN.
We use IP addresses of the range 77.87.48.64/26. (host going from .65 - .126)
example startup line:
sudo ./edge -d bbb -c bbb -k pass -a static:77.87.48.77 -s 255.255.255.192 -l vpn.berlin.freifunk.net:8718 -f -vvv
IP config
IPv4 addresses
Hosts from 77.87.48.65 to 77.87.48.126
hostname | IPv4-Address | Admin email | Comment |
---|---|---|---|
bbb1 | 77.87.48.65 | dpaufler at leo34 dot net | Main VPN Server BBB1 |
weimarnetz | 77.87.48.66 | bittorf at bluebottle dot com | http://weimarnetz.de/freifunk/vpn/ |
kel1 | 77.87.48.67 | syso-ff at no-route dot org | Temporaer fuer testzwecke. |
c-base GW | 77.87.48.68 | dpaufler at leo34 dot net, cven at cbase dot org | GW @cbase (WCW2009) |
gate | 77.87.48.69 | dpaufler at leo34 dot net | router @home |
tetzlav-vhost | 77.87.48.70 | tetzlav ät leipzig.freifunk.net | qemu-openwrt @inet |
tetzlav-ff-web | 77.87.48.71 | tetzlav ät leipzig.freifunk.net | server @home |
berlin.freifunk.net | 77.87.48.72 | nosy ät c-base.org | berlin web/dns |
Kortikalknoten | 77.87.48.73 | pirat ät ralfgerlich dot de | Viktoriastadt Titanic e.V. |
J.A.S. | 77.87.48.74 | pirat ät ralfgerlich dot de | Viktoriastadt Kaskelstr. |
Canapé | 77.87.48.75 | pirat ät ralfgerlich dot de | Südliche Pfarrstraße Berlin |
bgp.ff.dd19.de | 77.87.48.76 | dpaufler at leo34 dot net, alx at dd19 dot de | BGP routing FistColo |
carma | 77.87.48.77 | dpaufler at leo34 dot net | mobile notebook |
alx | 77.87.48.78 | alx at dd19 de | FOKUS vpn gate |
alx-eh2009 | 77.87.48.79 | alx at dd19 de | eh2009 vpn gate |
morpheus | 77.87.48.80 | simon.frerichs gmail com | siit, ipv6, ipv4 :) |
kifuse02 | 77.87.48.81 | patrick lunatiki de | pberg build & vpn server |
druschba | 77.87.48.82 | patrick lunatiki de | Berlin Weißensee uplink (Umbenannt von "lachman" zu "druschba") |
pitoresque | 77.87.48.83 | joli64 web de | pberg |
rinocelot | 77.87.48.84 | kinoletti gmail com | pberg / kiezfunk ;) |
blackhole | 77.87.48.85 | freifunk at animatedpictures de | |
karow | 77.87.48.86 | mercurix at wlankarow dot de | server in karow |
nuremberg | 77.87.48.87 | mercurix at wlankarow dot de | server in nürnberg |
moabit | 77.87.48.88 | mercurix at wlankarow dot de | WRT54G in der Kruppstr. 13 |
gw-floh-1 | 77.87.48.89 | onlinefloh dot freifunk at web dot de | router @home |
leipzig-l2gvpn-main | 77.87.48.90 | freifunk wwsnet net | F²x (Kopplung HauptVPN - Berlin) |
jow | 77.87.48.91 | freifunk wwsnet net | F²x #2 |
gw-floh-2 | 77.87.48.92 | onlinefloh dot freifunk at web dot de | server @Tempelhof |
schaeuble | 77.87.48.93 | patrick lunatiki de | pberg vpn gate |
inorouter | 77.87.48.94 | patrick lunatiki de | xberg Zossener uplink |
zeratul | 77.87.48.95 | andreas dot pittrich web de | |
caminetto-2 | 77.87.48.96 | Prometheus | |
23-5 | 77.87.48.97 | freifunk@23-5.eu | |
77.87.48.98 | |||
77.87.48.99 | |||
chi.cyranjo.org | 77.87.48.100 | steven midlink org | Freifunk Halle VPN #1 |
bno_test | 77.87.48.101 | dennis_bartsch hotmail com | |
77.87.48.102 | |||
hannover | 77.87.48.103 | toxxic freifunk-hannover de | Freifunk Hannover Testing |
77.87.48.104 | |||
joti | 77.87.48.105 | johannes soziologiker org | Hostname ändert sich noch, update ich dann |
56.3 | 77.87.48.106 | freifunkbs gmx-topmail de | Test |
77.87.48.107 | |||
77.87.48.108 | |||
77.87.48.109 | |||
wien | 77.87.48.110 | aaron dot lo-res dotdotdot org | via tunnel.wien.funkfeuer.at |
hamburg | 77.87.48.111 | ds at ainex net | bgp vpn router |
charon.fh.ff.jpod.cc | 77.87.48.112 | freifunk at jpod.cc | fhain vpn gate0 |
wrt0.fh.ff.jpod.cc | 77.87.48.113 | freifunk at jpod.cc | fhain vpn gate1 |
houston | 77.87.48.114 | freifunk at jpod.cc | FOKUS vpn gate |
vpn4.ff.jpod.cc | 77.87.48.115 | freifunk at jpod.cc | vpn gate |
cronus.ff.jpod.cc | 77.87.48.116 | freifunk at jpod.cc | vpn gate |
erfurt | 77.87.48.117 | sb at ilmbeat net | http://erfurt.freifunk.net |
rhea.ff.jpod.cc | 77.87.48.118 | freifunk at jpod.cc | vpn gate |
77.87.48.119 | |||
pberg.freifunk.net | 77.87.48.120 | admin at pberg dot freifunk dot net | http://pberg.freifunk.net |
chinchilla | 77.87.48.121 | robin pt pberg dot freifunk dot net | |
77.87.48.122 | |||
wonka | 77.87.48.123 | w-l2gvpn near chaos dot in-kiel dot de | test test test :) |
StefanoGSoC | 77.87.48.124 | pillastefano at gmail dot com | Tunnel for GSoC Project |
jwyzer1 | 77.87.48.125 | john dot wyzer at gmx dot de | lonely node in x-berg |
bubble | 77.87.48.126 | andre dot riehl at web dot de | lonely node in Lichtenberg |
Ipv6 addresses
uses fdca:ffee:babe:dad0::/64 - http://www.sixxs.net/tools/grh/ula/list/
OLSR config
IPv4
For olsrd v4 status look at http://vpn.berlin.freifunk.net:8080/nodes
to use the tunnel, add l2gvpn interface to olsr configuration at /etc/config/olsr
config 'Interface' option 'Interface' 'bbb' option 'HelloInterval' '10.0' option 'HelloValidityTime' '900.0' option 'TcInterval' '30.0' option 'TcValidityTime' '2700.0' option 'MidInterval' '150.0' option 'MidValidityTime' '2700.0' option 'HnaInterval' '150.0' option 'HnaValidityTime' '900.0' option 'Ip4Broadcast' '255.255.255.255' option 'LinkQualityMult' 'default 0.1' option 'LinkQualityMult' '77.87.48.65 0.5'
IPv6
For olsrd v6 status look at http://vpn.berlin.freifunk.net:8080/nodes
More Info for our 6Mesh Tests at 6mesh.freifunk.net
config 'Interface' option 'Interface' 'bbb' option 'HelloInterval' '10.0' option 'HelloValidityTime' '900.0' option 'TcInterval' '30.0' option 'TcValidityTime' '2700.0' option 'MidInterval' '150.0' option 'MidValidityTime' '2700.0' option 'HnaInterval' '150.0' option 'HnaValidityTime' '900.0' option 'Ip6AddrType' 'global' option 'LinkQualityMult' 'default 0.1' option 'LinkQualityMult' '77.87.48.65 0.5'
OSPF config
/etc/quagga/daemons
zebra=yes bgpd=no ospfd=yes
/etc/quagga/vtysh.conf
! ! Sample configuration file for vtysh. ! service integrated-vtysh-config !hostname quagga-router username root nopassword !
/etc/quagga/Quagga.conf
log file /var/log/quagga/bgpd.log log syslog informational ! password freifunk2009 enable password freifunk2009 ! interface bbb ip ospf authentication-key freifunk ipv6 nd suppress-ra ! router ospf ospf router-id 77.87.48.XX network 77.87.48.64/26 area 0.0.0.0 network 77.87.<your net>/xx area 0.0.0.0 ! ip forwarding ipv6 forwarding ! line vty !
test cases
gvpn test cases
- ipv6
- RA (gibs ne adresse vom benachbarten radvd)
- neighbour rechability via ll-addr. (ndp testen) (ping6 ll-nachbar)
- olsr (kommt multicast an? olsr nachbarn?) einheitliche olsr version
- routing (von 1 hop hinter vpn zu 1 hop hinter vpn)
- ipv4
- olsr (nachbarn?)
- std broadcast (kommt er an?)
- full broadcast (kommt er an?)
- link local multicast (komm er an?)
- routing (von 1 hop hinter vpn zu 1 hop hinter vpn)
- arp (ping ll-nachbar)
- dhcp (dhclient)
- olsr (nachbarn?)
- layer-2
- bridging (gehen all diese tests auch, wenn der testnode per bridge am tap device hängt?)
- STP? (gute frage)
- MTU
- Path MTU discovery (ping?) (tcp?) (tools?)
linux: tracepath BSD:
- generelly administrativia
- syncrone revisionen (nighly builds)
- automatische generierung von packages
- debian (libuci statisch linken.)
- openwrt
- automatische generierung von packages
- geskriptete updates, ssh keys
- syncrone revisionen (nighly builds)
- jitter messung?
- periodische bandbreitenvergleiche zwischen mit vpn und ohne vpn (tcp)
fixes n2n_v1
set netmask via command line argument
Wichtig: Already done at no-route.org SVN repo. |
Here is a more clean (kind of) solution to supply the subnet mask via command line argument:
--- edge.c 2008-12-11 16:54:00.000000000 +0100 +++ edge.c 2008-12-11 21:40:15.000000000 +0100 @@ -17,6 +17,7 @@ * Code contributions courtesy of: * Richard Andrews <bbmaj7@yahoo.com.au> * Don Bindner <don.bindner@gmail.com> + * Sylwester Sosnowski <syso-n2n@no-route.org> * */ @@ -252,6 +253,7 @@ "-a <tun IP address> " "-c <community> " "-k <encrypt key> " + "-s <subnet mask> " #ifndef WIN32 "[-u <uid> -g <gid>]" "[-f]" @@ -271,6 +273,7 @@ printf("-k <encrypt key> | Encryption key (ASCII) - also N2N_KEY=<encrypt key>\n"); printf("-l <supernode host:port> | Supernode IP:port\n"); printf("-p <local port> | Local port used for connecting to supernode\n"); + printf("-s <subnet mask> | n2n Subnet mask (Default: 255.255.255.0)\n"); #ifndef WIN32 printf("-u <UID> | User ID (numeric) to use when privileges are dropped\n"); printf("-g <GID> | Group ID (numeric) to use when privileges are dropped\n"); @@ -1125,7 +1128,9 @@ int opt, local_port = 0 /* any port */; char *tuntap_dev_name = "edge0"; char *ip_addr = NULL; + char *subnet_mask = "255.255.255.0"; ipstr_t ip_buf; + int got_s = 0; #ifndef WIN32 uid_t userid=0; /* root is the only guaranteed ID */ @@ -1196,7 +1201,7 @@ /* {int k;for(k=0;k<effectiveargc;++k) printf("%s\n",effectiveargv[k]);} */ optarg = NULL; - while((opt = getopt_long(effectiveargc, effectiveargv, "k:a:c:u:g:m:d:l:p:fvhrt", long_options, NULL)) != EOF) { + while((opt = getopt_long(effectiveargc, effectiveargv, "k:a:c:u:g:m:s:d:l:p:fvhrt", long_options, NULL)) != EOF) { switch (opt) { case 'a': ip_addr = strdup(optarg); @@ -1249,6 +1254,14 @@ case 'p': local_port = atoi(optarg); break; + case 's': /* Subnet Mask */ + if (got_s == 1) { + traceEvent(TRACE_WARNING, "Multiple subnet masks supplied."); + free(subnet_mask); + } + subnet_mask = strdup(optarg); + got_s = 1; + break; case 'h': /* help */ help(); break; @@ -1274,7 +1287,7 @@ /* setgid( 0 ); */ #endif - if(tuntap_open(&(eee.device), tuntap_dev_name, ip_addr, "255.255.255.0", device_mac ) < 0) + if(tuntap_open(&(eee.device), tuntap_dev_name, ip_addr, subnet_mask, device_mac ) < 0) return(-1); #ifndef WIN32
allow broadcast packets to every address, modify the packet_check to allow all packets
ugly
to allow broadcast packets to every address (i.e. OLSR bcast 255.255.255.255) modify the packet_check to allow all packets.
Index: edge.c =================================================================== --- edge.c (revision 3626) +++ edge.c (working copy) @@ -865,6 +865,10 @@ traceEvent(TRACE_INFO, "Discarding routed packet [rcvd=%s][expected=%s]", intoa(ntohl(the_ip->ip_dst.s_addr), ip_buf, sizeof(ip_buf)), intoa(ntohl(eee->device.ip_addr), ip_buf2, sizeof(ip_buf2))); + + /* dpa */ + return(0); + } else { /* This packet is for us */
less ugly (by wonka)
Index: edge.c =================================================================== --- edge.c (revision 3593) +++ edge.c (working copy) @@ -725,9 +725,12 @@ /* Note: all elements of the_ip are in network order */ struct ip *the_ip = (struct ip*)(pkt+sizeof(struct ether_header)); + + struct in_addr bcast = { 0xffffffff }; if((the_ip->ip_dst.s_addr != eee->device.ip_addr) - && ((the_ip->ip_dst.s_addr & eee->device.device_mask) != (eee->device.ip_addr & eee->device.device_mask))) /* Not a broadcast */ + && ((the_ip->ip_dst.s_addr & eee->device.device_mask) != (eee->device.ip_addr & eee->device.device_mask)) /* Not a broadcast */ + && ((the_ip->ip_dst.s_addr) != (bcast.s_addr))) /* really not a broadcast */ { ipstr_t ip_buf; ipstr_t ip_buf2;