By xzll

Landscape Router: 基于openSUSE MicroOS 安装实践

实践 | Practices 2025年10月23日

1. First | 序

上半年B站看到过 Landscape Router 项目但只是一眼略过

这几天再次得到推送于是乎尝试部署一下

此篇记录实践过程

📦
本篇所使用到的操作系统&软件版本(配置)如下所示

1.2. Preconditions | 前提条件

请仔细查看官网阐明的注意事项

注意事项 | Landscape Router
Configuring Linux as a Router

1.2.1. 检查内核版本

使用 uname -a 命令检查内核版本

强制要求内核版本 > 6.9.x

Example | 示例

➜  ~ uname -a
Linux xzllll.com 6.17.3-1-default #1 SMP PREEMPT_DYNAMIC Thu Oct 16 04:49:08 UTC 2025 (5508f45) x86_64 x86_64 x86_64 GNU/Linux
➜  ~

1.2.2. 检查内核 BPF 功能

使用 grep BPF /boot/config-$(uname -r)命令检查 BPF 功能 是否开启

Example | 示例

➜  ~ grep BPF /boot/config-$(uname -r)
CONFIG_BPF=y
CONFIG_HAVE_EBPF_JIT=y
CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y
# BPF subsystem
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_JIT=y
CONFIG_BPF_JIT_ALWAYS_ON=y
CONFIG_BPF_JIT_DEFAULT_ON=y
CONFIG_BPF_UNPRIV_DEFAULT_OFF=y
# CONFIG_BPF_PRELOAD is not set
CONFIG_BPF_LSM=y
# end of BPF subsystem
CONFIG_CGROUP_BPF=y
CONFIG_IPV6_SEG6_BPF=y
CONFIG_NETFILTER_BPF_LINK=y
CONFIG_NETFILTER_XT_MATCH_BPF=m
CONFIG_NET_SCH_BPF=y
CONFIG_NET_CLS_BPF=m
CONFIG_NET_ACT_BPF=m
CONFIG_BPF_STREAM_PARSER=y
CONFIG_LWTUNNEL_BPF=y
# HID-BPF support
CONFIG_HID_BPF=y
# end of HID-BPF support
CONFIG_BPF_EVENTS=y
# CONFIG_BPF_KPROBE_OVERRIDE is not set
# CONFIG_TEST_BPF is not set
➜  ~

1.2.3. 检查 BTF 相关功能

使用 grep CONFIG_DEBUG_INFO_BTF /boot/config-$(uname -r) 命令检查

Example | 示例

➜  ~ grep CONFIG_DEBUG_INFO_BTF /boot/config-$(uname -r)
CONFIG_DEBUG_INFO_BTF=y
CONFIG_DEBUG_INFO_BTF_MODULES=y
➜  ~

⚠️
注意

如果 /boot/config-$(uname -r) 路径无法找到

请检查 /proc/config.gz 或者 /lib/modules/$(uname -r)/config

例如

➜  ~ grep BPF /lib/modules/$(uname -r)/config
CONFIG_BPF=y
CONFIG_HAVE_EBPF_JIT=y
CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y
# BPF subsystem
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_JIT=y
CONFIG_BPF_JIT_ALWAYS_ON=y
CONFIG_BPF_JIT_DEFAULT_ON=y
CONFIG_BPF_UNPRIV_DEFAULT_OFF=y
# CONFIG_BPF_PRELOAD is not set
CONFIG_BPF_LSM=y
# end of BPF subsystem
CONFIG_CGROUP_BPF=y
CONFIG_IPV6_SEG6_BPF=y
CONFIG_NETFILTER_BPF_LINK=y
CONFIG_NETFILTER_XT_MATCH_BPF=m
CONFIG_NET_SCH_BPF=y
CONFIG_NET_CLS_BPF=m
CONFIG_NET_ACT_BPF=m
CONFIG_BPF_STREAM_PARSER=y
CONFIG_LWTUNNEL_BPF=y
# HID-BPF support
CONFIG_HID_BPF=y
# end of HID-BPF support
CONFIG_BPF_EVENTS=y
# CONFIG_BPF_KPROBE_OVERRIDE is not set
# CONFIG_TEST_BPF is not set
➜  ~ grep CONFIG_DEBUG_INFO_BTF /lib/modules/$(uname -r)/config
CONFIG_DEBUG_INFO_BTF=y
CONFIG_DEBUG_INFO_BTF_MODULES=y

➜  ~ zgrep BPF /proc/config.gz
CONFIG_BPF=y
CONFIG_HAVE_EBPF_JIT=y
CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y
# BPF subsystem
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_JIT=y
CONFIG_BPF_JIT_ALWAYS_ON=y
CONFIG_BPF_JIT_DEFAULT_ON=y
CONFIG_BPF_UNPRIV_DEFAULT_OFF=y
# CONFIG_BPF_PRELOAD is not set
CONFIG_BPF_LSM=y
# end of BPF subsystem
CONFIG_CGROUP_BPF=y
CONFIG_IPV6_SEG6_BPF=y
CONFIG_NETFILTER_BPF_LINK=y
CONFIG_NETFILTER_XT_MATCH_BPF=m
CONFIG_NET_SCH_BPF=y
CONFIG_NET_CLS_BPF=m
CONFIG_NET_ACT_BPF=m
CONFIG_BPF_STREAM_PARSER=y
CONFIG_LWTUNNEL_BPF=y
# HID-BPF support
CONFIG_HID_BPF=y
# end of HID-BPF support
CONFIG_BPF_EVENTS=y
# CONFIG_BPF_KPROBE_OVERRIDE is not set
# CONFIG_TEST_BPF is not set
➜  ~ zgrep CONFIG_DEBUG_INFO_BTF /proc/config.gz
CONFIG_DEBUG_INFO_BTF=y
CONFIG_DEBUG_INFO_BTF_MODULES=y

2. Deployment | 部署

2.1. 获取程序文件

Landscape Router 所需的文件很简单

分别为

  • Landscape Router 二进制文件
  • static 静态文件

Github链接如下所示

Releases · ThisSeanZhang/landscape
The goal is to easily configure your favorite Linux distribution as a router using the web UI - ThisSeanZhang/landscape
👩‍🏫
Tips | 贴士
  • 如果你需要pppoe功能则需要相应程序
  • 如果你需要分流至Docker则需要安装相应程序
⚠️
警告

2.1.1. ppp

若需要添加 PPPD

则需安装对应软件包

Loading repository data...
Reading installed packages...


Information for package ppp:
----------------------------
Repository     : openSUSE-Tumbleweed-Oss
Name           : ppp
Version        : 2.5.2-3.1
Arch           : x86_64
Vendor         : openSUSE
Installed Size : 963.2 KiB
Installed      : Yes (automatically)
Status         : up-to-date
Source package : ppp-2.5.2-3.1.src
Upstream URL   : https://ppp.samba.org
Summary        : The Point to Point Protocol for Linux
Description    :
    The ppp package contains the PPP (Point-to-Point Protocol) daemon,
    pppd, additional PPP utilities, documentation, and sample files. PPP
    provides a method for transmitting IP and IPX datagrams over serial
    point-to-point links, for example over a modem. The PPP daemon handles
    the details of setting up a PPP link including configuring the network
    interface and performing the PPP negotiations.

同时 Landscape Router 会检测 /usr/lib64/pppd/2.5.2 目录下的 rp-pppoe.so 文件

若遇到了以下错误


可以使用ln -s命令创建软链接

修改后文件树如下所示

➜  pppd pwd
/usr/lib64/pppd
➜  pppd tree
.
└── 2.5.2
    ├── minconn.so
    ├── openl2tp.so
    ├── passwordfd.so
    ├── pppoatm.so
    ├── pppoe.so
    ├── pppol2tp.so
    ├── radattr.so
    ├── radius.so
    ├── radrealms.so
    ├── rp-pppoe.so -> pppoe.so
    └── winbind.so

2 directories, 11 files
➜  pppd

2.1.2. Podman

若你使用的是 Podman 而不是 Docker

则需要做以下操作以便 Landscape Router 识别到 podman.socket

  1. 启用 podman.socket

    systemctl enable --now podman.socket
    
  2. 编辑 systemd 单元文件开机自动完成创建 podman.socket 软链接步骤

    systemctl edit --force --full podman-docker-socket
    

    写入以下内容:

    [Unit]
    Description=Create Symlink from podman.sock to docker.sock
    After=podman.socket
    Requires=podman.socket
    
    [Service]
    Type=oneshot
    RemainAfterExit=yes
    
    ExecStartPre=-/bin/rm -f /var/run/docker.sock
    ExecStart=/bin/ln -s /run/podman/podman.sock /var/run/docker.sock
    
    [Install]
    WantedBy=multi-user.target
    

2.2. 本机网络管理器配置

后期 Landscape Router 接管并配置该网卡

本地的网络管理器会有干扰

所以需要修改本地网络管理器配置

ifupdown 官网已经写明

这里补充 NetworkManager & systemctl-networkd

若使用 systemctl-networkd 不应同时启用 systemd-resolved

2.2.1. NetworkManager

➜  ~ cat /etc/NetworkManager/system-connections/enp1s0f0.nmconnection
[connection]
id=enp1s0f0
permissions=
interface-name=enp1s0f0
type=ethernet
[ipv4]
method=manual
address1=0.0.0.0

2.2.2. systemctl-networkd

/etc/systemd/network/50-enp1s0f0.network


[Match]
Name=enp1s0f0

[Network]
DHCP=no
IPv6AcceptRA=no
LinkLocalAddressing=no

2.3. 编辑 landscape.toml 文件

详细规则请移步官网

配置文件介绍 | Landscape Router
Configuring Linux as a Router

2.4. 创建 systemd 服务单元文件

使用以下命令创建

systemctl edit --force --full landscape-router

写入如下文件

  • 注意修改 ExecStart= 放置 程序本体 和 static.zip 的路径
[Unit]
Description=Landscape Router

[Service]
ExecStart=/usr/local/bin/landscape-webserver -c /srv/landscape-router-static
Restart=always
User=root
LimitMEMLOCK=infinity

[Install]
WantedBy=multi-user.target

👩‍🏫
Tips | 贴士
  1. 若你在 2.1.2. 节中使用 Podman ,可以设置依赖 podman-docker-socket 服务

    # /etc/systemd/system/landscape-router.service.d/override.conf
    [Unit]
    After=podman-docker-socket.service
    Requires=podman-docker-socket.service
    

2.5. 启动 Landscape Router

  1. 启动 Landscape Router

    systemctl start landscape-router
    
  2. 开机自启

    systemctl enable landscape-router
    
  3. 停止

    systemctl stop landscape-router
    

3. Usage | 使用

以下示例使用环境为

  • WAN → pppoe
  • LAN → dhcp server

3.1. 打开web界面

根据 landscape.toml 文件配置的地址打开浏览器访问web界面

输入设置好的账户&密码

3.2. 切换网卡区域

接下来需要点击页面显示中网卡按钮(四边形logo)切换网卡区域

  • WAN
  • LAN

3.3. 配置 WAN 接口

此时网卡分为WAN/LAN两部分

随后选择 WAN 口点击 🔗 图标配置 pppd 服务

如无特殊要求可按照默认配置直接启动以下服务

  • TCP MSS 钳制
  • 防火墙服务配置
  • 网卡NAT配置
  • IPV6-PD 客户端配置
  • Wan 路由转发服务(做路由用途必须启用)

3.4. 配置 LAN 接口

⚠️
配置 LAN 口时需要注意不要与当前管理口(网卡)冲突以免失联

LAN 端则需要配置 DHCP Server

目前 DHCP Server 仍然简陋

仅支持基本的 DHCP 服务和Mac IP 地址绑定


完成后按需配置如下选项:

  • ICMPV6-RA 服务配置
  • Lan 路由 转发 (做路由用途必须启用)
🔚
完成以上配置后基本路由环境配置已完成,客户端接入便可成功上网

3.5. (可选) 修改 DNS 上游配置

默认情况下 Landscape Router 配置的上游DNS地址为 1.1.1.1

建议改为国内的DNS服务器地址比如

  • 223.5.5.5
  • 119.29.29.29
  • ISP DNS
  • ......

Thanks & Copy

GitHub - ThisSeanZhang/landscape: The goal is to easily configure your favorite Linux distribution as a router using the web UI
The goal is to easily configure your favorite Linux distribution as a router using the web UI - ThisSeanZhang/landscape

标签

xzllll

三分钟热度三分钟收获