背景 有时候在对线上设备进行维护,由其是调试的时候希望技术人员远程进入路由后台调试路由信息的时候,如果没有内网穿透就会比较麻烦。 本篇博客是在路由上实现内网穿透,以实现数据、文件的点对点传输或访问 阅读时需要额外了解下p2p协议原理,以及n2n工具 模型框架图 搭建supernode节点 准备一台公网服务器作为supernode节点,下载源码(编译需要事先安装libssl-dev),编译 $ git clone https://github.com/ntop/n2n.git $ make AI写代码 1 2 运行supernode,侦听1234端口 $ ./supernode -l 1234 -v AI写代码 1 客户端搭建 openwrt本身包含n2n的Makefile,只不过现在不能用了,得改一下, n2n官网出现了2个版本n2n_v1、n2n_v2(可自己访问https://svn.ntop.org/svn/ntop/trunk/n2n/ 查看),本次是用的n2n_v2编译的,不过在Makefile中做了一个菜单选项,make menuconfig的时候可以选择编译哪个版本,改后的Makefile如下 # # Copyright (C) 2008 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # author: arvik # email: 1216601195@qq.com # blog : http://blog.csdn.net/u012819339 include $(TOPDIR)/rules.mk PKG_BRANCH:=trunk PKG_SOURCE_URL:=https://svn.ntop.org/svn/ntop/trunk/n2n PKG_REV:=$(shell LC_ALL=C svn info ${PKG_SOURCE_URL} | sed -ne's/^Last Changed Rev: //p') PKG_NAME:=n2n PKG_VERSION:=svn$(PKG_REV) PKG_RELEASE:=1 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz PKG_SOURCE_PROTO:=svn PKG_SOURCE_VERSION:=$(PKG_REV) PKG_BUILD_DEPENDS:= PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) PKG_INSTALL_DIR:=$(PKG_BUILD_DIR) PKG_VER_SELECT:= include $(INCLUDE_DIR)/package.mk define Package/n2n SECTION:=net CATEGORY:=Network TITLE:=VPN tunneling daemon URL:=http://www.ntop.org/n2n/ SUBMENU:=VPN DEPENDS:=libpthread +libopenssl endef define Package/$(PKG_NAME)/config source "$(SOURCE)/Config.in" endef ifdef CONFIG_N2N_VER_SELECT_V1 PKG_VER_SELECT:=v1 endif ifdef CONFIG_N2N_VER_SELECT_V2 PKG_VER_SELECT:=v2 endif define Build/Configure endef define Build/Compile $(MAKE) CC="$(TARGET_CC)" -C $(PKG_BUILD_DIR)/n2n_$(PKG_VER_SELECT) endef define Package/n2n/install $(INSTALL_DIR) $(1)/usr/sbin $(INSTALL_BIN) $(PKG_BUILD_DIR)/n2n_$(PKG_VER_SELECT)/edge $(1)/usr/sbin/ $(INSTALL_BIN) $(PKG_BUILD_DIR)/n2n_$(PKG_VER_SELECT)/supernode $(1)/usr/sbin/ endef AI写代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 在Makefile相同目录下增加一个Config.in文件,内容如下: choice prompt "select the version of n2n to compile, default select V1" default N2N_VER_SELECT_V2 depends on PACKAGE_n2n config N2N_VER_SELECT_V1 bool "n2n_v1" help "select the version V1 for n2n" config N2N_VER_SELECT_V2 bool "n2n_v2" help "select the version V2 for n2n" endchoice AI写代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 运行make menuconfig时候效果如下: 选择必要工具 libssl库是需要的,还需要在busybox中选择如下工具 Location: -> Base system -> busybox -> Networking Utilities -> tunctl AI写代码 1 2 3 4 5 路由器终端运行如下命令: $ tunctl -t tun0 $ ./edge -d n2n0 -c mynetwork -k encryptme -u 99 -g 99 -m 3C:A0:12:34:56:78 -a 1.2.3.4 -l a.b.c.d:xyw AI写代码 1 2 请自行参看./edge –help 查阅参数含义,更改上面命令中本地虚拟网卡网卡mac以及ip地址,指定服务器ip和侦听端口 测试结果 两个n2n对端互ping截图 终端通过n2n建立的网络访问路由效果截图