V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hiplon
V2EX  ›  宽带症候群

n2n 动态路由器异地组网方案 [简单异地组网 Step by Step]

  •  1
     
  •   hiplon · 2021-07-23 19:03:04 +08:00 · 4905 次点击
    这是一个创建于 978 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本文主要介绍通过 n2n 结合动态路由 RIP 的异地组网方案,经过近一年的使用,比较稳定,所以分享一下。

    ( 0 )前言及网络拓扑

    首先简单说一下组网的拓扑: Topo

    此前在 v 站和我的博客 也有陆续发过一些异地组网的方法:

    通过 N2N 组网并运行 OSPF 动态路由 on OpenWRT

    用动态路由打通各 Virtual L2 ( Zerotier )网络

    OpenWRT 结合 tinc 组自己的 SDLAN ( Step by Step )

    OpenWRT 搭建 WireGuard 服务器

    大家收藏点赞挺多的,就是没啥回复😆

    现在分享一下已经稳定运行一年多的方案,n2n + quagga-rip,方案只需一个带公网 IP 的服务器作握手 /中继(也可以用 n2n 官网提供的[不推荐]),在网络环境较好的情况下基本握手后可以实现直接穿透。

    ( 1 )安装配置 n2n

    n2n 软件 主要实现 peer-to-peer 虚拟组网功能,编译快速,配置简单,稳定。一般同类的软件有 zerotier, tinc, ... 本人基本都用过,综合考虑使用 n2n, 其它同类软件实现功能一样。

    SuperNode 节点:

    n2n SuperNode 节点类似于 zerotier 的 planet 或者 moons,用作握手或者中继,

    本文拓扑中 SuperNode 节点使用 Archlinux 服务器,可直接 pacman 安装,其它发行版可通过包管理或者自编译安装,非常简单。

    只需监听端口和 community(自定义字符串,和后面配置一致)即可

    $ supernode -h
    Welcome to n2n v.2.8.0 for x86_64-unknown-linux-gnu
    Built on Jan 22 2021 15:06:27
    Copyright 2007-2020 - ntop.org and contributors
    
    supernode <config file> (see supernode.conf)
    or
    supernode -l <local port> -c <path> [-u <uid> -g <gid>] [-t <mgmt port>] [-v] 
    
    -l <port>	Set UDP main listen port to <port>
    -c <path>	File containing the allowed communities.
    -u <UID>	User ID (numeric) to use when privileges are dropped.
    -g <GID>	Group ID (numeric) to use when privileges are dropped.
    -t <port>	Management UDP Port (for multiple supernodes on a machine).
    -v        	Increase verbosity. Can be used multiple times.
    -h        	This help message.
    
    

    EdgeNode 节点:

    EdgeNode 节点运行在各接入网段网关上,本人主要是运行其在各个拨号的 OpenWRT 路由器网关上,这样更加便利地将各个网段互联:

    OpenWRT 包管理中没有新版本 n2n,所以可以参考 n2n 2.8 for OpenWRT 是 OpenWRT 交叉编译的脚本,也有打包好的 ipk 安装包,当然也可以用其它方法

    安装完 edge 后,主要配置如下:(以拓扑中节点 X 为例)

    root@XMOPWRT:~# cat /etc/n2n/edge.conf 
    -d=tincn0
    -c=myperfectn2n //与前面 supernode 配置的 community(自定义字符串)一致
    -a=10.193.111.14  //n2n 互联段 IP
    -A1  //不启用加密性能更好(视乎需求)
    -f
    -r  # Enable packet forwarding  [启用 N2N 包转发需要] 
    -E  # Accept multicast MAC addresses  [启用动态路由需要] 
    -l=supernode.ntop.org:7777
    
    

    启动 n2n

    SuperNode

    systemctl enable n2n
    

    EdgeNode

    /etc/init.d/edge enable
    /etc/init.d/edge start
    

    内网 IP

    root@XMOPWRT:~# ip addr
    
    5: br-lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
        link/ether 66:09:80:0e:c9:af brd ff:ff:ff:ff:ff:ff
        inet 10.193.14.1/24 brd 10.193.14.255 scope global br-lan
           valid_lft forever preferred_lft forever
    
    
    11: tincn0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1290 qdisc fq_codel state UNKNOWN qlen 1000
        link/ether 5e:36:f6:58:de:a8 brd ff:ff:ff:ff:ff:ff
        inet 10.193.111.14/24 brd 10.193.111.255 scope global tincn0
           valid_lft forever preferred_lft forever
        inet6 fe80::5c36:f6ff:fe58:dea8/64 scope link 
           valid_lft forever preferred_lft forever
    
    

    至此,各个节点应该通过互联段可以互通。

    root@XMOPWRT:~# ping 10.193.111.11
    PING 10.193.111.11 (10.193.111.11): 56 data bytes
    64 bytes from 10.193.111.11: seq=0 ttl=64 time=20.020 ms
    ^C
    --- 10.193.111.11 ping statistics ---
    1 packets transmitted, 1 packets received, 0% packet loss
    round-trip min/avg/max = 20.020/20.020/20.020 ms
    root@XMOPWRT:~# ping 10.193.111.10
    PING 10.193.111.10 (10.193.111.10): 56 data bytes
    64 bytes from 10.193.111.10: seq=0 ttl=64 time=15.340 ms
    ^C
    --- 10.193.111.10 ping statistics ---
    2 packets transmitted, 1 packets received, 50% packet loss
    round-trip min/avg/max = 15.340/15.340/15.340 ms
    
    

    ( 2 )安装配置 quagga

    主要通过 quagga 并通过 RIP 路由协议实现动态路由,

    各 EdgeNode 节点安装 quagga-ripd

    opkg install quagga-ripd quagga quagga-libzebra quagga-zebra quagga-watchquagga
    

    安装完 quagga 后,主要配置如下:(以拓扑中节点 X 为例):

    root@XMOPWRT:~# cat /etc/quagga/ripd.conf
    password zebra
    !
    router rip
     network 10.193.111.0/24
     route 10.193.14.0/24
    !
    access-list vty permit 127.0.0.0/8
    access-list vty deny any
    !
    line vty
     access-class vty
    
    

    启动 quagga-ripd

    EdgeNode

    /etc/init.d/quagga enable
    /etc/init.d/quagga start
    

    至此,各个 EdgeNode 节点的 br-lan 网段应该通过可以互通。

    C:\Users\k>ipconfig
    
    Windows IP 配置
    
    无线局域网适配器 WLAN:
    
       连接特定的 DNS 后缀 . . . . . . . : lan
       IPv6 地址 . . . . . . . . . . . . : fd78:ecee:8a17:0:bcb2:17a9:71cd:8ea5
       临时 IPv6 地址. . . . . . . . . . : fd78:ecee:8a17:0:79c1:4:2b1:b58f
       本地链接 IPv6 地址. . . . . . . . : fe80::bcb2:17a9:71cd:8ea5%9
       IPv4 地址 . . . . . . . . . . . . : 10.193.14.133
       子网掩码  . . . . . . . . . . . . : 255.255.255.0
       默认网关. . . . . . . . . . . . . : 10.193.14.1
    
    
    C:\Users\k>ping 10.193.10.30
    
    正在 Ping 10.193.10.30 具有 32 字节的数据:
    来自 10.193.10.30 的回复: 字节=32 时间=14ms TTL=62
    来自 10.193.10.30 的回复: 字节=32 时间=13ms TTL=62
    
    10.193.10.30 的 Ping 统计信息:
        数据包: 已发送 = 2,已接收 = 2,丢失 = 0 (0% 丢失),
    往返行程的估计时间(以毫秒为单位):
        最短 = 13ms,最长 = 14ms,平均 = 13ms
    Control-C
    ^C
    C:\Users\k>ping 10.193.11.9
    
    正在 Ping 10.193.11.9 具有 32 字节的数据:
    来自 10.193.11.9 的回复: 字节=32 时间=18ms TTL=62
    
    10.193.11.9 的 Ping 统计信息:
        数据包: 已发送 = 1,已接收 = 1,丢失 = 0 (0% 丢失),
    往返行程的估计时间(以毫秒为单位):
        最短 = 18ms,最长 = 18ms,平均 = 18ms
    Control-C
    ^C
    

    ( 3 ) iptables 配置

    iptables -A input_rule -i tinc+ -j ACCEPT
    iptables -A forwarding_rule -i tinc+ -j ACCEPT
    iptables -A forwarding_rule -o tinc+ -j ACCEPT
    iptables -A output_rule -o tinc+ -j ACCEPT
    

    为了安全或者一些避免部分特定情况导致网络访问不通,可以启用 SNAT(可选 /建议)

    iptables -t nat -A POSTROUTING -s 0.0.0.0/0 -o tincn0 -j SNAT --to 10.193.111.14
    

    refer: https://vnf.cc/2021/07/n2n-rip-virtualnet/

    21 条回复    2021-07-27 01:06:40 +08:00
    acbot
        1
    acbot  
       2021-07-23 19:28:22 +08:00
    NB !
    jousca
        2
    jousca  
       2021-07-23 19:36:38 +08:00
    对于大佬作品必须先收藏感谢。
    Mast
        3
    Mast  
       2021-07-23 21:11:34 +08:00
    这肯定要收藏啊,谢谢。
    sunulin
        4
    sunulin  
       2021-07-23 21:15:57 +08:00 via iPhone
    🤣我都是加 route 原来还有 quagga-ripd,谢谢又省好多事
    hiplon
        5
    hiplon  
    OP
       2021-07-23 21:53:19 +08:00
    @acbot
    @jousca
    @Mast
    感谢支持
    @sunulin
    和静态路由也各有各的好处的,节点设备多了写静态路由可是 n^2 维护量😁
    NealLason
        6
    NealLason  
       2021-07-23 23:30:11 +08:00
    尝试过 n2n 和 tinc,n2n 打洞效果比 tinc 好一些,但是速度太渣了,同等情况下,tinc 能跑 100M 的,n2n 才 30 多 M 。。
    hiplon
        7
    hiplon  
    OP
       2021-07-23 23:42:32 +08:00
    @NealLason 不开加密性能会提升很多
    willqianji
        8
    willqianji  
       2021-07-24 00:08:41 +08:00 via iPhone
    牛逼,请教 如果 运营商有 udp 限制影响大吗
    wwhc
        9
    wwhc  
       2021-07-24 04:54:14 +08:00
    不需要任何第三方软件,用 openssh 就能实现
    hiplon
        10
    hiplon  
    OP
       2021-07-24 08:38:42 +08:00
    @wwhc 组网和 openssh tunnel 的目的完全不一样
    @willqianji 肯定会有影响的
    wwhc
        11
    wwhc  
       2021-07-24 09:45:25 +08:00
    @hiplon 如果异地组网是目的,那么用 openssh 可以完整的实现,不需要第三方软件
    hiplon
        12
    hiplon  
    OP
       2021-07-24 10:26:23 +08:00
    @wwhc 或许是我孤陋寡闻还没见过 ethernet over ssh 的方案,如果你有此实现或许建议可以写个教程学习下
    NealLason
        13
    NealLason  
       2021-07-24 11:35:06 +08:00
    @hiplon 不开加密这玩意还有啥意义。。
    hiplon
        14
    hiplon  
    OP
       2021-07-24 11:45:38 +08:00
    @NealLason 鱼和熊掌不可兼得,结合自己的需求才是重要的。因为我自己的应用层全是 ssh,https 协议,所以我链路层选择性能最大化不加密。
    brMu
        15
    brMu  
       2021-07-24 16:38:48 +08:00
    一直在用 zerotier,请问大佬 n2n 比 zerotier 好的地方是什么?好有动力试一试
    hiplon
        16
    hiplon  
    OP
       2021-07-24 16:42:26 +08:00
    @brMu 最终实现的功能上是差不多的😆,n2n 主要配置简单可选,supernode 可控,最终资料自己掌握。zerotier 现在越来越多功能了,也可以自己组 moons,不过总有部分资料是要通过 zerotier 公司。我一般会启用 n2n 作主用,然后 zerotier 备用。
    evemoo
        17
    evemoo  
       2021-07-24 17:16:54 +08:00
    尝试在 openwrt 上用 n2n 给 ns 加速,没成功。
    wwhc
        18
    wwhc  
       2021-07-25 00:50:07 +08:00
    @hiplon 可以参考这个指南构建 openssh 异地组网的方案:help.ubuntu.com/community/SSH_VPN
    sbilly
        19
    sbilly  
       2021-07-26 18:29:18 +08:00
    在这个配置下,rip 跑起来协议要用多少带宽?
    hiplon
        20
    hiplon  
    OP
       2021-07-26 20:42:58 +08:00
    @sbilly rip 握手后每分钟就 1 个广播心跳包,几个 k
    jayvs5200
        21
    jayvs5200  
       2021-07-27 01:06:40 +08:00 via iPhone
    学习了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3516 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 10:49 · PVG 18:49 · LAX 03:49 · JFK 06:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.