{"id":13648233,"url":"https://github.com/Jamesits/pilot","last_synced_at":"2025-04-22T07:30:53.304Z","repository":{"id":71870746,"uuid":"202897679","full_name":"Jamesits/pilot","owner":"Jamesits","description":"Simple web-based SDN controller for family and friends","archived":false,"fork":false,"pushed_at":"2022-12-21T00:47:50.000Z","size":2408,"stargazers_count":34,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-14T15:54:52.730Z","etag":null,"topics":["bgp","bgp-flow-specification","flowspec","gobgp","mpls","sdn","sdn-controller","vrf"],"latest_commit_sha":null,"homepage":"https://hub.docker.com/r/jamesits/pilot","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Jamesits.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},"funding":{"ko_fi":"jamesits","custom":["https://www.buymeacoffee.com/Jamesits","https://paypal.me/Jamesits"]}},"created_at":"2019-08-17T15:24:51.000Z","updated_at":"2024-10-25T15:35:48.000Z","dependencies_parsed_at":null,"dependency_job_id":"54c5deda-2c9a-41df-a323-39cdada884fa","html_url":"https://github.com/Jamesits/pilot","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jamesits%2Fpilot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jamesits%2Fpilot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jamesits%2Fpilot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jamesits%2Fpilot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Jamesits","download_url":"https://codeload.github.com/Jamesits/pilot/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250195033,"owners_count":21390230,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["bgp","bgp-flow-specification","flowspec","gobgp","mpls","sdn","sdn-controller","vrf"],"created_at":"2024-08-02T01:04:04.639Z","updated_at":"2025-04-22T07:30:53.297Z","avatar_url":"https://github.com/Jamesits.png","language":"Python","funding_links":["https://ko-fi.com/jamesits","https://www.buymeacoffee.com/Jamesits","https://paypal.me/Jamesits"],"categories":["Python"],"sub_categories":[],"readme":"# Pilot\n\nSimple web-based SDN controller for family and friends.\n\n[![Build Status](https://dev.azure.com/nekomimiswitch/General/_apis/build/status/pilot?branchName=master)](https://dev.azure.com/nekomimiswitch/General/_build/latest?definitionId=81\u0026branchName=master)\n\n## Introduction\n\nPilot is the SDN controller for your home. Once Pilot is set up, any device in your LAN can visit Pilot's web interface to easily select their own VRF.\n\n![Pilot web interface screenshot](assets/pilot-webui.png)\n\n## Requirements\n\nServer running Pilot:\n* Python 3.7 or later (if you don't use the Docker image)\n* GoBGP with gRPC enabled (if you don't use the Docker image)\n* LAN devices should not go through SNAT/masquerade to access the server (for proper IP address detection)\n\nGateway router:\n* Has VRF-Lite capability\n* Can act as a [BGP Flow Specification](https://tools.ietf.org/html/rfc5575) client\n\n## Usage\n\n### Router Setup\n\n* Put different network profiles in different VRFs\n* Add BGP session with your GoBGP instance and enable `ipv4 flowspec` and `ipv6 flowspec` address families\n* Allow flowspec rule installation on the interfaces to LAN clients\n\nExample configuration for Cisco IOS XE 16.x:\n```\n! Enable flowspec rule installation\nflowspec\n local-install interface-all\n\n! VRF definition\nip vrf UPLINK1\n rd 100:100\n route-target both 100:100\nip vrf UPLINK2\n rd 200:200\n route-target both 200:200\n\n! Uplink interfaces\ninterface GigabitEthernet0/0/0\n description uplink-1\n ip vrf select source\n ip vrf receive UPLINK1\n ip flowspec disable\n ipv6 flowspec disable\ninterface GigabitEthernet0/0/1\n description uplink-2\n ip vrf select source\n ip vrf receive UPLINK2\n ip flowspec disable\n ipv6 flowspec disable\n\n! LAN interfaces\ninterface GigabitEthernet0/0/2\n description LAN\n ip address 192.168.1.1 255.255.255.0\n ip vrf select source\n ip vrf receive UPLINK1\n ip vrf receive UPLINK2\n\n! BGP peer setup\nrouter bgp 65540\n bgp router-id 169.254.1.2\n neighbor 169.254.1.1 remote-as 65540\n address-family ipv4 flowspec\n  neighbor 169.254.1.1 activate\n address-family ipv6 flowspec\n  neighbor 169.254.1.1 activate\n\n! Routes for global and VRFs\nip route 0.0.0.0 0.0.0.0 x.x.x.x 10\nip route 0.0.0.0 0.0.0.0 y.y.y.y 20\nip route vrf UPLINK1 0.0.0.0 0.0.0.0 x.x.x.x\nip route vrf UPLINK2 0.0.0.0 0.0.0.0 y.y.y.y\n```\n\nExample configuration for Juniper Junos OS (interface configuration left out):\n```\nset policy-options policy-statement accept-all term 1 then accept\nset protocols bgp local-as 65540\nset protocols bgp group flowspec family inet flow no-validate accept-all\nset protocols bgp group flowspec family inet6 flow no-validate accept-all\nset protocols bgp group flowspec neighbor 169.254.1.1 peer-as 65540\nset routing-options flow term-order standard\n# exclude your upstream interfaces:\n# set routing-options flow interface-group [\u003cgroup-id\u003e] [exclude \u003cgroup-id\u003e]\n```\n\n### Pilot Setup\n\nThe easiest way to run Pilot is using the [Docker image](https://hub.docker.com/r/jamesits/pilot). Download all the files in [config](config) and put them in a directory. \n\nIn `gobgpd.toml`:\n* Change `global.config.as` and `global.config.router-id`\n* Change `neighbors[].config.neighbor-address` and `neighbors[].config.peer-as`\n\nIn `pilot.toml`:\n* Add or change `rule`\n\nThen spin up our Docker container:\n```shell\ndocker run --restart=always --name=pilot --network=host -v path/to/your/config/directory:/etc/pilot:ro jamesits/pilot:latest\n```\n\nThe web UI will be on port 80.\n\n## Thanks\n\nThis project is inspired by [xtomcom/NetworkSwitch](https://github.com/xtomcom/NetworkSwitch).\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FJamesits%2Fpilot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FJamesits%2Fpilot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FJamesits%2Fpilot/lists"}