Landscape is a web-based tool that helps you easily configure your favorite Linux distribution as a router.
Built with Rust / eBPF / AF_PACKET.
- Traffic diversion control (SIP-CIDR, QoS (dscp), DIP, domain, Geo matching rules)
- eBPF routing
- Independent DNS configuration and caching for each flow (to prevent DNS pollution and leaks)
- Traffic import into Docker containers
- Geo management
✅ Implemented and tested ⚠ Functional but untested ❌ Not implemented
-
IP Configuration
-
Static IP
- ✅ Set IP address
- ✅ Configure default route via gateway
-
DHCP Client
- ✅ Specify hostname
- ❌ Custom DHCP options
-
PPPoE (PPPD version)
- ✅ Set as default route
- ⚠ Multi-interface dialing
- ✅ Specify interface name
-
PPPoE (eBPF version)
- ✅ Protocol core implemented
- ❌ GRO/GSO causing oversized packets (unsolved)
-
DHCP Server
- ✅ Provide basic IP assignment and renewal
- ✅ Custom gateway/subnet/access rules
- ✅ IP-MAC binding
- ✅ IP lease display
-
IPv6 Support
- ✅ Use DHCPv6-PD to request prefix from upstream
- ✅ Use RA to advertise prefix to downstream
-
-
Flow Control Module
- ✅ Tag flows using IP + QoS
- ✅ Each flow can have its own DNS settings and cache
- ✅ Route marked traffic based on rules (direct/drop/reuse port/redirect to Docker or NIC)
- ❌ Assign tracking marks to specified packets
- ✅ External IP behavior control via tagging and
geoip.dat
support - ✅ When IP rules and DNS rules conflict, the priority of the rules is used for verdict (the smaller the value, the higher the priority)
-
Geo Management
- ✅ Manage multiple Geo sources
- ✅ Auto-update Geo IP/Site data
-
DNS
- ✅ Support DNS over HTTPS, DNS over TLS and DNS over Quic for upstream
- ✅ Assign specific upstream DNS by domain
- ✅ DNS Hijacking (return A / AAAA records)
- ❌ Hijack to return multiple records (example: TXT / CNAME and other)
- ✅ Tag resolved IPs and handle with traffic control
- ✅ Support GeoSite files
- ❌ Parse Docker container domain labels into DNS records
- ✅ Test domain resolution
-
NAT (eBPF)
- ✅ Basic NAT support
- ✅ Static mapping / Port forwarding
- ✅ NAT disables port reuse by default; reuse allowed via tagging rules
-
Metrics
- ✅ Report connection stats (bytes/packets) every 5 seconds
- ✅ Display active connections (not yet combined with NAT)
- ❌ Open export API for metrics
-
Docker
- ✅ Basic Docker container management and runtime
- ⚠ Pull images
- ✅ Route traffic into TProxy-enabled containers
-
Wi-Fi
- ✅ Enable/disable Wi-Fi using
iw
- ✅ Create AP with
hostapd
- ❌ Connect to existing Wi-Fi hotspot
- ✅ Enable/disable Wi-Fi using
-
Storage
- ✅ Use database instead of file-based config
- ✅ Export all current configs as
landscape_init.toml
- ❌ UI component to upload/restore config
- ❌ Config editor via UI
- ❌ Separate DB path for metrics
-
Miscellaneous
- ✅ Login screen
- ❌ English UI frontend
- ✅ NIC XPS/RPS optimization to distribute load across CPU cores
- Supported Linux Kernel:
6.9
or later - (Optional)
docker
-
Create config directory:
mkdir -p ~/.landscape-router
-
Download static.zip from release and extract to
~/.landscape-router/static
-
If you have a desktop environment and browser, you can skip this step. Otherwise, refer to Config to create
landscape_init.toml
-
Start the service by downloading a release binary from Releases Then run (as root):
./landscape-webserver
Default port: 6300 Default username: root Default password: root Use
./landscape-webserver --help
for other options. -
Once everything is confirmed to work, you can set it up as a systemd service. Create
/etc/systemd/system/landscape-router.service
with the following content:[Unit] Description=Landscape Router [Service] ExecStart=/root/landscape-webserver # remember to modify this path accordingly Restart=always User=root LimitMEMLOCK=infinity [Install] WantedBy=multi-user.target
See Build Documentation or Cross-compilation Guide
landscape-ebpf
: GNU GPL v2.0- Other parts: GNU GPL v3.0
If you have any suggestions or issues, feel free to submit them via issues.