文档章节

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

Eller
 Eller
发布于 2017/07/30 23:18
字数 1956
阅读 1995
收藏 3

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

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

 

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

n2n

如上图所示,n2n是一个二层架构的VPN网络,其中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 supernode

ps -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

616 uvccl8p lfhoncqcvtq

如果你开启调试模式了,可能就会看到原来是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.vpnhosting.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

 

(完)

 

© 著作权归作者所有

共有 人打赏支持
Eller
粉丝 12
博文 46
码字总数 43998
作品 0
深圳
程序员
私信 提问
加载中

评论(2)

Eller
Eller

引用来自“chuckxia”的评论

大侠 N2N按照步骤已经装好

就是到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;
}

这里 贴进去就显示代码不是太对 卡在这里 是不是这段代码有问题 或者是我贴的地方错了
你好,nginx.conf中的stream分为4项,
log_format
access_log
open_log_file_cache
include

可以先将这些用 # 符号 屏蔽掉,一项一项的放开测试,看具体问题出现在哪里以及你的报错具体内容是啥很重要。

chuckxia
chuckxia
大侠 N2N按照步骤已经装好

就是到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;
}

这里 贴进去就显示代码不是太对 卡在这里 是不是这段代码有问题 或者是我贴的地方错了
组建N2N VPN网络实现内网设备之间的相互访问

组建N2N VPN网络实现内网设备之间的相互访问 树叶的BLOG2017-12-036 阅读 VPN网络 概述 如果要实现设备的远程访问,比如在公司访问家里的电脑、路由器、智能开关等,我们一般会需要一个公网地...

树叶的BLOG
2017/12/03
0
0
blockChain - upnp & nat-pmp

常见的NAT穿透方法比如UDP打洞,或者STUN协议,但是这些方法都需要另一个已知的部署在公网环境下的服务器。 不需要部署任何公网环境下的服务器,通过路由器支持的UPnP协议来把内网的接口绑定...

YKIT
2018/05/17
0
0
常用集中内网穿透&端口映射软件工具

版权声明:本文为EnweiTech原创文章,未经博主允许不得转载。 https://blog.csdn.net/English0523/article/details/85006287 大家都用什么内网穿透?ngrok还是frp?自己搭建的还是国内免费的...

天府云创
2018/12/14
0
0
内网打洞技术:花生棒解决无固定IP地址网络环境

ERP、VPN、内网穿透、远程访问,这串有些陌生的词可能让你完全摸不着头脑,但是如果说到搭建私有云、远程办公、建立属于自己的博客,是不是瞬间又对这些实用的功能一下子充满热情?理想和现实...

花生壳动态域名解析
2017/02/24
4
0
借助EasyNTS云组网,无需拉专线,也能解决设备现场无公网固定IP的问题

版权声明:本文为EasyDarwin开源社区原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiejiashu/article/details/85414655 一、产品背景 为了帮助企业和个人用户解决网络访问和设备...

xiejiashu
2018/12/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【结构型】- 享元模式

享元模式 作用:利用共享技术有效地支持大量细粒度对象的复用 享元模式状态 内部状态:在享元对象内部不随外界环境改变而改变的共享部分,存储于享元对象内部 外部状态:随着环境的改变而改变...

ZeroneLove
昨天
1
0
Vue 中使用UEditor富文本编辑器-亲测可用-vue-ueditor-wrap

一、Vue中在使用Vue CLI开发中默认没法使用UEditor 其中UEditor中也存在不少错误,再引用过程中。 但是UEditor相对还是比较好用的一个富文本编辑器。 vue-ueditor-wrap说明 Vue + UEditor + ...

tianma3798
昨天
4
0
php-fpm配置

php-fpm配置 修改bbs.wangzb.cc.conf配置文件,将端口9000改为9001,重新访问网站是失败的 修改配置文件 # vim /etc/nginx/conf.d/bbs.wangzb.cc.conf# nginx -s reloadfastcgi_pass 1...

wzb88
昨天
1
0
配置方案:Redis持久化RDB和AOF

Redis持久化方案 Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘。当下次Redis重启时,...

linuxprobe16
昨天
6
0
介绍NoSQL最受欢迎的产品

MongoDB MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。主要解决的是海量数据的访问效率问题,为WEB应用提供可扩展的高性能数据存储解决方案。当数据量达到50GB以上的时候,Mon...

问题终结者
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部