Skip to content

配置GNB

编译 GNB

bash
#Linux
git clone https://github.com/gnbdev/opengnb.git
cd opengnb
make -f Makefile.linux

启动 GNB

bash
#节点 1002
#这里使用了GNB 的Lite模式,使用passcode
p=
#index服务器的ip
idx=
./gnb -n 1002 -I "$idx" --multi-socket=on -p $p -r "1001|10.1.0.1|255.255.0.0,1002|10.1.0.2|255.255.0.0,1003|10.1.0.3|255.255.0.0,1003|192.168.123.0|255.255.255.0" -q
#访问节点1003的内网
route add 192.168.123.0 mask 255.255.255.0 10.1.0.3 -p
bash
#节点 1003
p=
./gnb -n 1003 -I "$idx" --multi-socket=on -p $p -q
#作为网关时,需要更改/etc/sysctl.conf
net.ipv4.ip_forward = 1

IP 转发

需求:用树莓派作为一个 VPN 路由,不暴露另一个 VPN 节点的局域网,通过给树莓派新增 IP 的方式代理另一个 VPN 节点或另一个节点局域网下的指定主机,可使用 NAT 方式。

例如:处于局域网 192.168.132.0/24 的机器 A 想要访问处于 192.168.1.0/24 的机器 B, A<-->raspberrypi(gateway1/192.168.123.0/24)<-->GNB<-->gateway2(192.168.0.1/24)<-->B

使用下述命令实现

bash
#raspberrypi

#通过NAT(网络地址转换),将发往gnb_tun的数据包(SNAT)源地址转换为10.1.0.1
iptables -t nat -A POSTROUTING -o gnb_tun -j SNAT --to-source 10.1.0.1

#192.168.123.10<-->10.1.0.4
#使用ip addr add能够在指定网卡上添加一个虚拟的ip,但并不会生成虚拟网卡。如果要生成虚拟网卡需要使用tun或tap
#使用WiFi时,网卡为wlan0 若使用以太网则为eth0
ip addr add 192.168.123.10/24 dev wlan0
iptables -t nat -A PREROUTING -d 192.168.123.10 -j DNAT --to-destination 10.1.0.4

#192.168.123.11<-->192.168.1.1
ip addr add 192.168.123.11/24 dev wlan0
iptables -t nat -A PREROUTING -d 192.168.123.11 -j DNAT --to-destination 192.168.1.1

实现结果

$ ping 192.168.123.10
PING 192.168.123.10 (192.168.123.10) 56(84) bytes of data.
64 bytes from 192.168.123.10: icmp_seq=1 ttl=62 time=136 ms
64 bytes from 192.168.123.10: icmp_seq=2 ttl=62 time=54.3 ms
64 bytes from 192.168.123.10: icmp_seq=3 ttl=62 time=47.3 ms
64 bytes from 192.168.123.10: icmp_seq=4 ttl=62 time=46.2 ms
64 bytes from 192.168.123.10: icmp_seq=5 ttl=62 time=48.2 ms
64 bytes from 192.168.123.10: icmp_seq=6 ttl=62 time=49.9 ms

在 openwrt 中使用

系统信息

通过 luci 的 web 管理页面可以查询到

主机名	OpenWrt
型号	Raspberry Pi 3 Model B Plus Rev 1.3 (CpuMark : 16402.125442 Scores)
架构	ARMv8 Processor rev 4 (v8l) x 4 (1200Mhz, 53.7°C)
目标平台	bcm27xx/bcm2710
固件版本	ImmortalWrt 18.06-k5.4-SNAPSHOT r12336-5a5357e915 (2023-01-20) / LuCI openwrt-18.06-k5.4 branch (git-22.312.35760-7afcfb2)
内核版本	5.4.203

openwrt 编译 gnb

https://downloads.openwrt.org/releases/ 下载一个与系统信息对应的 SDK,在这里下载了https://downloads.openwrt.org/releases/18.06.5/targets/brcm2708/bcm2710/openwrt-sdk-18.06.5-brcm2708-bcm2710_gcc-7.3.0_musl.Linux-x86_64.tar.xz

通过文件名可以注意到这个 SDK 只能在 x86_64CPU 架构的 Linux 系统上使用.

通过 wsl 来使用这个 SDK

bash
mkdir -p /opt/openwrt && cd /opt/openwrt
# 可以通过这个方式下载,如果下载速度慢可以使用代理下载,或者在有代理的浏览器先下载再复制到这里
wget https://downloads.openwrt.org/releases/18.06.5/targets/brcm2708/bcm2710/openwrt-sdk-18.06.5-brcm2708-bcm2710_gcc-7.3.0_musl.Linux-x86_64.tar.xz
xz -d openwrt-sdk-18.06.5-brcm2708-bcm2710_gcc-7.3.0_musl.Linux-x86_64.tar.xz
tar xf openwrt-sdk-18.06.5-brcm2708-bcm2710_gcc-7.3.0_musl.Linux-x86_64.tar

#配置编译环境变量,在Linux中使用:分隔每个路径
export PATH=$PATH:/opt/openwrt/openwrt-sdk-18.06.5-brcm2708-bcm2710_gcc-7.3.0_musl.Linux-x86_64/staging_dir/toolchain-aarch64_cortex-a53_gcc-7.3.0_musl/bin
export STAGING_DIR=/opt/openwrt/openwrt-sdk-18.06.5-brcm2708-bcm2710_gcc-7.3.0_musl.Linux-x86_64/staging_dir/


#获取opengnb源码
cd /opt
git clone https://github.com/gnbdev/opengnb.git
cd opengnb
make -f Makefile.openwrt -e CC=aarch64-openwrt-linux-gcc install

#编译完成后在bin目录下存在四个可执行文件
#$ ls bin
#gnb  gnb_crypto  gnb_ctl  gnb_es

#压缩打包程序
mv bin openwrt_gnb
tar cf openwrt_gnb.tar openwrt_gnb
#通过scp将编译完成的程序传输到openwrt上,可能需要openwrt在webui上配置打开ssh
#为了偷懒,先将文件传输到root用户家目录下 /root
scp openwrt_gnb.tar root@target_openwrt_ip:~

运行 gnb

bash
#登录到openwrt
ssh root@target_openwrt_ip
#当前在用户家目录下/root
tar xf openwrt_gnb.tar
cd openwrt_gnb
# 然后按本文的启动GNB的方式运行,给openwrt的分配节点号为1003,idx节点的服务器和p的变量需要自己结合实际情况配置
screen -S gnb
./gnb -n 1003 -I "$idx" --multi-socket=on -p $p -q

运行 gnb 后,会生成一张 gnb_tun 网卡

bash
# root @ OpenWrt in ~/openwrt_gnb [21:00:12]
$ ip link show gnb_tun
17: gnb_tun: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1280 qdisc fq_codel state UNKNOWN mode DEFAULT group default qlen 500
    link/none

配置 openwrt 网络接口及防火墙

如果需要 gnb 的 IP 转发功能,因使用的是 Luci,需要在 web 页面进一步配置

创建防火墙

创建防火墙新的区域(zone) 配置OPENWRT-防火墙

配置防火墙,需要更改名称转发改为接受,并在下面的端口触发配置允许转发到目标区域,选择lan配置OPENWRT-防火墙-新区域配置OPENWRT-防火墙-新区域-2

由于从gnb网卡发往lan的网卡的源IP不一样,需要进行动态伪装,即MASQUERADE 配置OPENWRT-防火墙-lan配置

创建接口

点击接口-添加新接口来添加接口 配置OPENWRT-接口总览 然后填上名称,新接口的协议要选择未不配置协议,然后点击提交 配置OPENWRT-创建接口 提交后点击防火墙设置,选择在上面创建的gnbzone配置OPENWRT-接口配置防火墙

在其他运行了GNB的机器上添加路由,以节点号为1002的windows为例,使用管理员运行命令提示符或者Powershell

powershell
#通过-r指定参数,在gnb的内部路由192.168.1.0/24到10.1.0.3
./gnb -n 1002 -I "$idx" --multi-socket=on -p $p -r "1001|10.1.0.1|255.255.0.0,1002|10.1.0.2|255.255.0.0,1003|10.1.0.3|255.255.0.0,1003|192.168.1.0|255.255.255.0" -q

在Windows系统中将openwrt所在的192.168.1.0/24局域网路由到10.1.0.3

powershell
PS C:\Windows\system32> route add 192.168.1.0 mask 255.255.255.0 10.1.0.3

PS C:\Windows\system32> ping 192.168.1.5

正在 Ping 192.168.1.5 具有 32 字节的数据:
来自 192.168.1.5 的回复: 字节=32 时间=30ms TTL=63
来自 192.168.1.5 的回复: 字节=32 时间=29ms TTL=63
来自 192.168.1.5 的回复: 字节=32 时间=29ms TTL=63
来自 192.168.1.5 的回复: 字节=32 时间=30ms TTL=63

192.168.1.5 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 29ms,最长 = 30ms,平均 = 29ms

到此应该就能实现了 gnb 在 lan 这个局域网内的 IP 转发。