在openwrt路由中加入n2n,并在ubuntu里加入n2n服务,实现开机联网互通互访

发布者:leekwenty
发布于:2019-02-18 13:10
版权声明:本文为LeeKwen的原创文章,请联系微信@leekwenty后转载。 https://blog.csdn.net/leekwen/article/details/45244551

在openwrt路由中加入n2n,并在ubuntu里加入n2n服务,实现开机联网互通互访

1、openwrt的硬件环境:

将自己的WR703N刷入openwrt(这里需要修改FLASH芯片,换个8M的FLASH);
刷机后,安装openwrt,此教程网上一大堆,无需说明了,TELNET进入,并开启SSH后,root登陆。

2、安装n2n到openwrt中:

root@LeeKwen:~# opkg update <-----如果不能升级,请运行下条命令,查看源是否正确:
root@LeeKwen:~# cat /etc/opkg.conf
root@LeeKwen:~# opkg install n2n
运行上述命令即可安装n2n。

3、修改n2n的配置文件:

root@LeeKwen:~# cat /etc/config/n2n
config edge
        option ipaddr           '10.10.100.191'
        option supernode        '106.186.30.16'
        option port             '9876'
        option community        'leekwen'
        option key              'leekwen'
        option route            '1'

4、修改n2n服务的启动脚本:

root@LeeKwen:~# vi /etc/init.d/n2n
#!/bin/sh /etc/rc.common
# Copyright (C) 2008-2012 OpenWrt.org

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 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'
                [ "$route" = "1" ] && args='-r'
                service_start /usr/sbin/edge -f $args -a $ipaddr -c $community -k $key -l ${supernode}:${port} -M 1300
                ;;
          supernode)
                config_get port "$cfg" port
                [ -n "$port" ] || return 1
                service_start /usr/sbin/supernode -l $port
                ;;
        esac
}

stop_instance() {
        local cfg="$1"

        config_get type "$cfg" TYPE

        case "$type" in
          edge)
                service_stop /usr/sbin/edge
                ;;
          supernode)
                service_stop /usr/sbin/supernode
                ;;
        esac
}

start() {
        config_load 'n2n'
        config_foreach start_instance 'edge'
        config_foreach start_instance 'supernode'
}

stop() {
        config_load 'n2n'
        config_foreach stop_instance 'edge'
        config_foreach stop_instance 'supernode'
}

 5、将n2n加入openwrt系统启动项:

root@LeeKwen:~# /etc/init.d/n2n enable  

6、启动openwrt中的n2n服务:

root@LeeKwen:~# /etc/init.d/n2n start        

root@LeeKwen:~# ifconfig edge0
edge0     Link encap:Ethernet  HWaddr 86:CC:1B:E9:1A:DC
          inet addr:10.10.100.191  Bcast:10.10.100.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1300  Metric:1
          RX packets:1117 errors:0 dropped:22 overruns:0 frame:0
          TX packets:698 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:104415 (101.9 KiB)  TX bytes:98732 (96.4 KiB)

7、互通测试:与我的手机端 n2n互ping下

root@LeeKwen:~# ping 10.10.100.103
PING 10.10.100.103 (10.10.100.103): 56 data bytes
64 bytes from 10.10.100.103: seq=0 ttl=64 time=31.738 ms
64 bytes from 10.10.100.103: seq=1 ttl=64 time=25.347 ms
64 bytes from 10.10.100.103: seq=2 ttl=64 time=22.565 ms
64 bytes from 10.10.100.103: seq=3 ttl=64 time=40.063 ms
64 bytes from 10.10.100.103: seq=4 ttl=64 time=23.577 ms
^C
--- 10.10.100.103 ping statistics ---
6 packets transmitted, 5 packets received, 16% packet loss
round-trip min/avg/max = 22.565/19.838/31.738 ms

 在ubuntu系统中增加n2n服务:

1、我已经在上篇博客中有写如何在ubuntu安装n2n

(未安装过的用户请移驾http://blog.csdn.net/leekwen/article/details/45095887)
这里只说明增加n2n开机服务,具体步骤如下:


Leekwen@Leekwen:~$ svn co https://svn.ntop.org/svn/ntop/trunk/n2n
Leekwen@Leekwen:~$ cd n2n/
Leekwen@Leekwen:~/n2n$ ls
n2n_v1  n2n_v2
Leekwen@Leekwen:~/n2n$ cd n2n_v1/
Leekwen@Leekwen:~/n2n/n2n_v1$ ls
COPYING  edge.8  HACKING  lzoconf.h  Makefile   minilzo.h  n2n.h     openwrt  scripts      supernode.c       tuntap_linux.c  twofish.c  win32
debian   edge.c  INSTALL  lzodefs.h  minilzo.c  n2n.c      n2n.spec  README   supernode.1  tuntap_freebsd.c  tuntap_osx.c    twofish.h
Leekwen@Leekwen:~/n2n/n2n_v1$ make
Leekwen@Leekwen:~/n2n/n2n_v1$ ./edge -h
Welcome to n2n v.1.3.2 for i686
Built on 04/23/15 06:11:56 PM
Copyright 2007-08 - http://www.ntop.org

edge -d <tun device> -a <tun IP address> -c <community> -k <encrypt key> -s <netmask> [-u <uid> -g <gid>][-f][-m <MAC address>]
-l <supernode host:port> [-p <local port>] [-M <mtu>] [-t] [-r] [-v] [-b] [-h]

-d <tun device>          | tun device name
-a <tun IP address>      | n2n IP address
-c <community>           | n2n community name
-k <encrypt key>         | Encryption key (ASCII) - also N2N_KEY=<encrypt key>
-s <netmask>             | Edge interface netmask in dotted decimal notation (255.255.255.0)
-l <supernode host:port> | Supernode IP:port
-b                       | Periodically resolve supernode IP
                         | (when supernodes are running on dynamic IPs)
-p <local port>          | Local port used for connecting to supernode
-u <UID>                 | User ID (numeric) to use when privileges are dropped
-g <GID>                 | Group ID (numeric) to use when privileges are dropped
-f                       | Fork and run as a daemon. Use syslog.
-m <MAC address>         | Choose a MAC address for the TAP interface
                         | eg. -m 01:02:03:04:05:06
-M <mtu>                 | Specify n2n MTU (default 1400)
-t                       | Use http tunneling (experimental)
-r                       | Enable packet forwarding through n2n community
-v                       | Verbose

Environment variables:
  N2N_KEY                | Encryption key (ASCII)

Leekwen@Leekwen:~/n2n/n2n_v1$ pwd
/home/Leekwen/n2n/n2n_v1


2、下载并编译完毕后,编写启动服务文件n2n:

Leekwen@Leekwen:~/n2n/n2n_v1$ vi n2n

#!/bin/bash
##Some Variable define here ##
PROG="edge"
n2n_IP="10.10.100.103"
n2n_cname="leekwen"
n2n_pass="leekwen"
SNODE_Host="106.186.30.16"
SNODE_Port="9876"
LOGS="/var/log/$PROG.log"
PROG_PATH="/home/leekwen/n2n/n2n_v1"  # edge binary put on here for testing this script, Not Needed if the system binary.
PROG_ARGS="-f -d edge0 -a $n2n_IP -c $n2n_cname -k $n2n_pass -l $SNODE_Host:$SNODE_Port -M 1300" 
PID_PATH="/var/run"

RETVAL=0

start() {
    pid=`ps ax | grep $PROG | grep -v "grep" | awk '{print $1}'`
    if [ ! -z "$pid" ]; then
        ## Program is running, exit with error.
        echo "Error! $PROG is currently running!" 1>&2
        exit 1
    else
        ## Change from /dev/null to something like /var/log/$PROG if you want to save output.
        $PROG_PATH/$PROG $PROG_ARGS 2>&1 > $LOGS &

        echo "$PROG started"
        echo $pid > "$PID_PATH/$PROG.pid"
    fi

   RETVAL=$?
   if [ $RETVAL -eq 0 ]; then
      echo -e "\\033[60G\c"
      echo -e "[ \\033[1;32m\c"
      echo -e "OK\c"
      echo -e "\\033[0;39m\c"
      echo " ]"
   else
      echo -e "\\033[60G\c"
      echo -e "[ \\033[1;31m\c"
      echo -e "FAILED\c"
      echo -e "\\033[0;39m\c"
      echo " ]"
   fi
   return $RETVAL
}

stop() {
    pid=`ps ax | grep $PROG | grep -v "grep"| awk '{print $1}'`
    if [ ! -z "$pid" ]; then
        ## Program is running, so stop it
	kill $pid
        
        rm -f  "$PID_PATH/$PROG.pid"
        echo "$PROG stopped"
    else
        ## Program is not running, exit with error.
        echo "Error! $PROG not started!" 1>&2
        exit 1
    fi

   RETVAL=$?
   if [ $RETVAL -eq 0 ]; then
      echo -e "\\033[60G\c"
      echo -e "[ \\033[1;32m\c"
      echo -e "OK\c"
      echo -e "\\033[0;39m\c"
      echo " ]"
   else
      echo -e "\\033[60G\c"
      echo -e "[ \\033[1;31m\c"
      echo -e "FAILED\c"
      echo -e "\\033[0;39m\c"
      echo " ]"
   fi
   return $RETVAL

}

## Check to see if we are running as root first.
## Found at http://www.cyberciti.biz/tips/shell-root-user-check-script.html
if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root, you can use sudo command to run it." 1>&2
    exit 1
fi

case "$1" in
    start)
        start
        exit 0
    ;;
    stop)
        stop
        exit 0
    ;;
    reload|restart|force-reload)
        stop
        start
        exit 0
    ;;
    **)
        echo "Usage: $0 {start|stop|reload}" 1>&2
        exit 1
    ;;
esac

3、增加可执行权限,移动n2n服务到/etc/init.d/,并更新rc.d

Leekwen@Leekwen:~/n2n/n2n_v1$ chmod 755 n2n
Leekwen@Leekwen:~/n2n/n2n_v1$ sudo mv n2n /etc/init.d/
Leekwen@Leekwen:~/n2n/n2n_v1$ sudo update-rc.d n2n defaults


4、对n2n服务进行测试:

Leekwen@Leekwen:~/n2n/n2n_v1$ sudo /etc/init.d/n2n start
Leekwen@Leekwen:~/n2n/n2n_v1$ ifconfig edge0

Leekwen@Leekwen:~/n2n/n2n_v1$ sudo /etc/init.d/n2n stop
Leekwen@Leekwen:~/n2n/n2n_v1$ ifconfig edge0

Leekwen@Leekwen:~/n2n/n2n_v1$ sudo /etc/init.d/n2n restart
Leekwen@Leekwen:~/n2n/n2n_v1$ ifconfig edge0


5、对n2n服务进行Ping连通性测试:

Leekwen@Leekwen:~/n2n/n2n_v1$ ping 10.10.100.103
PING 10.10.100.103 (10.10.100.103): 56 data bytes
64 bytes from 10.10.100.103: seq=0 ttl=64 time=11.738 ms
64 bytes from 10.10.100.103: seq=1 ttl=64 time=15.347 ms
64 bytes from 10.10.100.103: seq=2 ttl=64 time=12.565 ms
64 bytes from 10.10.100.103: seq=3 ttl=64 time=10.063 ms
64 bytes from 10.10.100.103: seq=4 ttl=64 time=13.577 ms
^C
--- 10.10.100.103 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 10.063/12.838/15.347 ms

到此客户端的已经安装成功,在网络连接的情况下,每次重启ubuntu及openwrt路由后,他们都会自动连接上supernode节点,以构建一个p2p的网络。



声明:该文观点仅代表作者本人,转载请注明来自看雪