<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:wfw="http://wellformedweb.org/CommentAPI/">
<channel>
<title>dwt&#039;s life - n2n</title>
<link>https://dwt.life/tag/n2n/</link>
<atom:link href="https://dwt.life/feed/tag/n2n/" rel="self" type="application/rss+xml" />
<language>zh-CN</language>
<description></description>
<lastBuildDate>Sat, 21 Aug 2021 00:37:00 +0800</lastBuildDate>
<pubDate>Sat, 21 Aug 2021 00:37:00 +0800</pubDate>
<item>
<title>n2n使用和编译（以及未解决的问题）</title>
<link>https://dwt.life/archives/126/</link>
<guid>https://dwt.life/archives/126/</guid>
<pubDate>Sat, 21 Aug 2021 00:37:00 +0800</pubDate>
<dc:creator>Ricky</dc:creator>
<description><![CDATA[编译armbian需要提前安装cmake gcc等软件，以及：apt-get install pkg-config方法一：git clone https://github.com/ntop/n2...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h2>编译</h2><p>armbian需要提前安装cmake gcc等软件，以及：<br><code>apt-get install pkg-config</code></p><p>方法一：</p><pre><code class="lang-shell">git clone https://github.com/ntop/n2n.git
./autogen.sh
./configure
make
make install</code></pre><p>方法二：</p><pre><code class="lang-shell">mkdir build
cd build
cmake ..
maek &amp;&amp; make install</code></pre><p><strong>make install后日志才会存储到/var/log/messages中</strong></p><h2>配置文件</h2><h3>supernode.conf:</h3><pre><code>-p=25520
-c=community.list</code></pre><h3>edge.conf:</h3><pre><code>-d virtnet
-a 虚拟IP
-l 节点
-c netleo
-I 用户名
-J 密码
-A5
-k yeapcloud</code></pre><h2>生成密钥</h2><pre><code class="lang-shell">[user@machine n2n]$ tools/n2n-keygen ricky 007
* ricky nHWum+r42k1qDXdIeH-WFKeylK5UyLStRzxofRNAgpG</code></pre><p>然后放到community.list中</p><h2>问题</h2><p>指定publickey name的时候，添加到edge的配置文件后，就无法与supernode通信，去掉就正常。原因未知。</p><pre><code class="lang-shell">[user@host n2n]$ tools/n2n-keygen -F secretFed
-P opIyaWhWjKLJSNOHNpKnGmelhHWRqkmY5pAx7lbDHp4</code></pre><blockquote><p>参考</p><ol><li><a href="https://github.com/ntop/n2n/blob/dev/doc/Authentication.md">Authentication</a></li></ol></blockquote>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://dwt.life/archives/126/#comments</comments>
<wfw:commentRss>https://dwt.life/feed/tag/n2n/</wfw:commentRss>
</item>
<item>
<title>N2N 验证</title>
<link>https://dwt.life/archives/78/</link>
<guid>https://dwt.life/archives/78/</guid>
<pubDate>Tue, 13 Jul 2021 16:25:22 +0800</pubDate>
<dc:creator>Ricky</dc:creator>
<description><![CDATA[来自官方的issue回答：First of all, you should use -c &lt;community.list file name&gt; at the supernode. T...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<p>来自官方的issue回答：</p><blockquote><p>First of all, you should use <code>-c &lt;community.list file name&gt;</code> at the supernode. The plain text file contains all <a href="https://github.com/ntop/n2n/blob/dev/doc/Communities.md#restrict-supernode-access">allowed community names</a>. Only listed communties will be allowed to connect then, so keep the name secret. A sample <code>community.list</code> file (including more detailed information also about advanced features) should come with n2n.</p><p>As the community name is transmitted in plain text by default, sniffing would reveal it. That is why you should enable <a href="https://github.com/ntop/n2n/blob/dev/doc/Crypto.md#header">header encryption</a> (<code>-H</code>) at <strong>all</strong> the edges. Header encryption is a per-community setting; all edges of one community need to either have it enabled or disabled.</p><p>Going with this configuration, only edges knowing the right community name (<code>-c &lt;community.list file name&gt;</code>) will be able to register to the supernode and join the community.</p><p>You might find our <a href="https://github.com/ntop/n2n/blob/dev/doc/Faq.md#i-want-to-setup-a-supernode-that-only-i-can-use-perhaps-even-password-protected">FAQ</a> helpful.</p></blockquote>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://dwt.life/archives/78/#comments</comments>
<wfw:commentRss>https://dwt.life/feed/tag/n2n/</wfw:commentRss>
</item>
<item>
<title>网络之NAT 和N2N VPN</title>
<link>https://dwt.life/archives/74/</link>
<guid>https://dwt.life/archives/74/</guid>
<pubDate>Mon, 12 Jul 2021 20:03:00 +0800</pubDate>
<dc:creator>Ricky</dc:creator>
<description><![CDATA[N2N VPN 应用指南N2N 是一个P2P的开源VPN项目，具有内网穿透成功率高，去中心化，流量加密，使用简单的特点， 在笔者公司内部已经有近3年的使用经验，实践证明，N2N具备较为优秀的稳定...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<p>N2N VPN 应用指南<br>N2N 是一个P2P的开源VPN项目，具有内网穿透成功率高，去中心化，流量加密，使用简单的特点， 在笔者公司内部已经有近3年的使用经验，实践证明，N2N具备较为优秀的稳定性和安全性,，具备低成本替代专线需求的能力。在笔者的实践经验中，N2N用在多IDC之间的网络互通，多IDC上容器网络的互通。 表现的都很出色。<br><img src="https://pic.8oh.com.cn/cos/2021/07/12/2b190045a2ad1_1626092715.png" alt="98.png" title="98.png"></p><h1>一、 N2N通信原理</h1><p>N2N 是基于P2P协议的加密2层专用网络， 使用UDP协议进行封包传输，使用UDP协议带来了高性能和便捷性，例如利用很多场景下不会封锁DNS的UDP端口来打通网络，例如UDP原生优于TCP的传输性能。在NAT条件允许的情况下， edge节点间流量直连，无需通过supernode转发。</p><h2>1. NAT的原理</h2><p>想要理解UDP穿透的原理，就需要先了解NAT 的原理， 都知道NAT是地址转换，哪怎么个转换法哪？<br>SNAT： 源地址转换，当请求本文经过NAT网关时。NAT网关会将报文中的源地址替换掉，替换成能与目标地址路由互通的地址，此时目标地址不变，所以最终报文抵达目标服务。<br>DNAT： 目标地址转换，当service完成处理后返回数据，返回报文时的源地址和目标地址反过来，抵达NAT网关后NAT网关根据请求出去的时候的SNAT记录做反转，将目标地址转换成内网地址，最终抵达客户端。</p><h2>2. NAPT</h2><p>NAPT与NAT的唯一区别就是:NAT只转换IP地址，这种方式受限于对外的地址数量，是IP到IP的转换。所以常规NAT的方式的主要应用场景现实里可类比阿里云或者各种云的EIP。而NAPT同时会对源和目标端口进行转换，这就可以实现了一个公网IP可以满足多个后端主机同时访问外部网络，NAPT的常用场景例如家庭宽带、阿里云的NAT网关等。儿N2N的生存环境中，主要的场景基本都是NAPT，NAPT也是目前应用最为广泛的NAT方案，其有如下几种模式：<br>锥形NAT与对称NAT的区别，锥形NAT：只要是从同一个内部地址和端口出来的包，无论目的地址是否相同，NAT 都将它转换成同一个外部地址和端口。不满足这个条件的即可称之为对称NAT。<br>Full Cone NAT<br>锥形NAT， 当发出一个外部请求时， NAT网关会打开一个端口创建一个公网映射，然后会将传入这个端口的数据全部转发给内部主机。Full Cone NAT是最宽松的NAT规则，一旦映射建立，那么只要到公网的映射端口发送数据就可以直接到达后端服务。</p><h3>Address Restricted Cone NAT</h3><p>受限的锥形NAT， 当发出一个外部请求时，NAT网关会打开一个端口创建一个公网映射， 同时记录外部的主机IP，然后会将已经有记录IP地址并且从这个地址传来的数据转发给内部主机，其他数据会被丢弃。Address Restricted Cone NAT只限制IP不限制端口。<br>Port Restricted Cone NAT<br>严格限制的锥形NAT，同时记录外部主机的IP和端口， 然后校验传入端口的数据报文，必须地址和端口和记录的一致才会转发到对应的内部主机，否则会丢弃。Port Restricted Cone NAT同时校验和限制IP和端口。</p><h3>Symmetric NAT</h3><p>又叫对称NAT，每一个来自相同内部IP与端口，到一个特定目的地地址和端口的请求，都映射到一个独特的外部IP地址和端口。同一内部IP与端口发到不同的目的地和端口的信息包，都使用不同的映射。只有曾经收到过内部主机数据包的外部主机，才能够把数据包发回。<br>NAT的优缺点：<br>优点： 解决了IPV4 公网地址不够用的问题。能够隐藏和保护内网主机的地址。方便在NAT层扩展防火墙，负载均衡功能。<br>缺点：NAT网关对报文进行地址转换的本质是对报文源和目标的修改，这会导致额外的延迟和开销。</p><h2>3.关于内网穿透</h2><p>内网穿透俗称打洞，其实就是透过NAT对外提供服务的方式。当下流行的内网穿透工具ngrok和frp本质上是通过应用层的端口映射实现。即服务端监听一个公网端口，当外部用户请求到这个公网端口时，ngrok通过与客户端建立的连接来进行请求的转发。这种工具只能做到4层或者7层的内网穿透，而N2N 实现了2层的网络穿透。<br>对于锥形NAT来说，supernode节点像是个中介，介绍edge互相认识后，之间的交互直接就是edge与edge的交互了。这也是N2N 最优势与其他中心化方案的地方。流量直连。避免中间转发的开销。<br>对于对称NAT来说， supernode就是个邮局，所有到达对端的数据报文都要由supernode中转。所以两端交互不但会产生额外的消耗，还会受限于supernode节点的带宽。</p><h1>二、 N2N组件及配置</h1><h2>1. 基本组件</h2><p>supernode： 可以视为注册中心，用来注册各接入点的信息，相当于一张地址列表，在对称型或者端口受限型NAT的情况下，edge之间无法直接交互数据，此时需要通过supernode转发流量。<br>edge： 边缘节点， 负责与其他edge或者supernode进行数据交互，报文解密等， 会定时跟supernode通信，获取信息。</p><p>工作流程：</p><p>edge向supernode注册，supernode记下edge的信息，包括外网ip和端口，虚拟ip、虚拟mac地址、community等信息。<br>edge监听虚拟网卡，获取网卡要发送的数据。<br>当从虚拟网卡读取到数据时，将数据包发送到supernode。<br>supernode提取数据包中的mac地址，并查询注册列表，并附上来源地址和端口，转发到目标edge。<br>目标edge收到数据包，提取来源地址和端口，并尝试udp直连<br>若直连成功，数据包不再走supernode中转，否则一直从supernode中转。</p><h2>2. 配置</h2><p>edge配置</p><pre><code>Welcome to n2n v.2.1.0 for Linux-3.10.0-514.26.2.el7.x86_64
Built on Oct 25 2017 21:02:37
Copyright 2007-09 - http://www.ntop.org

edge -d &lt;tun device&gt; -a [static:|dhcp:]&lt;tun IP address&gt; -c &lt;community&gt; [-k &lt;encrypt key&gt; | -K &lt;key file&gt;] [-s &lt;netmask&gt;] [-u &lt;uid&gt; -g &lt;gid&gt;][-f][-m &lt;MAC address&gt;]
-l &lt;supernode host:port&gt; [-p &lt;local port&gt;] [-M &lt;mtu&gt;] [-r] [-E] [-v] [-t &lt;mgmt port&gt;] [-b] [-h]

# 虚拟设备名称。
-d &lt;tun device&gt;          | tun device name  
# 虚拟网卡上的虚拟IP或者指定DHCP广播
-a &lt;mode:address&gt;        | Set interface address. For DHCP use &#039;-r -a dhcp:0.0.0.0&#039; 
# 组名，n2n只是多个隔离网络，隔离网络会以组名来区分。
-c &lt;community&gt;           | n2n community name the edge belongs to. 
# 指定秘钥N2N 使用twofish加密算法进行数据加密。同一个网络里面的秘钥需要保持一致，supernode并不存储秘钥
-k &lt;encrypt key&gt;         | Encryption key (ASCII) - also N2N_KEY=&lt;encrypt key&gt;. Not with -K. 
# 秘钥文件和小写的-k选择其一即可
-K &lt;key file&gt;            | Specify a key schedule file to load. Not with -k.
# 虚拟网络的子网掩码
-s &lt;netmask&gt;             | Edge interface netmask in dotted decimal notation (255.255.255.0).
# supernode 的服务端地址和端口， 最多可以指定2个，做supernode的高可用
-l &lt;supernode host:port&gt; | Supernode IP:port
# 添加本地IP
-L &lt;local_ip&gt;            | Add local ip to bypass between same nat problem
# 设置NAT打洞间隔，默认20秒
-i &lt;interval&gt;            | Set the NAT hole-punch interval (default 20seconds)
#定期解析supernode的地址，如果supernode是一个域名且后端IP会产生变化的时候比较有用。
-b                       | Periodically resolve supernode IP
                         : (when supernodes are running on dynamic IPs)
-p &lt;local port&gt;          | Fixed local UDP port.
# 设置运行用户
-u &lt;UID&gt;                 | User ID (numeric) to use when privileges are dropped.
-g &lt;GID&gt;                 | Group ID (numeric) to use when privileges are dropped.
# 设定运行方式默认情况相爱自动使用daemon的方式运行，加入-f直接运行在前台。
-f                       | Do not fork and run as a daemon; rather run in foreground.
# 设置虚拟网卡MAC地址
-m &lt;MAC address&gt;         | Fix MAC address for the TAP interface (otherwise it may be random)
                         : eg. -m 01:02:03:04:05:06
# 设定mtu， 默认情况下是1400，不建议做改动。                         
-M &lt;mtu&gt;                 | Specify n2n MTU of edge interface (default 1400).
-r                       | Enable packet forwarding through n2n community.
# 是否接受多播MAC地址，默认不允许
-E                       | Accept multicast MAC addresses (default=drop).
-v                       | Make more verbose. Repeat as required.
# 管理UDP port 当一台主机上运行多个edge时，需要单独指定。
-t                       | Management UDP Port (for multiple edges on a machine).

Environment variables:
  N2N_KEY                | Encryption key (ASCII). Not with -K or -k.
supernode配置
supernode usage
# 指定UDP监听端口
-l &lt;lport&gt;  Set UDP main listen port to &lt;lport&gt;
#设定运行方式默认情况相爱自动使用daemon的方式运行，加入-f直接运行在前台。
-f          Run in foreground.
-u &lt;UID&gt;    User ID (numeric) to use when privileges are dropped.
-g &lt;GID&gt;    Group ID (numeric) to use when privileges are dropped.
-v          Increase verbosity. Can be used multiple times.
-h          This help message.</code></pre><h1>三、实战</h1><h2>1. 编译构建</h2><pre><code>#clone 源码
git clone https://github.com/meyerd/n2n.git

#安装依赖
yum install cmake openssl openssl-devel gcc-c++ git -y

#编译
cd n2n/n2n_v2
mkdir build 
cd build
cmake ..
make &amp;&amp; make install
# 会生成edge、supernode可执行文件。</code></pre><h2>2. 多IDC间的网络互通</h2><p>场景：<br>有杭州、北京2个IDC机房：杭州机房网络：172.16.0.0/16、北京机房网络：172.17.0.0/16<br>杭州IDC 的edge节点IP: 172.16.0.1/北京IDC的edge节点IP： 172.17.0.1<br>办公网网络：192.168.0.0/16<br>外网服务器（112.112.112.112和113.113.113.113）两台部署supernode</p><pre><code># 在外网服务器执行以下命令即可启动supernode：
supernode -l 1024

#办公网主机上执行
edge -r -a 10.0.0.1 -l 112.112.112.112:1024 -l 113.113.113.113:1024 -d edge1 -c 网络组 -k 秘钥

#杭州IDC机房主机上执行
edge -r -a 10.0.0.2 -l 112.112.112.112:1024 -l 113.113.113.113:1024 -d edge1 -c 网络组 -k 秘钥

#北京IDC机房主机上执行
edge -r -a 10.0.0.3 -l 112.112.112.112:1024 -l 113.113.113.113:1024 -d edge1 -c 网络组 -k 秘钥

# 所有节点开启路由转发
sysctl -w net.ipv4.ip_forward=1

#=========如果IDC网关可控可维护规则==========
#办公网主机上和核心交换上添加路由表
route add -net 172.16.0.0/16 gw 10.0.0.2
route add -net 172.17.0.0/16 gw 10.0.0.3

#在杭州IDC 网关上添加路由表：
route add -net 192.168.0.0/16 gw 172.16.0.1

#在北京IDC 网关上添加路由表：
route add -net 192.168.0.0/16 gw 172.17.0.1

# 在杭州和北京的edge上维护路由表
route add -net 192.168.0.0/16 gw 10.0.0.1

#=========如果IDC网关不可维护规则==========
# 在所有的edge上添加iptables规则：
iptables -t nat -A POSTROUTING -d 172.16.0.0/16 -j MASQUERADE # 杭州
iptables -t nat -A POSTROUTING -d 172.17.0.0/16 -j MASQUERADE # 北京</code></pre><p>这里是利用iptables做了SNAT， 做SNAT的原因是，当无法维护网关上的路由规则，外部请求过来的报文源地址是N2N 的虚拟地址，且这个虚拟地址除了edge所在的主机外其他主机均无法识别，导致无法回包，所以需要经过snat将地址转换成edge节点的主机IP。<br>引申思考：假设上面的场景里面还有一个kubernetes集群，我们需要在办公网直接连接kubernetes集群网络中的某一个pod，需要怎么做？答案其实非常简单，假设上例中的杭州IDC的edge节点同时是一个kubernetes的node。是不是只需要在办公网添加一条路由，把容器网络的下一跳指向到杭州edge节点的虚拟IP就行了？按照这个道理，结合实际的场景灵活应对即可。可继续关注本专栏，后面会有实际场景中的容器网络方案分享的文章。</p><h1>四、注意事项</h1><p>NAT 的模式直接决定流量是要通过supernode中转，所以在使用对称NAT的场景下流量使用supernode进行流量转发，需要注意supernode的带宽会成为edge间数据交互的瓶颈。<br>当一些场景下，网关不可控时需要通过地址伪装（SNAT）的方式保证网络的连通性，但只因为经过了地址转换，请求业务时获取到的客户端IP地址会是转换后的地址。一些针对IP的审计无法做到。<br>supernode 与edge间的网络通信使用UDP协议，请注意网络策略要放开。<br>iptables规则、本地路由表默认情况下重启会清空，需要注意持久化问题。</p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://dwt.life/archives/74/#comments</comments>
<wfw:commentRss>https://dwt.life/feed/tag/n2n/</wfw:commentRss>
</item>
</channel>
</rss>