Margrop
Articles158
Tags353
Categories21
1password AC AP API AppDaemon Aqara Cron Date Diagrams.net HA HADashboard HomeAssistant IP IPv4 Java LVM‑Thin Linux MacOS MySQL NAS PPPoE PostgreSQL ProcessOn Proxmox VE SSL Shell TTS TimeMachine UML Uptime Kuma Web Windows activate ad adb adblock agent aligenie aliyun alpine annotation aop authy autofs backup baidupan bash bitwarden boot brew browser caddy2 cdn centos cert certbot charles chat chrome classloader client clone closures cloudflare cmd command commit container crontab ctyun ddsm demo dependency deploy developer devtools dll dns docker domain download draw drawio dsm dump dylib edge exception export fail2ban feign firewall-cmd flow frp frpc frps fuckgfw function gcc gfw git github golang gperftools gridea grub gvt-g hacs havcs heap hello hexo hibernate hidpi hoisting homeassistant hosts html htmlparser https idea image img img2kvm import index install intel io ios ip iptables iptv ipv6 iso java javascript jetbrains jni jnilib jpa js json jsonb jupter jupyterlab jvm k8s kernel key kid kms kodi koolproxy koolproxyr kvm lan lastpass launchctl learning lede letsencrypt linux live low-code lvm lxc m3u8 mac macos mariadb markdown maven md5 microcode mirror modem modules monitor mount mstsc mysql n2n n5105 nas network nfs node node-red nodejs nohup notepad++ npm nssm ntp oop openfeign openssl os otp ovz packet capture pat pdf pem perf ping pip plugin png powerbutton print pro proxy pve pvekclean python qcow2 qemu qemu-guest-agent rar reboot reflog remote remote desktop renew repo resize retina root route router rule rules runtime safari sata scipy-notebook scoping scp server slmgr so socks source spk spring springboot springfox ssh ssl stash string supernode svg svn swagger sync synology systemctl tap tap-windows tapwindows telecom template terminal tls token totp tvbox txt ubuntu udisk ui undertow uninstall unlocker upgrade url v2ray vhd vim vlmcsd vm vmdk web websocket wechat windows with worker wow xiaoya xml yum zip 中国电信 云电脑 交换机 光猫 公网IP 内存 内网IP 升级 启动 夏令时 天猫精灵 天翼云 安装 容器 导入 小米 常用软件 广告屏蔽 序列号 应用市场 异常 抓包 描述文件 时区 显卡虚拟化 智能家居 智能音箱 梯子 模块 流程 流程图 浏览器 漫游 激活 火绒 电信 画图 直播源 续期 网关 网络风暴 群晖 腾讯 虚拟机 证书 路由 路由器 软件管家 软路由 运维监控 镜像 镜像源 门窗传感器 防火墙 阿里云 阿里源 集客

Hitokoto

Archive

如何使用群晖(DSM)运行N2N-编译篇

如何使用群晖(DSM)运行N2N-编译篇

群晖(后面使用DSM代替)是一个目前最著名的NAS系统,没有之一。
如何在DSM上直接运行N2N呢,当然又需要交叉编译了😂。
下面的交叉编译操作,需要有Linux的基本功,和vim操作的基本功。

已编译好的文件

编译环境:
Ubuntu 20.04.1 LTS
Linux vm-n2n-cc2 5.4.0-59-generic #65-Ubuntu SMP Thu Dec 10 12:01:51 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

  • 特别提示,不同的DSM系统,不同的架构,文件是不能通用的

  • 下面是基于DSM6.2.3apollolake架构编译好的文件

    1
    2
    3
    4
    5
    wget https://download.margrop.net/d/oneindex/network/n2n_2.8_stable/DSM6.2.3/libssl.so.1.1 -O libssl.so.1.1 
    wget https://download.margrop.net/d/oneindex/network/n2n_2.8_stable/DSM6.2.3/libcrypto.so.1.1 -O libcrypto.so.1.1
    wget https://download.margrop.net/d/oneindex/network/n2n_2.8_stable/DSM6.2.3/edge -O edge
    wget https://download.margrop.net/d/oneindex/network/n2n_2.8_stable/DSM6.2.3/supernode -O supernode
    wget https://download.margrop.net/d/oneindex/network/n2n_2.8_stable/DSM6.2.3/renew -O renew
  • 下面是基于DSM6.1.7broadwell架构编译好的文件

    1
    2
    3
    4
    wget https://download.margrop.net/d/oneindex/network/n2n_2.8_stable/DSM6.1.7/libssl.so.1.1 -O libssl.so.1.1
    wget https://download.margrop.net/d/oneindex/network/n2n_2.8_stable/DSM6.1.7/libcrypto.so.1.1 -O libcrypto.so.1.1
    wget https://download.margrop.net/d/oneindex/network/n2n_2.8_stable/DSM6.1.7/edge -O edge
    wget https://download.margrop.net/d/oneindex/network/n2n_2.8_stable/DSM6.1.7/supernode -O supernode

N2N编译环境的准备

交叉编译环境的准备

首先去下载目标机器对应的toolchain(就是用来编译目标平台的程序的编译工具套装,gccg++ld和库啥的)。

群晖的开发工具下载首页,进入DMS相应版本的目录里,比如我的是6.2.3版本,进去最新的DSM 6.2 Tool Chains,然后可以看到有很多对应着不同处理器的压缩包,找和你CPU对应的版本。

可以通过ls /sys/module | grep bios下面的文件找到CPU平台的代号。

可以看到我这台群晖对应的CPU平台为apollolake

然后后面是Linux内核版本,和cpu架构,这两个可以通过uname命令查看。

1
2
uname -a
Linux Fluxworks_NAS 4.4.59+ #25426 SMP PREEMPT Wed Jul 8 03:21:29 CST 2020 x86_64 GNU/Linux synology_apollolake_918+

解压并添加环境变量:

1
2
3
4
5
6
7
tar -xf apollolake-gcc493_glibc220_linaro_x86_64-GPL.txz
# cd x86_64-pc-linux-gnu/bin
# ls
x86_64-pc-linux-gnu-addr2line x86_64-pc-linux-gnu-cc x86_64-pc-linux-gnu-elfedit x86_64-pc-linux-gnu-gcc-ar x86_64-pc-linux-gnu-gprof x86_64-pc-linux-gnu-nm x86_64-pc-linux-gnu-ranlib x86_64-pc-linux-gnu-strip
x86_64-pc-linux-gnu-ar x86_64-pc-linux-gnu-c++filt x86_64-pc-linux-gnu-g++ x86_64-pc-linux-gnu-gcc-nm x86_64-pc-linux-gnu-ld x86_64-pc-linux-gnu-objcopy x86_64-pc-linux-gnu-readelf
x86_64-pc-linux-gnu-as x86_64-pc-linux-gnu-cpp x86_64-pc-linux-gnu-gcc x86_64-pc-linux-gnu-gcc-ranlib x86_64-pc-linux-gnu-ld.bfd x86_64-pc-linux-gnu-objdump x86_64-pc-linux-gnu-size
x86_64-pc-linux-gnu-c++ x86_64-pc-linux-gnu-ct-ng.config x86_64-pc-linux-gnu-gcc-4.9.3 x86_64-pc-linux-gnu-gcov x86_64-pc-linux-gnu-ldd x86_64-pc-linux-gnu-populate x86_64-pc-linux-gnu-strings

可以看到gcc相关的可执行程序,这时候可以验证一下下的程序对不对,运行一个试试。
然后把bin目录添加到`PATH让系统能够找到你的工具链

1
export PATH=$PATH:你的工具包的目录/x86_64-pc-linux-gnu/bin

OpenSSL交叉编译

下载并解压OpenSSL源代码

1
2
3
wget https://www.openssl.org/source/openssl-1.1.1i.tar.gz
tar -xvzf openssl-1.1.1i.tar.gz
cd openssl-1.1.1i

配置工具链地址,并生成Makefile文件

1
2
export PATH=$PATH:/root/dsm/x86_64-pc-linux-gnu/bin
./config no-asm -shared --prefix=/opt/toolchain/openssl/install-x86_64

Makefile中搜索:/CROSS_COMPILE=,并在后面加上x86_64-pc-linux-gnu-

1
2
3
vim Makefile
:/CROSS_COMPILE=
x86_64-pc-linux-gnu-

删除2个-m64

1
:/-m64

开始交叉编译OpenSSL

1
2
make
make install

下载N2N源代码

1
2
3
4
cd ~
git clone https://github.com/ntop/n2n
cd n2n
git checkout 2.8-stable

N2N交叉编译准备

1
2
cd ~/n2n
vim toolChain.cmake

n2n的目录下新建toolChain.cmake文件,并输入下面的配置内容

1
2
3
4
5
6
7
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_CROSSCOMPILING TRUE)
SET(CMAKE_CROSSCOMPILER "x86_64-pc-linux-gnu-")
SET(CMAKE_C_COMPILER "${CMAKE_CROSSCOMPILER}gcc")
SET(CMAKE_CXX_COMPILER "${CMAKE_CROSSCOMPILER}g++")
SET(CMAKE_FIND_ROOT_PATH /opt/toolchain/openssl/install-x86_64)
SET(CMAKE_VERBOSE_MAKEFILE on)

N2N交叉编译

使用CMaken2n进行交叉编译,

1
2
3
4
5
mkdir build
cd build
export PATH=$PATH:/root/dsm/x86_64-pc-linux-gnu/bin
cmake -DCMAKE_TOOLCHAIN_FILE=../toolChain.cmake ..
make

N2N在群晖安装

WinSCPwget之类的软件,将edgesupernode上传到 /usr/bin目录下
libssl.so.1.1libcrypto.so.1.1上传到 /lib64 下(32位CPU上传到 /lib下),其属性全改为 0755

1
2
3
4
5
6
7
8
chmod 755 edge
chmod 755 supernode
chmod 755 libssl.so.1.1
chmod 755 libcrypto.so.1.1
cp edge /usr/bin/
cp supernode /usr/bin/
cp libssl.so.1.1 /lib64/
cp libcrypto.so.1.1 /lib64/

手工启用tun模块:

1
insmod /lib/modules/tun.ko
  • 可能会遇到的问题

    我的白群也无意当中升级到了最新版本 dsm6.2.2,后来又降级到6.1.7,因为622启动edge以后,居然有一半的edge是ping不通的,即使使用了下面的方法仍然如此,而617全通,没有任何问题,可见617系统的网络功能更好一些。我无意当中发现群晖 dsm6.1、6.2(6.0未知)在启动之后,最开始的时候 n2n 是正常的,n2n的路由表也是有的,但是很快群晖就开始删除 n2n 的路由表了,这就是我们加入开机启动,刚开始 n2n 网络是可以 ping 通的,一会就断开了的原因。下面说说处理方法,2018-8-15 的方法仅做参考。将从 这里下载 (鼠标放上面,按鼠标右键,在弹出的菜单中选择“链接另存为…”)的文件保存为 renew,并加入开机启动 rc.rocal 文件里的 edge 语句后面: /etc/new/renew & (renew 的属性改为 0755)。这样,以后我们即使手动启动 n2n,它也会在 10 秒内给你加上群晖给删除的静态路由。

自动启用tun模块并启动edge:

1
2
3
4
5
6
7
8
9
10
11
cat <<EOF > /usr/local/etc/rc.d/tun.sh
!/bin/sh -e
insmod /lib/modules/tun.ko
sleep 30
/root/n2n/edge -d h0 -a 10.0.0.1 -c margrop -k UFDMIlrK3ueQz5mS -l blog.margrop.net:2345 -r -v -f &
#/etc/new/renew &
sleep 10
ifconfig h0 down
sleep 10
ifconfig h0 up
EOF

给脚本可执行权限:

1
chmod a+x /usr/local/etc/rc.d/tun.sh

参考文章

http://www.lucktu.com/archives/778.html
群晖交叉编译记录(编译subversion)
交叉编译N2N-LEDE Koolshare x86_64
CMake交叉编译配置
群晖(Synology)下N2N的设置方法

Author:Margrop
Link:http://blog.margrop.com/post/how-to-use-n2n-dsm/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可