Landscape
The goal is to make it easier to configure your favorite Linux distribution as a router. Built with Rust and eBPF.
Install / Use
/learn @ThisSeanZhang/LandscapeREADME
Landscape - eBPF-based Linux Router Platform
<!-- DeepWiki badge generated by https://deepwiki.ryoppippi.com/ -->Landscape makes it easier to turn your preferred Linux distribution into a router.
Landscape is an eBPF-based Linux router platform that provides network service management, policy control, and APIs.
Built with Rust / eBPF / AF_PACKET.
Documentation: https://landscape.whileaway.dev/en/
Screenshot

Core Features
- eBPF-based traffic steering with no impact on direct-path performance, using source matches
(SIP-CIDR, MAC)and destination matches(DIP, domain, Geo rules) - Per-flow DNS configuration and caching to avoid DNS pollution and leakage
- Traffic can be redirected into Docker containers, where TProxy-capable programs can be used to extend functionality
- Geo database management with support for DAT and TXT formats
- Stricter NAT4 by default, while allowing specific IPs or domains to use NAT1 for scenarios such as overlay networking, more: NAT4? No, stricter than NAT4
- APIs for everything that can be managed from the UI
Why Landscape
The most direct reason is that I want to keep using the Linux distributions I already know well for routing, rather than being locked into a single system. In addition to Debian, Landscape has already seen real-world usage reports on Arch, openSUSE, and other distributions.
Of course, you can build a stable routing solution by combining existing Linux tools. The problem is that those setups usually scatter configuration across multiple places, raise maintenance costs, and make storage and migration harder to manage. Landscape keeps everything in a single directory. You can drop in a new version and run it directly, existing configuration is migrated automatically on startup, and downgrades are supported when needed.
There are also practical network requirements behind it. A LAN may have BT/PT workloads that need NAT1, but I do not want other applications sharing the same upstream bandwidth. Landscape therefore provides finer-grained NAT control, so you can decide NAT behavior for different traffic based on domain names or IPs.
Different devices on the same LAN often need different traffic-steering policies. I also want direct traffic to keep working even if a container or proxy component fails, rather than having a failure take everything down with it.
Quick Start
Notes
- Linux kernel
6.9or later; this project depends heavily on Linux kernel capabilities, so systems with non-Linux kernels such as FreeBSD or macOS are not supported - BTF/BPF support must be enabled in the kernel
rootprivileges are required to start the service- Docker must be installed separately if you want container-based traffic redirection or container management features
- The backend binary and frontend static assets are released separately
- By default, if you do not configure additional static NAT or an exposure path, the management interface cannot be accessed directly from the WAN side
1. Create the config directory
mkdir -p /root/.landscape-router
2. Download the release assets
- From Releases
- Download
static.zip - Download the
landscape-webserverbinary for your architecture
- Download
- Extract it to
/root/.landscape-router/static(this is the default path, but it can be customized)
3. Start Landscape
Run as root:
./landscape-webserver
Default runtime values:
- Config directory:
/root/.landscape-router - HTTP redirect port:
6300 - HTTPS port:
6443 - Default username:
root - Default password:
root
Landscape can start directly without any pre-created configuration file. If you want to initialize it through landscape_init.toml, see the configuration guide on the documentation site.
You can check more options with ./landscape-webserver --help.
4. Open the management interface
http://landscape.local:6300automatically redirects to HTTPShttps://landscape.local:6443opens the Web UIhttps://landscape.local:6443/api/docsopens the REST API docs
Start at Boot
After confirming that the service is running correctly, you can configure it as a systemd service:
[Unit]
Description=Landscape Router
[Service]
ExecStart=/root/landscape-webserver
Restart=always
User=root
LimitMEMLOCK=infinity
[Install]
WantedBy=multi-user.target
Replace ExecStart with the actual path to your binary.
License
landscape-ebpf: GNU General Public License v2.0- Other parts: GNU General Public License v3.0
If you have suggestions or run into a problem, please open an issue here: https://github.com/ThisSeanZhang/landscape/issues
