{"id":34683274,"url":"https://github.com/thisseanzhang/landscape","last_synced_at":"2026-03-11T05:01:00.164Z","repository":{"id":271493604,"uuid":"906318504","full_name":"ThisSeanZhang/landscape","owner":"ThisSeanZhang","description":"The goal is to easily configure your favorite Linux distribution as a router using the web UI","archived":false,"fork":false,"pushed_at":"2026-03-05T09:30:43.000Z","size":15863,"stargazers_count":1194,"open_issues_count":27,"forks_count":77,"subscribers_count":8,"default_branch":"main","last_synced_at":"2026-03-05T12:40:27.667Z","etag":null,"topics":["dns-server","ebpf-tc","landscape-router","linux","netns","network-programming","networking-tools","router","rust","tproxy"],"latest_commit_sha":null,"homepage":"https://landscape.whileaway.dev","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ThisSeanZhang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-12-20T16:22:14.000Z","updated_at":"2026-03-05T08:08:04.000Z","dependencies_parsed_at":null,"dependency_job_id":"fbf1b76d-ce8a-453c-9755-66145926fabe","html_url":"https://github.com/ThisSeanZhang/landscape","commit_stats":null,"previous_names":["thisseanzhang/landscape"],"tags_count":89,"template":false,"template_full_name":null,"purl":"pkg:github/ThisSeanZhang/landscape","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThisSeanZhang%2Flandscape","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThisSeanZhang%2Flandscape/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThisSeanZhang%2Flandscape/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThisSeanZhang%2Flandscape/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ThisSeanZhang","download_url":"https://codeload.github.com/ThisSeanZhang/landscape/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThisSeanZhang%2Flandscape/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30372125,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T21:41:54.280Z","status":"online","status_checked_at":"2026-03-11T02:00:07.027Z","response_time":84,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dns-server","ebpf-tc","landscape-router","linux","netns","network-programming","networking-tools","router","rust","tproxy"],"created_at":"2025-12-24T21:35:57.290Z","updated_at":"2026-03-11T05:01:00.158Z","avatar_url":"https://github.com/ThisSeanZhang.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Landscape - Linux Router Configuration Tool\n\n[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-green.svg)](https://www.gnu.org/licenses/gpl-3.0)\n[![DeepWiki](https://img.shields.io/badge/DeepWiki-ThisSeanZhang%2Flandscape-blue.svg?logo=data\\:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAyCAYAAAAnWDnqAAAAAXNSR0IArs4c6QAAA05JREFUaEPtmUtyEzEQhtWTQyQLHNak2AB7ZnyXZMEjXMGeK/AIi+QuHrMnbChYY7MIh8g01fJoopFb0uhhEqqcbWTp06/uv1saEDv4O3n3dV60RfP947Mm9/SQc0ICFQgzfc4CYZoTPAswgSJCCUJUnAAoRHOAUOcATwbmVLWdGoH//PB8mnKqScAhsD0kYP3j/Yt5LPQe2KvcXmGvRHcDnpxfL2zOYJ1mFwrryWTz0advv1Ut4CJgf5uhDuDj5eUcAUoahrdY/56ebRWeraTjMt/00Sh3UDtjgHtQNHwcRGOC98BJEAEymycmYcWwOprTgcB6VZ5JK5TAJ+fXGLBm3FDAmn6oPPjR4rKCAoJCal2eAiQp2x0vxTPB3ALO2CRkwmDy5WohzBDwSEFKRwPbknEggCPB/imwrycgxX2NzoMCHhPkDwqYMr9tRcP5qNrMZHkVnOjRMWwLCcr8ohBVb1OMjxLwGCvjTikrsBOiA6fNyCrm8V1rP93iVPpwaE+gO0SsWmPiXB+jikdf6SizrT5qKasx5j8ABbHpFTx+vFXp9EnYQmLx02h1QTTrl6eDqxLnGjporxl3NL3agEvXdT0WmEost648sQOYAeJS9Q7bfUVoMGnjo4AZdUMQku50McDcMWcBPvr0SzbTAFDfvJqwLzgxwATnCgnp4wDl6Aa+Ax283gghmj+vj7feE2KBBRMW3FzOpLOADl0Isb5587h/U4gGvkt5v60Z1VLG8BhYjbzRwyQZemwAd6cCR5/XFWLYZRIMpX39AR0tjaGGiGzLVyhse5C9RKC6ai42ppWPKiBagOvaYk8lO7DajerabOZP46Lby5wKjw1HCRx7p9sVMOWGzb/vA1hwiWc6jm3MvQDTogQkiqIhJV0nBQBTU+3okKCFDy9WwferkHjtxib7t3xIUQtHxnIwtx4mpg26/HfwVNVDb4oI9RHmx5WGelRVlrtiw43zboCLaxv46AZeB3IlTkwouebTr1y2NjSpHz68WNFjHvupy3q8TFn3Hos2IAk4Ju5dCo8B3wP7VPr/FGaKiG+T+v+TQqIrOqMTL1VdWV1DdmcbO8KXBz6esmYWYKPwDL5b5FA1a0hwapHiom0r/cKaoqr+27/XcrS5UwSMbQAAAABJRU5ErkJggg==)](https://deepwiki.com/ThisSeanZhang/landscape)\n\n\u003c!-- DeepWiki badge generated by https://deepwiki.ryoppippi.com/ --\u003e\n\nLandscape is a web-based tool that helps you easily configure your favorite Linux distribution as a router.\n\n\u003e Built with Rust / eBPF / AF_PACKET.\n\n[简体中文](./README.zh.md) | [English](./README.md)\n\n\u003e For more information, please read the [documentation](https://landscape.whileaway.dev/en/introduction.html).\n\n## Screenshot\n![](main.png)\n\n---\n\n## CORE Features\n* Traffic diversion control (SIP-CIDR, MAC, DIP, domain, Geo matching rules)  \n* eBPF routing\n* Independent DNS configuration and caching for each flow (to prevent DNS pollution and leaks) \n* Traffic import into Docker containers \n* Geo management  \n\n---\n\n## Features\n\n\u003e ✅ Implemented and tested\n\u003e ⚠ Functional but untested\n\u003e ❌ Not implemented\n\n* \u003cu\u003eIP Configuration\u003c/u\u003e\n  * *Static IP*\n\n    * ✅ Set IP address\n    * ✅ Configure default route via gateway\n  * *DHCP Client*\n\n    * ✅ Specify hostname\n    * ❌ Custom DHCP options\n  * *PPPoE (PPPD version)*\n\n    * ✅ Set as default route\n    * ⚠ Multi-interface dialing\n    * ✅ Specify interface name\n  * *PPPoE (eBPF version)*\n\n    * ✅ Protocol core implemented\n    * ❌ GRO/GSO causing oversized packets (unsolved)\n  * *DHCP Server*\n\n    * ✅ Provide basic IP assignment and renewal\n    * ✅ Custom gateway/subnet/access rules\n    * ✅ IP-MAC binding\n    * ✅ IP lease display\n  * *IPv6 Support*\n\n    * ✅ Use DHCPv6-PD to request prefix from upstream\n    * ✅ Use RA to advertise multiple prefixes to downstream\n\n* \u003cu\u003eFlow Control Module\u003c/u\u003e\n\n  * ✅ Tag flows using IP / MAC\n  * ✅ Each flow can have its own DNS settings and cache\n  * ✅ Route marked traffic based on rules (direct/drop/reuse port/redirect to Docker or NIC)\n  * ❌ Assign tracking marks to specified packets\n  * ✅ External IP behavior control via tagging and `geoip.dat` support\n  * ✅ When IP rules and DNS rules conflict, the priority of the rules is used for verdict (the smaller the value, the higher the priority)\n\n* \u003cu\u003eGeo Management\u003c/u\u003e\n\n  * ✅ Manage multiple Geo sources\n  * ✅ Auto-update Geo IP/Site data\n\n* \u003cu\u003eDNS\u003c/u\u003e\n\n  * ✅ Support DNS over HTTPS, DNS over TLS and DNS over Quic for upstream\n  * ✅ Assign specific upstream DNS by domain\n  * ✅ DNS Hijacking (return A / AAAA records)\n  * ❌ Hijack to return multiple records (example: TXT / CNAME and other)\n  * ✅ Tag resolved IPs and handle with traffic control\n  * ✅ Support GeoSite files\n  * ❌ Parse Docker container domain labels into DNS records\n  * ✅ Test domain resolution\n\n* \u003cu\u003eNAT (eBPF)\u003c/u\u003e\n\n  * ✅ Basic NAT support\n  * ✅ Static mapping / Port forwarding \n  * ✅ NAT disables port reuse by default; reuse allowed via tagging rules\n\n* \u003cu\u003eMetrics\u003c/u\u003e\n\n  * ✅ Report connection stats (bytes/packets) every 5 seconds\n  * ✅ Display active connections (not yet combined with NAT)\n  * ❌ Open export API for metrics\n\n* \u003cu\u003eDocker\u003c/u\u003e\n\n  * ✅ Basic Docker container management and runtime\n  * ⚠ Pull images\n  * ✅ Route traffic into TProxy-enabled containers\n\n* \u003cu\u003eWi-Fi\u003c/u\u003e\n\n  * ✅ Enable/disable Wi-Fi using `iw`\n  * ✅ Create AP with `hostapd`\n  * ❌ Connect to existing Wi-Fi hotspot\n\n* \u003cu\u003eStorage\u003c/u\u003e\n\n  * ✅ Use database instead of file-based config\n  * ✅ Export all current configs as `landscape_init.toml`\n  * ❌ UI component to upload/restore config\n  * ❌ Config editor via UI\n  * ❌ Separate DB path for metrics\n\n* \u003cu\u003eMiscellaneous\u003c/u\u003e\n\n  * ✅ Login screen\n  * ❌ English UI frontend\n  * ✅ NIC XPS/RPS optimization to distribute load across CPU cores\n\n---\n\n## How to Start \u0026 Limitations\n\n### System Requirements\n\n* Supported Linux Kernel: `6.9` or later\n* The Linux kernel enables BTF/BPF functionality. See the [documentation](https://landscape.whileaway.dev/attention.html) for details.\n* (Optional) `docker`\n\n### Manual Startup\n1. Create config directory:\n\n   ```bash\n   mkdir -p /root/.landscape-router\n   ```\n2. Download **static.zip** from [release](https://github.com/ThisSeanZhang/landscape/releases) and extract to `/root/.landscape-router/static`\n3. It can be started without configuring any files, but if you want to initialize it automatically via a configuration file.\n   refer to [Config](https://landscape.whileaway.dev/config/) to create `landscape_init.toml`\n4. Start the service by downloading a release binary from [Releases](https://github.com/ThisSeanZhang/landscape/releases)\n   Then run (as root):\n\n   ```bash\n   ./landscape-webserver\n   ```\n\n   Default HTTP port: **6300**  \u003cbr/\u003e\n   Default HTTPS port: **6443**  \u003cbr/\u003e\n   Default username: **root**  \u003cbr/\u003e\n   Default password: **root**  \u003cbr/\u003e\n   Use `./landscape-webserver --help` for other options.\n5. Once everything is confirmed to work, you can set it up as a systemd service.\n   Create `/etc/systemd/system/landscape-router.service` with the following content:\n\n   ```text\n   [Unit]\n   Description=Landscape Router\n\n   [Service]\n   ExecStart=/root/landscape-webserver  # remember to modify this path accordingly\n   Restart=always\n   User=root\n   LimitMEMLOCK=infinity\n\n   [Install]\n   WantedBy=multi-user.target\n   ```\n\n### Armbian Integration\n\nSee [Armbian Integration Guide](https://landscape.whileaway.dev/compilation/armbian.html)\n\n---\n\n## Build Instructions\n\nSee [Build Documentation](https://landscape.whileaway.dev/compilation/) or [Cross-compilation Guide](https://landscape.whileaway.dev/compilation/cross.html)\n\n---\n\n## LICENSE\n\n* `landscape-ebpf`: [GNU GPL v2.0](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html)\n* Other parts: [GNU GPL v3.0](https://www.gnu.org/licenses/gpl-3.0.html)\n\n---\n\nIf you have any suggestions or issues, feel free to submit them via [issues](./issues/new).\n\n## Star History\n\n\u003ca href=\"https://www.star-history.com/#ThisSeanZhang/landscape\u0026Date\"\u003e\n \u003cpicture\u003e\n   \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=ThisSeanZhang/landscape\u0026type=Date\u0026theme=dark\" /\u003e\n   \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=ThisSeanZhang/landscape\u0026type=Date\" /\u003e\n   \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=ThisSeanZhang/landscape\u0026type=Date\" /\u003e\n \u003c/picture\u003e\n\u003c/a\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthisseanzhang%2Flandscape","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthisseanzhang%2Flandscape","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthisseanzhang%2Flandscape/lists"}