n2n内网穿透打洞部署全过程 + nginx公网端口映射

内网穿透、打洞工具有很多,此前在windows上使用的是vidcc这个玩意,也正因为linux不支持。自此在linux尝试过一些打洞工具,ssh 反向代理这些,因为安全性不便捷等多种原因,最终选择了n2n。

 

由于初次接触n2n,对其不是很了解,就此对n2n实现内网穿透打洞过程进行基本表述。

 

2008年,ntop的作者Luca Deri开始研究p2p V**,他一方面看到公众对p2p V**有着强烈的需求,另一方面又不满足已有产品的现状,于是n2n诞生了。

 

 

 

如上图所示,n2n是一个二层架构的V**网络,其中super node提供场所,让两个位于NAT/防火墙之后的edge node进行会面,一旦双方完成首次握手,剩下的数据流就之发生在两个edge node之间,如果有一方的NAT属于对称型(symmetrical),super node则还需继续为双方提供数据包的转发;edge node负责数据流的加解密,原理很简单。

 

至此,我们已经了解,部署n2n至少需要两台以上的机器。

 

我们此文采用两台centos。

 

centos7(super node) - 150.0.0.1 (公网IP)

 

centos 7(edge node)- 192.168.1.121 (虚拟机内网IP)

 

使用n2n产生的虚拟网段,将为 10.0.0.1 ~ 10.0.0.255

 

安装n2n

 

无论是edgenode还是supernode 都需要安装n2n,所以下面安装方法通用,提供两种n2n资源,均可。

 

git clone https://github.com/meyerd/n2n.git

 

or

 

svn co https://svn.ntop.org/svn/ntop/trunk/n2n

 

n2n分为v1和v2版本,两种协议互不兼容。我们选择v2版本。

 

cd n2n/n2n_v2

 

安装openssl、cmake、git、gcc、net-

 

yum install -y openssl-devel
yum install -y cmake
yum install -y net-tools
yum install -y git
yum install -y gcc gcc-c++

 

编译安装n2n

 

mkdir build
cd build
cmake ..
make && make install

 

n2n编译安装完,会产生两个程序指令,edge 和 supernode,欠着是边缘节点使用(客户端),后者则是超级节点使用(服务端)。

 

supernode(服务端运行)

 

supernode -l 5000

 

超级节点开启5000端口进行监听,以此来提供建交服务。

 

服务端也可以同时当做客户端使用,将服务端加入到虚拟网络中。

 

edge -a 10.0.0.10 -c edge0 -k wss -l 150.0.0.1:5000

 

edgenode(客户端运行)

 

edge -a 10.0.0.11 -c edge0 -k wss -l 150.0.0.1:5000

 

10.0.0.11 这个IP是虚拟网段,其他加入虚拟网络中的IP地址需要在同一网段,统一key,即wss(可设置为其他)。

 

 

 

此节点已有10.0.0.11这个IP,所在的是n2n创建的虚拟网卡,kill 掉edge 进程则此网卡销毁。

 

查看edge或者supernode 进程

 

ps -ef|grep supernodeps -ef|grep edge

 

--help

 

 

 

本文提到的重要参数

 

-k wss 通讯私匙,一般不用放在supernode节点,可自行约定edge节点的私匙统一设置。

 

-M 1200 设置mtu

 

-v -f 开启调试输出

 

调试

 

使用过程中不免遇到一些奇葩的事,调试是个关键,一些大的坑已经为你们踩过了,剩下的基本没啥问题。

 

1.开启调试模式

 

记住先kill掉之前的edge 或 supernode进程再进行调试以免冲突。

 

附加参数即可: -v -f

 

edge

 

edge -a 10.0.0.11 -c edge0 -k wss -l 150.0.0.1:5000 -v -f

 

supernode

 

supernode -l 5000 -v -f

 

2.正常使用,节点互相连接不通。

 

如果ping都不通,怀疑是防火墙的问题?测试请先直接关闭防火墙。完毕后,将其恢复,慢慢测试。

 

防火墙放行端口示例:

 

iptables -I INPUT -p tcp --dport 5000 -j ACCEPT
iptables -I INPUT -p udp --dport 5000 -j ACCEPT
iptables save
service iptables restart

 

 

 

2.创建了客户端,虚拟网卡没有ip

 

 

 

如果你开启调试模式了,可能就会看到原来是ifconfig 命令不存在,这个命令在net-tools包里(centos),那么就需要安装,重新开启edge即可解决。

 

安装net-tools

 

yum install -y net-tools

 

手动设置网卡IP(可省略,测试可以使用)

 

ifconfig edge0 10.0.0.11  netmask 255.255.255.0

 

那么,如果这步不成功的话,自然网络没有配置建立好,也就无法正常穿透内网。此时如果不开启调试模式,你也看不到任何错误,也就是很多人往往出现的配置好了,却无法正常访问,ping都不通,何以解忧。

 

3.ping能通,http和ssh却不通。

 

设置mtu值即可

 

edge -a 10.0.0.11 -c edge0 -k wss -l 150.0.0.1:5000 -M 1200

 

一般低于1400即可,当前设置1200。(不要忘了kill之前的进程哦)

 

至此,问题基本得以解决。

 

测试

 

10.0.0.10 (supernode、edge) 10不仅是超级节点也是边缘节点。

 

10.0.0.11(edge)无数边缘节点中其中一个

 

10 ping 11

 

 

 

11 ping 10

 

 

 

自此,网络可以互相访问,畅通无阻。如果你用你自己的电脑,需要将其加入到虚拟网络中,即可像局域网一样访问。

 

windows edge客户端软件

 

http://www.V**hosting.cz/n2nguien.exe

 

http://sourceforge.net/projects/n2nedgegui/

 

还要其他版本以及安卓版本,自行搜捕。

 

nginx转发端口代理映射

 

最后,我们将用nginx转发下公网IP端口到内网指定ip指定端口,这样可以让外界不加入虚拟网络即可访问其中的节点机器。

 

用户客户端 =》 公网IP(150.0.0.1:6011)=》虚拟内网(10.0.0.11:22)

 

从流程来看,我们的用户将访问公网IP的6011端口,可以连接到内网机器10.0.0.11的22端口(ssh)。

 

首先关闭防火墙或放行公网6011端口连接

 

vi /etc/sysconfig/iptables

 

增加

 

-A INPUT -p tcp -m state --state NEW -m tcp --dport 6011 -j ACCEPT

 

 

 

安装nginx(supernode)

 

详细请参照此文

 

注意需要转发tcp数据,编译时附加参数:--with-stream

 

#安装编译支持库
mkdir /mnt/tools -p
cd /mnt/tools
yum -y install gcc automake autoconf libtool make
yum install gcc gcc-c++#安装PCRE
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.40.tar.gz
tar -xzf pcre-8.40.tar.gz -C ./
cd pcre-8.40
./configure --prefix=/usr/local/pcre
make && make install
cd ..#安装zlib
wget http://zlib.net/zlib-1.2.11.tar.gz
tar -xzf zlib-1.2.11.tar.gz -C ./
cd zlib-1.2.11
./configure --prefix=/usr/local/zlib
make && make install
cd ..#安装openss
wget https://www.openssl.org/source/openssl-1.0.2k.tar.gz
tar -xzf openssl-1.0.2k.tar.gz -C ./
#注意,这里不需要进行安装,后面步骤省略。#编译安装nginx
wget http://nginx.org/download/nginx-1.12.0.tar.gz
tar -xzf nginx-1.12.0.tar.gz  -C ./
cd nginx-1.12.0./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--with-http_ssl_module \
--with-pcre=/mnt/tools/pcre-8.40/ \
--with-zlib=/mnt/tools/zlib-1.2.11/ \
--with-openssl=/mnt/tools/openssl-1.0.2k/ \
--with-stream#注:cpre、zlib、openssl等依赖包的路径是解压的源码路径不是安装后的路径。make
make install

 

编译安装完毕后,到nginx目录。

 

cd /usr/local/nginx/

 

编辑配置nginx.conf

 

stream {log_format proxy '$remote_addr [$time_local] ''$protocol $status $bytes_sent $bytes_received ''$session_time "$upstream_addr" ''"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';access_log /var/log/nginx/tcp-access.log proxy ;open_log_file_cache off;include /usr/local/nginx/conf.d/*.stream;
}

 

创建日志目录

 

mkdir /var/log/nginx/

 

创建模块配置目录并进入

 

mkdir /usr/local/nginx/conf.d/
cd /usr/local/nginx/conf.d/

 

新建tcp.stream文件(vi tcp.stream)

 

upstream TCP6011 {hash $remote_addr consistent;server 10.0.0.11:22;}server {listen 6011;proxy_connect_timeout 5s;proxy_timeout 300s;proxy_pass TCP6011;}

 

重载nginx

 

cd ..

 

./nginx -s reload

 

使用putty连接 150.0.0.1:6011 成功连接10.0.0.11

 

 

 

因为是nginx代理请求,所以来源是10.0.0.10而不是直接客户端。所以流量也会全部走supernode服务器而不直接交互。如果本地也配置到虚拟网络,即建立连接通过supernode,之后则直接互通。

 

详细请了解n2n官方,这个项目已经不在维护,但依然在广泛使用。

 

http://www.ntop.org/n2n/

 

https://sourceforge.net/projects/ntop/files/n2n/

 

https://www.buckhill.co.uk/blog/how-to-enable-broadcast-and-multicast-support-on-amazon-aws-ec2/2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows下快速删除上万个文件和子目录

为什么会慢 如果直接在Windows文件管理器里删除的话(通过菜单或者键盘Del或者ShiftDel),删除这个数量的文件需要大概10几分钟,具体根据文件数量目录层次不同耗时不同。这么慢是因为在删除之前系统有个准备阶段,在这个阶…

终于有人把安卓程序员必学知识点全整理出来了,BAT大厂面试总结

行业激烈变化时,恰恰是机会最多的时候 坦白讲,许多人骨子里害怕变化和竞争。 其实大可不必。 一来,怕也没用嘛。二来,变化越快,组合要素增加了,意味着新的工作机会越多。 就像传统媒体VS新媒体。 放在…

c#反混淆工具de4dot 一般混淆都可以解决

c#反混淆工具de4dot 一般混淆都可以解决 使用方法: 1、CMD 打开 De4Dot 所在文件夹 最好是以管理员身份运行CMD 2、输入 De4Dot C:\Users\muzigaiyu\Desktop\demo.exe 回车 成功后会在软件所在文件夹生成 demo-cleaned.exe 在用dotpeek 或者其他软件打开exe即可看…

餐厅点餐系统:测试与部署

项目测试与部署 1.系统测试 项目调试完成后,将项目打包成war包放入tomcat/wabapps文件夹,本机启动tomcat,redis缓存,mysql数据库等服务,本机访问localhost:8080/BookFood,测试系统的各个功能是否…

SpringCloud与Seata分布式事务初体验

在本篇文章中我们在SpringCloud环境下通过使用Seata来模拟用户购买商品时由于用户余额不足导致本次订单提交失败,来验证下在MySQL数据库内事务是否会回滚。 本章文章只涉及所需要测试的服务列表以及Seata配置部分。 用户提交订单购买商品大致分为以下几个步骤&…

想学IT的必看!今年Android面试必问的这些技术面,架构师必备技能

第一次观看我文章的朋友,可以关注、点赞、转发一下,每天分享各种干货技术和程序猿趣事 前言 职场的金三银四跳槽季又来了,不同的是今年比往年「冷」一些,形式更加严峻一些,大家多多少少可能都听到或看到一些信息&…

springboot集成redis使用redis作为session报错ClassNotFoundException类RememberMeServices

springboot 集成redis使用redis作为缓存,会报错的问题。 错误信息: java.lang.IllegalStateException: Error processing condition on org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration.taskSchedulerat org.springframew…

阿里巴巴分布式事务利器Seata环境准备

阿里巴巴自从跟SpringCloud共同发起创建微服务开源社区时,开启了SpringCloud Alibaba分支,而且在生态内提供了一款适用于分布式应用程序(Dubbo、SpringCloud等)的事务框架Seata,该框架经过多个大版本的发布&#xff0c…

对于‘敲什么都队’自主开发的《校园服务》软件的使用体验

信1805-1 边信哲 20183694 在六月十三日我系组织的2017级软件工程交流大会中,我为第十一组敲什么都队’自主开发的《校园服务》软件投出了我的一票,在为数众多的校园服务类软件中,《校园服务》最吸引我的地方就是他们的软件能完成数据…

阿里P7大牛亲自教你!BAT这种大厂履历意味着什么?积累总结

金九银十过后各大网络平台都是各种面经分享,包括已收offer,或面试失败的都有,相信大部分人都拿到了自己心仪的大厂offer,不过也有没有少数没能进到自己内心向往的大厂而懊恼的,那么到底如何才能进大厂,该准…

启动mac版docker自带的k8s

最近准备好好学习下k8s,为了图方便,直接使用docker集成的k8s,但是网上找了一些教程但都没能一次性成功,只好自己从头跑一遍,顺手写个教程可以方便有类似需求的同学参考。 话不多说,直接上步骤。 1.下载doc…

yum安装mysql

在CentOS7中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB。 1. 下载并安装MySQL官方的 Yum Repository 1[rootBrianZhu /]# wget -i -c http://dev.mysql.com…

springboot很多以来jar包是在外部当时候,如何打dockerfile到阿里云

首先保证springboot与各种jar包文件夹在同一目录 dockerfile如下内容 FROM frolvlad/alpine-oraclejdk8 VOLUME /usr/cloud ADD lib /lib/ ADD lib_attachment /lib_attachment/ ADD lib_bigdata /lib_bigdata/ ADD lib_bpm /lib_bpm/ ADD lib_deploy /lib_deploy/ ADD lib_el…

阿里P7大牛手把手教你!一眼就能看懂的Android自学手册,真香!

前言 曾听过很多人说Android学习很简单,做个App就上手了,工作机会多,毕业后也比较容易找工作。这种观点可能是很多Android开发者最开始入行的原因之一。 在工作初期,工作主要是按照业务需求实现App页面的功能,按照设…

【VScode】使用VScode 来写markdown时序图

准备工作在VScode中下载插件Markdown Preview Enhanced插件创建一个.md文件在VScode中打开文件,界面内点击右键可以看到Open preview to the side(还有很多方法外面都能搜到),可以进行实时预览效果开始markdown第一行主标题(次标题依次加#&am…

阿里P7大牛整理!BAT大厂面试基础题集合,成功入职字节跳动

都说大厂面试必问源码,可很多人看完MMKV 源码、Handler 源码、Binder 源码、OkHttp 源码等源码记不住,是脑子有问题吗?当然不是!是因为你没有掌握学习源码的技巧。 我的朋友子路,很多人都叫他路神,称他为“…

大项目之网上书城(八)——数据库大改添加图书

目录 大项目之网上书城(八)——数据库大改&添加图书主要改动1.数据库新增表代码2.数据库新增触发器3.其他对BookService和BookDao的修改代码4.addBook.jsp代码效果图5.AddNewBookServlet代码大项目之网上书城(八)——数据库大…

hping3工具DOS攻击实验

需要两台机器,一台扮演攻击源,另一做目标源。 攻击源地址:10.0.40.4 被攻击机器地址:10.0.40.246 2 被攻击的机器上安装tcpdump,tcpdump主要是用来抓包的,看看网络数据包是否到达。 $ yum install tcpdump -y 3 首先开启tcp…

腾讯T2亲自讲解!搞懂开源框架设计思想真的这么重要吗?系列篇

Java相关 无论什么级别的Android从业者,Java作为Android开发基础语言。不管是工作还是面试中,Java都是必考题。如果不懂Java的话,薪酬会非常吃亏(美团尤为重视Java基础) 详细介绍了Java泛型、注解、并发编程、数据传…

解决Docker容器内访问宿主机MySQL数据库服务器的问题

懒得描述太多,总归是解决了问题,方法简要记录如下,虽然简要,但是完整,一来纪念处理该问题耗费的大半天时间,二来本着共享精神帮助其他遇到该问题的哥们儿,当然这个方法并不一定能解决你们的问题,但是多少能提供些解决思路. 第一,先检查防火墙,通常应该没什么问题 (问题解决之后…