diff options
Diffstat (limited to 'docs')
115 files changed, 0 insertions, 18038 deletions
diff --git a/docs/automation/md-cloud-init.md b/docs/automation/md-cloud-init.md deleted file mode 100644 index 6c25287d..00000000 --- a/docs/automation/md-cloud-init.md +++ /dev/null @@ -1,375 +0,0 @@ ---- -lastproofread: '2026-04-13' ---- - -(cloud-init)= - -# VyOS cloud-init - -VyOS instances in cloud and virtualized environments are initialized using the -industry-standard `cloud-init`. Through `cloud-init`, VyOS injects SSH -keys, configures network settings, and applies custom configurations during the -initial instance boot. - -## Configuration sources - -VyOS `cloud-init` obtains configuration data from the following sources: - -- `meta-data`: Instance-specific details provided by the cloud platform or - hypervisor. In some cloud environments, this data is available via an HTTP - endpoint at `http://169.254.169.254`. -- `network configuration`: Network settings such as IP addresses, routes, and - DNS (only available on certain cloud and virtualization platforms). -- `user-data`: User-supplied CLI configuration commands. - -## User-data - -Major cloud providers support injecting `user-data` as plain text or base64 -encoding text during initial instance boot. As `user-data` has a strict size -limit of \~16384 bytes, long configuration command lists can be compressed using -`gzip`. - -The recommended method for configuring VyOS instances via `user-data` is to -use the `cloud-config` syntax described below. - -## Cloud-config modules - -By default, VyOS enables only two `cloud-config` modules: - -- `write_files`: Inserts user-provided files such as encryption keys, - certificates, or `config.boot` into the filesystem during the initial - instance boot. See [Cloud-init-write_files] for file syntax and file format - requirements. -- `vyos_userdata`: Executes user-provided CLI configuration commands during - the initial instance boot. - -The files to insert and the CLI commands to execute must be provided in a -`cloud-config` YAML file. - -## Cloud-config file format - -`cloud-config` files are written in YAML and must begin with the -`#cloud-config` line. Only `vyos_config_commands` and `write_files` are -supported as top-level keys. The use of these keys is described in the -following two sections. - -## Vyos_config_commands key - -Use the `vyos_config_commands` key to define configuration commands for -initializing your VyOS instance. Commands must follow the set-style syntax -and can include both `set` and `delete` statements. - -Syntax requirements: - -- Place one command per line. -- Enclose values in single quotes. -- Avoid single quotes within commands or values. - -Applying commands from `cloud-config` overrides both settings configured via -`meta-data` and default VyOS settings. After commands are applied, -`cloud-init` automatically performs `commit` and `save`. - -The following is an example of a `cloud-config` file: - -```yaml -#cloud-config -vyos_config_commands: - - set system host-name 'vyos-prod-ashburn' - - set service ntp server 1.pool.ntp.org - - set service ntp server 2.pool.ntp.org - - delete interfaces ethernet eth1 address 'dhcp' - - set interfaces ethernet eth1 address '192.0.2.247/24' - - set protocols static route 198.51.100.0/24 next-hop '192.0.2.1' -``` - -### Instance defaults/fallbacks - -If no external configuration data is provided, VyOS applies the following -defaults: - -- **SSH:** port 22. -- **Credentials:** `vyos`/`vyos`. -- **Networking:** DHCP is enabled on the first Ethernet interface. - -All defaults can be overridden via `user-data` configurations. - -## Write_files key - -VyOS allows you to run custom scripts during the initial instance boot to -execute operational, configuration, and standard Linux commands. - -Use the `write_files` key to insert these scripts into the -`/opt/vyatta/etc/config/scripts/` directory. - -Depending on when your commands need to run, use one of the following paths: - -- `/opt/vyatta/etc/config/scripts/vyos-preconfig-bootup.script`: Commands - defined here are executed before the system configuration is applied. -- `/opt/vyatta/etc/config/scripts/vyos-postconfig-bootup.script`: Commands - defined here are executed after the system configuration is applied. - -In both cases, commands are executed with `root` privileges. - -:::{note} -Use the `/opt/vyatta/etc/config/` path instead of `/config/scripts/` as -referenced in the {ref}`command-scripting` section. The `/config/scripts/` -directory is not mounted when the `write_files` module runs. -::: - -The following example shows how to use `write_files` to execute an -operational command **after** the initial configuration is complete: - -```yaml -#cloud-config -write_files: - - path: /opt/vyatta/etc/config/scripts/vyos-postconfig-bootup.script - owner: root:vyattacfg - permissions: '0775' - content: | - #!/bin/vbash - source /opt/vyatta/etc/functions/script-template - filename=/tmp/bgp_status_`date +"%Y_%m_%d_%I_%M_%p"`.log - run show ip bgp summary >> $filename -``` - -You can combine standard Linux commands to fetch data and VyOS configuration -commands (like `set` and `commit`) in the same script. - -The following example sets the `hostname` based on the instance identifier -obtained from the EC2 Instance Metadata Service (IMDS). - -```yaml -#cloud-config -write_files: - - path: /opt/vyatta/etc/config/scripts/vyos-postconfig-bootup.script - owner: root:vyattacfg - permissions: '0775' - content: | - #!/bin/vbash - source /opt/vyatta/etc/functions/script-template - hostname=`curl -s http://169.254.169.254/latest/meta-data/instance-id` - configure - set system host-name $hostname - commit - exit -``` - -## NoCloud - -Injecting configuration data is not limited to cloud platforms. The NoCloud -data source allows you to inject `user-data` and `meta-data` on -virtualization platforms such as VMware, Hyper-V, and KVM. - -The simplest way to use the NoCloud data source is to create a `seed.iso` -file and attach it to the virtual machine as a CD drive. The volume must be -formatted as a VFAT or ISO 9660 file system with the label `cidata` or -`CIDATA`. - -Create text files named `user-data` and `meta-data`. On Linux-based -systems, use the `mkisofs` utility to create the `seed.iso` file. The -following syntax adds these files to the ISO 9660 file system: - -```none -mkisofs -joliet -rock -volid "cidata" -output seed.iso meta-data user-data -``` - -Once generated, attach the `seed.iso` file to your virtual machine. The -following example shows how to attach the file as a CD drive using KVM: - -```none -$ virt-install -n vyos_r1 \ - --ram 4096 \ - --vcpus 2 \ - --cdrom seed.iso \ - --os-type linux \ - --os-variant debian10 \ - --network network=default \ - --graphics vnc \ - --hvm \ - --virt-type kvm \ - --disk path=/var/lib/libvirt/images/vyos_kvm.qcow2,bus=virtio \ - --import \ - --noautoconsole -``` - -For more information on the NoCloud data source, visit the [NoCloud] page in -the `cloud-init` documentation. - -## Troubleshooting - -If your configuration does not apply as expected, follow these troubleshooting -steps: - -1. **Validate your YAML**: Ensure your `cloud-config` file follows proper - YAML syntax. Online resources such as [YAML Lint](https://www.yamllint.com/) - provide simple validation tools. -2. **Check the logs**: `cloud-init` writes logs to `/var/log/cloud-init.log`. - Filter for VyOS-specific entries using: - -```none -sudo grep vyos /var/log/cloud-init.log -``` - -## Cloud-init on Proxmox - -Before you begin, review the `cloud-init` [network-config-docs] to -understand how to import user and network configuration data. - -Key considerations: - -- Define VyOS configuration commands in the `user-data` file. -- Avoid including network configuration data in the `user-data` file. -- If no network configuration data is provided, the DHCP client is enabled on - the first interface. This happens at the OS level and is not reflected in the - VyOS CLI. - -The following example shows how to disable the DHCP client on `eth0` to -address this behavior. - -In this example: - -- **Proxmox IP address**: `192.168.0.253/24`. -- **Storage**: The `local` volume is mounted at `/var/lib/vz` and contains - all content types, including snippets. - -The goal is to remove the default DHCP client from the first interface and -apply a custom configuration during the initial instance boot using -`cloud-init`. - -### Generate .qcow2 image - -First, generate a VyOS `.qcow2` image with `cloud-init` support from the -[vyos-vm-images] repository: - -1. Clone the `vyos-vm-images` repository and comment out the `download-iso` - role in `qemu.yml`. -2. Download your preferred VyOS `.iso` file and save it as `/tmp/vyos.iso`. -3. Generate the `.qcow2` image (using a 10G disk size for this example): - -```sh -sudo ansible-playbook qemu.yml -e disk_size=10 \ - -e iso_local=/tmp/vyos.iso -e grub_console=serial -e vyos_version=1.5.0 \ - -e cloud_init=true -e cloud_init_ds=NoCloud -``` - -This generates your new image at `/tmp/vyos-1.5.0-cloud-init-10G-qemu.qcow2`. - -4. Copy the resulting image to the Proxmox server: - -```sh -sudo scp /tmp/vyos-1.5.0-cloud-init-10G-qemu.qcow2 root@192.168.0.253:/tmp/ -``` - -### Prepare cloud-init files - -Create the following files on your Proxmox server to proceed with this setup: - -- `user-data`: Contains VyOS configuration commands. -- `network-config`: Disables the DHCP client on the first interface. -- `meta-data`: An empty file (required by `cloud-init`). - -All files must be placed in the `/tmp/` directory. - -Follow these steps to create the required files: - -1. Navigate to the `/tmp/` directory: - - ```sh - cd /tmp/ - ``` - -2. Create the `user-data` file. Begin the file with `#cloud-config` and - include VyOS configuration commands. - - ```none - #cloud-config - vyos_config_commands: - - set system host-name 'vyos-BRAS' - - set service ntp server '1.pool.ntp.org' - - set service ntp server '2.pool.ntp.org' - - delete interfaces ethernet eth0 address 'dhcp' - - set interfaces ethernet eth0 address '198.51.100.2/30' - - set interfaces ethernet eth0 description 'WAN - ISP01' - - set interfaces ethernet eth1 address '192.168.25.1/24' - - set interfaces ethernet eth1 description 'Coming through VLAN 25' - - set interfaces ethernet eth2 address '192.168.26.1/24' - - set interfaces ethernet eth2 description 'Coming through VLAN 26' - - set protocols static route 0.0.0.0/0 next-hop '198.51.100.1' - ``` - -3. Create the `network-config` file. Include the following: - - ```none - version: 2 - ethernets: - eth0: - dhcp4: false - dhcp6: false - ``` - -4. Create the required empty `meta-data` file. - -### Create seed.iso - -Once you have created the necessary files, generate the `seed.iso` image and -mount it as a CD drive to the new VM. - -```sh -mkisofs -joliet -rock -volid "cidata" -output seed.iso meta-data \ -user-data network-config -``` - -:::{note} -Be careful while copying and pasting the above commands. Double quotes may need -to be corrected. -::: - -### Create the VM - -Note that the following settings apply to this particular example and may -require adjustment for other setups: - -- **VM ID**: `555`. -- **VM and .iso file storage**: The local volume (`directory` type, - mounted at `/var/lib/vz`). -- **VM resources**: Can be modified as needed. - -The `seed.iso` file was previously created in the `/tmp/` directory. Move -it to `/var/lib/vz/template/iso`: - -```sh -mv /tmp/seed.iso /var/lib/vz/template/iso/ -``` - -On the Proxmox server: - -```none -## Create VM, import disk and define boot order -qm create 555 --name vyos-1.5.0-cloudinit --memory 1024 --net0 virtio,bridge=vmbr0 -qm importdisk 555 vyos-1.5.0-cloud-init-10G-qemu.qcow2 local -qm set 555 --virtio0 local:555/vm-555-disk-0.raw -qm set 555 --boot order=virtio0 - -## Import seed.iso for cloud init -qm set 555 --ide2 media=cdrom,file=local:iso/seed.iso - -## Since this server has 1 nic, lets add network intefaces (vlan 25 and 26) -qm set 555 --net1 virtio,bridge=vmbr0,firewall=1,tag=25 -qm set 555 --net2 virtio,bridge=vmbr0,firewall=1,tag=26 -``` - -### Power on and verify the VM - -Power on the VM using the CLI or GUI. After it boots, verify the configuration. - -### References - -- Cloud-init [network-config-docs]. -- Proxmox [Cloud-init-Support]. - -[cloud-init-docs]: https://docs.vyos.io/en/equuleus/automation/cloud-init.html?highlight=cloud-init#vyos-cloud-init -[cloud-init-support]: <https://pve.proxmox.com/pve-docs/pve-admin-guide.html#qm_cloud_init> -[cloud-init-write_files]: https://cloudinit.readthedocs.io/en/latest/topics/examples.html#writing-out-arbitrary-files -[network-config-docs]: https://cloudinit.readthedocs.io/en/latest/topics/network-config.html -[nocloud]: https://cloudinit.readthedocs.io/en/latest/reference/datasources/nocloud.html -[vyos-vm-images]: https://github.com/vyos/vyos-vm-images diff --git a/docs/automation/md-command-scripting.md b/docs/automation/md-command-scripting.md deleted file mode 100644 index c1e1c239..00000000 --- a/docs/automation/md-command-scripting.md +++ /dev/null @@ -1,216 +0,0 @@ ---- -lastproofread: '2026-03-16' ---- - -(command-scripting)= - -# Command scripting - -VyOS supports executing configuration and operational commands non-interactively -from shell scripts. - -To include VyOS-specific functions and aliases, source the -`/opt/vyatta/etc/functions/script-template` file at the beginning of your -script. - -```none -#!/bin/vbash -source /opt/vyatta/etc/functions/script-template -exit -``` - -## Script execute permissions - -Simply placing script files in `/config/scripts/` does not mean the system -can execute them. - -To make your scripts executable, grant them **execute permissions**. Use the -following command: - -```none -chmod +x /config/scripts/script-name.sh -``` - -## Run configuration commands - -In scripts, present configuration commands as in a standard configuration -session. - -For example, to disable a BGP peer during a VRRP transition to the backup -state, use the following syntax: - -```none -#!/bin/vbash -source /opt/vyatta/etc/functions/script-template -configure -set protocols bgp system-as 65536 -set protocols bgp neighbor 192.168.2.1 shutdown -commit -exit -``` - -## Run operational commands - -In scripts, **always** prefix operational commands with `run`. - -```none -#!/bin/vbash -source /opt/vyatta/etc/functions/script-template -run show interfaces -exit -``` - -## Run commands remotely - -You can execute multiple **operational commands** on a remote VyOS system by -passing a script block over SSH. - -```none -ssh 192.0.2.1 'vbash -s' <<EOF -source /opt/vyatta/etc/functions/script-template -run show interfaces -exit -EOF -``` - -Example output: - -```none -Welcome to VyOS -Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down -Interface IP Address S/L Description ---------- ---------- --- ----------- -eth0 192.0.2.1/24 u/u -lo 127.0.0.1/8 u/u - ::1/128 -``` - -## Other script languages - -If you use a scripting language other than bash, configure your script to -output the relevant commands, and then source that output into a bash script. - -The following example demonstrates this two-step process: - -```python -#!/usr/bin/env python3 -print("delete firewall group address-group somehosts") -print("set firewall group address-group somehosts address '192.0.2.3'") -print("set firewall group address-group somehosts address '203.0.113.55'") -``` - -```none -#!/bin/vbash -source /opt/vyatta/etc/functions/script-template -configure -source <(/config/scripts/setfirewallgroup.py) -commit -``` - -## Execute configuration scripts - -In Linux, it is common practice to prefix system commands with `sudo`. - -In VyOS, if you prefix a script that modifies the configuration with `sudo` -(see the code snippet below), subsequent manual configuration changes fail with -the `Set failed` error. Recovery requires a system reboot. - -```none -sudo ./myscript.sh # Modifies config -configure -set ... # Any configuration parameter -``` - -To avoid this issue, run scripts under the `vyattacfg` group using the `sg` -command: - -```none -sg vyattacfg -c ./myscript.sh -``` - -To ensure the script is executed under the `vyattacfg` group, safeguard it as -follows: - -```none -if [ "$(id -g -n)" != 'vyattacfg' ] ; then - exec sg vyattacfg -c "/bin/vbash $(readlink -f $0) $@" -fi -``` - -## Executing pre-hooks/post-hooks scripts - -VyOS allows you to run custom scripts **before** and **after** each commit. - -Place your custom scripts in the following default directories: - -```none -/config/scripts/commit/pre-hooks.d - Directory with scripts that run before - each commit. - -/config/scripts/commit/post-hooks.d - Directory with scripts that run after - each commit. -``` - -Scripts run in alphabetical order. Filenames must consist only of ASCII letters -(upper and lowercase), digits (0-9), underscores (\_), and hyphens (-). No other -characters are allowed. - -:::{note} -Custom scripts are executed **without** root privileges. Prefix -specific commands with `sudo` in your script when required. -::: - -The following example shows the output after executing a post-hook script -that runs the `show interfaces` command: - -```none -vyos@vyos# set interfaces ethernet eth1 address 192.0.2.3/24 -vyos@vyos# commit -Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down -Interface IP Address S/L Description ---------- ---------- --- ----------- -eth0 198.51.100.10/24 u/u -eth1 192.0.2.3/24 u/u -eth2 - u/u -eth3 - u/u -lo 203.0.113.5/24 u/u -``` - -## Preconfig script on boot - -VyOS runs `/config/scripts/vyos-preconfig-bootup.script` at boot, **before** -the system configuration is applied. - -Use this script to apply **pre-configuration** workarounds for unresolved bugs -or enhancements not yet available in VyOS. - -The default script contains the following: - -```none -#!/bin/sh -# This script is executed at boot time before VyOS configuration is applied. -# Any modifications required to work around unfixed bugs or use -# services not available through the VyOS CLI system can be placed here. -``` - -## Postconfig script on boot - -VyOS runs `/config/scripts/vyos-postconfig-bootup.script` at boot, **after** -the system configuration is applied. - -Use this script to apply **post-configuration** workarounds for unresolved bugs -or enhancements not yet available in VyOS. - -The default script contains the following: - -```none -#!/bin/sh -# This script is executed at boot time after VyOS configuration is fully -# applied. Any modifications required to work around unfixed bugs or use -# services not available through the VyOS CLI system can be placed here. -``` - -:::{warning} -For configuration or upgrade management issues, modify this script -only as a last resort. Always try CLI-based solutions first. -::: diff --git a/docs/automation/md-index.md b/docs/automation/md-index.md deleted file mode 100644 index 62e60f84..00000000 --- a/docs/automation/md-index.md +++ /dev/null @@ -1,16 +0,0 @@ -# VyOS Automation - -```{toctree} -:maxdepth: 2 - -vyos-api -vyos-ansible -terraform/index -vyos-napalm -vyos-netmiko -vyos-salt -command-scripting -cloud-init -vyos-pyvyos -vyos-govyos -``` diff --git a/docs/automation/md-vyos-ansible.md b/docs/automation/md-vyos-ansible.md deleted file mode 100644 index 1ced72be..00000000 --- a/docs/automation/md-vyos-ansible.md +++ /dev/null @@ -1,99 +0,0 @@ ---- -lastproofread: '2026-04-13' ---- - -(vyos-ansible)= - -# Ansible - -VyOS can be configured using Ansible. To use it, install the `ansible` -package and the `python3-paramiko` module. - -## Directory structure - -Arrange your Ansible project directory as follows: - -```none -. -├── ansible.cfg -├── files -│ └── id_rsa_docker.pub -├── hosts -└── main.yml -``` - -## File contents - -- `ansible.cfg` - -```none -[defaults] -host_key_checking = no -retry_files_enabled = False -ANSIBLE_INVENTORY_UNPARSED_FAILED = true -``` - -- `id_rsa_docker.pub` - -Contains only the SSH public key. - -```none -AAAAB3NzaC1yc2EAAAADAQABAAABAQCoDgfhQJuJRFWJijHn7ZinZ3NWp4hWVrt7HFcvn0kgtP/5PeCtMt -``` - -- `hosts` - -Defines the target VyOS devices and the connection parameters required to reach -them. - -```none -[vyos_hosts] -r11 ansible_ssh_host=192.0.2.11 - -[vyos_hosts:vars] -ansible_python_interpreter=/usr/bin/python3 -ansible_user=vyos -ansible_ssh_pass=vyos -ansible_network_os=vyos -ansible_connection=network_cli -``` - -- `main.yml` - -Defines the configuration tasks to be applied to the target VyOS devices. - -```none ---- - -- hosts: r11 - - connection: network_cli - gather_facts: 'no' - - tasks: - - name: Configure remote r11 - vyos_config: - lines: - - set system host-name r11 - - set system name-server 203.0.113.254 - - set service ssh disable-host-validation - - set system login user vyos authentication public-keys docker@work type ssh-rsa - - set system login user vyos authentication public-keys docker@work key "{{ lookup('file', 'id_rsa_docker.pub') }}" - - set system time-zone America/Los_Angeles - - set interfaces ethernet eth0 description WAN -``` - -## Run Ansible - -To apply the configuration, use the following command: - -```none -$ ansible-playbook -i hosts main.yml - -PLAY [r11] ************************************************************************************************** - -TASK [Configure remote r11] ********************************************************************************* - -PLAY RECAP ************************************************************************************************** -r11 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 -``` diff --git a/docs/automation/md-vyos-govyos.md b/docs/automation/md-vyos-govyos.md deleted file mode 100644 index f1ad3e91..00000000 --- a/docs/automation/md-vyos-govyos.md +++ /dev/null @@ -1,186 +0,0 @@ ---- -lastproofread: '2026-04-14' ---- - -(vyos-govyos)= - -# Go-VyOS - -Go-VyOS is a Go library for configuring and managing VyOS devices through -their API. - -- [GitHub repository](https://github.com/ganawaj/go-vyos): Hosts the source - code. -- [Documentation](https://pkg.go.dev/github.com/ganawaj/go-vyos@v0.1.0/vyos): - Provides the complete API reference, including available types, functions, and - methods. - -## Installation - -To install Go-VyOS, run: - -```bash -go install "github.com/ganawaj/go-vyos/vyos" -``` - -## Getting started - -### Import and disable TLS verification - -```none -import "github.com/ganawaj/go-vyos/vyos" -client := vyos.NewClient(nil).WithToken("AUTH_KEY").WithURL("https://192.168.0.1").Insecure() -``` - -### Initialize a VyDevice object - -```none -import ( - "github.com/ganawaj/go-vyos/vyos" - "os" -) - -hostname := os.Getenv("VYDEVICE_HOSTNAME") -port := os.Getenv("VYDEVICE_PORT") -url := fmt.Sprintf("https://%s:%s", hostname, port) - -apikey := os.Getenv("VYDEVICE_APIKEY") -verify_ssl := os.Getenv("VYDEVICE_VERIFY_SSL") - -client := vyos.NewClient(nil).WithToken(apikey).WithURL(url) - -if verify_ssl == "false" { - client = client.Insecure() -} -``` - -## Use Go-VyOS - -### Configure, then set - -```none -out, resp, err := c.Conf.Set(ctx, "interfaces ethernet eth0 address 192.168.1.1/24") -if err != nil { - panic(fmt.Sprintf("Error: %v", err)) -} - -fmt.Println(out.Success) -``` - -### Show a single object value - -```none -out, resp, err := c.Show.Do(ctx, "interfaces dummy dum1 address") -if err != nil { - panic("Error: %v", err) -} - -fmt.Println(out.Success) -fmt.Printf("Data: %v\n", out.Data) -``` - -### Configure, then show object - -```none -out, resp, err := c.Conf.Get(ctx, "interfaces dummy dum1", nil) -if err != nil { - panic("Error: %v", err) -} - -fmt.Println(out.Success) -fmt.Printf("Data: %v\n", out.Data) -``` - -### Configure, then show multivalue object - -```none -options := RetrieveOptions{ - Multivalue: true, -} - -out, resp, err := c.Conf.Get(ctx, "interfaces dummy dum1", options) -if err != nil { - panic("Error: %v", err) -} - -fmt.Println(out.Success) -``` - -### Configure, then delete object - -```none -out, resp, err := c.Conf.Delete(ctx, "interfaces dummy dum1") -if err != nil { - panic("Error: %v", err) -} - -fmt.Println(out.Success) -``` - -### Configure, then save - -```none -out, resp, err := c.Conf.Save(ctx, "") - -if err != nil { - panic("Error: %v", err) -} - -fmt.Println(out.Success) -``` - -### Configure, then save file - -```none -out, resp, err := c.Conf.Save(ctx, "/config/test300.config") - -if err != nil { - panic("Error: %v", err) -} - -fmt.Println(out.Success) -``` - -### Show object - -```none -out, resp, err := c.Show.Do(ctx, "system image") -if err != nil { - panic("Error: %v", err) -} - -fmt.Println(out.Success) -fmt.Printf("Data: %v\n", out.Data) -``` - -### Generate object - -```none -out, resp, err := c.Generate.Do(ctx, "pki wireguard key-pair") -if err != nil { - panic("Error: %v", err) -} - -fmt.Println(out.Success) -fmt.Printf("Data: %v\n", out.Data) -``` - -### Reset object - -```none -out, resp, err := c.Reset.Do(ctx, "ip bgp 192.0.2.11") -if err != nil { - panic("Error: %v", err) -} - -fmt.Println(out.Success) -fmt.Printf("Data: %v\n", out.Data) -``` - -### Configure, then load file - -```none -out, resp, err := c.ConfigFile.Load(ctx, "/config/test300.config") -``` - -[go-vyos]: https://github.com/ganawaj/go-vyos diff --git a/docs/automation/md-vyos-napalm.md b/docs/automation/md-vyos-napalm.md deleted file mode 100644 index 87567593..00000000 --- a/docs/automation/md-vyos-napalm.md +++ /dev/null @@ -1,152 +0,0 @@ ---- -lastproofread: '2026-04-13' ---- - -(vyos-napalm)= - -# NAPALM VyOS driver - -VyOS can be configured using the [NAPALM VyOS driver], which enables you to -retrieve device data and apply configurations via SSH. - -:::{note} -The `napalm-vyos` module is currently in testing. -::: - -To use the NAPALM VyOS driver, install the following packages: - -```none -apt install python3-pip -pip3 install napalm -pip3 install napalm-vyos -``` - -## Retrieve device data - -The following script connects to a VyOS device, retrieves device facts and -the ARP table, and prints the output in JSON format. - -```none -#!/usr/bin/env python3 - -import json -from napalm import get_network_driver - -driver = get_network_driver('vyos') - -vyos_router = driver( - hostname="192.0.2.1", - username="vyos", - password="vyospass", - optional_args={"port": 22}, -) - -vyos_router.open() -output = vyos_router.get_facts() -print(json.dumps(output, indent=4)) - -output = vyos_router.get_arp_table() -print(json.dumps(output, indent=4)) - -vyos_router.close() -``` - -Output: - -```none -$ ./vyos-napalm.py -{ - "uptime": 7185, - "vendor": "VyOS", - "os_version": "1.3.0-rc5", - "serial_number": "", - "model": "Standard PC (Q35 + ICH9, 2009)", - "hostname": "r4-1.3", - "fqdn": "vyos.local", - "interface_list": [ - "eth0", - "eth1", - "eth2", - "lo", - "vtun10" - ] -} -[ - { - "interface": "eth1", - "mac": "52:54:00:b2:38:2c", - "ip": "192.0.2.2", - "age": 0.0 - }, - { - "interface": "eth0", - "mac": "52:54:00:a2:b9:5b", - "ip": "203.0.113.11", - "age": 0.0 - } -] -``` - -## Apply a configuration - -To apply a configuration using NAPALM VyOS driver, you will need a file with -configuration commands (`commands.conf`) and a script that executes and -commits them (`vyos-napalm.py`). - -- `commands.conf` - -```none -set service ssh disable-host-validation -set service ssh port '2222' -set system name-server '192.0.2.8' -set system name-server '203.0.113.8' -set interfaces ethernet eth1 description 'FOO' -``` - -- `vyos-napalm.py` - -```none -#!/usr/bin/env python3 - -from napalm import get_network_driver - -driver = get_network_driver('vyos') - -vyos_router = driver( - hostname="192.0.2.1", - username="vyos", - password="vyospass", - optional_args={"port": 22}, -) - -vyos_router.open() -vyos_router.load_merge_candidate(filename='commands.conf') -diffs = vyos_router.compare_config() - -if bool(diffs) == True: - print(diffs) - vyos_router.commit_config() -else: - print('No configuration changes to commit') - vyos_router.discard_config() - -vyos_router.close() -``` - -Output: - -```none -$./vyos-napalm.py -[edit interfaces ethernet eth1] -+description FOO -[edit service ssh] -+disable-host-validation -+port 2222 -[edit system] -+name-server 192.0.2.8 -+name-server 203.0.113.8 -[edit] -``` - -[napalm]: https://napalm.readthedocs.io/en/latest/base.html -[NAPALM VyOS driver]: https://github.com/napalm-automation-community/napalm-vyos diff --git a/docs/automation/md-vyos-netmiko.md b/docs/automation/md-vyos-netmiko.md deleted file mode 100644 index 2e947b6a..00000000 --- a/docs/automation/md-vyos-netmiko.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -lastproofread: '2026-04-13' ---- - -(vyos-netmiko)= - -# Netmiko - -VyOS can be configured using [Netmiko]. To use Netmiko, install the -`python3-netmiko` module. - -## Example - -The following script connects to a VyOS device, applies configuration changes, -commits them, and runs an operational mode command to verify the updated -configuration. - -```none -#!/usr/bin/env python3 - -from netmiko import ConnectHandler - -vyos_router = { - "device_type": "vyos", - "host": "192.0.2.1", - "username": "vyos", - "password": "vyospass", - "port": 22, - } - -net_connect = ConnectHandler(**vyos_router) - -config_commands = [ - 'set interfaces ethernet eth0 description WAN', - 'set interfaces ethernet eth1 description LAN', - ] - -# set configuration -output = net_connect.send_config_set(config_commands, exit_config_mode=False) -print(output) - -# commit configuration -output = net_connect.commit() -print(output) - -# operational mode commands -output = net_connect.send_command("run show interfaces") -print(output) -``` - -Output - -```none -$ ./vyos-netmiko.py -configure -set interfaces ethernet eth0 description WAN -[edit] -vyos@r4-1.5# set interfaces ethernet eth1 description LAN -[edit] -vyos@r4-1.5# -commit -[edit] -vyos@r4-1.5# -Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down -Interface IP Address S/L Description ---------- ---------- --- ----------- -eth0 203.0.113.1/24 u/u WAN -eth1 192.0.2.1/30 u/u LAN -eth2 - u/u -lo 127.0.0.1/8 u/u - ::1/128 -vtun10 10.10.0.1/24 u/u -[edit] -``` - -[netmiko]: https://github.com/ktbyers/netmiko diff --git a/docs/automation/md-vyos-pyvyos.md b/docs/automation/md-vyos-pyvyos.md deleted file mode 100644 index 2a9599d7..00000000 --- a/docs/automation/md-vyos-pyvyos.md +++ /dev/null @@ -1,138 +0,0 @@ ---- -lastproofread: '2026-04-14' ---- - -(vyos-pyvyos)= - -# PyVyOS - -PyVyOS is a Python library for configuring and managing VyOS devices through -their API. - -**Key resources:** - -- [Documentation](https://pyvyos.readthedocs.io/en/latest/): Provides - installation, configuration, and usage instructions. -- [GitHub repository](https://github.com/robertoberto/pyvyos): Hosts the - source code. -- [PyPI](https://pypi.org/project/pyvyos/): Hosts distribution packages for - installation via the Python package installer (`pip`). - -## Installation - -To install PyVyOS via `pip`, run: - -```bash -pip install pyvyos -``` - -## Getting started - -### Import and disable warnings for verify=false - -```none -import urllib3 -urllib3.disable_warnings() -``` - -### Use API response class - -```none -@dataclass -class ApiResponse: - status: int - request: dict - result: dict - error: str -``` - -### Initialize a VyDevice object - -```none -from dotenv import load_dotenv -load_dotenv() - -hostname = os.getenv('VYDEVICE_HOSTNAME') -apikey = os.getenv('VYDEVICE_APIKEY') -port = os.getenv('VYDEVICE_PORT') -protocol = os.getenv('VYDEVICE_PROTOCOL') -verify_ssl = os.getenv('VYDEVICE_VERIFY_SSL') - -verify = verify_ssl.lower() == "true" if verify_ssl else True - -device = VyDevice(hostname=hostname, apikey=apikey, port=port, protocol=protocol, verify=verify) -``` - -## Use PyVyOS - -### Configure, then set - -```none -response = device.configure_set(path=["interfaces", "ethernet", "eth0", "address", "192.168.1.1/24"]) -if not response.error: - print(response.result) -``` - -### Configure, then show a single object value - -```none -response = device.retrieve_return_values(path=["interfaces", "dummy", "dum1", "address"]) -print(response.result) -``` - -### Configure, then show object - -```none -response = device.retrieve_show_config(path=[]) -if not response.error: - print(response.result) -``` - -### Configure, then delete object - -```none -response = device.configure_delete(path=["interfaces", "dummy", "dum1"]) -``` - -### Configure, then save - -```none -response = device.config_file_save() -``` - -### Configure, then save file - -```none -response = device.config_file_save(file="/config/test300.config") -``` - -### Show object - -```none -response = device.show(path=["system", "image"]) -print(response.result) -``` - -### Generate object - -```none -randstring = ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(20)) -keyrand = f'/tmp/key_{randstring}' -response = device.generate(path=["ssh", "client-key", keyrand]) -``` - -### Reset object - -```none -response = device.reset(path=["conntrack-sync", "internal-cache"]) -if not response.error: - print(response.result) -``` - -### Configure, then load file - -```none -response = device.config_file_load(file="/config/test300.config") -``` - -[pyvyos]: https://github.com/robertoberto/pyvyos diff --git a/docs/automation/terraform/md-index.md b/docs/automation/terraform/md-index.md deleted file mode 100644 index 9f741c35..00000000 --- a/docs/automation/terraform/md-index.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -lastproofread: '2026-03-23' ---- - -# VyOS Terraform - -VyOS supports development infrastructure via Terraform and provisioning -via Ansible. -Terraform allows you to automate the deployment of instances on a number of -cloud and virtual platforms. This section shows how to deploy VyOS on -multiple platforms: AWS, Microsoft Azure, Google Cloud Platform (GCP), -and VMware vSphere. -For more information, see the -official documentation for [Terraform] and [Ansible]. - -```{toctree} -:caption: Guides -:maxdepth: 1 - -terraformAWS -terraformAZ -terraformGoogle -terraformvSphere -``` - -[ansible]: https://docs.ansible.com -[install]: https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli -[terraform]: https://developer.hashicorp.com/terraform/intro diff --git a/docs/configexamples/md-ansible.md b/docs/configexamples/md-ansible.md deleted file mode 100644 index 3f984812..00000000 --- a/docs/configexamples/md-ansible.md +++ /dev/null @@ -1,203 +0,0 @@ ---- -lastproofread: '2024-04-09' ---- - -(examples-ansible)= - -# Ansible example - -## Setting up Ansible on a server running the Debian operating system. - -In this example, we will set up a simple use of Ansible to configure -multiple VyOS routers. -We have four pre-configured routers with this configuration: - -Using the general schema for example: - -```{image} /_static/images/ansible.png -:align: center -:alt: Network Topology Diagram -:width: 80% -``` - -We have four pre-configured routers with this configuration: - -```none -set interfaces ethernet eth0 address dhcp -set service ssh -commit -save -``` - -- vyos7 - 192.0.2.105 -- vyos8 - 192.0.2.106 -- vyos9 - 192.0.2.107 -- vyos10 - 192.0.2.108 - -## Install Ansible: - -```none -# apt-get install ansible -Do you want to continue? [Y/n] y -``` - -## Install Paramiko: - -```none -#apt-get install -y python3-paramiko -``` - -## Check the version: - -```none -# ansible --version -ansible 2.10.8 -config file = None -configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] -ansible python module location = /usr/lib/python3/dist-packages/ansible -executable location = /usr/bin/ansible -python version = 3.9.2 (default, Feb 28 2021, 17:03:44) [GCC 10.2.1 20210110] -``` - -## Basic configuration of ansible.cfg: - -```none -# nano /root/ansible.cfg -[defaults] -host_key_checking = no -``` - -## Add all the VyOS hosts: - -```none -# nano /root/hosts -[vyos_hosts] -vyos7 ansible_ssh_host=192.0.2.105 -vyos8 ansible_ssh_host=192.0.2.106 -vyos9 ansible_ssh_host=192.0.2.107 -vyos10 ansible_ssh_host=192.0.2.108 -``` - -## Add general variables: - -```none -# mkdir /root/group_vars/ -# nano /root/group_vars/vyos_hosts -ansible_python_interpreter: /usr/bin/python3 -ansible_network_os: vyos -ansible_connection: network_cli -ansible_user: vyos -ansible_ssh_pass: vyos -``` - -## Add a simple playbook with the tasks for each router: - -```none -# nano /root/main.yml - ---- -- hosts: vyos_hosts - gather_facts: 'no' - tasks: - - name: Configure general settings for the vyos hosts group - vyos_config: - lines: - - set system name-server 192.0.2.1 - - set interfaces ethernet eth0 description '#WAN#' - - set interfaces ethernet eth1 description '#LAN#' - - set interfaces ethernet eth2 disable - - set interfaces ethernet eth3 disable - - set system host-name {{ inventory_hostname }} - save: true -``` - -## Start the playbook: - -```none -ansible-playbook -i hosts main.yml -PLAY [vyos_hosts] ************************************************************** - -TASK [Configure general settings for the vyos hosts group] ********************* -ok: [vyos9] -ok: [vyos10] -ok: [vyos7] -ok: [vyos8] - -PLAY RECAP ********************************************************************* -vyos10 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 -vyos7 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 -vyos8 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 -vyos9 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 -``` - -## Check the result on the vyos10 router: - -```none -vyos@vyos10:~$ show interfaces -Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down -Interface IP Address S/L Description ---------- ---------- --- ----------- -eth0 192.0.2.108/24 u/u WAN -eth1 - u/u LAN -eth2 - A/D -eth3 - A/D -lo 127.0.0.1/8 u/u - ::1/128 - -vyos@vyos10:~$ sh configuration commands | grep 192.0.2.1 -set system name-server '192.0.2.1' -``` - -## The simple way without configuration of the hostname (one task for all routers): - -```none -# nano /root/hosts_v2 -[vyos_hosts_group] -vyos7 ansible_ssh_host=192.0.2.105 -vyos8 ansible_ssh_host=192.0.2.106 -vyos9 ansible_ssh_host=192.0.2.107 -vyos10 ansible_ssh_host=192.0.2.108 -[vyos_hosts_group:vars] -ansible_python_interpreter=/usr/bin/python3 -ansible_user=vyos -ansible_ssh_pass=vyos -ansible_network_os=vyos -ansible_connection=network_cli - -# nano /root/main_v2.yml ---- -- hosts: vyos_hosts_group - connection: network_cli - gather_facts: 'no' - tasks: - - name: Configure remote vyos_hosts_group - vyos_config: - lines: - - set system name-server 192.0.2.1 - - set interfaces ethernet eth0 description WAN - - set interfaces ethernet eth1 description LAN - - set interfaces ethernet eth2 disable - - set interfaces ethernet eth3 disable - save: true -``` - -```none -# ansible-playbook -i hosts_v2 main_v2.yml - -PLAY [vyos_hosts_group] ******************************************************** - -TASK [Configure remote vyos_hosts_group] *************************************** -ok: [vyos8] -ok: [vyos7] -ok: [vyos9] -ok: [vyos10] - -PLAY RECAP ********************************************************************* -vyos10 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 -vyos7 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 -vyos8 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 -vyos9 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 -``` - -In the next chapter of the example, we'll use Ansible with jinja2 -templates and variables. diff --git a/docs/configexamples/md-bgp-ipv6-unnumbered.md b/docs/configexamples/md-bgp-ipv6-unnumbered.md deleted file mode 100644 index 36d8cf39..00000000 --- a/docs/configexamples/md-bgp-ipv6-unnumbered.md +++ /dev/null @@ -1,173 +0,0 @@ ---- -lastproofread: '2021-06-28' ---- - -(examples-bgp-ipv6-unnumbered)= - -# BGP IPv6 unnumbered with extended nexthop - -General information can be found in the {ref}`routing-bgp` chapter. - -## Configuration - -- Router A: - -```none -set protocols bgp system-as 64496 -set protocols bgp address-family ipv4-unicast redistribute connected -set protocols bgp address-family ipv6-unicast redistribute connected -set protocols bgp neighbor eth1 interface v6only -set protocols bgp neighbor eth1 interface v6only peer-group 'fabric' -set protocols bgp neighbor eth2 interface v6only -set protocols bgp neighbor eth2 interface v6only peer-group 'fabric' -set protocols bgp parameters bestpath as-path multipath-relax -set protocols bgp parameters bestpath compare-routerid -set protocols bgp parameters default no-ipv4-unicast -set protocols bgp parameters router-id '192.168.0.1' -set protocols bgp peer-group fabric address-family ipv4-unicast -set protocols bgp peer-group fabric address-family ipv6-unicast -set protocols bgp peer-group fabric capability extended-nexthop -set protocols bgp peer-group fabric remote-as 'external' -``` - -- Router B: - -```none -set protocols bgp system-as 64499 -set protocols bgp address-family ipv4-unicast redistribute connected -set protocols bgp address-family ipv6-unicast redistribute connected -set protocols bgp neighbor eth1 interface v6only -set protocols bgp neighbor eth1 interface v6only peer-group 'fabric' -set protocols bgp neighbor eth2 interface v6only -set protocols bgp neighbor eth2 interface v6only peer-group 'fabric' -set protocols bgp parameters bestpath as-path multipath-relax -set protocols bgp parameters bestpath compare-routerid -set protocols bgp parameters default no-ipv4-unicast -set protocols bgp parameters router-id '192.168.0.2' -set protocols bgp peer-group fabric address-family ipv4-unicast -set protocols bgp peer-group fabric address-family ipv6-unicast -set protocols bgp peer-group fabric capability extended-nexthop -set protocols bgp peer-group fabric remote-as 'external' -``` - -## Results - -- Router A: - -```none -vyos@vyos:~$ show interfaces -Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down -Interface IP Address S/L Description ---------- ---------- --- ----------- -eth0 198.51.100.34/24 u/u -eth1 - u/u -eth2 - u/u -lo 127.0.0.1/8 u/u - 192.168.0.1/32 - ::1/128 -``` - -```none -vyos@vyos:~$ show ip route -Codes: K - kernel route, C - connected, S - static, R - RIP, - O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, - T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, - F - PBR, f - OpenFabric, - > - selected route, * - FIB route - -S>* 0.0.0.0/0 [210/0] via 198.51.100.34, eth0, 03:21:53 -C>* 198.51.100.0/24 is directly connected, eth0, 03:21:53 -C>* 192.168.0.1/32 is directly connected, lo, 03:21:56 -B>* 192.168.0.2/32 [20/0] via fe80::a00:27ff:fe3b:7ed2, eth2, 00:05:07 - * via fe80::a00:27ff:fe7b:4000, eth1, 00:05:07 -``` - -```none -vyos@vyos:~$ ping 192.168.0.2 -PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data. -64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.575 ms -64 bytes from 192.168.0.2: icmp_seq=2 ttl=64 time=0.628 ms -64 bytes from 192.168.0.2: icmp_seq=3 ttl=64 time=0.581 ms -64 bytes from 192.168.0.2: icmp_seq=4 ttl=64 time=0.682 ms -64 bytes from 192.168.0.2: icmp_seq=5 ttl=64 time=0.597 ms - ---- 192.168.0.2 ping statistics --- -5 packets transmitted, 5 received, 0% packet loss, time 4086ms -rtt min/avg/max/mdev = 0.575/0.612/0.682/0.047 ms -``` - -```none -vyos@vyos:~$ show ip bgp summary - -IPv4 Unicast Summary: -BGP router identifier 192.168.0.1, local AS number 65020 vrf-id 0 -BGP table version 4 -RIB entries 5, using 800 bytes of memory -Peers 2, using 41 KiB of memory -Peer groups 1, using 64 bytes of memory - -Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd -eth1 4 64499 13 13 0 0 0 00:05:33 2 -eth2 4 64499 13 14 0 0 0 00:05:29 2 - -Total number of neighbors 2 -``` - -- Router B: - -```none -vyos@vyos:~$ show interfaces -Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down -Interface IP Address S/L Description ---------- ---------- --- ----------- -eth0 198.51.100.33/24 u/u -eth1 - u/u -eth2 - u/u -lo 127.0.0.1/8 u/u - 192.168.0.2/32 - ::1/128 -``` - -```none -vyos@vyos:~$ show ip route -Codes: K - kernel route, C - connected, S - static, R - RIP, - O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, - T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, - F - PBR, f - OpenFabric, - > - selected route, * - FIB route - -S>* 0.0.0.0/0 [210/0] via 198.51.100.33, eth0, 00:44:08 -C>* 198.51.100.0/24 is directly connected, eth0, 00:44:09 -B>* 192.168.0.1/32 [20/0] via fe80::a00:27ff:fe2d:205d, eth1, 00:06:18 - * via fe80::a00:27ff:fe93:e142, eth2, 00:06:18 -C>* 192.168.0.2/32 is directly connected, lo, 00:44:11 -``` - -```none -vyos@vyos:~$ ping 192.168.0.1 -PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data. -64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=0.427 ms -64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=0.471 ms -64 bytes from 192.168.0.1: icmp_seq=3 ttl=64 time=0.782 ms -64 bytes from 192.168.0.1: icmp_seq=4 ttl=64 time=0.715 ms - ---- 192.168.0.1 ping statistics --- -4 packets transmitted, 4 received, 0% packet loss, time 3051ms -rtt min/avg/max/mdev = 0.427/0.598/0.782/0.155 ms -``` - -```none -vyos@vyos:~$ show ip bgp summary -IPv4 Unicast Summary: -BGP router identifier 192.168.0.2, local AS number 65021 vrf-id 0 -BGP table version 4 -RIB entries 5, using 800 bytes of memory -Peers 2, using 41 KiB of memory -Peer groups 1, using 64 bytes of memory - -Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd -eth1 4 64496 14 14 0 0 0 00:06:40 2 -eth2 4 64496 14 14 0 0 0 00:06:37 2 - -Total number of neighbors 2 -``` diff --git a/docs/configexamples/md-dmvpn-dualhub-dualcloud.md b/docs/configexamples/md-dmvpn-dualhub-dualcloud.md deleted file mode 100644 index 8f5639b1..00000000 --- a/docs/configexamples/md-dmvpn-dualhub-dualcloud.md +++ /dev/null @@ -1,523 +0,0 @@ ---- -lastproofread: '2024-02-21' ---- - -(examples-dmvpn-dualhub-dualcloud)= - -# DMVPN Dual HUB Dual Cloud - -This document is to describe a basic setup to build DVMPN network with two Hubs and two clouds using DMVPN Phase3. -OSPF is used as routing protocol inside DMVPN. - -In this example we use VyOS 1.5 as HUBs and Spokes (HUB-1, HUB-2, SPOKE-2, SPOKE-3) and Cisco IOSv 15.5(3)M (SPOKE-1) -as a Spoke. - -## Network Topology - -```{image} /_static/images/dual-hub-DMVPN.png -:align: center -:alt: DMVPN Network Topology -:width: 80% -``` - -## Configurations - -### Underlay configuration -Networks 192.168.X.0/24 are used as LANs for every spoke. - -HUB-1 - -```none -set interfaces ethernet eth0 address '10.0.0.2/30' -set protocols static route 0.0.0.0/0 next-hop 10.0.0.1 -``` - -HUB-2 - -```none -set interfaces ethernet eth0 address '10.0.1.2/30' -set protocols static route 0.0.0.0/0 next-hop 10.0.1.1 -``` - -Spoke-1 - -```none -interface GigabitEthernet0/0 - ip address 10.0.11.2 255.255.255.252 - duplex auto - speed auto - media-type rj45 -! -interface GigabitEthernet0/1 - ip address 192.168.11.1 255.255.255.0 - ip ospf 1 area 0 - duplex auto - speed auto - media-type rj45 -! -ip route 0.0.0.0 0.0.0.0 10.0.11.1 -``` - -Spoke-2 - -```none -set interfaces ethernet eth0 address '10.0.12.2/30' -set interfaces ethernet eth1 address '192.168.12.1/24' -set protocols static route 0.0.0.0/0 next-hop 10.0.12.1 -``` - -Spoke-3 - -```none -set interfaces ethernet eth0 address '10.0.13.2/30' -set interfaces ethernet eth1 address '192.168.13.1/24' -set protocols static route 0.0.0.0/0 next-hop 10.0.13.1 -``` - -### NHRP configuration -The next step is to configure the NHRP protocol. In a Dual cloud network, every HUB has to be configured with one GRE -multipoint tunnel interface and every spoke has to be configured with two tunnel interfaces, one tunnel to each hub. -In this example tunnel networks are 10.100.100.0/24 for the first cloud and 10.100.101.0/24 for the second cloud. -But VyOS uses FRR for NHRP, that is why the tunnel address mask must be /32. - -HUB-1 - -```none -set interfaces tunnel tun100 address '10.100.100.1/32' -set interfaces tunnel tun100 enable-multicast -set interfaces tunnel tun100 encapsulation 'gre' -set interfaces tunnel tun100 ip adjust-mss '1360' -set interfaces tunnel tun100 mtu '1436' -set interfaces tunnel tun100 parameters ip key '42' -set interfaces tunnel tun100 source-interface 'eth0' -set protocols nhrp tunnel tun100 authentication 'vyos' -set protocols nhrp tunnel tun100 holdtime '300' -set protocols nhrp tunnel tun100 multicast 'dynamic' -set protocols nhrp tunnel tun100 network-id '1' -set protocols nhrp tunnel tun100 redirect -set protocols nhrp tunnel tun100 registration-no-unique -``` - -HUB-2 - -```none -set interfaces tunnel tun101 address '10.100.101.1/32' -set interfaces tunnel tun101 enable-multicast -set interfaces tunnel tun101 encapsulation 'gre' -set interfaces tunnel tun101 ip adjust-mss '1360' -set interfaces tunnel tun101 mtu '1436' -set interfaces tunnel tun101 parameters ip key '43' -set interfaces tunnel tun101 source-interface 'eth0' -set protocols nhrp tunnel tun101 authentication 'vyos' -set protocols nhrp tunnel tun101 holdtime '300' -set protocols nhrp tunnel tun101 multicast 'dynamic' -set protocols nhrp tunnel tun101 network-id '2' -set protocols nhrp tunnel tun101 redirect -set protocols nhrp tunnel tun101 registration-no-unique -``` - -Spoke-1 - -```none -interface Tunnel100 - ip address 10.100.100.11 255.255.255.0 - no ip redirects - ip mtu 1436 - ip nhrp authentication vyos - ip nhrp map multicast 10.0.0.2 - ip nhrp network-id 1 - ip nhrp holdtime 300 - ip nhrp nhs 10.100.100.1 nbma 10.0.0.2 - ip nhrp shortcut - ip tcp adjust-mss 1360 - tunnel source GigabitEthernet0/0 - tunnel mode gre multipoint - tunnel key 42 -! -interface Tunnel101 - ip address 10.100.101.11 255.255.255.0 - no ip redirects - ip mtu 1436 - ip nhrp authentication vyos - ip nhrp map multicast 10.0.1.2 - ip nhrp network-id 2 - ip nhrp holdtime 300 - ip nhrp nhs 10.100.101.1 nbma 10.0.1.2 - ip nhrp shortcut - ip tcp adjust-mss 1360 - tunnel source GigabitEthernet0/0 - tunnel mode gre multipoint - tunnel key 43 -``` - -Spoke-2 - -```none -set interfaces tunnel tun100 address '10.100.100.12/32' -set interfaces tunnel tun100 enable-multicast -set interfaces tunnel tun100 encapsulation 'gre' -set interfaces tunnel tun100 ip adjust-mss '1360' -set interfaces tunnel tun100 mtu '1436' -set interfaces tunnel tun100 parameters ip key '42' -set interfaces tunnel tun100 source-interface 'eth0' -set interfaces tunnel tun101 address '10.100.101.12/32' -set interfaces tunnel tun101 enable-multicast -set interfaces tunnel tun101 encapsulation 'gre' -set interfaces tunnel tun101 ip adjust-mss '1360' -set interfaces tunnel tun101 mtu '1436' -set interfaces tunnel tun101 parameters ip key '43' -set interfaces tunnel tun101 source-interface 'eth0' -set protocols nhrp tunnel tun100 authentication 'vyos' -set protocols nhrp tunnel tun100 holdtime '300' -set protocols nhrp tunnel tun100 multicast '10.0.0.2' -set protocols nhrp tunnel tun100 network-id '1' -set protocols nhrp tunnel tun100 nhs tunnel-ip dynamic nbma '10.0.0.2' -set protocols nhrp tunnel tun100 registration-no-unique -set protocols nhrp tunnel tun100 shortcut -set protocols nhrp tunnel tun101 authentication 'vyos' -set protocols nhrp tunnel tun101 holdtime '300' -set protocols nhrp tunnel tun101 multicast '10.0.1.2' -set protocols nhrp tunnel tun101 network-id '2' -set protocols nhrp tunnel tun101 nhs tunnel-ip dynamic nbma '10.0.1.2' -set protocols nhrp tunnel tun101 registration-no-unique -set protocols nhrp tunnel tun101 shortcut -``` - -Spoke-3 - -```none -set protocols nhrp tunnel tun100 authentication 'vyos' -set protocols nhrp tunnel tun100 holdtime '300' -set protocols nhrp tunnel tun100 multicast '10.0.0.2' -set protocols nhrp tunnel tun100 network-id '1' -set protocols nhrp tunnel tun100 nhs tunnel-ip dynamic nbma '10.0.0.2' -set protocols nhrp tunnel tun100 registration-no-unique -set protocols nhrp tunnel tun100 shortcut -set protocols nhrp tunnel tun101 authentication 'vyos' -set protocols nhrp tunnel tun101 holdtime '300' -set protocols nhrp tunnel tun101 multicast '10.0.1.2' -set protocols nhrp tunnel tun101 network-id '2' -set protocols nhrp tunnel tun101 nhs tunnel-ip dynamic nbma '10.0.1.2' -set protocols nhrp tunnel tun101 registration-no-unique -set protocols nhrp tunnel tun101 shortcut -``` - -### Overlay configuration -The last step is to configure the routing protocol. In this scenario, OSPF was chosen as the dynamic routing protocol. -But you can use iBGP or eBGP. To form fast convergence it is possible to use BFD protocol. - -HUB-1 - -```none -set protocols ospf interface tun100 area '0' -set protocols ospf interface tun100 network 'point-to-multipoint' -set protocols ospf interface tun100 passive disable -set protocols ospf passive-interface 'default' -``` - -HUB-2 - -```none -set protocols ospf interface tun101 area '0' -set protocols ospf interface tun101 network 'point-to-multipoint' -set protocols ospf interface tun101 passive disable -set protocols ospf passive-interface 'default' -``` - -Spoke-1 - -```none -interface Tunnel100 - ip ospf network point-to-multipoint - ip ospf dead-interval 40 - ip ospf hello-interval 10 - ip ospf 1 area 0 -! -interface Tunnel101 - ip ospf network point-to-multipoint - ip ospf dead-interval 40 - ip ospf hello-interval 10 - ip ospf 1 area 0 -! -router ospf 1 - passive-interface default - no passive-interface Tunnel100 - no passive-interface Tunnel101 -``` - -Spoke-2 - -```none -set protocols ospf interface eth1 area '0' -set protocols ospf interface tun100 area '0' -set protocols ospf interface tun100 network 'point-to-multipoint' -set protocols ospf interface tun100 passive disable -set protocols ospf interface tun101 area '0' -set protocols ospf interface tun101 network 'point-to-multipoint' -set protocols ospf interface tun101 passive disable -set protocols ospf passive-interface 'default' -``` - -Spoke-3 - -```none -set protocols ospf interface eth1 area '0' -set protocols ospf interface tun100 area '0' -set protocols ospf interface tun100 network 'point-to-multipoint' -set protocols ospf interface tun100 passive disable -set protocols ospf interface tun101 area '0' -set protocols ospf interface tun101 network 'point-to-multipoint' -set protocols ospf interface tun101 passive disable -set protocols ospf passive-interface 'default' -``` - -### Security configuration -Tunnels can be encrypted by IPSEC for security. - -HUB-1 - -```none -set vpn ipsec esp-group ESP-HUB lifetime '1800' -set vpn ipsec esp-group ESP-HUB mode 'transport' -set vpn ipsec esp-group ESP-HUB pfs 'disable' -set vpn ipsec esp-group ESP-HUB proposal 1 encryption 'aes256' -set vpn ipsec esp-group ESP-HUB proposal 1 hash 'sha1' -set vpn ipsec ike-group IKE-HUB key-exchange 'ikev1' -set vpn ipsec ike-group IKE-HUB lifetime '3600' -set vpn ipsec ike-group IKE-HUB proposal 1 dh-group '2' -set vpn ipsec ike-group IKE-HUB proposal 1 encryption 'aes256' -set vpn ipsec ike-group IKE-HUB proposal 1 hash 'sha1' -set vpn ipsec interface 'eth0' -set vpn ipsec profile NHRPVPN authentication mode 'pre-shared-secret' -set vpn ipsec profile NHRPVPN authentication pre-shared-secret 'secret' -set vpn ipsec profile NHRPVPN bind tunnel 'tun100' -set vpn ipsec profile NHRPVPN esp-group 'ESP-HUB' -set vpn ipsec profile NHRPVPN ike-group 'IKE-HUB' -``` - -HUB-2 - -```none -set vpn ipsec esp-group ESP-HUB lifetime '1800' -set vpn ipsec esp-group ESP-HUB mode 'transport' -set vpn ipsec esp-group ESP-HUB pfs 'disable' -set vpn ipsec esp-group ESP-HUB proposal 1 encryption 'aes256' -set vpn ipsec esp-group ESP-HUB proposal 1 hash 'sha1' -set vpn ipsec ike-group IKE-HUB key-exchange 'ikev1' -set vpn ipsec ike-group IKE-HUB lifetime '3600' -set vpn ipsec ike-group IKE-HUB proposal 1 dh-group '2' -set vpn ipsec ike-group IKE-HUB proposal 1 encryption 'aes256' -set vpn ipsec ike-group IKE-HUB proposal 1 hash 'sha1' -set vpn ipsec interface 'eth0' -set vpn ipsec profile NHRPVPN authentication mode 'pre-shared-secret' -set vpn ipsec profile NHRPVPN authentication pre-shared-secret 'secret' -set vpn ipsec profile NHRPVPN bind tunnel 'tun101' -set vpn ipsec profile NHRPVPN esp-group 'ESP-HUB' -set vpn ipsec profile NHRPVPN ike-group 'IKE-HUB' -``` - -VyOS Spokes have the same configuration - -```none -set vpn ipsec esp-group ESP-HUB lifetime '1800' -set vpn ipsec esp-group ESP-HUB mode 'transport' -set vpn ipsec esp-group ESP-HUB pfs 'disable' -set vpn ipsec esp-group ESP-HUB proposal 1 encryption 'aes256' -set vpn ipsec esp-group ESP-HUB proposal 1 hash 'sha1' -set vpn ipsec ike-group IKE-HUB key-exchange 'ikev1' -set vpn ipsec ike-group IKE-HUB lifetime '3600' -set vpn ipsec ike-group IKE-HUB proposal 1 dh-group '2' -set vpn ipsec ike-group IKE-HUB proposal 1 encryption 'aes256' -set vpn ipsec ike-group IKE-HUB proposal 1 hash 'sha1' -set vpn ipsec interface 'eth0' -set vpn ipsec profile NHRPVPN authentication mode 'pre-shared-secret' -set vpn ipsec profile NHRPVPN authentication pre-shared-secret 'secret' -set vpn ipsec profile NHRPVPN bind tunnel 'tun100' -set vpn ipsec profile NHRPVPN bind tunnel 'tun101' -set vpn ipsec profile NHRPVPN esp-group 'ESP-HUB' -set vpn ipsec profile NHRPVPN ike-group 'IKE-HUB' -``` - -SPOKE-1 - -```none -crypto isakmp policy 1 - encr aes 256 - authentication pre-share - group 2 - lifetime 3600 -crypto isakmp key secret address 0.0.0.0 -! -! -crypto ipsec transform-set ESP_TRANSFORMSET esp-aes 256 esp-sha-hmac - mode transport -! -! -crypto ipsec profile gre_protection - set security-association lifetime seconds 1800 - set transform-set ESP_TRANSFORMSET -! -interface Tunnel100 - tunnel protection ipsec profile gre_protection shared -! -interface Tunnel101 - tunnel protection ipsec profile gre_protection shared -``` - -## Monitoring -All spokes created IPSec tunnels to Hubs, are registered on Hubs using NHRP protocol and formed adjacency in OSPF. -```none -vyos@HUB-1:~$ show vpn ipsec sa -Connection State Uptime Bytes In/Out Packets In/Out Remote address Remote ID Proposal --------------------------- ------- -------- -------------- ---------------- ---------------- ----------- ------------------------ -dmvpn-NHRPVPN-tun100-child up 6m1s 4K/5K 51/56 10.0.13.2 10.0.13.2 AES_CBC_256/HMAC_SHA1_96 -dmvpn-NHRPVPN-tun100-child up 6m36s 4K/6K 56/65 10.0.12.2 10.0.12.2 AES_CBC_256/HMAC_SHA1_96 -dmvpn-NHRPVPN-tun100-child up 8m49s 6K/6K 73/77 10.0.11.2 10.0.11.2 AES_CBC_256/HMAC_SHA1_96 - -vyos@HUB-1:~$ show ip nhrp cache -Iface Type Protocol NBMA Claimed NBMA Flags Identity -tun100 dynamic 10.100.100.12 10.0.12.2 10.0.12.2 T 10.0.12.2 -tun100 dynamic 10.100.100.13 10.0.13.2 10.0.13.2 T 10.0.13.2 -tun100 dynamic 10.100.100.11 10.0.11.2 10.0.11.2 T 10.0.11.2 -tun100 local 10.100.100.1 10.0.0.2 10.0.0.2 - - -vyos@HUB-1:~$ show ip ospf neighbor - -Neighbor ID Pri State Up Time Dead Time Address Interface RXmtL RqstL DBsmL -192.168.11.1 1 Full/DROther 17m01s 36.201s 10.100.100.11 tun100:10.100.100.1 0 0 0 -192.168.12.1 1 Full/DROther 9m42s 37.443s 10.100.100.12 tun100:10.100.100.1 0 0 0 -192.168.13.1 1 Full/DROther 9m15s 35.053s 10.100.100.13 tun100:10.100.100.1 0 0 0 -``` -First, we see that LANs are accessible through hubs using OSPF routes. -```none -SPOKE-1#show ip route -Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP - D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area - N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 - E1 - OSPF external type 1, E2 - OSPF external type 2 - i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2 - ia - IS-IS inter area, * - candidate default, U - per-user static route - o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP - a - application route - + - replicated route, % - next hop override, p - overrides from PfR - -Gateway of last resort is 10.0.11.1 to network 0.0.0.0 -..... - 192.168.11.0/24 is variably subnetted, 2 subnets, 2 masks -C 192.168.11.0/24 is directly connected, GigabitEthernet0/1 -L 192.168.11.1/32 is directly connected, GigabitEthernet0/1 -O 192.168.12.0/24 [110/1002] via 10.100.101.1, 00:14:36, Tunnel101 - [110/1002] via 10.100.100.1, 00:16:13, Tunnel100 -O 192.168.13.0/24 [110/1002] via 10.100.101.1, 00:14:36, Tunnel101 - [110/1002] via 10.100.100.1, 00:15:45, Tunnel100 - - -vyos@SPOKE-2:~$ show ip route -Codes: K - kernel route, C - connected, L - local, S - static, - R - RIP, O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, - T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR, - f - OpenFabric, t - Table-Direct, - > - selected route, * - FIB route, q - queued, r - rejected, b - backup - t - trapped, o - offload failure - -...... - -O>* 192.168.11.0/24 [110/3] via 10.100.100.1, tun100 onlink, weight 1, 00:12:36 - * via 10.100.101.1, tun101 onlink, weight 1, 00:12:36 -O 192.168.12.0/24 [110/1] is directly connected, eth1, weight 1, 01:24:40 -C>* 192.168.12.0/24 is directly connected, eth1, weight 1, 01:24:43 -L>* 192.168.12.1/32 is directly connected, eth1, weight 1, 01:24:43 -O>* 192.168.13.0/24 [110/3] via 10.100.100.1, tun100 onlink, weight 1, 00:12:36 - * via 10.100.101.1, tun101 onlink, weight 1, 00:12:36 -``` -After initiating traffic between SPOKES sites, Phase 3 of DMVPN will work. -For instance, traceroute was generated from PC-SPOKE-2 to PC-SPOKE-1 -```none -PC-SPOKE-2 : 192.168.12.2 255.255.255.0 gateway 192.168.12.1 - -PC-SPOKE-2> trace 192.168.11.2 -trace to 192.168.11.2, 8 hops max, press Ctrl+C to stop - 1 192.168.12.1 0.558 ms 0.378 ms 0.561 ms - 2 10.100.101.1 1.768 ms 1.158 ms 1.744 ms - 3 10.100.101.11 7.196 ms 4.971 ms 4.793 ms - 4 *192.168.11.2 7.747 ms (ICMP type:3, code:3, Destination port unreachable) - -PC-SPOKE-2> trace 192.168.11.2 -trace to 192.168.11.2, 8 hops max, press Ctrl+C to stop - 1 192.168.12.1 0.562 ms 0.396 ms 0.364 ms - 2 10.100.100.11 4.401 ms 4.399 ms 4.174 ms - 3 *192.168.11.2 3.241 ms (ICMP type:3, code:3, Destination port unreachable) -``` -First trace goes via HUB but the second goes directly from SPOKE-1 to SPOKE-2. -Now routing tables are changed. LAN networks 192.168.12.0/24 and 192.168.11.0/24 available directly via SPOKES. -```none -vyos@SPOKE-2:~$ show ip route -Codes: K - kernel route, C - connected, L - local, S - static, - R - RIP, O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, - T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR, - f - OpenFabric, t - Table-Direct, - > - selected route, * - FIB route, q - queued, r - rejected, b - backup - t - trapped, o - offload failure - -N>* 192.168.11.0/24 [10/0] via 10.100.100.11, tun100 onlink, weight 1, 00:00:14 -O 192.168.11.0/24 [110/3] via 10.100.100.1, tun100 onlink, weight 1, 00:00:54 - via 10.100.101.1, tun101 onlink, weight 1, 00:00:54 - - -SPOKE-1# show ip route next-hop-override -Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP - D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area - N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 - E1 - OSPF external type 1, E2 - OSPF external type 2 - i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2 - ia - IS-IS inter area, * - candidate default, U - per-user static route - o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP - a - application route - + - replicated route, % - next hop override, p - overrides from PfR - -Gateway of last resort is 10.0.11.1 to network 0.0.0.0 - -O % 192.168.12.0/24 [110/1002] via 10.100.101.1, 00:24:09, Tunnel101 - [110/1002] via 10.100.100.1, 00:25:46, Tunnel100 - [NHO][110/1] via 10.100.100.12, 00:00:03, Tunnel100 -``` -NHRP shows shortcuts on Spokes -```none -vyos@SPOKE-2:~$ show ip nhrp shortcut -Type Prefix Via Identity -dynamic 192.168.11.0/24 10.100.100.11 10.0.11.2 - -SPOKE-1# show ip nhrp shortcut -10.100.100.12/32 via 10.100.100.12 - Tunnel100 created 00:09:59, expire 00:02:21 - Type: dynamic, Flags: router nhop rib nho - NBMA address: 10.0.12.2 -192.168.12.0/24 via 10.100.100.12 - Tunnel100 created 00:02:38, expire 00:02:21 - Type: dynamic, Flags: router rib nho - NBMA address: 10.0.12.2 -``` -A new Spoke to Spoke IPSec tunnel is created -```none -SPOKE-1#show crypto isakmp sa -IPv4 Crypto ISAKMP SA -dst src state conn-id status -10.0.0.2 10.0.11.2 QM_IDLE 1002 ACTIVE -10.0.12.2 10.0.11.2 QM_IDLE 1004 ACTIVE -10.0.1.2 10.0.11.2 QM_IDLE 1003 ACTIVE - -vyos@SPOKE-2:~$ show vpn ipsec sa -Connection State Uptime Bytes In/Out Packets In/Out Remote address Remote ID Proposal --------------------------- ------- -------- -------------- ---------------- ---------------- ----------- ------------------------ -dmvpn-NHRPVPN-tun100-child up 7m26s 4K/4K 57/53 10.0.0.2 10.0.0.2 AES_CBC_256/HMAC_SHA1_96 -dmvpn-NHRPVPN-tun100-child up 11m48s 316B/1K 3/15 10.0.11.2 10.0.11.2 AES_CBC_256/HMAC_SHA1_96 -dmvpn-NHRPVPN-tun101-child up 5m58s 5K/4K 62/51 10.0.1.2 10.0.1.2 AES_CBC_256/HMAC_SHA1_96 -``` - -## Summary - -If one of the Hubs loses connectivity to the Internet, the other Hub will be available and take the main role. -This is a simple example where only one internet connection is used. But in the real world, there can be two -connections to the Internet. In this case, there is a recommendation to build each tunnel via each Internet connection, -choose the main cloud, and manipulate traffic via a routing protocol. It allows the creation failover on link-level -connections too. diff --git a/docs/configexamples/md-firewall.md b/docs/configexamples/md-firewall.md deleted file mode 100644 index 5d170511..00000000 --- a/docs/configexamples/md-firewall.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -lastproofread: '2024-09-11' ---- - -# Firewall Examples - -This section contains examples of firewall configurations for various -deployments. - -```{toctree} -:maxdepth: 2 - -fwall-and-vrf -fwall-and-bridge -zone-policy -``` diff --git a/docs/configexamples/md-fwall-and-bridge.md b/docs/configexamples/md-fwall-and-bridge.md deleted file mode 100644 index 75fb6b25..00000000 --- a/docs/configexamples/md-fwall-and-bridge.md +++ /dev/null @@ -1,487 +0,0 @@ ---- -lastproofread: '2024-09-11' ---- - -# Bridge and firewall example - -## Scenario and requirements - -This example shows how to configure a VyOS router with bridge interfaces and -firewall rules. - -Three non VLAN-aware bridges are going to be configured, and each one has its -own requirements. - -- Bridge br0: - : - Isolated layer 2 bridge. - - Accept only IPv6 communication whithin the bridge. -- Bridge br1: - : - Drop all DHCP discover packets. - - Accept all ARP packets. - - Within the bridge, accept only new IPv4 connections from host 10.1.1.102 - - Drop all other IPv4 connections. - - Drop all IPv6 connections. - - Accept access to router itself. - - Allow connections to internet - - Drop connections to other LANs. -- Bridge br2: - : - Accept all DHCP discover packets. - - Accept only DHCP offers from valid server and|or trusted bridge port. - - Accept all ARP packets. - - Accept all IPv4 connections. - - Drop all IPv6 connections. - - Deny access to the router. - - Allow connections to internet. - - Allow connections to bridge br1. - -## Configuration - -### Bridges and interfaces configuration - -First, we need to configure the interfaces and bridges: - -```none -# Brige br0 -set interfaces bridge br0 description 'Isolated L2 bridge' -set interfaces bridge br0 member interface eth1 -set interfaces bridge br0 member interface eth2 -set interfaces ethernet eth1 description 'br0' -set interfaces ethernet eth2 description 'br0' - -# Bridge br1: -set interfaces bridge br1 address '10.1.1.1/24' -set interfaces bridge br1 description 'L3 bridge br1' -set interfaces bridge br1 member interface eth3 -set interfaces bridge br1 member interface eth4 -set interfaces ethernet eth3 description 'br1' -set interfaces ethernet eth4 description 'br1' - -# Bridge br2: -set interfaces bridge br2 address '10.2.2.1/24' -set interfaces bridge br2 description 'L3 bridge br2' -set interfaces bridge br2 member interface eth5 -set interfaces bridge br2 member interface eth6 -set interfaces bridge br2 member interface eth7 -set interfaces ethernet eth5 description 'br2 - Host' -set interfaces ethernet eth6 description 'br2 - Trusted DHCP Server' -set interfaces ethernet eth7 description 'br2' -``` - -### Bridge firewall configuration - -In this section, we are going to configure the firewall rules that will be used -in bridge firewall, and will control the traffic within each bridge. - -We are going to use custom firewall rulesets, one for each bridge that will -be used in `prerouting`, and one for each bridge that will be used in the -`forward` chain. - -Also, we are going to use firewall interface groups in order to simplify the -firewall configuration. - -So first, let's create the required firewall interface groups: - -```none -# Bridge br0 interface-group: -set firewall group interface-group br0-ifaces interface 'br0' -set firewall group interface-group br0-ifaces interface 'eth1' -set firewall group interface-group br0-ifaces interface 'eth2' - -# Bridge br1 interface-group: -set firewall group interface-group br1-ifaces interface 'br1' -set firewall group interface-group br1-ifaces interface 'eth3' -set firewall group interface-group br1-ifaces interface 'eth4' - -# Bridge br2 interface-group: -set firewall group interface-group br2-ifaces interface 'br2' -set firewall group interface-group br2-ifaces interface 'eth5' -set firewall group interface-group br2-ifaces interface 'eth6' -set firewall group interface-group br2-ifaces interface 'eth7' -``` - -As said before, we are going to create custom firewall rulesets for each -bridge, that will be used in the `prerouting` chain, in order to drop as much -unwanted traffic as early as possible. So, custom rulesets used in -`prerouting` chain are going to be `br0-pre`, `br1-pre`, and `br2-pre`: - -```none -# Prerouting - Catch all traffic for br0 -set firewall bridge prerouting filter rule 10 action 'jump' -set firewall bridge prerouting filter rule 10 description 'br0 traffic' -set firewall bridge prerouting filter rule 10 inbound-interface group 'br0-ifaces' -set firewall bridge prerouting filter rule 10 jump-target 'br0-pre' - -# Prerouting - Catch all traffic for br1 -set firewall bridge prerouting filter rule 20 action 'jump' -set firewall bridge prerouting filter rule 20 description 'br1 traffic' -set firewall bridge prerouting filter rule 20 inbound-interface group 'br1-ifaces' -set firewall bridge prerouting filter rule 20 jump-target 'br1-pre' - -# Prerouting - Catch all traffic for br2 -set firewall bridge prerouting filter rule 30 action 'jump' -set firewall bridge prerouting filter rule 30 description 'br2 traffic' -set firewall bridge prerouting filter rule 30 inbound-interface group 'br2-ifaces' -set firewall bridge prerouting filter rule 30 jump-target 'br2-pre' -``` - -And then create the custom rulesets: - -```none -### br0 - br0-pre - # Requirements: accept only IPv6 communication within the bridge -set firewall bridge name br0-pre rule 10 description 'Accept IPv6 traffic' -set firewall bridge name br0-pre rule 10 action 'accept' -set firewall bridge name br0-pre rule 10 ethernet-type 'ipv6' - # And drop everything else -set firewall bridge name br0-pre default-action 'drop' - -### br1 - br1-pre - # Requirements: drop all DHCP discover packets -set firewall bridge name br1-pre rule 10 description 'Drop DHCP discover' -set firewall bridge name br1-pre rule 10 action 'drop' -set firewall bridge name br1-pre rule 10 protocol 'udp' -set firewall bridge name br1-pre rule 10 source port '68' -set firewall bridge name br1-pre rule 10 destination port '67' -set firewall bridge name br1-pre rule 10 destination mac-address 'ff:ff:ff:ff:ff:ff' -set firewall bridge name br1-pre rule 10 log - # Requirement: drop all IPv6 connections -set firewall bridge name br1-pre rule 20 description 'Drop IPv6 traffic' -set firewall bridge name br1-pre rule 20 action 'drop' -set firewall bridge name br1-pre rule 20 ethernet-type 'ipv6' - # Accept everything else so it can be parsed later -set firewall bridge name br1-pre default-action 'accept' - -### br2 - br2-pre - # Requirements: drop all IPv6 connections -set firewall bridge name br2-pre rule 10 description 'Drop IPv6 traffic' -set firewall bridge name br2-pre rule 10 action 'drop' -set firewall bridge name br2-pre rule 10 ethernet-type 'ipv6' - # Accept everything else so it can be parsed later -set firewall bridge name br2-pre default-action 'accept' -``` - -Now, in the `forward` chain, we are going to define state policies, and -custom rulesets for each bridge that would be used in the `forward` chain. -These rulesets are `br0-fwd`, `br1-fwd`, and `br2-fwd`: - -```none -# Forward - State policies if not defined globally -set firewall bridge forward filter rule 5 action 'accept' -set firewall bridge forward filter rule 5 state 'established' -set firewall bridge forward filter rule 5 state 'related' -set firewall bridge forward filter rule 10 action 'drop' -set firewall bridge forward filter rule 10 state 'invalid' - -# Forward - Catch all traffic for br0 -set firewall bridge forward filter rule 110 description 'br0 traffic' -set firewall bridge forward filter rule 110 action 'jump' -set firewall bridge forward filter rule 110 inbound-interface group 'br0-ifaces' -set firewall bridge forward filter rule 110 jump-target 'br0-fwd' - -# Forward - Catch all traffic for br1 -set firewall bridge forward filter rule 120 description 'br1 traffic' -set firewall bridge forward filter rule 120 action 'jump' -set firewall bridge forward filter rule 120 inbound-interface group 'br1-ifaces' -set firewall bridge forward filter rule 120 jump-target 'br1-fwd' - -# Forward - Catch all traffic for br2 -set firewall bridge forward filter rule 130 description 'br2 traffic' -set firewall bridge forward filter rule 130 action 'jump' -set firewall bridge forward filter rule 130 inbound-interface group 'br2-ifaces' -set firewall bridge forward filter rule 130 jump-target 'br2-fwd' - -# Forward - Default action drop: -set firewall bridge forward filter default-action 'drop' -``` - -And the content of the custom rulesets: - -```none -### br0 - br0-fwd - # Accept everything that wasn't dropped in prerouting -set firewall bridge name br0-fwd default-action 'accept' - -### br1 - br1-fwd - # Requirement: Accept all ARP packets -set firewall bridge name br1-fwd rule 10 description 'Accept ARP' -set firewall bridge name br1-fwd rule 10 action 'accept' -set firewall bridge name br1-fwd rule 10 ethernet-type 'arp' - # Requirement: Accept only new IPv4 connections from host 10.1.1.102 -set firewall bridge name br1-fwd rule 20 description 'Accept ipv4 from host' -set firewall bridge name br1-fwd rule 20 action 'accept' -set firewall bridge name br1-fwd rule 20 source address '10.1.1.102' -set firewall bridge name br1-fwd rule 20 state 'new' - # Drop everythin else within the bridge: -set firewall bridge name br1-fwd default-action 'drop' - -### br2 - br2-fwd - # Requirement: Accept all DHCP discover packets -set firewall bridge name br2-fwd rule 10 description 'Accept DHCP discover' -set firewall bridge name br2-fwd rule 10 action 'accept' -set firewall bridge name br2-fwd rule 10 protocol 'udp' -set firewall bridge name br2-fwd rule 10 source port '68' -set firewall bridge name br2-fwd rule 10 destination port '67' -set firewall bridge name br2-fwd rule 10 destination mac-address 'ff:ff:ff:ff:ff:ff' - # Requirement: Accept only DHCP offers from valid server on port eth6 -set firewall bridge name br2-fwd rule 20 description 'Accept DHCP offers from trusted interface' -set firewall bridge name br2-fwd rule 20 action 'accept' -set firewall bridge name br2-fwd rule 20 protocol 'udp' -set firewall bridge name br2-fwd rule 20 source port '67' -set firewall bridge name br2-fwd rule 20 destination port '68' -set firewall bridge name br2-fwd rule 20 inbound-interface name 'eth6' -set firewall bridge name br2-fwd rule 22 description 'Drop all other DHCP offers' -set firewall bridge name br2-fwd rule 22 action 'drop' -set firewall bridge name br2-fwd rule 22 protocol 'udp' -set firewall bridge name br2-fwd rule 22 source port '67' -set firewall bridge name br2-fwd rule 22 destination port '68' -set firewall bridge name br2-fwd rule 22 log - - # Accept all ARP packets -set firewall bridge name br2-fwd rule 30 description 'Accept ARP' -set firewall bridge name br2-fwd rule 30 action 'accept' -set firewall bridge name br2-fwd rule 30 ethernet-type 'arp' - # Accept all IPv4 connections -set firewall bridge name br2-fwd rule 40 description 'Accept ipv4' -set firewall bridge name br2-fwd rule 40 action 'accept' -set firewall bridge name br2-fwd rule 40 ethernet-type 'ipv4' - # Drop everything else -set firewall bridge name br2-fwd default-action 'drop' -``` - -### IP firewall configuration - -Since some of the requirements listed above exceed the capabilities of the -bridge firewall, we need to use the IP firewall to implement them. -For bridge br1 and br2, we need to control the traffic that is going to the -router itself, to other local networks, and to the Internet. - -As a reminder, here's a link to the {doc}`firewall documentation -</configuration/firewall/index>`, where you can find more information about -the packet flow for traffic that comes from bridge layer and should be analized -by the IP firewall. - -Access to the router itself is controlled by the base chain `input`, and -rules to accomplish all the requirements are: - -```none -# First of all, if not using global state policies, we need to define them: -set firewall ipv4 input filter rule 10 state 'established' -set firewall ipv4 input filter rule 10 state 'related' -set firewall ipv4 input filter rule 10 action 'accept' -set firewall ipv4 input filter rule 20 state 'invalid' -set firewall ipv4 input filter rule 20 action 'drop' - -# Input - br1 - Accept access to router itself -set firewall ipv4 input filter rule 110 description "Accept access from br1" -set firewall ipv4 input filter rule 110 action 'accept' -set firewall ipv4 input filter rule 110 inbound-interface group 'br1-ifaces' - -# Input - br2 - Deny access to the router -set firewall ipv4 input filter rule 120 description "Deny access from br2" -set firewall ipv4 input filter rule 120 action 'drop' -set firewall ipv4 input filter rule 120 inbound-interface group 'br2-ifaces' -``` - -And for traffic that is going to other local networks, and to he Internet, we -need to use the base chain `forward`. As in the bridge firewall, we are -going to use custom rulesets for each bridge, that would be used in the -`forward` chain. Those rulesets are `ip-br1-fwd` and `ip-br2-fwd`: - -```none -# First of all, if not using global state policies, we need to define them: -set firewall ipv4 forward filter rule 5 action 'accept' -set firewall ipv4 forward filter rule 5 state 'established' -set firewall ipv4 forward filter rule 5 state 'related' -set firewall ipv4 forward filter rule 10 action 'drop' -set firewall ipv4 forward filter rule 10 state 'invalid' - -# Forward - Catch all traffic for br1 -set firewall ipv4 forward filter rule 110 description 'br1 traffic' -set firewall ipv4 forward filter rule 110 action 'jump' -set firewall ipv4 forward filter rule 110 inbound-interface group 'br1-ifaces' -set firewall ipv4 forward filter rule 110 jump-target 'ip-br1-fwd' - -# Forward - Catch all traffic for br2 -set firewall ipv4 forward filter rule 120 description 'br2 traffic' -set firewall ipv4 forward filter rule 120 action 'jump' -set firewall ipv4 forward filter rule 120 inbound-interface group 'br2-ifaces' -set firewall ipv4 forward filter rule 120 jump-target 'ip-br2-fwd' - -# Forward - Default action drop: -set firewall ipv4 forward filter default-action 'drop' -``` - -And the content of the custom rulesets: - -```none -### br1 - ip-br1-fwd - # Requirement: Allow connections to internet -set firewall ipv4 name ip-br1-fwd rule 10 description 'br1 - allow internet access' -set firewall ipv4 name ip-br1-fwd rule 10 action 'accept' -set firewall ipv4 name ip-br1-fwd rule 10 outbound-interface name 'eth0' - # Requirement: Drop all other connections -set firewall ipv4 name ip-br1-fwd default-action 'drop' - -### br2 - ip-br2-fwd - # Requirement: Allow connections to internet -set firewall ipv4 name ip-br2-fwd rule 10 description 'br2 - allow internet access' -set firewall ipv4 name ip-br2-fwd rule 10 action 'accept' -set firewall ipv4 name ip-br2-fwd rule 10 outbound-interface name 'eth0' - # Requirement: Allow connections to br1 -set firewall ipv4 name ip-br2-fwd rule 20 description 'br2 - allow access to br1' -set firewall ipv4 name ip-br2-fwd rule 20 action 'accept' -set firewall ipv4 name ip-br2-fwd rule 20 outbound-interface group 'br1-ifaces' - # Requirement: Drop all other connections -set firewall ipv4 name ip-br2-fwd default-action 'drop' -``` - -## Validation - -While testing the configuration, we can check logs in order to ensure that -we are accepting and/or blocking the correct traffic. - -For example, while a host tries to get an IP address from a DHCP server in -br1 all DHCP discover are dropped, and in br2, we can see that DHCP offers from -untrusted servers are dropped: - -```none -vyos@bridge:~$ show log firewall bridge -Sep 17 14:22:35 kernel: [bri-NAM-br2-fwd-22-D]IN=eth7 OUT=eth5 MAC=50:00:00:09:00:00:50:00:00:04:00:00:08:00 SRC=10.2.2.199 DST=10.2.2.92 LEN=322 TOS=0x10 PREC=0x00 TTL=128 ID=0 DF PROTO=UDP SPT=67 DPT=68 LEN=302 -Sep 17 14:28:18 kernel: [bri-NAM-br1-pre-10-D]IN=eth3 OUT= MAC=ff:ff:ff:ff:ff:ff:00:50:79:66:68:0c:08:00 SRC=0.0.0.0 DST=255.255.255.255 LEN=392 TOS=0x10 PREC=0x00 TTL=16 ID=0 PROTO=UDP SPT=68 DPT=67 LEN=372 -Sep 17 14:28:19 kernel: [bri-NAM-br1-pre-10-D]IN=eth3 OUT= MAC=ff:ff:ff:ff:ff:ff:00:50:79:66:68:0c:08:00 SRC=0.0.0.0 DST=255.255.255.255 LEN=392 TOS=0x10 PREC=0x00 TTL=16 ID=0 PROTO=UDP SPT=68 DPT=67 LEN=372 -``` - -And with operational mode commands, we can check rules matchers, actions, and -counters. - -Bridge firewall rulset: - -```none -vyos@bri:~$ show firewall bridge -Rulesets bridge Information - ---------------------------------- -bridge Firewall "forward filter" - -Rule Action Protocol Packets Bytes Conditions -------- -------- ---------- --------- ------- ----------------------------------------- -5 accept all 19 1916 ct state { established, related } accept -10 drop all 0 0 ct state invalid -110 jump all 2 208 iifname @I_br0-ifaces jump NAME_br0-fwd -120 jump all 10 670 iifname @I_br1-ifaces jump NAME_br1-fwd -130 jump all 12 3086 iifname @I_br2-ifaces jump NAME_br2-fwd -default drop all 0 0 - ---------------------------------- -bridge Firewall "name br0-fwd" - -Rule Action Protocol Packets Bytes -------- -------- ---------- --------- ------- -default accept all 2 208 - ---------------------------------- -bridge Firewall "name br0-pre" - -Rule Action Protocol Packets Bytes Conditions -------- -------- ---------- --------- ------- ---------------------- -10 accept all 18 1872 ether type ip6 accept -default drop all 9 1476 - ---------------------------------- -bridge Firewall "name br1-fwd" - -Rule Action Protocol Packets Bytes Conditions -------- -------- ---------- --------- ------- ---------------------------------------- -10 accept all 5 250 ether type arp accept -20 accept all 3 252 ct state new ip saddr 10.1.1.102 accept -default drop all 2 168 - ---------------------------------- -bridge Firewall "name br1-pre" - -Rule Action Protocol Packets Bytes Conditions -------- -------- ---------- --------- ------- ---------------------------------------------------------------------------------------- -10 drop udp 3 1176 ether daddr ff:ff:ff:ff:ff:ff udp sport 68 udp dport 67 prefix "[bri-NAM-br1-pre-10-D]" -20 drop all 0 0 ether type ip6 -default accept all 58 4430 - ---------------------------------- -bridge Firewall "name br2-fwd" - -Rule Action Protocol Packets Bytes Conditions -------- -------- ---------- --------- ------- --------------------------------------------------------------- -10 accept udp 4 1312 ether daddr ff:ff:ff:ff:ff:ff udp sport 68 udp dport 67 accept -20 accept udp 2 656 udp sport 67 udp dport 68 iifname "eth6" accept -22 drop udp 1 322 udp sport 67 udp dport 68 prefix "[bri-NAM-br2-fwd-22-D]" -30 accept all 2 92 ether type arp accept -40 accept all 3 704 ether type ip accept -default drop all 0 0 - ---------------------------------- -bridge Firewall "name br2-pre" - -Rule Action Protocol Packets Bytes Conditions -------- -------- ---------- --------- ------- -------------- -10 drop all 7 728 ether type ip6 -default accept all 77 7548 - ---------------------------------- -bridge Firewall "prerouting filter" - -Rule Action Protocol Packets Bytes Conditions -------- -------- ---------- --------- ------- ---------------------------------------- -10 jump all 27 3348 iifname @I_br0-ifaces jump NAME_br0-pre -20 jump all 61 5606 iifname @I_br1-ifaces jump NAME_br1-pre -30 jump all 84 8276 iifname @I_br2-ifaces jump NAME_br2-pre -default drop all 0 0 - -vyos@bridge:~$ -``` - -IPv4 firewall rulset: - -```none -vyos@bridge:~$ show firewall ipv4 -Rulesets ipv4 Information - ---------------------------------- -ipv4 Firewall "forward filter" - -Rule Action Protocol Packets Bytes Conditions -------- -------- ---------- --------- ------- ------------------------------------------- -5 accept all 76 6384 ct state { established, related } accept -10 drop all 0 0 ct state invalid -110 jump all 13 1092 iifname @I_br1-ifaces jump NAME_ip-br1-fwd -120 jump all 3 252 iifname @I_br2-ifaces jump NAME_ip-br2-fwd -default drop all 0 0 - ---------------------------------- -ipv4 Firewall "input filter" - -Rule Action Protocol Packets Bytes Conditions -------- -------- ---------- --------- ------- ----------------------------------------- -10 accept all 0 0 ct state { established, related } accept -20 drop all 0 0 ct state invalid -110 accept all 10 720 iifname @I_br1-ifaces accept -120 drop all 26 2672 iifname @I_br2-ifaces -default accept all 3037 991621 - ---------------------------------- -ipv4 Firewall "name ip-br1-fwd" - -Rule Action Protocol Packets Bytes Conditions -------- -------- ---------- --------- ------- ---------------------- -10 accept all 5 420 oifname "eth0" accept -default drop all 8 672 - ---------------------------------- -ipv4 Firewall "name ip-br2-fwd" - -Rule Action Protocol Packets Bytes Conditions -------- -------- ---------- --------- ------- ----------------------------- -10 accept all 1 84 oifname "eth0" accept -20 accept all 2 168 oifname @I_br1-ifaces accept -default drop all 0 0 - -vyos@bridge:~$ -``` diff --git a/docs/configexamples/md-index.md b/docs/configexamples/md-index.md deleted file mode 100644 index 66b3359e..00000000 --- a/docs/configexamples/md-index.md +++ /dev/null @@ -1,59 +0,0 @@ -(examples)= - -# Configuration Blueprints - -This chapter contains various configuration examples: - -```{toctree} -:maxdepth: 2 - -firewall -bgp-ipv6-unnumbered -ospf-unnumbered -azure-vpn-bgp -azure-vpn-dual-bgp -ha -wan-load-balancing -pppoe-ipv6-basic -l3vpn-hub-and-spoke -lac-lns -inter-vrf-routing-vrf-lite -dmvpn-dualhub-dualcloud -qos -segment-routing-isis -nmp -ansible -ipsec-cisco-policy-based -ipsec-cisco-route-based -ipsec-pa-route-based -policy-based-ipsec-and-firewall -site-2-site-cisco -``` - -## Configuration Blueprints (autotest) - -The next pages contain fully automated configuration examples. - -Each lab will build and test from an external script. -The page content is generated, so changes will not take effect. - -A host `vyos-oobm` will be used as an SSH proxy. This host is just -necessary for the lab tests. - -The process will do the following steps: -1. create the lab on a eve-ng server -2. configure each host in the lab -3. do some defined tests -4. optional do an upgrade to a higher version and do step 3 again. -5. generate the documentation and include files -6. shutdown and destroy the lab, if there is no error - -```{toctree} -:maxdepth: 1 - -autotest/DHCPRelay_through_GRE/DHCPRelay_through_GRE -autotest/tunnelbroker/tunnelbroker -autotest/L3VPN_EVPN/L3VPN_EVPN -autotest/Wireguard/Wireguard -autotest/OpenVPN_with_LDAP/OpenVPN_with_LDAP -``` diff --git a/docs/configexamples/md-lac-lns.md b/docs/configexamples/md-lac-lns.md deleted file mode 100644 index 1b020924..00000000 --- a/docs/configexamples/md-lac-lns.md +++ /dev/null @@ -1,172 +0,0 @@ ---- -lastproofread: '2024-02-21' ---- - -(examples-lac-lns)= - -# PPPoE over L2TP - -This document is to describe a basic setup using PPPoE over L2TP. -LAC and LNS are components of the broadband topology. -LAC - L2TP access concentrator -LNS - L2TP Network Server -LAC and LNS forms L2TP tunnel. LAC receives packets from PPPoE clients and -forward them to LNS. LNS is the termination point that comes from PPP packets -from the remote client. - -In this example we use VyOS 1.5 as LNS and Cisco IOS as LAC. -All users with domain **vyos.io** will be tunneled to LNS via L2TP. - -## Network Topology - -```{image} /_static/images/lac-lns-diagram.jpg -:align: center -:alt: Network Topology Diagram -:width: 60% -``` - -## Configurations - -### LAC - -```none -aaa new-model -! -aaa authentication ppp default local -! -vpdn enable -vpdn aaa attribute nas-ip-address vpdn-nas -! -vpdn-group LAC - request-dialin - protocol l2tp - domain vyos.io - initiate-to ip 192.168.139.100 - source-ip 192.168.139.101 - local name LAC - l2tp tunnel password 0 test123 -! -bba-group pppoe MAIN-BBA - virtual-template 1 -! -interface GigabitEthernet0/0 - description To LNS - ip address 192.168.139.101 255.255.255.0 - duplex auto - speed auto - media-type rj45 -! -interface GigabitEthernet0/1 - description To PPPoE clients - no ip address - duplex auto - speed auto - media-type rj45 - pppoe enable group MAIN-BBA -! -interface Virtual-Template1 - description pppoe MAIN-BBA - no ip address - no peer default ip address - ppp mtu adaptive - ppp authentication chap -! -``` - -### LNS - -```none -set interfaces ethernet eth0 address '192.168.139.100/24' -set nat source rule 100 outbound-interface name 'eth0' -set nat source rule 100 source address '10.0.0.0/24' -set nat source rule 100 translation address 'masquerade' -set protocols static route 0.0.0.0/0 next-hop 192.168.139.2 -set vpn l2tp remote-access authentication mode 'radius' -set vpn l2tp remote-access authentication radius server 192.168.139.110 key 'radiustest' -set vpn l2tp remote-access client-ip-pool TEST-POOL range '10.0.0.2-10.0.0.100' -set vpn l2tp remote-access default-pool 'TEST-POOL' -set vpn l2tp remote-access gateway-address '10.0.0.1' -set vpn l2tp remote-access lns host-name 'LAC' -set vpn l2tp remote-access lns shared-secret 'test123' -set vpn l2tp remote-access name-server '8.8.8.8' -set vpn l2tp remote-access ppp-options disable-ccp -``` - -:::{note} -This setup requires the Compression Control Protocol (CCP) -being disabled, the command `set vpn l2tp remote-access ppp-options disable-ccp` -accomplishes that. -::: - -### Client -In this lab we use Windows PPPoE client. - -```{image} /_static/images/lac-lns-winclient.jpg -:align: center -:alt: Window PPPoE Client Configuration -:width: 100% -``` - -### Monitoring -Monitoring on LNS side - -```none -vyos@vyos:~$ show l2tp-server sessions - ifname | username | ip | ip6 | ip6-dp | calling-sid | rate-limit | state | uptime | rx-bytes | tx-bytes ---------+--------------+----------+-----+--------+-----------------+------------+--------+----------+-----------+---------- - l2tp0 | test@vyos.io | 10.0.0.2 | | | 192.168.139.101 | | active | 00:00:35 | 188.4 KiB | 9.3 MiB -``` - -Monitoring on LAC side - -```none -Router#show pppoe session - 1 session in FORWARDED (FWDED) State - 1 session total -Uniq ID PPPoE RemMAC Port VT VA State - SID LocMAC VA-st Type - 1 1 000c.290b.20a6 Gi0/1 1 N/A FWDED - 0c58.88ac.0001 - -Router#show l2tp -L2TP Tunnel and Session Information Total tunnels 1 sessions 1 - -LocTunID RemTunID Remote Name State Remote Address Sessn L2TP Class/ - Count VPDN Group -23238 2640 LAC est 192.168.139.100 1 LAC - -LocID RemID TunID Username, Intf/ State Last Chg Uniq ID - Vcid, Circuit -25641 25822 23238 test@vyos.io, Gi0/1 est 00:05:36 1 -``` - -Monitoring on RADIUS Server side - -```none -root@Radius:~# cat /var/log/freeradius/radacct/192.168.139.100/detail-20240221 -Wed Feb 21 13:37:17 2024 - User-Name = "test@vyos.io" - NAS-Port = 0 - NAS-Port-Id = "l2tp0" - NAS-Port-Type = Virtual - Service-Type = Framed-User - Framed-Protocol = PPP - Calling-Station-Id = "192.168.139.101" - Called-Station-Id = "192.168.139.100" - Acct-Status-Type = Start - Acct-Authentic = RADIUS - Acct-Session-Id = "45c731e169d9a4f1" - Acct-Session-Time = 0 - Acct-Input-Octets = 0 - Acct-Output-Octets = 0 - Acct-Input-Packets = 0 - Acct-Output-Packets = 0 - Acct-Input-Gigawords = 0 - Acct-Output-Gigawords = 0 - Framed-IP-Address = 10.0.0.2 - NAS-IP-Address = 192.168.139.100 - Event-Timestamp = "Feb 21 2024 13:37:17 UTC" - Tmp-String-9 = "ai:" - Acct-Unique-Session-Id = "ea6a1089816f19c0d0f1819bc61c3318" - Timestamp = 1708522637 -``` diff --git a/docs/configexamples/md-nmp.md b/docs/configexamples/md-nmp.md deleted file mode 100644 index 9c422172..00000000 --- a/docs/configexamples/md-nmp.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -lastproofread: '2023-03-26' ---- - -(examples-nmp)= - -# NMP example - -Consider how to quickly set up NMP and VyOS for monitoring. -NMP is multi-vendor network monitoring from 'SolarWinds' built to -scale and expand with the needs of your network. - -## Configuration 'VyOS' - -First prepare our VyOS router for connection to NMP. We have to set -up the SNMP protocol and connectivity between the router and NMP. - -```none -set interfaces ethernet eth0 address 'dhcp' -set system name-server '8.8.8.8' -set service snmp community router authorization 'test' -set service snmp community router network '0.0.0.0/0' -``` - -## Configuration 'NMP' - -Next, you just should follow the pictures: - -```{image} /_static/images/nmp1.png -:align: center -:alt: Network Topology Diagram -:width: 80% -``` - -```{image} /_static/images/nmp2.png -:align: center -:alt: Network Topology Diagram -:width: 80% -``` - -```{image} /_static/images/nmp3.png -:align: center -:alt: Network Topology Diagram -:width: 80% -``` - -```{image} /_static/images/nmp4.png -:align: center -:alt: Network Topology Diagram -:width: 80% -``` - -```{image} /_static/images/nmp5.png -:align: center -:alt: Network Topology Diagram -:width: 80% -``` - -```{image} /_static/images/nmp6.png -:align: center -:alt: Network Topology Diagram -:width: 80% -``` - -```{image} /_static/images/nmp7.png -:align: center -:alt: Network Topology Diagram -:width: 80% -``` - -In the end, you'll get a powerful instrument for monitoring the VyOS systems. diff --git a/docs/configexamples/md-ospf-unnumbered.md b/docs/configexamples/md-ospf-unnumbered.md deleted file mode 100644 index 9c4d5399..00000000 --- a/docs/configexamples/md-ospf-unnumbered.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -lastproofread: '2021-06-29' ---- - -(examples-ospf-unnumbered)= - -# OSPF unnumbered with ECMP - -General information can be found in the {ref}`routing-ospf` chapter. - -## Configuration - -- Router A: - -```none -set interfaces ethernet eth0 address '10.0.0.1/24' -set interfaces ethernet eth1 address '192.168.0.1/32' -set interfaces ethernet eth1 ip ospf authentication md5 key-id 1 md5-key 'yourpassword' -set interfaces ethernet eth1 ip ospf network 'point-to-point' -set interfaces ethernet eth2 address '192.168.0.1/32' -set interfaces ethernet eth2 ip ospf authentication md5 key-id 1 md5-key 'yourpassword' -set interfaces ethernet eth2 ip ospf network 'point-to-point' -set interfaces loopback lo address '192.168.0.1/32' -set protocols ospf area 0.0.0.0 authentication 'md5' -set protocols ospf area 0.0.0.0 network '192.168.0.1/32' -set protocols ospf parameters router-id '192.168.0.1' -set protocols ospf redistribute connected -``` - -- Router B: - -```none -set interfaces ethernet eth0 address '10.0.0.2/24' -set interfaces ethernet eth1 address '192.168.0.2/32' -set interfaces ethernet eth1 ip ospf authentication md5 key-id 1 md5-key 'yourpassword' -set interfaces ethernet eth1 ip ospf network 'point-to-point' -set interfaces ethernet eth2 address '192.168.0.2/32' -set interfaces ethernet eth2 ip ospf authentication md5 key-id 1 md5-key 'yourpassword' -set interfaces ethernet eth2 ip ospf network 'point-to-point' -set interfaces loopback lo address '192.168.0.2/32' -set protocols ospf area 0.0.0.0 authentication 'md5' -set protocols ospf area 0.0.0.0 network '192.168.0.2/32' -set protocols ospf parameters router-id '192.168.0.2' -set protocols ospf redistribute connected -``` - -## Results - -- Router A: - -```none -vyos@vyos:~$ show interfaces -Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down -Interface IP Address S/L Description ---------- ---------- --- ----------- -eth0 10.0.0.1/24 u/u -eth1 192.168.0.1/32 u/u -eth2 192.168.0.1/32 u/u -lo 127.0.0.1/8 u/u - 192.168.0.1/32 - ::1/128 -``` - -```none -vyos@vyos:~$ show ip route -Codes: K - kernel route, C - connected, S - static, R - RIP, - O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, - T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, - F - PBR, f - OpenFabric, - > - selected route, * - FIB route, q - queued route, r - rejected route - -S>* 0.0.0.0/0 [210/0] via 10.0.0.254, eth0, 00:57:34 -O 10.0.0.0/24 [110/20] via 192.168.0.2, eth1 onlink, 00:13:21 - via 192.168.0.2, eth2 onlink, 00:13:21 -C>* 10.0.0.0/24 is directly connected, eth0, 00:57:35 -O 192.168.0.1/32 [110/0] is directly connected, lo, 00:48:53 -C * 192.168.0.1/32 is directly connected, eth2, 00:56:31 -C * 192.168.0.1/32 is directly connected, eth1, 00:56:31 -C>* 192.168.0.1/32 is directly connected, lo, 00:57:36 -O>* 192.168.0.2/32 [110/1] via 192.168.0.2, eth1 onlink, 00:29:03 - * via 192.168.0.2, eth2 onlink, 00:29:03 -``` - -- Router B: - -```none -vyos@vyos:~$ show interfaces -Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down -Interface IP Address S/L Description ---------- ---------- --- ----------- -eth0 10.0.0.2/24 u/u -eth1 192.168.0.2/32 u/u -eth2 192.168.0.2/32 u/u -lo 127.0.0.1/8 u/u - 192.168.0.2/32 - ::1/128 -``` - -```none -vyos@vyos:~$ show ip route -Codes: K - kernel route, C - connected, S - static, R - RIP, - O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, - T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, - F - PBR, f - OpenFabric, - > - selected route, * - FIB route, q - queued route, r - rejected route - -S>* 0.0.0.0/0 [210/0] via 10.0.0.254, eth0, 00:57:34 -O 10.0.0.0/24 [110/20] via 192.168.0.1, eth1 onlink, 00:13:21 - via 192.168.0.1, eth2 onlink, 00:13:21 -C>* 10.0.0.0/24 is directly connected, eth0, 00:57:35 -O 192.168.0.2/32 [110/0] is directly connected, lo, 00:48:53 -C * 192.168.0.2/32 is directly connected, eth2, 00:56:31 -C * 192.168.0.2/32 is directly connected, eth1, 00:56:31 -C>* 192.168.0.2/32 is directly connected, lo, 00:57:36 -O>* 192.168.0.1/32 [110/1] via 192.168.0.1, eth1 onlink, 00:29:03 - * via 192.168.0.1, eth2 onlink, 00:29:03 -``` diff --git a/docs/configexamples/md-policy-based-ipsec-and-firewall.md b/docs/configexamples/md-policy-based-ipsec-and-firewall.md deleted file mode 100644 index 00110117..00000000 --- a/docs/configexamples/md-policy-based-ipsec-and-firewall.md +++ /dev/null @@ -1,255 +0,0 @@ -(examples-policy-based-ipsec-and-firewall)= - -# Policy-Based Site-to-Site VPN and Firewall Configuration - -This guide shows an example policy-based IKEv2 site-to-site VPN between two -VyOS routers, and firewall configuration. - -For simplicity, configuration and tests are done only using IPv4, and firewall -configuration is done only on one router. - -## Network Topology and requirements - -This configuration example and the requirements consists of: - -- Two VyOS routers with public IP address. - -- 2 private subnets on each site. - -- Local subnets should be able to reach internet using source NAT. - -- Communication between private subnets should be done through IPSec tunnel - without NAT. - -- Configuration of basic firewall in one site, in order to: - - > - Protect the router on 'WAN' interface, allowing only IPSec connections - > and SSH access from trusted IPs. - > - Allow access to the router only from trusted networks. - > - Allow DNS requests only only for local networks. - > - Allow ICMP on all interfaces. - > - Allow all new connections from local subnets. - > - Allow connections from LANs to LANs through the tunnel. - -```{image} /_static/images/policy-based-ipsec-and-firewall.png -``` - -## Configuration -Interface and routing configuration: -```none -# LEFT router: -set interfaces ethernet eth0 address '198.51.100.14/30' -set interfaces ethernet eth1 vif 111 address '10.1.11.1/24' -set interfaces ethernet eth2 vif 112 address '10.1.12.1/24' -set protocols static route 0.0.0.0/0 next-hop 198.51.100.13 - -# RIGHT router: -set interfaces ethernet eth0 address '192.0.2.130/30' -set interfaces ethernet eth1 vif 221 address '10.2.21.1/24' -set interfaces ethernet eth2 vif 222 address '10.2.22.1/24' -``` -IPSec configuration: -```none -# LEFT router: -set vpn ipsec authentication psk RIGHT id '198.51.100.14' -set vpn ipsec authentication psk RIGHT id '192.0.2.130' -set vpn ipsec authentication psk RIGHT secret 'p4ssw0rd' -set vpn ipsec esp-group ESP-GROUP mode 'tunnel' -set vpn ipsec esp-group ESP-GROUP proposal 1 encryption 'aes256' -set vpn ipsec esp-group ESP-GROUP proposal 1 hash 'sha256' -set vpn ipsec ike-group IKE-GROUP key-exchange 'ikev2' -set vpn ipsec ike-group IKE-GROUP proposal 1 dh-group '14' -set vpn ipsec ike-group IKE-GROUP proposal 1 encryption 'aes256' -set vpn ipsec ike-group IKE-GROUP proposal 1 hash 'sha256' -set vpn ipsec interface 'eth0' -set vpn ipsec site-to-site peer RIGHT authentication mode 'pre-shared-secret' -set vpn ipsec site-to-site peer RIGHT connection-type 'initiate' -set vpn ipsec site-to-site peer RIGHT default-esp-group 'ESP-GROUP' -set vpn ipsec site-to-site peer RIGHT ike-group 'IKE-GROUP' -set vpn ipsec site-to-site peer RIGHT local-address '198.51.100.14' -set vpn ipsec site-to-site peer RIGHT remote-address '192.0.2.130' -set vpn ipsec site-to-site peer RIGHT tunnel 0 local prefix '10.1.11.0/24' -set vpn ipsec site-to-site peer RIGHT tunnel 0 remote prefix '10.2.21.0/24' -set vpn ipsec site-to-site peer RIGHT tunnel 1 local prefix '10.1.11.0/24' -set vpn ipsec site-to-site peer RIGHT tunnel 1 remote prefix '10.2.22.0/24' -set vpn ipsec site-to-site peer RIGHT tunnel 2 local prefix '10.1.12.0/24' -set vpn ipsec site-to-site peer RIGHT tunnel 2 remote prefix '10.2.21.0/24' -set vpn ipsec site-to-site peer RIGHT tunnel 3 local prefix '10.1.12.0/24' -set vpn ipsec site-to-site peer RIGHT tunnel 3 remote prefix '10.2.22.0/24' - -# RIGHT router: -set vpn ipsec authentication psk LEFT id '192.0.2.130' -set vpn ipsec authentication psk LEFT id '198.51.100.14' -set vpn ipsec authentication psk LEFT secret 'p4ssw0rd' -set vpn ipsec esp-group ESP-GROUP mode 'tunnel' -set vpn ipsec esp-group ESP-GROUP proposal 1 encryption 'aes256' -set vpn ipsec esp-group ESP-GROUP proposal 1 hash 'sha256' -set vpn ipsec ike-group IKE-GROUP key-exchange 'ikev2' -set vpn ipsec ike-group IKE-GROUP proposal 1 dh-group '14' -set vpn ipsec ike-group IKE-GROUP proposal 1 encryption 'aes256' -set vpn ipsec ike-group IKE-GROUP proposal 1 hash 'sha256' -set vpn ipsec interface 'eth0' -set vpn ipsec site-to-site peer LEFT authentication mode 'pre-shared-secret' -set vpn ipsec site-to-site peer LEFT connection-type 'none' -set vpn ipsec site-to-site peer LEFT default-esp-group 'ESP-GROUP' -set vpn ipsec site-to-site peer LEFT ike-group 'IKE-GROUP' -set vpn ipsec site-to-site peer LEFT local-address '192.0.2.130' -set vpn ipsec site-to-site peer LEFT remote-address '198.51.100.14' -set vpn ipsec site-to-site peer LEFT tunnel 0 local prefix '10.2.21.0/24' -set vpn ipsec site-to-site peer LEFT tunnel 0 remote prefix '10.1.11.0/24' -set vpn ipsec site-to-site peer LEFT tunnel 1 local prefix '10.2.22.0/24' -set vpn ipsec site-to-site peer LEFT tunnel 1 remote prefix '10.1.11.0/24' -set vpn ipsec site-to-site peer LEFT tunnel 2 local prefix '10.2.21.0/24' -set vpn ipsec site-to-site peer LEFT tunnel 2 remote prefix '10.1.12.0/24' -set vpn ipsec site-to-site peer LEFT tunnel 3 local prefix '10.2.22.0/24' -set vpn ipsec site-to-site peer LEFT tunnel 3 remote prefix '10.1.12.0/24' -``` -Firewall Configuration: -```none -# Firewall Groups: -set firewall group network-group LOCAL-NETS network '10.1.11.0/24' -set firewall group network-group LOCAL-NETS network '10.1.12.0/24' -set firewall group network-group REMOTE-NETS network '10.2.21.0/24' -set firewall group network-group REMOTE-NETS network '10.2.22.0/24' -set firewall group network-group TRUSTED network '198.51.100.125/32' -set firewall group network-group TRUSTED network '203.0.113.0/24' -set firewall group network-group TRUSTED network '10.1.11.0/24' -set firewall group network-group TRUSTED network '192.168.70.0/24' - -# Forward traffic: default drop and only allow what is needed -set firewall ipv4 forward filter default-action 'drop' - -# Forward traffic: global state policies -set firewall ipv4 forward filter rule 1 action 'accept' -set firewall ipv4 forward filter rule 1 state established 'enable' -set firewall ipv4 forward filter rule 1 state related 'enable' -set firewall ipv4 forward filter rule 2 action 'drop' -set firewall ipv4 forward filter rule 2 state invalid 'enable' - -# Forward traffic: Accept all connections from local networks -set firewall ipv4 forward filter rule 10 action 'accept' -set firewall ipv4 forward filter rule 10 source group network-group 'LOCAL-NETS' - -# Forward traffic: accept connections from remote LANs to local LANs -set firewall ipv4 forward filter rule 20 action 'accept' -set firewall ipv4 forward filter rule 20 destination group network-group 'LOCAL-NETS' -set firewall ipv4 forward filter rule 20 source group network-group 'REMOTE-NETS' - -# Input traffic: default drop and only allow what is needed -set firewall ipv4 input filter default-action 'drop' - -# Input traffic: global state policies -set firewall ipv4 input filter rule 1 action 'accept' -set firewall ipv4 input filter rule 1 state established 'enable' -set firewall ipv4 input filter rule 1 state related 'enable' -set firewall ipv4 input filter rule 2 action 'drop' -set firewall ipv4 input filter rule 2 state invalid 'enable' - -# Input traffic: add rules needed for ipsec connection -set firewall ipv4 input filter rule 10 action 'accept' -set firewall ipv4 input filter rule 10 destination port '500,4500' -set firewall ipv4 input filter rule 10 inbound-interface name 'eth0' -set firewall ipv4 input filter rule 10 protocol 'udp' -set firewall ipv4 input filter rule 15 action 'accept' -set firewall ipv4 input filter rule 15 inbound-interface name 'eth0' -set firewall ipv4 input filter rule 15 protocol 'esp' - -# Input traffic: accept ssh connection from trusted ips -set firewall ipv4 input filter rule 20 action 'accept' -set firewall ipv4 input filter rule 20 destination port '22' -set firewall ipv4 input filter rule 20 protocol 'tcp' -set firewall ipv4 input filter rule 20 source group network-group 'TRUSTED' - -# Input traffic: accepd dns requests only from local networks. -set firewall ipv4 input filter rule 25 action 'accept' -set firewall ipv4 input filter rule 25 destination port '53' -set firewall ipv4 input filter rule 25 protocol 'udp' -set firewall ipv4 input filter rule 25 source group network-group 'LOCAL-NETS' - -# Input traffic: allow icmp -set firewall ipv4 input filter rule 30 action 'accept' -set firewall ipv4 input filter rule 30 protocol 'icmp' -``` -And NAT Configuration: -```none -set nat source rule 10 destination group network-group 'REMOTE-NETS' -set nat source rule 10 exclude -set nat source rule 10 outbound-interface name 'eth0' -set nat source rule 10 source group network-group 'LOCAL-NETS' -set nat source rule 20 outbound-interface name 'eth0' -set nat source rule 20 source group network-group 'LOCAL-NETS' -set nat source rule 20 translation address 'masquerade' -``` -## Checking through op-mode commands -After some testing, we can check IPSec status, and counter on every tunnel: -```none -vyos@LEFT:~$ show vpn ipsec sa -Connection State Uptime Bytes In/Out Packets In/Out Remote address Remote ID Proposal --------------- ------- -------- -------------- ---------------- ---------------- ----------- --------------------------------------- -RIGHT-tunnel-0 up 36m24s 840B/840B 10/10 192.0.2.130 192.0.2.130 AES_CBC_256/HMAC_SHA2_256_128/MODP_2048 -RIGHT-tunnel-1 up 36m33s 588B/588B 7/7 192.0.2.130 192.0.2.130 AES_CBC_256/HMAC_SHA2_256_128/MODP_2048 -RIGHT-tunnel-2 up 35m50s 1K/1K 15/15 192.0.2.130 192.0.2.130 AES_CBC_256/HMAC_SHA2_256_128/MODP_2048 -RIGHT-tunnel-3 up 36m54s 2K/2K 32/32 192.0.2.130 192.0.2.130 AES_CBC_256/HMAC_SHA2_256_128/MODP_2048 -vyos@LEFT:~$ -``` -Also, we can check firewall counters: -```none -vyos@LEFT:~$ show firewall -Rulesets Information - ---------------------------------- -IPv4 Firewall "forward filter" - -Rule Action Protocol Packets Bytes Conditions -------- -------- ---------- --------- ------- ------------------------------------------------------ -1 accept all 681 96545 ct state { established, related } accept -2 drop all 0 0 ct state invalid -10 accept all 360 27205 ip saddr @N_LOCAL-NETS accept -20 accept all 8 648 ip daddr @N_LOCAL-NETS ip saddr @N_REMOTE-NETS accept -default drop all - ---------------------------------- -IPv4 Firewall "input filter" - -Rule Action Protocol Packets Bytes Conditions -------- -------- ---------- --------- ------- ---------------------------------------------- -1 accept all 901 123709 ct state { established, related } accept -2 drop all 0 0 ct state invalid -10 accept udp 0 0 udp dport { 500, 4500 } iifname "eth0" accept -15 accept esp 0 0 meta l4proto esp iifname "eth0" accept -20 accept tcp 1 60 tcp dport 22 ip saddr @N_TRUSTED accept -25 accept udp 0 0 udp dport 53 ip saddr @N_LOCAL-NETS accept -30 accept icmp 0 0 meta l4proto icmp accept -default drop all - -vyos@LEFT:~$ -vyos@LEFT:~$ show firewall statistics -Rulesets Statistics - ---------------------------------- -IPv4 Firewall "forward filter" - -Rule Packets Bytes Action Source Destination Inbound-Interface Outbound-interface -------- --------- ------- -------- ----------- ------------- ------------------- -------------------- -1 681 96545 accept any any any any -2 0 0 drop any any any any -10 360 27205 accept LOCAL-NETS any any any -20 8 648 accept REMOTE-NETS LOCAL-NETS any any -default N/A N/A drop any any any any - ---------------------------------- -IPv4 Firewall "input filter" - -Rule Packets Bytes Action Source Destination Inbound-Interface Outbound-interface -------- --------- ------- -------- ---------- ------------- ------------------- -------------------- -1 905 124213 accept any any any any -2 0 0 drop any any any any -10 0 0 accept any any eth0 any -15 0 0 accept any any eth0 any -20 1 60 accept TRUSTED any any any -25 0 0 accept LOCAL-NETS any any any -30 0 0 accept any any any any -default N/A N/A drop any any any any - -vyos@LEFT:~$ -``` diff --git a/docs/configexamples/md-segment-routing-isis.md b/docs/configexamples/md-segment-routing-isis.md deleted file mode 100644 index 76cb726c..00000000 --- a/docs/configexamples/md-segment-routing-isis.md +++ /dev/null @@ -1,277 +0,0 @@ ---- -lastproofread: '2023-04-10' ---- - -(examples-segment-routing-isis)= - -# Segment-routing IS-IS example - -When utilizing VyOS in an environment with Cisco IOS-XR gear you can use this -blue print as an initial setup to get MPLS ISIS-SR working between those two -devices.The lab was build using {abbr}`EVE-NG (Emulated Virtual -Environment NG)`. - -:::{figure} /_static/images/vyos-sr-isis.png -:alt: ISIS-SR network - -ISIS-SR example network -::: - -The below configuration is used as example where we keep focus on -VyOS-P1/VyOS-P2/XRv-P3 which we share the settings. - -## Configuration - -- VyOS-P1: - -```none -set interfaces dummy dum0 address '192.0.2.1/32' -set interfaces ethernet eth1 address '192.0.2.5/30' -set interfaces ethernet eth1 mtu '8000' -set interfaces ethernet eth3 address '192.0.2.21/30' -set interfaces ethernet eth3 mtu '8000' -set protocols isis interface dum0 passive -set protocols isis interface eth1 network point-to-point -set protocols isis interface eth3 network point-to-point -set protocols isis level 'level-2' -set protocols isis log-adjacency-changes -set protocols isis metric-style 'wide' -set protocols isis net '49.0000.0000.0000.0001.00' -set protocols isis segment-routing maximum-label-depth '8' -set protocols isis segment-routing prefix 192.0.2.1/32 index value '1' -set protocols mpls interface 'eth1' -set protocols mpls interface 'eth3' -set system host-name 'P1-VyOS' -``` - -- XRv-P3: - -```none -hostname P3-VyOS -interface Loopback0 - ipv4 address 192.0.2.3 255.255.255.255 -! -interface GigabitEthernet0/0/0/1 - mtu 8014 - ipv4 address 192.0.2.6 255.255.255.252 -! -interface GigabitEthernet0/0/0/2 - mtu 8014 - ipv4 address 192.0.2.18 255.255.255.252 -! -router isis VyOS - is-type level-2-only - net 49.0000.0000.0000.0003.00 - log adjacency changes - address-family ipv4 unicast - metric-style wide - segment-routing mpls - ! - interface Loopback0 - passive - address-family ipv4 unicast - prefix-sid index 3 - ! - ! - interface GigabitEthernet0/0/0/1 - point-to-point - address-family ipv4 unicast - ! - ! - interface GigabitEthernet0/0/0/2 - point-to-point - address-family ipv4 unicast - ! - ! -! -``` - -- VyOS-P2: - -```none -set interfaces dummy dum0 address '192.0.2.2/32' -set interfaces ethernet eth2 address '192.0.2.17/30' -set interfaces ethernet eth2 mtu '8000' -set interfaces ethernet eth3 address '192.0.2.26/30' -set interfaces ethernet eth3 mtu '8000' -set protocols isis interface dum0 passive -set protocols isis interface eth2 network point-to-point -set protocols isis interface eth3 network point-to-point -set protocols isis level 'level-2' -set protocols isis log-adjacency-changes -set protocols isis metric-style 'wide' -set protocols isis net '49.0000.0000.0000.0002.00' -set protocols isis segment-routing maximum-label-depth '8' -set protocols isis segment-routing prefix 192.0.2.2/32 index value '2' -set protocols mpls interface 'eth2' -set protocols mpls interface 'eth3' -set system host-name 'P2-VyOS' -``` - -This gives us MPLS segment routing enabled and labels forwarding : - -```none -vyos@P1-VyOS:~$ show mpls table -Inbound Label Type Nexthop Outbound Label ------------------------------------------------------------------ -15000 SR (IS-IS) 192.0.2.6 implicit-null -15001 SR (IS-IS) 192.0.2.22 implicit-null -15002 SR (IS-IS) fe80::5200:ff:fe04:3 implicit-null -16002 SR (IS-IS) 192.0.2.6 16002 -16003 SR (IS-IS) 192.0.2.6 implicit-null -16011 SR (IS-IS) 192.0.2.22 implicit-null - -vyos@P2-VyOS:~$ show mpls table -Inbound Label Type Nexthop Outbound Label -------------------------------------------------------- -15000 SR (IS-IS) 192.0.2.18 implicit-null -16001 SR (IS-IS) 192.0.2.18 16001 -16003 SR (IS-IS) 192.0.2.18 implicit-null -16011 SR (IS-IS) 192.0.2.18 16011 - -RP/0/0/CPU0:P3-VyOS#show mpls forwarding -Tue Mar 28 17:47:18.928 UTC -Local Outgoing Prefix Outgoing Next Hop Bytes -Label Label or ID Interface Switched ------- ----------- ------------------ ------------ --------------- ------------ -16001 Pop SR Pfx (idx 1) Gi0/0/0/1 192.0.2.5 0 -16002 Pop SR Pfx (idx 2) Gi0/0/0/2 192.0.2.17 0 -16011 16011 SR Pfx (idx 11) Gi0/0/0/1 192.0.2.5 0 -24000 Pop SR Adj (idx 1) Gi0/0/0/1 192.0.2.5 0 -24001 Pop SR Adj (idx 3) Gi0/0/0/1 192.0.2.5 0 -24002 Pop SR Adj (idx 1) Gi0/0/0/2 192.0.2.17 0 -24003 Pop SR Adj (idx 3) Gi0/0/0/2 192.0.2.17 0 -``` - -VyOS is able to check MSD per devices: - -```none -vyos@P1-VyOS:~$ show isis segment-routing node -Area VyOS: -IS-IS L1 SR-Nodes: - -IS-IS L2 SR-Nodes: - -System ID SRGB SRLB Algorithm MSD ---------------------------------------------------------------- -0000.0000.0001 16000 - 23999 15000 - 15999 SPF 8 -0000.0000.0002 16000 - 23999 15000 - 15999 SPF 8 -0000.0000.0003 16000 - 23999 0 - 4294967295 SPF 10 -0000.0000.0011 16000 - 23999 15000 - 15999 SPF 8 - -vyos@P2-VyOS:~$ show isis segment-routing node -Area VyOS: - IS-IS L1 SR-Nodes: - - IS-IS L2 SR-Nodes: - - System ID SRGB SRLB Algorithm MSD - --------------------------------------------------------------- - 0000.0000.0001 16000 - 23999 15000 - 15999 SPF 8 - 0000.0000.0002 16000 - 23999 15000 - 15999 SPF 8 - 0000.0000.0003 16000 - 23999 0 - 4294967295 SPF 10 - 0000.0000.0011 16000 - 23999 15000 - 15999 SPF 8 -``` - -Here is the routing tables showing the MPLS segment routing label operations: - -```none -vyos@P1-VyOS:~$ show ip route isis -Codes: K - kernel route, C - connected, S - static, R - RIP, - O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, - T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR, - f - OpenFabric, - > - selected route, * - FIB route, q - queued, r - rejected, b - backup - t - trapped, o - offload failure - -I>* 192.0.2.2/32 [115/30] via 192.0.2.6, eth1, label 16002, weight 1, 1d03h18m -I>* 192.0.2.3/32 [115/10] via 192.0.2.6, eth1, label implicit-null, weight 1, 1d03h18m -I 192.0.2.4/30 [115/20] via 192.0.2.6, eth1 inactive, weight 1, 1d03h18m -I>* 192.0.2.11/32 [115/20] via 192.0.2.22, eth3, label implicit-null, weight 1, 1d02h47m -I>* 192.0.2.16/30 [115/20] via 192.0.2.6, eth1, weight 1, 1d03h18m -I 192.0.2.20/30 [115/20] via 192.0.2.22, eth3 inactive, weight 1, 1d02h48m -I>* 192.0.2.24/30 [115/30] via 192.0.2.6, eth1, weight 1, 1d03h18m - - -vyos@P2-VyOS:~$ show ip route isis -Codes: K - kernel route, C - connected, S - static, R - RIP, - O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, - T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR, - f - OpenFabric, - > - selected route, * - FIB route, q - queued, r - rejected, b - backup - t - trapped, o - offload failure - -I>* 192.0.2.1/32 [115/30] via 192.0.2.18, eth2, label 16001, weight 1, 1d03h17m -I>* 192.0.2.3/32 [115/10] via 192.0.2.18, eth2, label implicit-null, weight 1, 1d03h17m -I>* 192.0.2.4/30 [115/20] via 192.0.2.18, eth2, weight 1, 1d03h17m -I>* 192.0.2.11/32 [115/40] via 192.0.2.18, eth2, label 16011, weight 1, 1d02h47m -I 192.0.2.16/30 [115/20] via 192.0.2.18, eth2 inactive, weight 1, 1d03h17m -I>* 192.0.2.20/30 [115/30] via 192.0.2.18, eth2, weight 1, 1d03h17m - -RP/0/0/CPU0:P3-VyOS#show route isis -Tue Mar 28 18:19:16.417 UTC - -i L2 192.0.2.1/32 [115/20] via 192.0.2.5, 1d03h, GigabitEthernet0/0/0/1 -i L2 192.0.2.2/32 [115/20] via 192.0.2.17, 1d03h, GigabitEthernet0/0/0/2 -i L2 192.0.2.11/32 [115/30] via 192.0.2.5, 1d02h, GigabitEthernet0/0/0/1 -i L2 192.0.2.20/30 [115/20] via 192.0.2.5, 1d03h, GigabitEthernet0/0/0/1 -i L2 192.0.2.24/30 [115/20] via 192.0.2.17, 1d03h, GigabitEthernet0/0/0/2 -``` - -Information about prefix-sid and label-operation from VyOS - -```none -vyos@P1-VyOS:~$ show isis route prefix-sid -Area VyOS: -IS-IS L2 IPv4 routing table: - - Prefix Metric Interface Nexthop SID Label Op. - ---------------------------------------------------------------------- - 192.0.2.1/32 0 - - - - - 192.0.2.2/32 30 eth1 192.0.2.6 2 Swap(16002, 16002) - 192.0.2.3/32 10 eth1 192.0.2.6 3 Pop(16003) - 192.0.2.4/30 20 eth1 192.0.2.6 - - - 192.0.2.16/30 20 eth1 192.0.2.6 - - - 192.0.2.20/30 0 - - - - - 192.0.2.24/30 30 eth1 192.0.2.6 - - - - vyos@P2-VyOS:~$ show isis route prefix-sid - Area VyOS: - IS-IS L2 IPv4 routing table: - - Prefix Metric Interface Nexthop SID Label Op. - ----------------------------------------------------------------------- - 192.0.2.1/32 30 eth2 192.0.2.18 1 Swap(16001, 16001) - 192.0.2.2/32 0 - - - - - 192.0.2.3/32 10 eth2 192.0.2.18 3 Pop(16003) - 192.0.2.4/30 20 eth2 192.0.2.18 - - - 192.0.2.16/30 20 eth2 192.0.2.18 - - - 192.0.2.20/30 30 eth2 192.0.2.18 - - - 192.0.2.24/30 0 - - - - -``` - -Ping between VyOS-P1 / VyOS-P2 to confirm reachability: - -```none -vyos@P1-VyOS:~$ ping 192.0.2.2 source-address 192.0.2.1 -PING 192.0.2.2 (192.0.2.2) from 192.0.2.1 : 56(84) bytes of data. -64 bytes from 192.0.2.2: icmp_seq=1 ttl=63 time=3.47 ms -64 bytes from 192.0.2.2: icmp_seq=2 ttl=63 time=2.06 ms -64 bytes from 192.0.2.2: icmp_seq=3 ttl=63 time=3.90 ms -64 bytes from 192.0.2.2: icmp_seq=4 ttl=63 time=3.87 ms -^C ---- 192.0.2.2 ping statistics --- -4 packets transmitted, 4 received, 0% packet loss, time 3004ms -rtt min/avg/max/mdev = 2.064/3.326/3.903/0.748 ms - -vyos@P2-VyOS:~$ ping 192.0.2.1 source-address 192.0.2.2 -PING 192.0.2.1 (192.0.2.1) from 192.0.2.2 : 56(84) bytes of data. -64 bytes from 192.0.2.1: icmp_seq=1 ttl=63 time=2.91 ms -64 bytes from 192.0.2.1: icmp_seq=2 ttl=63 time=3.23 ms -64 bytes from 192.0.2.1: icmp_seq=3 ttl=63 time=2.91 ms -64 bytes from 192.0.2.1: icmp_seq=4 ttl=63 time=2.85 ms -^C ---- 192.0.2.1 ping statistics --- -4 packets transmitted, 4 received, 0% packet loss, time 3005ms -rtt min/avg/max/mdev = 2.846/2.972/3.231/0.151 ms -``` diff --git a/docs/configexamples/md-site-2-site-cisco.md b/docs/configexamples/md-site-2-site-cisco.md deleted file mode 100644 index a3b33d21..00000000 --- a/docs/configexamples/md-site-2-site-cisco.md +++ /dev/null @@ -1,167 +0,0 @@ -(examples-site-2-site-cisco)= - -# Site-to-Site IPSec VPN to Cisco using FlexVPN - -This guide shows a sample configuration for FlexVPN site-to-site Internet -Protocol Security (IPsec)/Generic Routing Encapsulation (GRE) tunnel. - -FlexVPN is a newer "solution" for deployment of VPNs and it utilizes IKEv2 as -the key exchange protocol. The result is a flexible and scalable VPN solution -that can be easily adapted to fit various network needs. It can also support a -variety of encryption methods, including AES and 3DES. - -The lab was built using EVE-NG. - -## Configuration - -### VyOS - -- GRE: - -```none -set interfaces tunnel tun1 encapsulation 'gre' -set interfaces tunnel tun1 ip adjust-mss '1336' -set interfaces tunnel tun1 mtu '1376' -set interfaces tunnel tun1 remote '10.1.1.6' -set interfaces tunnel tun1 source-address '198.51.100.1' -``` - -- IPsec: - -```none -set vpn ipsec authentication psk vyos_cisco_l id 'vyos.net’ -set vpn ipsec authentication psk vyos_cisco_l id 'cisco.hub.net' -set vpn ipsec authentication psk vyos_cisco_l secret 'secret' -set vpn ipsec esp-group e1 lifetime '3600' -set vpn ipsec esp-group e1 mode 'tunnel' -set vpn ipsec esp-group e1 pfs 'disable' -set vpn ipsec esp-group e1 proposal 1 encryption 'aes128' -set vpn ipsec esp-group e1 proposal 1 hash 'sha256' -set vpn ipsec ike-group i1 key-exchange 'ikev2' -set vpn ipsec ike-group i1 lifetime '28800' -set vpn ipsec ike-group i1 proposal 1 dh-group '5' -set vpn ipsec ike-group i1 proposal 1 encryption 'aes256' -set vpn ipsec ike-group i1 proposal 1 hash 'sha256' -set vpn ipsec interface 'eth2' -set vpn ipsec options disable-route-autoinstall -set vpn ipsec options flexvpn -set vpn ipsec options interface 'tun1' -set vpn ipsec options virtual-ip -set vpn ipsec site-to-site peer cisco_hub authentication local-id 'vyos.net' -set vpn ipsec site-to-site peer cisco_hub authentication mode 'pre-shared-secret' -set vpn ipsec site-to-site peer cisco_hub authentication remote-id 'cisco.hub.net' -set vpn ipsec site-to-site peer cisco_hub connection-type 'initiate' -set vpn ipsec site-to-site peer cisco_hub default-esp-group 'e1' -set vpn ipsec site-to-site peer cisco_hub ike-group 'i1' -set vpn ipsec site-to-site peer cisco_hub local-address '198.51.100.1' -set vpn ipsec site-to-site peer cisco_hub remote-address '10.1.1.6' -set vpn ipsec site-to-site peer cisco_hub tunnel 1 local prefix '198.51.100.1/32' -set vpn ipsec site-to-site peer cisco_hub tunnel 1 protocol 'gre' -set vpn ipsec site-to-site peer cisco_hub tunnel 1 remote prefix '10.1.1.6/32' -set vpn ipsec site-to-site peer cisco_hub virtual-address '0.0.0.0' -``` - -### Cisco - -```none -aaa new-model -! -! -aaa authorization network default local -! -crypto ikev2 name-mangler GET_DOMAIN - fqdn all - email all -! -! -crypto ikev2 authorization policy vyos - pool mypool - aaa attribute list mylist - route set interface - route accept any tag 100 distance 5 -! -crypto ikev2 keyring mykeys - peer peer1 - identity fqdn vyos.net - pre-shared-key local secret - pre-shared-key remote secret -crypto ikev2 profile my_profile - match identity remote fqdn vyos.net - identity local fqdn cisco.hub.net - authentication remote pre-share - authentication local pre-share - keyring local mykeys - dpd 10 3 periodic - aaa authorization group psk list local name-mangler GET_DOMAIN - aaa authorization user psk cached - virtual-template 1 -! -! -! -crypto ipsec transform-set TSET esp-aes esp-sha256-hmac - mode tunnel -! -! -crypto ipsec profile my-ipsec-profile - set transform-set TSET - set ikev2-profile my_profile -! -interface Virtual-Template1 type tunnel - no ip address - ip mtu 1376 - ip nhrp network-id 1 - ip nhrp shortcut virtual-template 1 - ip tcp adjust-mss 1336 - tunnel path-mtu-discovery - tunnel protection ipsec profile my-ipsec-profile - ! - ip local pool my_pool 172.16.122.1 172.16.122.254 -``` - -Since the tunnel is a point-to-point GRE tunnel, it behaves like any other -point-to-point interface (for example: serial, dialer), and it is possible to -run any Interior Gateway Protocol (IGP)/Exterior Gateway Protocol (EGP) over -the link in order to exchange routing information - -## Verification - -```none -vyos@vyos$ show interfaces -Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down -Interface IP Address S/L Description ---------- ---------- --- ----------- -eth0 - u/u -eth1 - u/u -eth2 198.51.100.1/24 u/u -eth3 172.16.1.2/24 u/u -lo 127.0.0.1/8 u/u - ::1/128 -tun1 172.16.122.2/32 u/u -vyos@vyos:~$ show vpn ipsec sa -Connection State Uptime Bytes In/Out Packets In/Out Remote address Remote ID Proposal ------------------- ------- -------- -------------- ---------------- ---------------- --------------------- ----------------------------- -cisco_hub-tunnel-1 up 44m17s 35K/31K 382/367 10.1.1.6 cisco.hub.net AES_CBC_128/HMAC_SHA2_256_128 - - -Hub#sh crypto ikev2 sa detailed - IPv4 Crypto IKEv2 SA -Tunnel-id Local Remote fvrf/ivrf Status -5 10.1.1.6/4500 198.51.100.1/4500 none/none READY - Encr: AES-CBC, keysize: 256, PRF: SHA256, Hash: SHA256, DH Grp:5, Auth sign: PSK, Auth verify: PSK - Life/Active Time: 86400/2694 sec - CE id: 0, Session-id: 2 - Status Description: Negotiation done - Local spi: C94EE2DC92A60C47 Remote spi: 9AF0EF151BECF14C - Local id: cisco.hub.net - Remote id: vyos.net - Local req msg id: 269 Remote req msg id: 0 - Local next msg id: 269 Remote next msg id: 0 - Local req queued: 269 Remote req queued: 0 - Local window: 5 Remote window: 1 - DPD configured for 10 seconds, retry 3 - Fragmentation not configured. - Extended Authentication not configured. - NAT-T is not detected - Cisco Trust Security SGT is disabled - Assigned host addr: 172.16.122.2 -``` diff --git a/docs/configexamples/md-wan-load-balancing.md b/docs/configexamples/md-wan-load-balancing.md deleted file mode 100644 index 21c78f2a..00000000 --- a/docs/configexamples/md-wan-load-balancing.md +++ /dev/null @@ -1,158 +0,0 @@ ---- -lastproofread: '2021-06-29' ---- - -(wan-load-balancing)= - - -# WAN Load Balancer examples - -## Example 1: Distributing load evenly - -The setup used in this example is shown in the following diagram: - -```{image} /_static/images/Wan_load_balancing1.png -:align: center -:alt: Network Topology Diagram -:width: 80% -``` - -### Overview -> - All traffic coming in through eth2 is balanced between eth0 and eth1 -> on the router. -> - Pings will be sent to four targets for health testing (33.44.55.66, -> 44.55.66.77, 55.66.77.88 and 66.77.88.99). -> - All outgoing packets are assigned the source address of the assigned -> interface (SNAT). -> - eth0 is set to be removed from the load balancer's interface pool -> after 5 ping failures, eth1 will be removed after 4 ping failures. - -### Create static routes to ping targets -Create static routes through the two ISPs towards the ping targets and -commit the changes: - -```none -set protocols static route 33.44.55.66/32 next-hop 11.22.33.1 -set protocols static route 44.55.66.77/32 next-hop 11.22.33.1 -set protocols static route 55.66.77.88/32 next-hop 22.33.44.1 -set protocols static route 66.77.88.99/32 next-hop 22.33.44.1 -``` - -### Configure the load balancer -Configure the WAN load balancer with the parameters described above: - -```none -set load-balancing wan interface-health eth0 failure-count 5 -set load-balancing wan interface-health eth0 nexthop 11.22.33.1 -set load-balancing wan interface-health eth0 test 10 type ping -set load-balancing wan interface-health eth0 test 10 target 33.44.55.66 -set load-balancing wan interface-health eth0 test 20 type ping -set load-balancing wan interface-health eth0 test 20 target 44.55.66.77 -set load-balancing wan interface-health eth1 failure-count 4 -set load-balancing wan interface-health eth1 nexthop 22.33.44.1 -set load-balancing wan interface-health eth1 test 10 type ping -set load-balancing wan interface-health eth1 test 10 target 55.66.77.88 -set load-balancing wan interface-health eth1 test 20 type ping -set load-balancing wan interface-health eth1 test 20 target 66.77.88.99 -set load-balancing wan rule 10 inbound-interface eth2 -set load-balancing wan rule 10 interface eth0 -set load-balancing wan rule 10 interface eth1 -``` - -## Example 2: Failover based on interface weights -This example uses the failover mode. -(wan-example2-overview)= - -### Overview -In this example, eth0 is the primary interface and eth1 is the secondary -interface. To provide simple failover functionality. If eth0 fails, eth1 -takes over. - -### Create interface weight based configuration -The configuration steps are the same as in the previous example, except -rule 10. So we keep the configuration, remove rule 10 and add a new rule -for the failover mode: - -```none -delete load-balancing wan rule 10 -set load-balancing wan rule 10 failover -set load-balancing wan rule 10 inbound-interface eth2 -set load-balancing wan rule 10 interface eth0 weight 10 -set load-balancing wan rule 10 interface eth1 weight 1 -``` - -## Example 3: Failover based on rule order -The previous example used the failover command to send traffic through -eth1 if eth0 fails. In this example, failover functionality is provided -by rule order. -(wan-example3-overview)= - -### Overview -Two rules will be created, the first rule directs traffic coming in -from eth2 to eth0 and the second rule directs the traffic to eth1. If -eth0 fails the first rule is bypassed and the second rule matches, -directing traffic to eth1. - -### Create rule order based configuration -We keep the configuration from the previous example, delete rule 10 -and create the two new rules as described: - -```none -delete load-balancing wan rule 10 -set load-balancing wan rule 10 inbound-interface eth2 -set load-balancing wan rule 10 interface eth0 -set load-balancing wan rule 20 inbound-interface eth2 -set load-balancing wan rule 20 interface eth1 -``` - -## Example 4: Failover based on rule order - priority traffic -A rule order for prioritizing traffic is useful in scenarios where the -secondary link has a lower speed and should only carry high priority -traffic. It is assumed for this example that eth1 is connected to a -slower connection than eth0 and should prioritize VoIP traffic. -(wan-example4-overview)= - -### Overview -A rule order for prioritizing traffic is useful in scenarios where the -secondary link has a lower speed and should only carry high priority -traffic. It is assumed for this example that eth1 is connected to a -slower connection than eth0 and should prioritize VoIP traffic. - -### Create rule order based configuration with low speed secondary link -We keep the configuration from the previous example, delete rule 20 and -create a new rule as described: - -```none -delete load-balancing wan rule 20 -set load-balancing wan rule 20 inbound-interface eth2 -set load-balancing wan rule 20 interface eth1 -set load-balancing wan rule 20 destination port sip -set load-balancing wan rule 20 protocol tcp -set protocols static route 0.0.0.0/0 next-hop 11.22.33.1 -``` - -## Example 5: Exclude traffic from load balancing -In this example two LAN interfaces exist in different subnets instead -of one like in the previous examples: - -```{image} /_static/images/Wan_load_balancing_exclude1.png -:align: center -:alt: Network Topology Diagram -:width: 80% -``` - -### Adding a rule for the second interface -Based on the previous example, another rule for traffic from the second -interface eth3 can be added to the load balancer. However, traffic meant -to flow between the LAN subnets will be sent to eth0 and eth1 as well. -To prevent this, another rule is required. This rule excludes traffic -between the local subnets from the load balancer. It also excludes -locally-sources packets (required for web caching with load balancing). -eth+ is used as an alias that refers to all ethernet interfaces: - -```none -set load-balancing wan rule 5 exclude -set load-balancing wan rule 5 inbound-interface eth+ -set load-balancing wan rule 5 destination address 10.0.0.0/8 -``` - diff --git a/docs/configexamples/md-zone-policy.md b/docs/configexamples/md-zone-policy.md deleted file mode 100644 index 6018e7fe..00000000 --- a/docs/configexamples/md-zone-policy.md +++ /dev/null @@ -1,413 +0,0 @@ ---- -lastproofread: '2024-06-14' ---- - -(examples-zone-policy)= - -# Zone-Policy example - -:::{note} -In {vytask}`T2199` the syntax of the zone configuration was changed. -The zone configuration moved from `zone-policy zone <name>` to `firewall -zone <name>`. -::: - -## Native IPv4 and IPv6 - -We have three networks. - -```none -WAN - 172.16.10.0/24, 2001:0DB8:0:9999::0/64 -LAN - 192.168.100.0/24, 2001:0DB8:0:AAAA::0/64 -DMZ - 192.168.200.0/24, 2001:0DB8:0:BBBB::0/64 -``` - -**This specific example is for a router on a stick, but is very easily -adapted for however many NICs you have**: - -- Internet - 192.168.200.100 - TCP/80 -- Internet - 192.168.200.100 - TCP/443 -- Internet - 192.168.200.100 - TCP/25 -- Internet - 192.168.200.100 - TCP/53 -- VyOS acts as DHCP, DNS forwarder, NAT, router and firewall. -- 192.168.200.200/2001:0DB8:0:BBBB::200 is an internal/external DNS, web - and mail (SMTP/IMAP) server. -- 192.168.100.10/2001:0DB8:0:AAAA::10 is the administrator's console. It - can SSH to VyOS. -- LAN and DMZ hosts have basic outbound access: Web, FTP, SSH. -- LAN can access DMZ resources. -- DMZ cannot access LAN resources. -- Inbound WAN connect to DMZ host. - -```{image} /_static/images/zone-policy-diagram.png -:align: center -:alt: Network Topology Diagram -:width: 80% -``` - -The VyOS interface is assigned the .1/:1 address of their respective -networks. WAN is on VLAN 10, LAN on VLAN 20, and DMZ on VLAN 30. - -It will look something like this: - -```none -interfaces { - ethernet eth0 { - duplex auto - hw-id 00:53:ed:6e:2a:92 - smp_affinity auto - speed auto - vif 10 { - address 172.16.10.1/24 - address 2001:db8:0:9999::1/64 - } - vif 20 { - address 192.168.100.1/24 - address 2001:db8:0:AAAA::1/64 - } - vif 30 { - address 192.168.200.1/24 - address 2001:db8:0:BBBB::1/64 - } - } - loopback lo { - } -} -``` - -## Zones Basics -Each interface is assigned to a zone. The interface can be physical or -virtual such as tunnels (VPN, PPTP, GRE, etc) and are treated exactly -the same. - -Traffic flows from zone A to zone B. That flow is what I refer to as a -zone-pair-direction. eg. A->B and B->A are two zone-pair-destinations. - -Ruleset are created per zone-pair-direction. - -I name rule sets to indicate which zone-pair-direction they represent. -eg. ZoneA-ZoneB or ZoneB-ZoneA. LAN-DMZ, DMZ-LAN. - -In VyOS, you have to have unique Ruleset names. In the event of overlap, -I add a "-6" to the end of v6 rulesets. eg. LAN-DMZ, LAN-DMZ-6. This -allows for each auto-completion and uniqueness. - -In this example we have 4 zones. LAN, WAN, DMZ, Local. The local zone is -the firewall itself. - -If your computer is on the LAN and you need to SSH into your VyOS box, -you would need a rule to allow it in the LAN-Local ruleset. If you want -to access a webpage from your VyOS box, you need a rule to allow it in -the Local-LAN ruleset. - -In rules, it is good to keep them named consistently. As the number of -rules you have grows, the more consistency you have, the easier your -life will be. - -```none -Rule 1 - State Established, Related -Rule 2 - State Invalid -Rule 100 - ICMP -Rule 200 - Web -Rule 300 - FTP -Rule 400 - NTP -Rule 500 - SMTP -Rule 600 - DNS -Rule 700 - DHCP -Rule 800 - SSH -Rule 900 - IMAPS -``` - -The first two rules are to deal with the idiosyncrasies of VyOS and -iptables. - -Zones and Rulesets both have a default action statement. When using -Zone-Policies, the default action is set by the zone-policy statement -and is represented by rule 10000. - -It is good practice to log both accepted and denied traffic. It can save -you significant headaches when trying to troubleshoot a connectivity -issue. - -To add logging to the default rule, do: - -```none -set firewall name <ruleSet> default-log -``` - -By default, iptables does not allow traffic for established sessions to -return, so you must explicitly allow this. I do this by adding two rules -to every ruleset. 1 allows established and related state packets through -and rule 2 drops and logs invalid state packets. We place the -established/related rule at the top because the vast majority of traffic -on a network is established and the invalid rule to prevent invalid -state packets from mistakenly being matched against other rules. Having -the most matched rule listed first reduces CPU load in high volume -environments. Note: I have filed a bug to have this added as a default -action as well. - -''It is important to note, that you do not want to add logging to the -established state rule as you will be logging both the inbound and -outbound packets for each session instead of just the initiation of the -session. Your logs will be massive in a very short period of time.'' - -In VyOS you must have the interfaces created before you can apply it to -the zone and the rulesets must be created prior to applying it to a -zone-policy. - -I create/configure the interfaces first. Build out the rulesets for each -zone-pair-direction which includes at least the three state rules. Then -I setup the zone-policies. - -Zones do not allow for a default action of accept; either drop or -reject. It is important to remember this because if you apply an -interface to a zone and commit, any active connections will be dropped. -Specifically, if you are SSH’d into VyOS and add local or the interface -you are connecting through to a zone and do not have rulesets in place -to allow SSH and established sessions, you will not be able to connect. - -The following are the rules that were created for this example (may not -be complete), both in IPv4 and IPv6. If there is no IP specified, then -the source/destination address is not explicit. - -```none -WAN - DMZ:192.168.200.200 - tcp/80 -WAN - DMZ:192.168.200.200 - tcp/443 -WAN - DMZ:192.168.200.200 - tcp/25 -WAN - DMZ:192.168.200.200 - tcp/53 -WAN - DMZ:2001:0DB8:0:BBBB::200 - tcp/80 -WAN - DMZ:2001:0DB8:0:BBBB::200 - tcp/443 -WAN - DMZ:2001:0DB8:0:BBBB::200 - tcp/25 -WAN - DMZ:2001:0DB8:0:BBBB::200 - tcp/53 - -DMZ - Local - tcp/53 -DMZ - Local - tcp/123 -DMZ - Local - tcp/67,68 - -LAN - Local - tcp/53 -LAN - Local - tcp/123 -LAN - Local - tcp/67,68 -LAN:192.168.100.10 - Local - tcp/22 -LAN:2001:0DB8:0:AAAA::10 - Local - tcp/22 - -LAN - WAN - tcp/80 -LAN - WAN - tcp/443 -LAN - WAN - tcp/22 -LAN - WAN - tcp/20,21 - -DMZ - WAN - tcp/80 -DMZ - WAN - tcp/443 -DMZ - WAN - tcp/22 -DMZ - WAN - tcp/20,21 -DMZ - WAN - tcp/53 -DMZ - WAN - udp/53 - -Local - WAN - tcp/80 -Local - WAN - tcp/443 -Local - WAN - tcp/20,21 - -Local - DMZ - tcp/25 -Local - DMZ - tcp/67,68 -Local - DMZ - tcp/53 -Local - DMZ - udp/53 - -Local - LAN - tcp/67,68 - -LAN - DMZ - tcp/80 -LAN - DMZ - tcp/443 -LAN - DMZ - tcp/993 -LAN:2001:0DB8:0:AAAA::10 - DMZ:2001:0DB8:0:BBBB::200 - tcp/22 -LAN:192.168.100.10 - DMZ:192.168.200.200 - tcp/22 -``` - -Since we have 4 zones, we need to setup the following rulesets. - -```none -Lan-wan -Lan-local -Lan-dmz -Wan-lan -Wan-local -Wan-dmz -Local-lan -Local-wan -Local-dmz -Dmz-lan -Dmz-wan -Dmz-local -``` - -Even if the two zones will never communicate, it is a good idea to -create the zone-pair-direction rulesets and set default-log. This -will allow you to log attempts to access the networks. Without it, you -will never see the connection attempts. - -This is an example of the three base rules. - -```none -name wan-lan { - default-action drop - default-log - rule 1 { - action accept - state { - established enable - related enable - } - } - rule 2 { - action drop - log enable - state { - invalid enable - } - } -} -``` - -Here is an example of an IPv6 DMZ-WAN ruleset. - -```none -ipv6-name dmz-wan-6 { - default-action drop - default-log - rule 1 { - action accept - state { - established enable - related enable - } - } - rule 2 { - action drop - log enable - state { - invalid enable - } - rule 100 { - action accept - log enable - protocol ipv6-icmp - } - rule 200 { - action accept - destination { - port 80,443 - } - log enable - protocol tcp - } - rule 300 { - action accept - destination { - port 20,21 - } - log enable - protocol tcp - } - rule 500 { - action accept - destination { - port 25 - } - log enable - protocol tcp - source { - address 2001:db8:0:BBBB::200 - } - } - rule 600 { - action accept - destination { - port 53 - } - log enable - protocol tcp_udp - source { - address 2001:db8:0:BBBB::200 - } - } - rule 800 { - action accept - destination { - port 22 - } - log enable - protocol tcp - } -} -``` - -Once you have all of your rulesets built, then you need to create your -zone-policy. - -Start by setting the interface and default action for each zone. - -```none -set firewall zone dmz default-action drop -set firewall zone dmz interface eth0.30 -``` - -In this case, we are setting the v6 ruleset that represents traffic -sourced from the LAN, destined for the DMZ. Because the zone-policy -firewall syntax is a little awkward, I keep it straight by thinking of -it backwards. - -```none -set firewall zone dmz from lan firewall ipv6-name lan-dmz-6 -``` - -DMZ-LAN policy is LAN-DMZ. You can get a rhythm to it when you build out -a bunch at one time. - -In the end, you will end up with something like this config. I took out -everything but the Firewall, Interfaces, and zone-policy sections. It is -long enough as is. - -## IPv6 Tunnel -If you are using a IPv6 tunnel from HE.net or someone else, the basis is -the same except you have two WAN interfaces. One for v4 and one for v6. - -You would have 5 zones instead of just 4 and you would configure your v6 -ruleset between your tunnel interface and your LAN/DMZ zones instead of -to the WAN. - -LAN, WAN, DMZ, local and TUN (tunnel) - -v6 pairs would be: - -```none -lan-tun -lan-local -lan-dmz -tun-lan -tun-local -tun-dmz -local-lan -local-tun -local-dmz -dmz-lan -dmz-tun -dmz-local -``` - -Notice, none go to WAN since WAN wouldn't have a v6 address on it. - -You would have to add a couple of rules on your wan-local ruleset to -allow protocol 41 in. - -Something like: - -```none -rule 400 { - action accept - destination { - address 172.16.10.1 - } - log enable - protocol 41 - source { - address ip.of.tunnel.broker - } -} -``` diff --git a/docs/configuration/firewall/md-bridge.md b/docs/configuration/firewall/md-bridge.md deleted file mode 100644 index 42442ee7..00000000 --- a/docs/configuration/firewall/md-bridge.md +++ /dev/null @@ -1,673 +0,0 @@ ---- -lastproofread: '2026-03-28' ---- - -(firewall-configuration)= - -# Bridge Firewall Configuration - -## Overview - -Learn more about bridge firewall configuration -and related op-mode commands. - -The following commands are covered in this section: - -```{cfgcmd} set firewall bridge \<options\> -``` -From the main structure defined in -{doc}`Firewall Overview</configuration/firewall/index>` -in this section you can find detailed information only for the next part -of the general structure: -```none -- set firewall - * bridge - - forward - + filter - - input - + filter - - output - + filter - - prerouting - + filter - - name - + custom_name -``` -Traffic that is received by the router on an interface that is a member of a -bridge is processed on the **Bridge Layer**. Before the bridge decision is -made, all packets are analyzed at **Prerouting**. First filters can be applied -here, and also rules for ignoring connection tracking system can be configured. -The relevant configuration that acts in **prerouting** is: - - -- `set firewall bridge prerouting filter ...`. - - -For traffic that needs to be switched internally by the bridge, the base -chain is **forward**, and its base command for filtering is `set firewall -bridge forward filter ...`, which happens in stage 4, highlighted with red -color. - - -:::{figure} /_static/images/firewall-bridge-forward.png -::: - - -For traffic destined to the router itself or that needs to be routed -(assuming a layer3 bridge is configured), the base chain is **input**, and the -base command is `set firewall bridge input filter ...` and the path is: - - -:::{figure} /_static/images/firewall-bridge-input.png -::: - - -If it's not dropped, then the packet is sent to **IP Layer**, and will be -processed by the **IP Layer** firewall: IPv4 or IPv6 ruleset. Check once again -the {doc}`general packet flow diagram</configuration/firewall/index>` if -needed. - - -For traffic that originates from the bridge itself, the base chain is -**output**, and the base command is `set firewall bridge output filter -...`, and the path is: - - -:::{figure} /_static/images/firewall-bridge-output.png -::: - - -Custom bridge firewall chains can be created with the command `set firewall -bridge name <name> ...`. To use such a custom chain, a rule with action jump -and the appropriate target must be defined in a base chain. - - -## Bridge Rules - - -For firewall filtering, firewall rules need to be created. Each rule is -numbered, has an action to apply if the rule is matched, and the ability -to specify multiple matching criteria. Data packets go through the rules -from 1 - 999999, so order is crucial. At the first match the action of the -rule will be executed. - - -### Actions - - -If a rule is defined, an action must also be defined for it. This tells the -firewall what to do if all matching criteria in the rule are met. - - -In firewall bridge rules, the action can be: - - -- `accept`: accept the packet. -- `continue`: continue parsing next rule. -- `drop`: drop the packet. -- `jump`: jump to another custom chain. -- `return`: Return from the current chain and continue at the next rule - of the last chain. -- `queue`: Enqueue packet to userspace. -- `notrack`: ignore connection tracking system. This action is only - available in prerouting chain. -```{cfgcmd} set firewall bridge forward filter rule \<1-999999\> action [accept | continue | drop | jump | queue | return] -``` - -```{cfgcmd} set firewall bridge input filter rule \<1-999999\> action [accept | continue | drop | jump | queue | return] -``` - -```{cfgcmd} set firewall bridge output filter rule \<1-999999\> action [accept | continue | drop | jump | queue | return] -``` - -```{cfgcmd} set firewall bridge prerouting filter rule \<1-999999\> action [accept | continue | drop | jump | notrack | queue | return] -``` - -```{cfgcmd} set firewall bridge name \<name\> rule \<1-999999\> action [accept | continue | drop | jump | queue | return] - - -This required setting defines the action of the current rule. If action is -set to jump, then jump-target is also needed. -``` - -```{cfgcmd} set firewall bridge forward filter rule \<1-999999\> jump-target \<text\> -``` - -```{cfgcmd} set firewall bridge input filter rule \<1-999999\> jump-target \<text\> -``` - -```{cfgcmd} set firewall bridge output filter rule \<1-999999\> jump-target \<text\> -``` - -```{cfgcmd} set firewall bridge prerouting filter rule \<1-999999\> jump-target \<text\> -``` - -```{cfgcmd} set firewall bridge name \<name\> rule \<1-999999\> jump-target \<text\> - - -If action is set to ``queue``, use next command to specify the queue -target. Range is also supported: -``` - -```{cfgcmd} set firewall bridge forward filter rule \<1-999999\> queue \<0-65535\> -``` - -```{cfgcmd} set firewall bridge input filter rule \<1-999999\> queue \<0-65535\> -``` - -```{cfgcmd} set firewall bridge output filter rule \<1-999999\> queue \<0-65535\> -``` - -```{cfgcmd} set firewall bridge prerouting filter rule \<1-999999\> queue \<0-65535\> -``` - -```{cfgcmd} set firewall bridge name \<name\> rule \<1-999999\> queue \<0-65535\> - - -Also, if action is set to ``queue``, use next command to specify the queue -options. Possible options are ``bypass`` and ``fanout``: -``` - -```{cfgcmd} set firewall bridge forward filter rule \<1-999999\> queue-options bypass -``` - -```{cfgcmd} set firewall bridge input filter rule \<1-999999\> queue-options bypass -``` - -```{cfgcmd} set firewall bridge output filter rule \<1-999999\> queue-options bypass -``` - -```{cfgcmd} set firewall bridge prerouting filter rule \<1-999999\> queue-options bypass -``` - -```{cfgcmd} set firewall bridge name \<name\> rule \<1-999999\> queue-options bypass -``` - -```{cfgcmd} set firewall bridge forward filter rule \<1-999999\> queue-options fanout -``` - -```{cfgcmd} set firewall bridge input filter rule \<1-999999\> queue-options fanout -``` - -```{cfgcmd} set firewall bridge output filter rule \<1-999999\> queue-options fanout -``` - -```{cfgcmd} set firewall bridge prerouting filter rule \<1-999999\> queue-options fanout -``` - -```{cfgcmd} set firewall bridge name \<name\> rule \<1-999999\> queue-options fanout -``` -Also, **default-action** is an action that takes place whenever a packet does -not match any rule in its chain. For base chains, possible options for -**default-action** are **accept** or **drop**. -```{cfgcmd} set firewall bridge forward filter default-action [accept | drop] -``` - -```{cfgcmd} set firewall bridge input filter default-action [accept | drop] -``` - -```{cfgcmd} set firewall bridge output filter default-action [accept | drop] -``` - -```{cfgcmd} set firewall bridge prerouting filter default-action [accept | drop] -``` - -```{cfgcmd} set firewall bridge name \<name\> default-action [accept | continue | drop | jump | reject | return] - - -This sets the default action of the rule-set if a packet does not match -any of the rules in that chain. If default-action is set to ``jump``, then -``default-jump-target`` is also needed. Note that for base chains, default -action can only be set to ``accept`` or ``drop``, while on custom chains -more actions are available. -``` - -```{cfgcmd} set firewall bridge name \<name\> default-jump-target \<text\> - -To be used only when ``default-action`` is set to ``jump``. Use this -command to specify jump target for default rule. -``` -:::{note} -**Important note about default-actions:** -If the default action for any base chain is not defined, then the default -action is set to **accept** for that chain. For custom chains, if the -default action is not defined, then the default-action is set to **drop**. -::: - - -### Firewall Logs - - -You can enable logging for every firewall rule. If enabled, other log options -can be configured. -```{cfgcmd} set firewall bridge forward filter rule \<1-999999\> log -``` - -```{cfgcmd} set firewall bridge input filter rule \<1-999999\> log -``` - -```{cfgcmd} set firewall bridge output filter rule \<1-999999\> log -``` - -```{cfgcmd} set firewall bridge prerouting filter rule \<1-999999\> log -``` - -```{cfgcmd} set firewall bridge name \<name\> rule \<1-999999\> log - -Enable logging for the matched packet. If this configuration command is not -present, then the log is not enabled. -``` - -```{cfgcmd} set firewall bridge forward filter default-log -``` - -```{cfgcmd} set firewall bridge input filter default-log -``` - -```{cfgcmd} set firewall bridge output filter default-log -``` - -```{cfgcmd} set firewall bridge prerouting filter default-log -``` - -```{cfgcmd} set firewall bridge name \<name\> default-log - -Use this command to enable the logging of the default action on -the specified chain. -``` - -```{cfgcmd} set firewall bridge forward filter rule \<1-999999\> log-options level [emerg | alert | crit | err | warn | notice | info | debug] -``` - -```{cfgcmd} set firewall bridge input filter rule \<1-999999\> log-options level [emerg | alert | crit | err | warn | notice | info | debug] -``` - -```{cfgcmd} set firewall bridge output filter rule \<1-999999\> log-options level [emerg | alert | crit | err | warn | notice | info | debug] -``` - -```{cfgcmd} set firewall bridge prerouting filter rule \<1-999999\> log-options level [emerg | alert | crit | err | warn | notice | info | debug] -``` - -```{cfgcmd} set firewall bridge name \<name\> rule \<1-999999\> log-options level [emerg | alert | crit | err | warn | notice | info | debug] - - -Define log-level. Only applicable if rule log is enabled. -``` - -```{cfgcmd} set firewall bridge forward filter rule \<1-999999\> log-options group \<0-65535\> -``` - -```{cfgcmd} set firewall bridge input filter rule \<1-999999\> log-options group \<0-65535\> -``` - -```{cfgcmd} set firewall bridge output filter rule \<1-999999\> log-options group \<0-65535\> -``` - -```{cfgcmd} set firewall bridge prerouting filter rule \<1-999999\> log-options group \<0-65535\> -``` - -```{cfgcmd} set firewall bridge name \<name\> rule \<1-999999\> log-options group \<0-65535\> - - -Define the log group to send messages to. Only applicable if rule log is -enabled. -``` - -```{cfgcmd} set firewall bridge forward filter rule \<1-999999\> log-options snapshot-length \<0-9000\> -``` - -```{cfgcmd} set firewall bridge input filter rule \<1-999999\> log-options snapshot-length \<0-9000\> -``` - -```{cfgcmd} set firewall bridge output filter rule \<1-999999\> log-options snapshot-length \<0-9000\> -``` - -```{cfgcmd} set firewall bridge prerouting filter rule \<1-999999\> log-options snapshot-length \<0-9000\> -``` - -```{cfgcmd} set firewall bridge name \<name\> rule \<1-999999\> log-options snapshot-length \<0-9000\> - - -Define length of packet payload to include in netlink message. Only -applicable if rule log is enabled and the log group is defined. -``` - -```{cfgcmd} set firewall bridge forward filter rule \<1-999999\> log-options queue-threshold \<0-65535\> -``` - -```{cfgcmd} set firewall bridge input filter rule \<1-999999\> log-options queue-threshold \<0-65535\> -``` - -```{cfgcmd} set firewall bridge output filter rule \<1-999999\> log-options queue-threshold \<0-65535\> -``` - -```{cfgcmd} set firewall bridge prerouting filter rule \<1-999999\> log-options queue-threshold \<0-65535\> -``` - -```{cfgcmd} set firewall bridge name \<name\> rule \<1-999999\> log-options queue-threshold \<0-65535\> - - -Define the number of packets to queue inside the kernel before sending them -to userspace. Only applicable if rule log is enabled and the log group is -defined. -``` -### Firewall Description - - -You can define a description for reference for every custom chain. -```{cfgcmd} set firewall bridge name \<name\> description \<text\> - -Provide a rule-set description to a custom firewall chain. -``` - -```{cfgcmd} set firewall bridge forward filter rule \<1-999999\> description \<text\> -``` - -```{cfgcmd} set firewall bridge input filter rule \<1-999999\> description \<text\> -``` - -```{cfgcmd} set firewall bridge output filter rule \<1-999999\> description \<text\> -``` - -```{cfgcmd} set firewall bridge prerouting filter rule \<1-999999\> description \<text\> -``` - -```{cfgcmd} set firewall bridge name \<name\> rule \<1-999999\> description \<text\> - - -Provide a description for each rule. -``` -### Rule Status - - -By default, when you define a rule, it is enabled. In some cases, it is -useful to disable the rule instead of removing it. -```{cfgcmd} set firewall bridge forward filter rule \<1-999999\> disable -``` - -```{cfgcmd} set firewall bridge input filter rule \<1-999999\> disable -``` - -```{cfgcmd} set firewall bridge output filter rule \<1-999999\> disable -``` - -```{cfgcmd} set firewall bridge prerouting filter rule \<1-999999\> disable -``` - -```{cfgcmd} set firewall bridge name \<name\> rule \<1-999999\> disable - -Command for disabling a rule but keep it in the configuration. -``` -### Matching criteria - - -There are many matching criteria against which a packet can be tested. Refer -to {doc}`IPv4</configuration/firewall/ipv4>` and -{doc}`IPv6</configuration/firewall/ipv6>` matching criteria for more details. - - -Since bridges operate at layer 2, both matchers for IPv4 and IPv6 are -supported in bridge firewall configuration. Same applies to firewall groups. - - -Same specific matching criteria that can be used in bridge firewall are -described in this section: -```{cfgcmd} set firewall bridge forward filter rule \<1-999999\> ethernet-type [802.1q | 802.1ad | arp | ipv4 | ipv6] -``` - -```{cfgcmd} set firewall bridge input filter rule \<1-999999\> ethernet-type [802.1q | 802.1ad | arp | ipv4 | ipv6] -``` - -```{cfgcmd} set firewall bridge output filter rule \<1-999999\> ethernet-type [802.1q | 802.1ad | arp | ipv4 | ipv6] -``` - -```{cfgcmd} set firewall bridge prerouting filter rule \<1-999999\> ethernet-type [802.1q | 802.1ad | arp | ipv4 | ipv6] -``` - -```{cfgcmd} set firewall bridge name \<name\> rule \<1-999999\> ethernet-type [802.1q | 802.1ad | arp | ipv4 | ipv6] - - -Match based on the Ethernet type of the packet. -``` - -```{cfgcmd} set firewall bridge forward filter rule \<1-999999\> vlan ethernet-type [802.1q | 802.1ad | arp | ipv4 | ipv6] -``` - -```{cfgcmd} set firewall bridge input filter rule \<1-999999\> vlan ethernet-type [802.1q | 802.1ad | arp | ipv4 | ipv6] -``` - -```{cfgcmd} set firewall bridge output filter rule \<1-999999\> vlan ethernet-type [802.1q | 802.1ad | arp | ipv4 | ipv6] -``` - -```{cfgcmd} set firewall bridge prerouting filter rule \<1-999999\> vlan ethernet-type [802.1q | 802.1ad | arp | ipv4 | ipv6] -``` - -```{cfgcmd} set firewall bridge name \<name\> rule \<1-999999\> vlan ethernet-type [802.1q | 802.1ad | arp | ipv4 | ipv6] - - -Match based on the Ethernet type of the packet when it is VLAN tagged. -``` - -```{cfgcmd} set firewall bridge forward filter rule \<1-999999\> vlan id \<0-4096\> -``` - -```{cfgcmd} set firewall bridge input filter rule \<1-999999\> vlan id \<0-4096\> -``` - -```{cfgcmd} set firewall bridge output filter rule \<1-999999\> vlan id \<0-4096\> -``` - -```{cfgcmd} set firewall bridge prerouting filter rule \<1-999999\> vlan id \<0-4096\> -``` - -```{cfgcmd} set firewall bridge name \<name\> rule \<1-999999\> vlan id \<0-4096\> - - -Match based on VLAN identifier. Range is also supported. -``` - -```{cfgcmd} set firewall bridge forward filter rule \<1-999999\> vlan priority \<0-7\> -``` - -```{cfgcmd} set firewall bridge input filter rule \<1-999999\> vlan priority \<0-7\> -``` - -```{cfgcmd} set firewall bridge output filter rule \<1-999999\> vlan priority \<0-7\> -``` - -```{cfgcmd} set firewall bridge prerouting filter rule \<1-999999\> vlan priority \<0-7\> -``` - -```{cfgcmd} set firewall bridge name \<name\> rule \<1-999999\> vlan priority \<0-7\> - - -Match based on VLAN priority (Priority Code Point - PCP). Range is also -supported. -``` -### Packet Modifications - - -Starting from **VyOS-1.5-rolling-202410060007**, the firewall can modify -packets before they are sent out. This feaure provides more flexibility in -packet handling. -```{cfgcmd} set firewall bridge [prerouting | forward | output] filter rule \<1-999999\> set dscp \<0-63\> - - -Set a specific value of Differentiated Services Codepoint (DSCP). -``` - -```{cfgcmd} set firewall bridge [prerouting | forward | output] filter rule \<1-999999\> set mark \<1-2147483647\> - - -Set a specific packet mark value. -``` - -```{cfgcmd} set firewall bridge [prerouting | forward | output] filter rule \<1-999999\> set tcp-mss \<500-1460\> - - -Set the TCP-MSS (TCP maximum segment size) for the connection. -``` - -```{cfgcmd} set firewall bridge [prerouting | forward | output] filter rule \<1-999999\> set ttl \<0-255\> - - -Set the TTL (Time to Live) value. -``` - -```{cfgcmd} set firewall bridge [prerouting | forward | output] filter rule \<1-999999\> set hop-limit \<0-255\> - - -Set hop limit value. -``` - -```{cfgcmd} set firewall bridge [forward | output] filter rule \<1-999999\> set connection-mark \<0-2147483647\> - - -Set connection mark value. -``` -### Use IP firewall - -By default, for switched traffic, only the rules defined under `set firewall -bridge` are applied. There are two global-options that can be configured in -order to force deeper analysis of the packet on the IP layer. These options -are: -```{cfgcmd} set firewall global-options apply-to-bridged-traffic ipv4 - -This command enables the IPv4 firewall for bridged traffic. If this option -is used, packets are also parsed by rules defined in ``set firewall ipv4 -...`` -``` - -```{cfgcmd} set firewall global-options apply-to-bridged-traffic ipv6 - -This command enables the IPv6 firewall for bridged traffic. If this option -is used, packets are also parsed by rules defined in ``set firewall ipv6 -...`` -``` -## Operation-mode Firewall -### Rule-set overview -In this section you can find all useful firewall op-mode commands. -General commands for firewall configuration, counter and statistics: -```{opcmd} show firewall -``` - -```{opcmd} show firewall summary -``` - -```{opcmd} show firewall statistics -``` -And, to print only bridge firewall information: -```{opcmd} show firewall bridge -``` - -```{opcmd} show firewall bridge forward filter -``` - -```{opcmd} show firewall bridge forward filter rule \<rule\> -``` - -```{opcmd} show firewall bridge name \<name\> -``` - -```{opcmd} show firewall bridge name \<name\> rule \<rule\> -``` -### Show Firewall log -```{opcmd} show log firewall -``` - -```{opcmd} show log firewall bridge -``` - -```{opcmd} show log firewall bridge forward -``` - -```{opcmd} show log firewall bridge forward filter -``` - -```{opcmd} show log firewall bridge name \<name\> -``` - -```{opcmd} show log firewall bridge forward filter rule \<rule\> -``` - -```{opcmd} show log firewall bridge name \<name\> rule \<rule\> - -Show the logs of all firewall; show all bridge firewall logs; show all logs -for forward hook; show all logs for forward hook and priority filter; show -all logs for particular custom chain; show logs for specific Rule-Set. -``` -### Example -Configuration example: -```none -set firewall bridge forward filter default-action 'drop' -set firewall bridge forward filter default-log -set firewall bridge forward filter rule 10 action 'continue' -set firewall bridge forward filter rule 10 inbound-interface name 'eth2' -set firewall bridge forward filter rule 10 vlan id '22' -set firewall bridge forward filter rule 20 action 'drop' -set firewall bridge forward filter rule 20 inbound-interface group 'TRUNK-RIGHT' -set firewall bridge forward filter rule 20 vlan id '60' -set firewall bridge forward filter rule 30 action 'jump' -set firewall bridge forward filter rule 30 jump-target 'TEST' -set firewall bridge forward filter rule 30 outbound-interface name '!eth1' -set firewall bridge forward filter rule 35 action 'accept' -set firewall bridge forward filter rule 35 vlan id '11' -set firewall bridge forward filter rule 40 action 'continue' -set firewall bridge forward filter rule 40 destination mac-address '66:55:44:33:22:11' -set firewall bridge forward filter rule 40 source mac-address '11:22:33:44:55:66' -set firewall bridge name TEST default-action 'accept' -set firewall bridge name TEST default-log -set firewall bridge name TEST rule 10 action 'continue' -set firewall bridge name TEST rule 10 log -set firewall bridge name TEST rule 10 vlan priority '0' -``` -And op-mode commands: -```none -vyos@BRI:~$ show firewall bridge -Rulesets bridge Information - ---------------------------------- -bridge Firewall "forward filter" - -Rule Action Protocol Packets Bytes Conditions -------- -------- ---------- --------- ------- --------------------------------------------------------------------- -10 continue all 0 0 iifname "eth2" vlan id 22 continue -20 drop all 0 0 iifname @I_TRUNK-RIGHT vlan id 60 -30 jump all 2130 170688 oifname != "eth1" jump NAME_TEST -35 accept all 2080 168616 vlan id 11 accept -40 continue all 0 0 ether daddr 66:55:44:33:22:11 ether saddr 11:22:33:44:55:66 continue -default drop all 0 0 - ---------------------------------- -bridge Firewall "name TEST" - -Rule Action Protocol Packets Bytes Conditions -------- -------- ---------- --------- ------- -------------------------------------------------- -10 continue all 2130 170688 vlan pcp 0 prefix "[bri-NAM-TEST-10-C]" continue -default accept all 2130 170688 - -vyos@BRI:~$ -vyos@BRI:~$ show firewall bridge name TEST -Ruleset Information - ---------------------------------- -bridge Firewall "name TEST" - -Rule Action Protocol Packets Bytes Conditions -------- -------- ---------- --------- ------- -------------------------------------------------- -10 continue all 2130 170688 vlan pcp 0 prefix "[bri-NAM-TEST-10-C]" continue -default accept all 2130 170688 - -vyos@BRI:~$ -``` -Inspect logs: -```none -vyos@BRI:~$ show log firewall bridge -Dec 05 14:37:47 kernel: [bri-NAM-TEST-10-C]IN=eth1 OUT=eth2 ARP HTYPE=1 PTYPE=0x0800 OPCODE=1 MACSRC=50:00:00:04:00:00 IPSRC=10.11.11.101 MACDST=00:00:00:00:00:00 IPDST=10.11.11.102 -Dec 05 14:37:48 kernel: [bri-NAM-TEST-10-C]IN=eth1 OUT=eth2 ARP HTYPE=1 PTYPE=0x0800 OPCODE=1 MACSRC=50:00:00:04:00:00 IPSRC=10.11.11.101 MACDST=00:00:00:00:00:00 IPDST=10.11.11.102 -Dec 05 14:37:49 kernel: [bri-NAM-TEST-10-C]IN=eth1 OUT=eth2 ARP HTYPE=1 PTYPE=0x0800 OPCODE=1 MACSRC=50:00:00:04:00:00 IPSRC=10.11.11.101 MACDST=00:00:00:00:00:00 IPDST=10.11.11.102 -... -vyos@BRI:~$ show log firewall bridge forward filter -Dec 05 14:42:22 kernel: [bri-FWD-filter-default-D]IN=eth2 OUT=eth1 MAC=33:33:00:00:00:16:50:00:00:06:00:00:86:dd SRC=0000:0000:0000:0000:0000:0000:0000:0000 DST=ff02:0000:0000:0000:0000:0000:0000:0016 LEN=96 TC=0 HOPLIMIT=1 FLOWLBL=0 PROTO=ICMPv6 TYPE=143 CODE=0 -Dec 05 14:42:22 kernel: [bri-FWD-filter-default-D]IN=eth2 OUT=eth1 MAC=33:33:00:00:00:16:50:00:00:06:00:00:86:dd SRC=0000:0000:0000:0000:0000:0000:0000:0000 DST=ff02:0000:0000:0000:0000:0000:0000:0016 LEN=96 TC=0 HOPLIMIT=1 FLOWLBL=0 PROTO=ICMPv6 TYPE=143 CODE=0 -``` diff --git a/docs/configuration/firewall/md-global-options.md b/docs/configuration/firewall/md-global-options.md deleted file mode 100644 index 3a480472..00000000 --- a/docs/configuration/firewall/md-global-options.md +++ /dev/null @@ -1,214 +0,0 @@ ---- -lastproofread: '2026-03-30' ---- - -(firewall-global-options-configuration)= - -# Global Options Firewall Configuration - -## Overview - -Some firewall settings are global and affect the entire system. This section -provides information about these global options that you can configure using -the VyOS CLI. - -Configuration commands covered in this section: - -```{cfgcmd} set firewall global-options ... -``` -## Configuration -```{cfgcmd} set firewall global-options all-ping [enable | disable] - -By default, when VyOS receives an ICMP echo request packet destined for -itself, it answers with an ICMP echo reply, unless your firewall prevents -it. - -You can set firewall rules to accept, drop, or reject ICMP in, out, or -local traffic. You can also use the **firewall global-options all-ping** -command. This command affects only LOCAL traffic (packets destined for your -VyOS system), not IN or OUT traffic. - -:::{note} -**firewall global-options all-ping** affects only LOCAL traffic -and always behaves in the most restrictive way -::: -:::{code-block} none -set firewall global-options all-ping enable -::: -When you set this command, VyOS answers every ICMP echo request addressed -to itself, but that response occurs only if no other rule drops or rejects -local echo requests. In case of conflict, VyOS does not answer ICMP echo -requests. - -:::{code-block} none -set firewall global-options all-ping disable -::: -When you set this command, VyOS answers no ICMP echo requests addressed to -itself, regardless of where they come from or what specific rules accept -them. -``` - -```{cfgcmd} set firewall global-options apply-to-bridged-traffic [ipv4 | ipv6] - -Apply IPv4 or IPv6 firewall rules to bridged traffic. -``` - -```{cfgcmd} set firewall global-options broadcast-ping [enable | disable] - -Enable or disable the response to ICMP broadcast messages. The system -alters the following parameter: -* ``net.ipv4.icmp_echo_ignore_broadcasts`` -``` - -```{cfgcmd} set firewall global-options ip-src-route [enable | disable] -``` - -```{cfgcmd} set firewall global-options ipv6-src-route [enable | disable] - -Set whether VyOS accepts packets with a source route option. -The following sysctl parameters will be changed: -* ``net.ipv4.conf.all.accept_source_route`` -* ``net.ipv6.conf.all.accept_source_route`` -``` - -```{cfgcmd} set firewall global-options receive-redirects [enable | disable] -``` - -```{cfgcmd} set firewall global-options ipv6-receive-redirects [enable | disable] - -Allow VyOS to accept ICMPv4 and ICMPv6 redirect messages. -The following sysctl parameters will be changed: -* ``net.ipv4.conf.all.accept_redirects`` -* ``net.ipv6.conf.all.accept_redirects`` -``` - -```{cfgcmd} set firewall global-options send-redirects [enable | disable] - -Allow VyOS to send ICMPv4 redirect messages. -The following sysctl parameter will be changed: -* ``net.ipv4.conf.all.send_redirects`` -``` - -```{cfgcmd} set firewall global-options log-martians [enable | disable] - -Allow VyOS to log martian IPv4 packets. -The following sysctl parameter will be changed: -* ``net.ipv4.conf.all.log_martians`` -``` - -```{cfgcmd} set firewall global-options source-validation [strict | loose | disable] - -Set the IPv4 source validation mode. -The following sysctl parameter will be changed: -* ``net.ipv4.conf.all.rp_filter`` -``` - -```{cfgcmd} set firewall global-options syn-cookies [enable | disable] - -Allow VyOS to use IPv4 TCP SYN Cookies. -The following sysctl parameter will be changed: -* ``net.ipv4.tcp_syncookies`` -``` - -```{cfgcmd} set firewall global-options twa-hazards-protection [enable | disable] - -Enable or disable VyOS {rfc}`1337` conformance. -The following sysctl parameter will be changed: -* ``net.ipv4.tcp_rfc1337`` -``` - -```{cfgcmd} set firewall global-options state-policy established action [accept | drop | reject] -``` - -```{cfgcmd} set firewall global-options state-policy established log -``` - -```{cfgcmd} set firewall global-options state-policy established log-level [emerg | alert | crit | err | warn | notice | info | debug] - -Set the global setting for an established connection. -``` - -```{cfgcmd} set firewall global-options state-policy invalid action [accept | drop | reject] -``` - -```{cfgcmd} set firewall global-options state-policy invalid log -``` - -```{cfgcmd} set firewall global-options state-policy invalid log-level [emerg | alert | crit | err | warn | notice | info | debug] - -Set the global setting for invalid packets. -``` - -```{cfgcmd} set firewall global-options state-policy related action [accept | drop | reject] -``` - -```{cfgcmd} set firewall global-options state-policy related log -``` - -```{cfgcmd} set firewall global-options state-policy related log-level [emerg | alert | crit | err | warn | notice | info | debug] - -Set the global setting for related connections. -``` -VyOS supports setting timeouts for connections by connection type. You can -set timeout values for generic connections, ICMP connections, UDP -connections, or TCP connections in various states. -```{cfgcmd} set firewall global-options timeout icmp \<1-21474836\> - -:defaultvalue: -``` - -```{cfgcmd} set firewall global-options timeout other \<1-21474836\> - -:defaultvalue: -``` - -```{cfgcmd} set firewall global-options timeout tcp close \<1-21474836\> - -:defaultvalue: -``` - -```{cfgcmd} set firewall global-options timeout tcp close-wait \<1-21474836\> - -:defaultvalue: -``` - -```{cfgcmd} set firewall global-options timeout tcp established \<1-21474836\> - -:defaultvalue: -``` - -```{cfgcmd} set firewall global-options timeout tcp fin-wait \<1-21474836\> - -:defaultvalue: -``` - -```{cfgcmd} set firewall global-options timeout tcp last-ack \<1-21474836\> - -:defaultvalue: -``` - -```{cfgcmd} set firewall global-options timeout tcp syn-recv \<1-21474836\> - -:defaultvalue: -``` - -```{cfgcmd} set firewall global-options timeout tcp syn-sent \<1-21474836\> - -:defaultvalue: -``` - -```{cfgcmd} set firewall global-options timeout tcp time-wait \<1-21474836\> - -:defaultvalue: -``` - -```{cfgcmd} set firewall global-options timeout udp other \<1-21474836\> - -:defaultvalue: -``` - -```{cfgcmd} set firewall global-options timeout udp stream \<1-21474836\> -:defaultvalue: - -Set the timeout in seconds for a protocol or state. -```
\ No newline at end of file diff --git a/docs/configuration/firewall/md-groups.md b/docs/configuration/firewall/md-groups.md deleted file mode 100644 index 2e4bdec1..00000000 --- a/docs/configuration/firewall/md-groups.md +++ /dev/null @@ -1,419 +0,0 @@ ---- -lastproofread: '2026-03-30' ---- - -(firewall-groups-configuration)= - -# Firewall groups - -## Configuration - -Firewall groups represent collections of IP addresses, networks, ports, -MAC addresses, domains, or interfaces. You can reference a group in firewall, -NAT, and policy route rules as either a source or destination matcher, and/or -as inbound or outbound in the case of interface groups. - -### Address Groups - -An **address group** contains a single IP address or IP address range. - -```{cfgcmd} set firewall group address-group \<name\> address [address | address range] - -``` -```{cfgcmd} set firewall group ipv6-address-group \<name\> address \<address\> - -Define an IPv4 or IPv6 address group. - -:::{code-block} none -set firewall group address-group ADR-INSIDE-v4 address 192.168.0.1 -set firewall group address-group ADR-INSIDE-v4 address 10.0.0.1-10.0.0.8 -set firewall group ipv6-address-group ADR-INSIDE-v6 address 2001:db8::1 -::: -``` - -```{cfgcmd} set firewall group address-group \<name\> description \<text\> -``` - -```{cfgcmd} set firewall group ipv6-address-group \<name\> description \<text\> - -Provide an IPv4 or IPv6 address group description. -``` -### Remote Groups -A **remote-group** uses a URL that hosts a newline-delimited list of IPv4 -and/or IPv6 addresses, CIDRs, and ranges. VyOS pulls this list periodically -according to the frequency you define in the firewall **resolver-interval** -and loads matching entries into the group for use in rules. The list is cached -in persistent storage, so rules continue to function if updates fail. -```{cfgcmd} set firewall group remote-group \<name\> url \<http(s) url\> - -Specify a remote list of IPv4 and/or IPv6 addresses, ranges, and CIDRs -to fetch. -``` - -```{cfgcmd} set firewall group remote-group \<name\> description \<text\> - -Set a description for a remote group. -``` -The remote list format is flexible. VyOS attempts to parse the first word of -each line as an entry and skips lines it cannot match. Lines that begin with -an alphanumeric character but do not match valid IPv4 or IPv6 addresses, -ranges, or CIDRs are logged to the system log. The following examples show -acceptable formats that VyOS parses correctly: -```none -127.0.0.1 -127.0.0.0/24 -127.0.0.1-127.0.0.254 -2001:db8::1 -2001:db8:cafe::/48 -2001:db8:cafe::1-2001:db8:cafe::ffff -``` -### Network Groups -**Network groups** accept IP networks in CIDR notation. You can add specific -IP addresses as a 32-bit prefix. If you need to add a mix of addresses and -networks, use a network group. -```{cfgcmd} set firewall group network-group \<name\> network \<CIDR\> -``` - -```{cfgcmd} set firewall group ipv6-network-group \<name\> network \<CIDR\> - -Define an IPv4 or IPv6 network group. - -:::{code-block} none -set firewall group network-group NET-INSIDE-v4 network 192.168.0.0/24 -set firewall group network-group NET-INSIDE-v4 network 192.168.1.0/24 -set firewall group ipv6-network-group NET-INSIDE-v6 network 2001:db8::/64 -::: -``` - -```{cfgcmd} set firewall group network-group \<name\> description \<text\> -``` - -```{cfgcmd} set firewall group ipv6-network-group \<name\> description \<text\> - -Provide an IPv4 or IPv6 network group description. -``` -### Interface Groups -An **interface group** represents a collection of interfaces. -```{cfgcmd} set firewall group interface-group \<name\> interface \<text\> - -Define an interface group. -Wildcard ``*`` is supported. For example: ``eth3*``. -Prepend the character ``!`` to invert the criteria. For example: ``!eth2``. -``` - -```none -set firewall group interface-group LAN interface bond1001 -set firewall group interface-group LAN interface eth3* -``` - -```{cfgcmd} set firewall group interface-group \<name\> description \<text\> - -Provide an interface group description. -``` -### Port Groups -A **port group** represents only port numbers, not the protocol. You can -reference port groups for either TCP or UDP. Create TCP and UDP groups -separately to avoid accidentally filtering unnecessary ports. Specify port -ranges by using `-`. -```{cfgcmd} set firewall group port-group \<name\> port [portname | portnumber | startport-endport] - -Define a port group. A port name can be any name defined in -/etc/services. For example, ``http``. - -:::{code-block} none -set firewall group port-group PORT-TCP-SERVER1 port http -set firewall group port-group PORT-TCP-SERVER1 port 443 -set firewall group port-group PORT-TCP-SERVER1 port 5000-5010 -::: -``` - -```{cfgcmd} set firewall group port-group \<name\> description \<text\> - -Provide a port group description. -``` -### MAC Groups -A **mac group** represents a collection of mac addresses. -```{cfgcmd} set firewall group mac-group \<name\> mac-address \<mac-address\> - -Define a mac group. -``` - -```none -set firewall group mac-group MAC-G01 mac-address 88:a4:c2:15:b6:4f -set firewall group mac-group MAC-G01 mac-address 4c:d5:77:c0:19:81 -``` - -```{cfgcmd} set firewall group mac-group \<name\> description \<text\> - -Provide a MAC group description. -``` -### Domain Groups -A **domain group** represents a collection of domains. -```{cfgcmd} set firewall group domain-group \<name\> address \<domain\> - -Define a domain group. -``` - -```none -set firewall group domain-group DOM address example.com -``` - -```{cfgcmd} set firewall group domain-group \<name\> description \<text\> - -Provide a domain group description. -``` -### Dynamic Groups -Firewall dynamic groups differ from other groups because you can use them as -source/destination in firewall rules, and members are not defined statically -in VyOS configuration. Instead, firewall rules dynamically add members to -these groups. - -#### Defining Dynamic Address Groups -Dynamic address groups support both IPv4 and IPv6 families. Use these -commands to define dynamic IPv4 and IPv6 address groups: -```{cfgcmd} set firewall group dynamic-group address-group \<name\> -``` - -```{cfgcmd} set firewall group dynamic-group ipv6-address-group \<name\> -``` -Add description to firewall groups: -```{cfgcmd} set firewall group dynamic-group address-group \<name\> description <text> -``` - -```{cfgcmd} set firewall group dynamic-group ipv6-address-group \<name\> description <text> -``` -#### Adding elements to Dynamic Firewall Groups -After you define dynamic firewall groups, use them in firewall rules to -dynamically add elements to them. - -Commands used for this task are: -- Add destination IP address of the connection to a dynamic address group: -```{cfgcmd} set firewall ipv4 [forward | input | output] filter rule \<1-999999\> add-address-to-group destination-address address-group \<name\> -``` - -```{cfgcmd} set firewall ipv4 name \<name\> rule \<1-999999\> add-address-to-group destination-address address-group <name> -``` - -```{cfgcmd} set firewall ipv6 [forward | input | output] filter rule \<1-999999\> add-address-to-group destination-address address-group \<name\> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> add-address-to-group destination-address address-group <name> -``` -- Add source IP address of the connection to a dynamic address group: -```{cfgcmd} set firewall ipv4 [forward | input | output] filter rule \<1-999999\> add-address-to-group source-address address-group \<name\> -``` - -```{cfgcmd} set firewall ipv4 name \<name\> rule \<1-999999\> add-address-to-group source-address address-group <name> -``` - -```{cfgcmd} set firewall ipv6 [forward | input | output] filter rule \<1-999999\> add-address-to-group source-address address-group \<name\> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> add-address-to-group source-address address-group <name> -``` -You can define specific timeouts per rule. When a rule matches, the source or -destination address is added to the group, and the element remains in the group -until the timeout expires. If you do not define a timeout, the element remains -in the group until the next reboot or until you commit firewall configuration -changes. -```{cfgcmd} set firewall ipv4 [forward | input | output] filter rule \<1-999999\> add-address-to-group [destination-address | source-address] timeout <timeout> -``` - -```{cfgcmd} set firewall ipv4 name \<name\> rule \<1-999999\> add-address-to-group [destination-address | source-address] timeout \<timeout\> -``` - -```{cfgcmd} set firewall ipv6 [forward | input | output] filter rule \<1-999999\> add-address-to-group [destination-address | source-address] timeout <timeout> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> add-address-to-group [destination-address | source-address] timeout \<timeout\> -``` -Timeout can be defined using seconds, minutes, hours or days: -```none -set firewall ipv6 name FOO rule 10 add-address-to-group source-address timeout -Possible completions: -<number>s Timeout value in seconds -<number>m Timeout value in minutes -<number>h Timeout value in hours -<number>d Timeout value in days -``` -#### Using Dynamic Firewall Groups -Like other firewall groups, you can use dynamic firewall groups in firewall -rules as matching options. For example: -```none -set firewall ipv4 input filter rule 10 source group dynamic-address-group FOO -set firewall ipv4 input filter rule 10 destination group dynamic-address-group BAR -``` -## Examples - -### General example -After you create firewall groups, you can reference them in firewall, NAT, -NAT66, and/or policy-route rules. The following example creates multiple -groups: -```none -set firewall group address-group SERVERS address 198.51.100.101 -set firewall group address-group SERVERS address 198.51.100.102 -set firewall group network-group TRUSTEDv4 network 192.0.2.0/30 -set firewall group network-group TRUSTEDv4 network 203.0.113.128/25 -set firewall group ipv6-network-group TRUSTEDv6 network 2001:db8::/64 -set firewall group interface-group LAN interface eth2.2001 -set firewall group interface-group LAN interface bon0 -set firewall group port-group PORT-SERVERS port http -set firewall group port-group PORT-SERVERS port 443 -set firewall group port-group PORT-SERVERS port 5000-5010 -``` -And next, some configuration example where groups are used: -```none -set firewall ipv4 output filter rule 10 action accept -set firewall ipv4 output filter rule 10 outbound-interface group !LAN -set firewall ipv4 forward filter rule 20 action accept -set firewall ipv4 forward filter rule 20 source group network-group TRUSTEDv4 -set firewall ipv6 input filter rule 10 action accept -set firewall ipv6 input filter rule 10 source group network-group TRUSTEDv6 -set nat destination rule 101 inbound-interface group LAN -set nat destination rule 101 destination group address-group SERVERS -set nat destination rule 101 protocol tcp -set nat destination rule 101 destination group port-group PORT-SERVERS -set nat destination rule 101 translation address 203.0.113.250 -set policy route PBR rule 201 destination group port-group PORT-SERVERS -set policy route PBR rule 201 protocol tcp -set policy route PBR rule 201 set table 15 -``` -### Port knocking example -You can use dynamic firewall groups with port knocking to secure access to -the router or any other device. The following example shows a 4-step port -knocking configuration: -```none -set firewall global-options state-policy established action 'accept' -set firewall global-options state-policy invalid action 'drop' -set firewall global-options state-policy related action 'accept' -set firewall group dynamic-group address-group ALLOWED -set firewall group dynamic-group address-group PN_01 -set firewall group dynamic-group address-group PN_02 -set firewall ipv4 input filter default-action 'drop' -set firewall ipv4 input filter rule 5 action 'accept' -set firewall ipv4 input filter rule 5 protocol 'icmp' -set firewall ipv4 input filter rule 10 action 'drop' -set firewall ipv4 input filter rule 10 add-address-to-group source-address address-group 'PN_01' -set firewall ipv4 input filter rule 10 add-address-to-group source-address timeout '2m' -set firewall ipv4 input filter rule 10 description 'Port_nock 01' -set firewall ipv4 input filter rule 10 destination port '9990' -set firewall ipv4 input filter rule 10 protocol 'tcp' -set firewall ipv4 input filter rule 20 action 'drop' -set firewall ipv4 input filter rule 20 add-address-to-group source-address address-group 'PN_02' -set firewall ipv4 input filter rule 20 add-address-to-group source-address timeout '3m' -set firewall ipv4 input filter rule 20 description 'Port_nock 02' -set firewall ipv4 input filter rule 20 destination port '9991' -set firewall ipv4 input filter rule 20 protocol 'tcp' -set firewall ipv4 input filter rule 20 source group dynamic-address-group 'PN_01' -set firewall ipv4 input filter rule 30 action 'drop' -set firewall ipv4 input filter rule 30 add-address-to-group source-address address-group 'ALLOWED' -set firewall ipv4 input filter rule 30 add-address-to-group source-address timeout '2h' -set firewall ipv4 input filter rule 30 description 'Port_nock 03' -set firewall ipv4 input filter rule 30 destination port '9992' -set firewall ipv4 input filter rule 30 protocol 'tcp' -set firewall ipv4 input filter rule 30 source group dynamic-address-group 'PN_02' -set firewall ipv4 input filter rule 99 action 'accept' -set firewall ipv4 input filter rule 99 description 'Port_nock 04 - Allow ssh' -set firewall ipv4 input filter rule 99 destination port '22' -set firewall ipv4 input filter rule 99 protocol 'tcp' -set firewall ipv4 input filter rule 99 source group dynamic-address-group 'ALLOWED' -``` -Before testing, we can check the members of firewall groups: -```none -vyos@vyos# run show firewall group -Firewall Groups - -Name Type References Members Timeout Expires -------- ---------------------- -------------------- ------------- --------- --------- -ALLOWED address_group(dynamic) ipv4-input-filter-30 N/D N/D N/D -PN_01 address_group(dynamic) ipv4-input-filter-10 N/D N/D N/D -PN_02 address_group(dynamic) ipv4-input-filter-20 N/D N/D N/D -[edit] -vyos@vyos# -``` -With this configuration, to gain SSH access to the router, the user must: - -1. Create a new TCP connection to destination port 9990. A new entry is added - to dynamic firewall group `PN_01`. - - ```none - vyos@vyos# run show firewall group - Firewall Groups - - Name Type References Members Timeout Expires - ------- ---------------------- -------------------- ------------- --------- --------- - ALLOWED address_group(dynamic) ipv4-input-filter-30 N/D N/D N/D - PN_01 address_group(dynamic) ipv4-input-filter-10 192.168.89.31 120 119 - PN_02 address_group(dynamic) ipv4-input-filter-20 N/D N/D N/D - [edit] - vyos@vyos# - ``` - -2. Create a new TCP connection to destination port 9991. A new entry is added - to dynamic firewall group `PN_02`. - - ```none - vyos@vyos# run show firewall group - Firewall Groups - - Name Type References Members Timeout Expires - ------- ---------------------- -------------------- ------------- --------- --------- - ALLOWED address_group(dynamic) ipv4-input-filter-30 N/D N/D N/D - PN_01 address_group(dynamic) ipv4-input-filter-10 192.168.89.31 120 106 - PN_02 address_group(dynamic) ipv4-input-filter-20 192.168.89.31 180 179 - [edit] - vyos@vyos# - ``` - -3. Create a new TCP connection to destination port 9992. A new entry is added - to dynamic firewall group `ALLOWED`. - - ```none - vyos@vyos# run show firewall group - Firewall Groups - - Name Type References Members Timeout Expires - ------- ---------------------- -------------------- ------------- --------- --------- - ALLOWED address_group(dynamic) ipv4-input-filter-30 192.168.89.31 7200 7199 - PN_01 address_group(dynamic) ipv4-input-filter-10 192.168.89.31 120 89 - PN_02 address_group(dynamic) ipv4-input-filter-20 192.168.89.31 180 170 - [edit] - vyos@vyos# - ``` - -4. Now you can connect via SSH to the router (assuming SSH is - configured). - -## Operation-mode -```{opcmd} show firewall group -``` - -```{opcmd} show firewall group \<name\> - -Display an overview of defined groups, including the firewall group name, -type, references (where the group is used), members, timeout, and -expiration (the last two only apply to dynamic firewall groups). -``` -Here is an example of such command: -```none -vyos@vyos:~$ show firewall group -Firewall Groups - -Name Type References Members Timeout Expires ------------- ---------------------- ---------------------- ---------------- --------- --------- -SERVERS address_group nat-destination-101 198.51.100.101 - 198.51.100.102 -ALLOWED address_group(dynamic) ipv4-input-filter-30 192.168.77.39 7200 7174 -PN_01 address_group(dynamic) ipv4-input-filter-10 192.168.0.245 120 112 - 192.168.77.39 120 85 -PN_02 address_group(dynamic) ipv4-input-filter-20 192.168.77.39 180 151 -LAN interface_group ipv4-output-filter-10 bon0 - nat-destination-101 eth2.2001 -TRUSTEDv6 ipv6_network_group ipv6-input-filter-10 2001:db8::/64 -TRUSTEDv4 network_group ipv4-forward-filter-20 192.0.2.0/30 - 203.0.113.128/25 -PORT-SERVERS port_group route-PBR-201 443 - route-PBR-201 5000-5010 - nat-destination-101 http -vyos@vyos:~$ -``` diff --git a/docs/configuration/firewall/md-ipv6.md b/docs/configuration/firewall/md-ipv6.md deleted file mode 100644 index bbbaec16..00000000 --- a/docs/configuration/firewall/md-ipv6.md +++ /dev/null @@ -1,1624 +0,0 @@ ---- -lastproofread: '2026-04-01' ---- - -(firewall-ipv6-configuration)= - -# IPv6 Firewall Configuration - -## Overview - -This section covers useful information about IPv6 firewall configuration and -appropriate operation-mode commands. - -This section describes the following configuration commands: - -```{cfgcmd} set firewall ipv6 ... -``` -To learn about the general traffic flow in VyOS firewalls, see {doc}`Firewall </configuration/firewall/index>`. -```none -- set firewall - * ipv6 - - forward - + filter - - input - + filter - - output - + filter - + raw - - prerouting - + raw - - name - + custom_name -``` -The router first receives all traffic and processes it in the **prerouting** -section. - - -This stage includes: - - -- **Firewall Prerouting**: commands found under `set firewall ipv6 - prerouting raw ...` -- {doc}`Conntrack Ignore</configuration/system/conntrack>`: `set system - conntrack ignore ipv6...` -- {doc}`Policy Route</configuration/policy/route>`: commands found under - `set policy route6 ...` -- {doc}`Destination NAT</configuration/nat/nat44>`: commands found under - `set nat66 destination ...` - - -For transit traffic that the router receives and forwards, the base chain is -**forward**. The following diagram shows a simplified packet flow for transit -traffic: - - -:::{figure} /_static/images/firewall-fwd-packet-flow.png -::: - - -Use `set firewall ipv6 forward filter ...` to configure filtering rules for -transit traffic. This command corresponds to stage 5 and is highlighted in red -in the diagram. - - -For traffic destined to the router, use the **input** chain. For traffic the -router generates, use the **output** chain. The following diagram shows the -packet flow for traffic destined to the router and traffic generated by the -router (starting from circle number 6): - - -:::{figure} /_static/images/firewall-input-packet-flow.png -::: - - -Use `set firewall ipv6 input filter ...` to configure traffic destined to -the router. - - -Use `set firewall ipv6 output ...` to configure traffic the router generates. -Two sub-chains are available: **filter** and **raw**: - - -- **Output Prerouting**: `set firewall ipv6 output raw ...`. - As described in **Prerouting**, the firewall processes rules in this - section before the connection tracking subsystem. -- **Output Filter**: `set firewall ipv6 output filter ...`. The firewall - processes rules in this section after the connection tracking subsystem. - - -:::{note} -**Important note about default-actions:** -If you do not define a default action for a base chain, the system sets -the default action to **accept** for that chain. For custom chains, if you -do not define a default action, the system sets the default-action to -**drop** -::: - - -Create custom firewall chains using the commands -`set firewall ipv6 name <name> ...`. To use the custom chain, define a -rule with **action jump** and the appropriate **target** in a base chain. - - -## Firewall - IPv6 Rules - - -Create firewall rules for firewall filtering. Each rule is numbered and has -an action to apply when the rule is matched. You can specify multiple matching -criteria. Packets go through rules from 1 - 999999, so order is crucial. The -firewall executes the action of the first matching rule. - - -### Actions - - -If you define a rule, you must define an action for it. The action tells the -firewall what to do when all criteria for that rule are met. - - -The action can be : - - -- `accept`: accept the packet. -- `continue`: continue parsing next rule. -- `drop`: drop the packet. -- `reject`: reject the packet. -- `jump`: jump to another custom chain. -- `return`: Return from the current chain and continue at the next rule - of the last chain. -- `queue`: Enqueue packet to userspace. -- `synproxy`: synproxy the packet. -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> action [accept | continue | drop | jump | queue | reject | return | synproxy] -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> action [accept | continue | drop | jump | queue | reject | return | synproxy] -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> action [accept | continue | drop | jump | queue | reject | return] -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> action [accept | continue | drop | jump | queue | reject | return] - - -This required setting defines the action of the current rule. If you set -the action to jump, you must also define a jump-target. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> jump-target <text> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> jump-target <text> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> jump-target <text> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> jump-target <text> - - -Use this command only when action is set to ``jump``. Specify the jump -target. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> queue <0-65535> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> queue <0-65535> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> queue <0-65535> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> queue <0-65535> - - -Use this command only when action is set to ``queue``. Specify the queue -target. Queue ranges are also supported. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> queue-options bypass -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> queue-options bypass -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> queue-options bypass -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> queue-options bypass - - -Use this command only when action is set to ``queue``. This command allows -the packet to go through the firewall when no userspace software is connected -to the queue. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> queue-options fanout -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> queue-options fanout -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> queue-options fanout -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> queue-options fanout - - -Use this command only when action is set to ``queue``. This command -distributes packets among multiple queues. -``` -Also, **default-action** is an action that takes place whenever a packet does -not match any rule in its chain. For base chains, possible options for -**default-action** are **accept** or **drop**. -```{cfgcmd} set firewall ipv6 forward filter default-action [accept | drop] -``` - -```{cfgcmd} set firewall ipv6 input filter default-action [accept | drop] -``` - -```{cfgcmd} set firewall ipv6 output filter default-action [accept | drop] -``` - -```{cfgcmd} set firewall ipv6 name \<name\> default-action [accept | drop | jump | queue | reject | return] - - -Set the default action of the rule-set if a packet does not match any rule -criteria. If you set default-action to ``jump``, you must also define -``default-jump-target``. For base chains, you can only set the default -action to ``accept`` or ``drop``. For custom chains, more actions are -available. -``` - -```{cfgcmd} set firewall ipv6 name \<name\> default-jump-target \<text\> - -To be used only when ``default-action`` is set to ``jump``. Use this -command to specify the jump target for the default rule. -``` -:::{note} -**Important note about default-actions:** -If you do not define the default action for a base chain, the system sets -the default action to **accept** for that chain. For custom chains, if you -do not define a default action, the system sets the default-action to -**drop**. -::: - - -### Firewall Logs - - -You can enable logging for each firewall rule. When enabled, you can also -define other log options. -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> log -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> log -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> log -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> log - -Enable logging for matched packets. If this configuration command is not -present, logging is disabled. -``` - -```{cfgcmd} set firewall ipv6 forward filter default-log -``` - -```{cfgcmd} set firewall ipv6 input filter default-log -``` - -```{cfgcmd} set firewall ipv6 output filter default-log -``` - -```{cfgcmd} set firewall ipv6 name \<name\> default-log - -Use this command to enable the logging of the default action on -the specified chain. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> log-options level [emerg | alert | crit | err | warn | notice | info | debug] -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> log-options level [emerg | alert | crit | err | warn | notice | info | debug] -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> log-options level [emerg | alert | crit | err | warn | notice | info | debug] -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> log-options level [emerg | alert | crit | err | warn | notice | info | debug] - - -Define log-level. Only applicable if rule log is enabled. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> log-options group <0-65535> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> log-options group <0-65535> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> log-options group <0-65535> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> log-options group <0-65535> - - -Define the log group to send messages to. Only applicable if rule log is -enabled. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> log-options snapshot-length <0-9000> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> log-options snapshot-length <0-9000> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> log-options snapshot-length <0-9000> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> log-options snapshot-length <0-9000> - - -Define the length of packet payload to include in a netlink message. Only -applicable when rule logging is enabled and log group is defined. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> log-options queue-threshold <0-65535> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> log-options queue-threshold <0-65535> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> log-options queue-threshold <0-65535> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> log-options queue-threshold <0-65535> - - -Define the number of packets to queue inside the kernel before sending them -to userspace. Only applicable when rule logging is enabled and log group is -defined. -``` -### Firewall Description - - -For reference, you can define descriptions on every rule and custom chain. -```{cfgcmd} set firewall ipv6 name \<name\> description \<text\> - -Provide a rule-set description to a custom firewall chain. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> description <text> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> description <text> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> description <text> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> description \<text\> - -Provide a description for each rule. -``` -### Rule Status - - -New rules are enabled by default. In some cases, you may want to disable a -rule rather than remove it. -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> disable -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> disable -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> disable -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> disable - -Command for disabling a rule but keep it in the configuration. -``` -### Matching criteria - - -There are a lot of matching criteria against which the packet can be tested. -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> connection-status nat [destination | source] -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> connection-status nat [destination | source] -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> connection-status nat [destination | source] -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> connection-status nat [destination | source] - - -Match packets based on NAT connection status. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> connection-mark <1-2147483647> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> connection-mark <1-2147483647> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> connection-mark <1-2147483647> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> connection-mark <1-2147483647> - - -Match packets based on connection mark. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> source address [address | addressrange | CIDR] -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> source address [address | addressrange | CIDR] -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> source address [address | addressrange | CIDR] -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> source address [address | addressrange | CIDR] -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> destination address [address | addressrange | CIDR] -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> destination address [address | addressrange | CIDR] -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> destination address [address | addressrange | CIDR] -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> destination address [address | addressrange | CIDR] - - -Match based on source or destination address. This is similar to network -groups, but you can negate the matching addresses here. - - -:::{code-block} none -set firewall ipv6 name FOO rule 100 source address 2001:db8::202 -::: -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> source address-mask [address] -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> source address-mask [address] -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> source address-mask [address] -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> source address-mask [address] -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> destination address-mask [address] -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> destination address-mask [address] -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> destination address-mask [address] -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> destination address-mask [address] - - -Apply an arbitrary netmask to mask addresses and match only a specific -portion. This is useful for IPv6 because rules remain valid when the IPv6 -prefix changes if the host portion of the system's IPv6 address is static. -Examples include SLAAC and [tokenised IPv6 addresses](https://datatracker.ietf.org/doc/id/draft-chown-6man-tokenised-ipv6-identifiers-02.txt) - - -This function works for both individual addresses and address groups. - - -% stop_vyoslinter - -:::{code-block} none -# Match any IPv6 address with the suffix ::0000:0000:0000:beef -set firewall ipv6 forward filter rule 100 destination address ::beef -set firewall ipv6 forward filter rule 100 destination address-mask ::ffff:ffff:ffff:ffff -# Address groups -set firewall group ipv6-address-group WEBSERVERS address ::1000 -set firewall group ipv6-address-group WEBSERVERS address ::2000 -set firewall ipv6 forward filter rule 200 source group address-group WEBSERVERS -set firewall ipv6 forward filter rule 200 source address-mask ::ffff:ffff:ffff:ffff -::: -% start_vyoslinter -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> source fqdn <fqdn> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> source fqdn <fqdn> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> source fqdn <fqdn> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> source fqdn <fqdn> -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> destination fqdn <fqdn> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> destination fqdn <fqdn> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> destination fqdn <fqdn> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> destination fqdn <fqdn> - - -Specify a Fully Qualified Domain Name as source or destination to match. -Ensure that the router can resolve the DNS query. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> source geoip country-code <country> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> source geoip country-code <country> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> source geoip country-code <country> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> source geoip country-code <country> -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> destination geoip country-code <country> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> destination geoip country-code <country> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> destination geoip country-code <country> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> destination geoip country-code <country> -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> source geoip inverse-match -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> source geoip inverse-match -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> source geoip inverse-match -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> source geoip inverse-match -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> destination geoip inverse-match -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> destination geoip inverse-match -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> destination geoip inverse-match -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> destination geoip inverse-match - - -Match IP addresses based on their geolocation. For more information, see -[GeoIP matching](https://wiki.nftables.org/wiki-nftables/index.php/GeoIP_matching). -Use inverse-match to match anything except the specified country codes. -``` -DB-IP.com provides data under CC-BY-4.0 license. Attribution is required and -redistribution is permitted, allowing VyOS to include a database in images -(approximately 3 MB compressed). The package includes a cron script that you -can manually call through op-mode update geoip to keep the database and rules -updated. -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> source mac-address <mac-address> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> source mac-address <mac-address> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> source mac-address <mac-address> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> source mac-address <mac-address> - - -You can specify only a source MAC address to match. - - -:::{code-block} none -set firewall ipv6 input filter rule 100 source mac-address 00:53:00:11:22:33 -set firewall ipv6 input filter rule 101 source mac-address !00:53:00:aa:12:34 -::: -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> source port [1-65535 | portname | start-end] -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> source port [1-65535 | portname | start-end] -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> source port [1-65535 | portname | start-end] -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> source port [1-65535 | portname | start-end] -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> destination port [1-65535 | portname | start-end] -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> destination port [1-65535 | portname | start-end] -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> destination port [1-65535 | portname | start-end] -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> destination port [1-65535 | portname | start-end] - - -Specify a port by number or by name as defined in ``/etc/services``. - - -:::{code-block} none -set firewall ipv6 forward filter rule 10 source port '22' -set firewall ipv6 forward filter rule 11 source port '!http' -set firewall ipv6 forward filter rule 12 source port 'https' -::: -Multiple source ports can be specified as a comma-separated list. -The whole list can also be "negated" using ``!``. For example: - - -:::{code-block} none -set firewall ipv6 forward filter rule 10 source port '!22,https,3333-3338' -::: -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> source group address-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> source group address-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> source group address-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> source group address-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> destination group address-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> destination group address-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> destination group address-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> destination group address-group <name | !name> - - -Specify an address group. You can prepend the character ``!`` to invert the -matching criteria. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> source group dynamic-address-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> source group dynamic-address-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> source group dynamic-address-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> source group dynamic-address-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> destination group dynamic-address-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> destination group dynamic-address-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> destination group dynamic-address-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> destination group dynamic-address-group <name | !name> - - -Specify a dynamic address group. You can prepend the character ``!`` to -invert the matching criteria. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> source group network-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> source group network-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> source group network-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> source group network-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> destination group network-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> destination group network-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> destination group network-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> destination group network-group <name | !name> - - -Specify a network group. You can prepend the character ``!`` to invert the -matching criteria. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> source group port-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> source group port-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> source group port-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> source group port-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> destination group port-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> destination group port-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> destination group port-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> destination group port-group <name | !name> - - -Specify a port group. You can prepend the character ``!`` to invert the -matching criteria. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> source group domain-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> source group domain-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> source group domain-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> source group domain-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> destination group domain-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> destination group domain-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> destination group domain-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> destination group domain-group <name | !name> - - -Specify a domain group. You can prepend the character ``!`` to invert the -matching criteria. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> source group mac-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> source group mac-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> source group mac-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> source group mac-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> destination group mac-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> destination group mac-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> destination group mac-group <name | !name> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> destination group mac-group <name | !name> - - -Specify a MAC group. You can prepend the character ``!`` to invert the -matching criteria. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> dscp [0-63 | start-end] -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> dscp [0-63 | start-end] -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> dscp [0-63 | start-end] -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> dscp [0-63 | start-end] -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> dscp-exclude [0-63 | start-end] -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> dscp-exclude [0-63 | start-end] -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> dscp-exclude [0-63 | start-end] -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> dscp-exclude [0-63 | start-end] - - -Match based on dscp value. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> fragment [match-frag | match-non-frag] -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> fragment [match-frag | match-non-frag] -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> fragment [match-frag | match-non-frag] -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> fragment [match-frag | match-non-frag] - - -Match packets based on fragmentation. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> icmpv6 [code | type] <0-255> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> icmpv6 [code | type] <0-255> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> icmpv6 [code | type] <0-255> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> icmpv6 [code | type] <0-255> - - -Match packets based on ICMP or ICMPv6 code and type. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> icmpv6 type-name <text> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> icmpv6 type-name <text> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> icmpv6 type-name <text> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> icmpv6 type-name <text> - - -Match based on ICMPv6 type-name. Press **Tab** for information about -supported **type-name** criteria. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> inbound-interface name <iface> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> inbound-interface name <iface> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> inbound-interface name <iface> - - -Match based on inbound interface. You can use the wildcard ``*``. For -example: ``eth2*``. You can prepend the character ``!`` to invert the -matching criteria. For example ``!eth2`` -``` -:::{note} -If an interface is attached to a non-default VRF, when using -**inbound-interface**, use the VRF name. For example: -`set firewall ipv6 forward filter rule 10 inbound-interface name MGMT` -::: -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> inbound-interface group <iface_group> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> inbound-interface group <iface_group> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> inbound-interface group <iface_group> - - -Match based on the inbound interface group. You can prepend the character -``!`` to invert the matching criteria. For example ``!IFACE_GROUP`` -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> outbound-interface name <iface> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> outbound-interface name <iface> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> outbound-interface name <iface> - - -Match based on outbound interface. You can use the wildcard ``*``. For -example: ``eth2*``. You can prepend the character ``!`` to invert the -matching criteria. For example ``!eth2`` -``` -:::{note} -If an interface is attached to a non-default VRF, when using -**outbound-interface**, use the physical interface name. For example: -`set firewall ipv6 forward filter rule 10 outbound-interface name eth0` -::: -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> outbound-interface group <iface_group> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> outbound-interface group <iface_group> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> outbound-interface group <iface_group> - - -Match based on outbound interface group. You can prepend the character ``!`` -to invert the matching criteria. For example ``!IFACE_GROUP`` -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> ipsec [match-ipsec-in | match-ipsec-out | match-none-in | match-none-out] -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> ipsec [match-ipsec-in | match-none-in] -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> ipsec [match-ipsec-out | match-none-out] -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> ipsec [match-ipsec-in | match-ipsec-out | match-none-in | match-none-out] - - -Match packets based on IPsec. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> limit burst <0-4294967295> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> limit burst <0-4294967295> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> limit burst <0-4294967295> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> limit burst <0-4294967295> - - -Match based on the maximum number of packets allowed to exceed the rate -limit. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> limit rate <text> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> limit rate <text> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> limit rate <text> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> limit rate <text> - - -Match based on the maximum average rate, specified as ``integer/unit``. -For example, specify ``5/minutes``. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> packet-length <text> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> packet-length <text> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> packet-length <text> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> packet-length <text> -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> packet-length-exclude <text> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> packet-length-exclude <text> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> packet-length-exclude <text> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> packet-length-exclude <text> - - -Match based on packet length. You can specify multiple values from 1 to -65535 and ranges. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> packet-type [broadcast | host | multicast | other] -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> packet-type [broadcast | host | multicast | other] -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> packet-type [broadcast | host | multicast | other] -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> packet-type [broadcast | host | multicast | other] - - -Match based on packet type. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> protocol [<text> | <0-255> | all | tcp_udp] -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> protocol [<text> | <0-255> | all | tcp_udp] -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> protocol [<text> | <0-255> | all | tcp_udp] -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> protocol [<text> | <0-255> | all | tcp_udp] - - -Match based on protocol number or name as defined in ``/etc/protocols``. -Specify ``all`` for all protocols and ``tcp_udp`` for TCP and UDP packets. -Prepend ``!`` to negate the protocol selection. - - -:::{code-block} none -set firewall ipv6 input filter rule 10 protocol tcp -::: -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> recent count <1-255> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> recent count <1-255> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> recent count <1-255> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> recent count <1-255> -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> recent time [second | minute | hour] -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> recent time [second | minute | hour] -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> recent time [second | minute | hour] -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> recent time [second | minute | hour] - - -Match packets based on recently seen sources. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> tcp flags [not] <text> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> tcp flags [not] <text> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> tcp flags [not] <text> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> tcp flags [not] <text> - - -Allowed values for TCP flags: ``ack``, ``cwr``, ``ecn``, ``fin``, ``psh``, -``rst``, ``syn``, and ``urg``. You can specify multiple values. To invert -the selection, use ``not``, as shown in the following example. - - -:::{code-block} none -set firewall ipv6 input filter rule 10 tcp flags 'ack' -set firewall ipv6 input filter rule 12 tcp flags 'syn' -set firewall ipv6 input filter rule 13 tcp flags not 'fin' -::: -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> state [established | invalid | new | related] -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> state [established | invalid | new | related] -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> state [established | invalid | new | related] -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> state [established | invalid | new | related] - - -Match based on packet state. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> time startdate <text> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> time startdate <text> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> time startdate <text> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> time startdate <text> -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> time starttime <text> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> time starttime <text> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> time starttime <text> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> time starttime <text> -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> time stopdate <text> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> time stopdate <text> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> time stopdate <text> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> time stopdate <text> -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> time stoptime <text> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> time stoptime <text> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> time stoptime <text> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> time stoptime <text> -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> time weekdays <text> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> time weekdays <text> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> time weekdays <text> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> time weekdays <text> - - -Match packets based on time criteria. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> hop-limit <eq | gt | lt> <0-255> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> hop-limit <eq | gt | lt> <0-255> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> hop-limit <eq | gt | lt> <0-255> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> hop-limit <eq | gt | lt> <0-255> - - -Match the hop-limit parameter. Use ``eq`` for equal, ``gt`` for greater than, -and ``lt`` for less than. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> recent count <1-255> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> recent count <1-255> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> recent count <1-255> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> recent count <1-255> -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> recent time <second | minute | hour> -``` - -```{cfgcmd} set firewall ipv6 input filter rule \<1-999999\> recent time <second | minute | hour> -``` - -```{cfgcmd} set firewall ipv6 output filter rule \<1-999999\> recent time <second | minute | hour> -``` - -```{cfgcmd} set firewall ipv6 name \<name\> rule \<1-999999\> recent time <second | minute | hour> - - -Match when the specified number of connections occur within the specified -time period. Use these criteria to block brute-force attempts. -``` -### Packet Modifications - - -The firewall can modify packets before sending them. -This feature provides more flexibility for packet handling. -```{cfgcmd} set firewall ipv6 prerouting raw rule \<1-999999\> set dscp <0-63> -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> set dscp <0-63> -``` - -```{cfgcmd} set firewall ipv6 output [filter | raw] rule \<1-999999\> set dscp <0-63> - - -Set a specific value of Differentiated Services Codepoint (DSCP). -``` - -```{cfgcmd} set firewall ipv6 prerouting raw rule \<1-999999\> set mark <1-2147483647> -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> set mark <1-2147483647> -``` - -```{cfgcmd} set firewall ipv6 output [filter | raw] rule \<1-999999\> set mark <1-2147483647> - - -Set a specific packet mark value. -``` - -```{cfgcmd} set firewall ipv6 prerouting raw rule \<1-999999\> set tcp-mss <500-1460> -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> set tcp-mss <500-1460> -``` - -```{cfgcmd} set firewall ipv6 output [filter | raw] rule \<1-999999\> set tcp-mss <500-1460> - - -Set the TCP-MSS (TCP maximum segment size) for the connection. -``` - -```{cfgcmd} set firewall ipv6 prerouting raw rule \<1-999999\> set hop-limit <0-255> -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> set hop-limit <0-255> -``` - -```{cfgcmd} set firewall ipv6 output [filter | raw] rule \<1-999999\> set hop-limit <0-255> - - -Set hop limit value. -``` - -```{cfgcmd} set firewall ipv6 forward filter rule \<1-999999\> set connection-mark <0-2147483647> -``` - -```{cfgcmd} set firewall ipv4 output [filter | raw] rule \<1-999999\> set connection-mark <0-2147483647> - - -Set connection mark value. -``` -## Synproxy - - -Synproxy connections -```{cfgcmd} set firewall ipv6 [input | forward] filter rule \<1-999999\> action synproxy -``` - -```{cfgcmd} set firewall ipv6 [input | forward] filter rule \<1-999999\> protocol tcp -``` - -```{cfgcmd} set firewall ipv6 [input | forward] filter rule \<1-999999\> synproxy tcp mss <501-65535> - - - Set the TCP MSS (maximum segment size) for the connection. -``` - -```{cfgcmd} set firewall ipv6 [input | forward] filter rule \<1-999999\> synproxy tcp window-scale <1-14> - - - Set the window scale factor for TCP window scaling. -``` -### Example synproxy - - -Requirements to enable synproxy: - - -- Traffic must be symmetric -- Synproxy relies on syncookies and TCP timestamps, ensure these are enabled -- Disable conntrack loose track option -```none - -set system sysctl parameter net.ipv4.tcp_timestamps value '1' - - -set system conntrack tcp loose disable - -set system conntrack ignore ipv6 rule 10 destination port '8080' - -set system conntrack ignore ipv6 rule 10 protocol 'tcp' - -set system conntrack ignore ipv6 rule 10 tcp flags syn - - -set firewall global-options syn-cookies 'enable' - -set firewall ipv6 input filter rule 10 action 'synproxy' - -set firewall ipv6 input filter rule 10 destination port '8080' - -set firewall ipv6 input filter rule 10 inbound-interface name 'eth1' - -set firewall ipv6 input filter rule 10 protocol 'tcp' - -set firewall ipv6 input filter rule 10 synproxy tcp mss '1460' - -set firewall ipv6 input filter rule 10 synproxy tcp window-scale '7' - -set firewall ipv6 input filter rule 1000 action 'drop' - -set firewall ipv6 input filter rule 1000 state invalid - -``` -## Operation-mode Firewall - - -### Rule-set overview -```{opcmd} show firewall - -Show a basic firewall overview for all rule-sets, not only for IPv6: - - -:::{code-block} none -vyos@vyos:~$ show firewall -Rulesets Information - - ---------------------------------- -IPv4 Firewall "forward filter" - - -Rule Action Protocol Packets Bytes Conditions -------- -------- ---------- --------- ------- ----------------------------------------- -5 jump all 0 0 iifname "eth1" jump NAME_VyOS_MANAGEMENT -10 jump all 0 0 oifname "eth1" jump NAME_WAN_IN -15 jump all 0 0 iifname "eth3" jump NAME_WAN_IN -default accept all - - ---------------------------------- -IPv4 Firewall "name VyOS_MANAGEMENT" - - -Rule Action Protocol Packets Bytes Conditions -------- -------- ---------- --------- ------- -------------------------------- -5 accept all 0 0 ct state established accept -10 drop all 0 0 ct state invalid -20 accept all 0 0 ip saddr @A_GOOD_GUYS accept -30 accept all 0 0 ip saddr @N_ENTIRE_RANGE accept -40 accept all 0 0 ip saddr @A_VyOS_SERVERS accept -50 accept icmp 0 0 meta l4proto icmp accept -default drop all 0 0 - - ---------------------------------- -IPv6 Firewall "forward filter" - - -Rule Action Protocol -------- -------- ---------- -5 jump all -10 jump all -15 jump all -default accept all - - ---------------------------------- -IPv6 Firewall "input filter" - - -Rule Action Protocol -------- -------- ---------- -5 jump all -default accept all - - ---------------------------------- -IPv6 Firewall "ipv6_name IPV6-VyOS_MANAGEMENT" - - -Rule Action Protocol -------- -------- ---------- -5 accept all -10 drop all -20 accept all -30 accept all -40 accept all -50 accept ipv6-icmp -default drop all -::: -``` - -```{opcmd} show firewall summary - -This will show you a summary of rule-sets and groups - - -:::{code-block} none -vyos@vyos:~$ show firewall summary -Ruleset Summary - - -IPv6 Ruleset: - - -Ruleset Hook Ruleset Priority Description --------------- -------------------- ------------------------- -forward filter -input filter -ipv6_name IPV6-VyOS_MANAGEMENT -ipv6_name IPV6-WAN_IN PUBLIC_INTERNET - - -IPv4 Ruleset: - - -Ruleset Hook Ruleset Priority Description --------------- ------------------ ------------------------- -forward filter -input filter -name VyOS_MANAGEMENT -name WAN_IN PUBLIC_INTERNET - - -Firewall Groups - - -Name Type References Members ------------------------ ------------------ ----------------------- ---------------- -PBX address_group WAN_IN-100 198.51.100.77 -SERVERS address_group WAN_IN-110 192.0.2.10 -WAN_IN-111 192.0.2.11 -WAN_IN-112 192.0.2.12 -WAN_IN-120 -WAN_IN-121 -WAN_IN-122 -SUPPORT address_group VyOS_MANAGEMENT-20 192.168.1.2 -WAN_IN-20 -PHONE_VPN_SERVERS address_group WAN_IN-160 10.6.32.2 -PINGABLE_ADRESSES address_group WAN_IN-170 192.168.5.2 -WAN_IN-171 -PBX ipv6_address_group IPV6-WAN_IN-100 2001:db8::1 -SERVERS ipv6_address_group IPV6-WAN_IN-110 2001:db8::2 -IPV6-WAN_IN-111 2001:db8::3 -IPV6-WAN_IN-112 2001:db8::4 -IPV6-WAN_IN-120 -IPV6-WAN_IN-121 -IPV6-WAN_IN-122 -SUPPORT ipv6_address_group IPV6-VyOS_MANAGEMENT-20 2001:db8::5 -IPV6-WAN_IN-20 -::: -``` - -```{opcmd} show firewall ipv6 [forward | input | output] filter -``` - -```{opcmd} show firewall ipv6 ipv6-name \<name\> - -This command will give an overview of a single rule-set. - - -:::{code-block} none -vyos@vyos:~$ show firewall ipv6 input filter -Ruleset Information - - ---------------------------------- -ipv6 Firewall "input filter" - - -Rule Action Protocol Packets Bytes Conditions -------- -------- ---------- --------- ------- ------------------------------------------------------------------------------ -10 jump all 13 1456 iifname "eth1" jump NAME6_INP-ETH1 -20 accept ipv6-icmp 10 1112 meta l4proto ipv6-icmp iifname "eth0" prefix "[ipv6-INP-filter-20-A]" accept -default accept all 14 1584 - - -vyos@vyos:~$ -::: -``` - -```{opcmd} show firewall ipv6 [forward | input | output] filter rule <1-999999> -``` - -```{opcmd} show firewall ipv6 name \<name\> rule \<1-999999\> -``` - -```{opcmd} show firewall ipv6 ipv6-name \<name\> rule \<1-999999\> - -This command will give an overview of a rule in a single rule-set -``` - -```{opcmd} show firewall group \<name\> - -Show an overview of defined groups, including the type, members, and where -the group is used. - - -:::{code-block} none -vyos@vyos:~$ show firewall group LAN -Firewall Groups - - -Name Type References Members ------------- ------------------ ----------------------- ---------------- -LAN ipv6_network_group IPV6-VyOS_MANAGEMENT-30 2001:db8::0/64 -IPV6-WAN_IN-30 -LAN network_group VyOS_MANAGEMENT-30 192.168.200.0/24 -WAN_IN-30 -::: -``` - -```{opcmd} show firewall statistics - -Show statistics of all rule-sets since the last boot. -``` -### Show Firewall log -```{opcmd} show log firewall -``` - -```{opcmd} show log firewall ipv6 -``` - -```{opcmd} show log firewall ipv6 [forward | input | output | name] -``` - -```{opcmd} show log firewall ipv6 [forward | input | output] filter -``` - -```{opcmd} show log firewall ipv6 name \<name\> -``` - -```{opcmd} show log firewall ipv6 [forward | input | output] filter rule \<rule\> -``` - -```{opcmd} show log firewall ipv6 name \<name\> rule \<rule\> - -Show firewall logs for all firewalls, all IPv6 firewalls, specific hooks, -specific priorities, specific custom chains, or specific rule-sets. -``` -### Example Partial Config -```none -firewall { - ipv6 { - input { - filter { - rule 10 { - action jump - inbound-interface { - name eth1 - } - jump-target INP-ETH1 - } - rule 20 { - action accept - inbound-interface { - name eth0 - } - log - protocol ipv6-icmp - } - } - } - name INP-ETH1 { - default-action drop - default-log - rule 10 { - action accept - protocol tcp_udp - } - } - } -} -``` -### Update geoip database -```{opcmd} update geoip - -Command used to update GeoIP database and firewall sets. -```
\ No newline at end of file diff --git a/docs/configuration/interfaces/md-index.md b/docs/configuration/interfaces/md-index.md deleted file mode 100644 index 9082cd80..00000000 --- a/docs/configuration/interfaces/md-index.md +++ /dev/null @@ -1,26 +0,0 @@ -# Interfaces - -```{toctree} -:includehidden: true -:maxdepth: 1 - -bonding -bridge -dummy -ethernet -geneve -l2tpv3 -loopback -macsec -openvpn -wireguard -pppoe -pseudo-ethernet -sstp-client -tunnel -virtual-ethernet -vti -vxlan -wireless -wwan -``` diff --git a/docs/configuration/loadbalancing/md-index.md b/docs/configuration/loadbalancing/md-index.md deleted file mode 100644 index 3241edb7..00000000 --- a/docs/configuration/loadbalancing/md-index.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -lastproofread: '2026-04-06' ---- - -(load-balancing)= - -# Load-balancing - -```{toctree} -:includehidden: true -:maxdepth: 1 - -wan -haproxy -``` diff --git a/docs/configuration/md-index.md b/docs/configuration/md-index.md deleted file mode 100644 index 3e215502..00000000 --- a/docs/configuration/md-index.md +++ /dev/null @@ -1,23 +0,0 @@ -# Configuration Guide - -The following structure represents the CLI structure. - -```{toctree} -:includehidden: true -:maxdepth: 1 - -container/index -firewall/index -highavailability/index -interfaces/index -loadbalancing/index -nat/index -policy/index -pki/index -protocols/index -service/index -system/index -trafficpolicy/index -vpn/index -vrf/index -``` diff --git a/docs/configuration/nat/md-index.md b/docs/configuration/nat/md-index.md deleted file mode 100644 index 35e5d32b..00000000 --- a/docs/configuration/nat/md-index.md +++ /dev/null @@ -1,13 +0,0 @@ -(nat)= - -# NAT - -```{toctree} -:includehidden: true -:maxdepth: 1 - -nat44 -nat64 -nat66 -cgnat -``` diff --git a/docs/configuration/pki/md-index.md b/docs/configuration/pki/md-index.md deleted file mode 100644 index be59e30f..00000000 --- a/docs/configuration/pki/md-index.md +++ /dev/null @@ -1,551 +0,0 @@ ---- -lastproofread: '2024-01-05' ---- - -```{include} /_include/need_improvement.txt -``` - -(pki)= - -# PKI -VyOS 1.4 changed the way in how encryption keys or certificates are stored on the -system. In the pre VyOS 1.4 era, certificates got stored under /config and every -service referenced a file. That made copying a running configuration from system -A to system B a bit harder, as you had to copy the files and their permissions -by hand. - -{vytask}`T3642` describes a new CLI subsystem that serves as a "certstore" to -all services requiring any kind of encryption key(s). In short, public and -private certificates are now stored in PKCS#8 format in the regular VyOS CLI. -Keys can now be added, edited, and deleted using the regular set/edit/delete -CLI commands. - -VyOS not only can now manage certificates issued by 3rd party Certificate -Authorities, it can also act as a CA on its own. You can create your own root -CA and sign keys with it by making use of some simple op-mode commands. - -Don't be afraid that you need to re-do your configuration. Key transformation is -handled, as always, by our migration scripts, so this will be a smooth transition -for you! - -## Key Generation - -### Certificate Authority (CA) -VyOS now also has the ability to create CAs, keys, Diffie-Hellman and other -keypairs from an easy to access operational level command. -```{opcmd} generate pki ca - -Create a new {abbr}`CA (Certificate Authority)` and output the CAs public and -private key on the console. -``` - -```{opcmd} generate pki ca install \<name\> - -Create a new {abbr}`CA (Certificate Authority)` and output the CAs public and -private key on the console. - -:::{note} -In addition to the command above, the output is in a format which can be used -to directly import the key into the VyOS CLI by simply copy-pasting the output -from op-mode into configuration mode. - -``name`` is used for the VyOS CLI command to identify this key. This -key ``name`` is then used in the CLI configuration to reference the key -instance. -::: -``` - -```{opcmd} generate pki ca sign \<ca-name\> - -Create a new subordinate {abbr}`CA (Certificate Authority)` and sign it using -the private key referenced by ca-name. -``` - -```{opcmd} generate pki ca sign \<ca-name\> install \<name\> - -Create a new subordinate {abbr}`CA (Certificate Authority)` and sign it using -the private key referenced by `name`. - -:::{note} -In addition to the command above, the output is in a format which can be used -to directly import the key into the VyOS CLI by simply copy-pasting the output -from op-mode into configuration mode. - -``name`` is used for the VyOS CLI command to identify this key. This -key ``name`` is then used in the CLI configuration to reference the key -instance. -::: -``` -### Certificates -```{opcmd} generate pki certificate - -Create a new public/private keypair and output the certificate on the console. -``` - -```{opcmd} generate pki certificate install \<name\> - -Create a new public/private keypair and output the certificate on the console. - -:::{note} -In addition to the command above, the output is in a format which can be used -to directly import the key into the VyOS CLI by simply copy-pasting the output -from op-mode into configuration mode. - -``name`` is used for the VyOS CLI command to identify this key. This -key ``name`` is then used in the CLI configuration to reference the key -instance. -::: -``` - -```{opcmd} generate pki certificate self-signed - -Create a new self-signed certificate. The public/private is then shown on the -console. -``` - -```{opcmd} generate pki certificate self-signed install \<name\> - -Create a new self-signed certificate. The public/private is then shown on the -console. - -:::{note} -In addition to the command above, the output is in a format which can be used -to directly import the key into the VyOS CLI by simply copy-pasting the output -from op-mode into configuration mode. - -``name`` is used for the VyOS CLI command to identify this key. This -key ``name`` is then used in the CLI configuration to reference the key -instance. -::: -``` - -```{opcmd} generate pki certificate sign \<ca-name\> - -Create a new public/private keypair which is signed by the CA referenced by -ca-name. The signed certificate is then output to the console. -``` - -```{opcmd} generate pki certificate sign \<ca-name\> install \<name\> - -Create a new public/private keypair which is signed by the CA referenced by -ca-name. The signed certificate is then output to the console. - -:::{note} -In addition to the command above, the output is in a format which can be used -to directly import the key into the VyOS CLI by simply copy-pasting the output -from op-mode into configuration mode. - -``name`` is used for the VyOS CLI command to identify this key. This -key ``name`` is then used in the CLI configuration to reference the key -instance. -::: -``` -### Diffie-Hellman parameters -```{opcmd} generate pki dh - -Generate a new set of {abbr}`DH (Diffie-Hellman)` parameters. The key size -is requested by the CLI and defaults to 2048 bit. - -The generated parameters are then output to the console. -``` - -```{opcmd} generate pki dh install \<name\> - -Generate a new set of {abbr}`DH (Diffie-Hellman)` parameters. The key size -is requested by the CLI and defaults to 2048 bit. - -:::{note} -In addition to the command above, the output is in a format which can be used -to directly import the key into the VyOS CLI by simply copy-pasting the output -from op-mode into configuration mode. - -``name`` is used for the VyOS CLI command to identify this key. This -key ``name`` is then used in the CLI configuration to reference the key -instance. -::: -``` -### OpenVPN -```{opcmd} generate pki openvpn shared-secret - -Generate a new OpenVPN shared secret. The generated secret is the output to -the console. -``` - -```{opcmd} generate pki openvpn shared-secret install \<name\> - -Generate a new OpenVPN shared secret. The generated secret is the output to -the console. - -:::{note} -In addition to the command above, the output is in a format which can be used -to directly import the key into the VyOS CLI by simply copy-pasting the output -from op-mode into configuration mode. - -``name`` is used for the VyOS CLI command to identify this key. This -key ``name`` is then used in the CLI configuration to reference the key -instance. -::: -``` -### WireGuard -```{opcmd} generate pki wireguard key-pair - -Generate a new WireGuard public/private key portion and output the result to -the console. -``` - -```{opcmd} generate pki wireguard key-pair install \<interface\> - -Generate a new WireGuard public/private key portion and output the result to -the console. - -:::{note} -In addition to the command above, the output is in a format which can -be used to directly import the key into the VyOS CLI by simply copy-pasting -the output from op-mode into configuration mode. - -``interface`` is used for the VyOS CLI command to identify the WireGuard -interface where this private key is to be used. -::: -``` - -```{opcmd} generate pki wireguard preshared-key - -Generate a WireGuard pre-shared secret used for peers to communicate. -``` - -```{opcmd} generate pki wireguard preshared-key install \<peer\> - -Generate a WireGuard pre-shared secret used for peers to communicate. - -:::{note} -In addition to the command above, the output is in a format which can -be used to directly import the key into the VyOS CLI by simply copy-pasting -the output from op-mode into configuration mode. - -``peer`` is used for the VyOS CLI command to identify the WireGuard peer where -this secret is to be used. -::: -``` -## Key usage (CLI) -### CA (Certificate Authority) -```{cfgcmd} set pki ca \<name\> certificate - -Add the public CA certificate for the CA named `name` to the VyOS CLI. - -:::{note} -When loading the certificate you need to manually strip the -``-----BEGIN CERTIFICATE-----`` and ``-----END CERTIFICATE-----`` tags. -Also, the certificate/key needs to be presented in a single line without -line breaks (``\n``), this can be done using the following shell command: - -``$ tail -n +2 ca.pem | head -n -1 | tr -d '\n'`` -::: -``` - -```{cfgcmd} set pki ca \<name\> crl - -Certificate revocation list in PEM format. -``` - -```{cfgcmd} set pki ca \<name\> description - -A human readable description what this CA is about. -``` - -```{cfgcmd} set pki ca \<name\> private key - -Add the CAs private key to the VyOS CLI. This should never leave the system, -and is only required if you use VyOS as your certificate generator as -mentioned above. - -:::{note} -When loading the certificate you need to manually strip the -``-----BEGIN KEY-----`` and ``-----END KEY-----`` tags. Also, the -certificate/key needs to be presented in a single line without line -breaks (``\n``), this can be done using the following shell command: - -``$ tail -n +2 ca.key | head -n -1 | tr -d '\n'`` -::: -``` - -```{cfgcmd} set pki ca \<name\> private password-protected - -Mark the CAs private key as password protected. User is asked for the password -when the key is referenced. -``` -### Server Certificate -After we have imported the CA certificate(s) we can now import and add -certificates used by services on this router. -```{cfgcmd} set pki certificate \<name\> certificate - -Add public key portion for the certificate named `name` to the VyOS CLI. - -:::{note} -When loading the certificate you need to manually strip the -``-----BEGIN CERTIFICATE-----`` and ``-----END CERTIFICATE-----`` tags. -Also, the certificate/key needs to be presented in a single line without -line breaks (``\n``), this can be done using the following shell command: - -``$ tail -n +2 cert.pem | head -n -1 | tr -d '\n'`` -::: -``` - -```{cfgcmd} set pki certificate \<name\> description - -A human readable description what this certificate is about. -``` - -```{cfgcmd} set pki certificate \<name\> private key - -Add the private key portion of this certificate to the CLI. This should never -leave the system as it is used to decrypt the data. - -:::{note} -When loading the certificate you need to manually strip the -``-----BEGIN KEY-----`` and ``-----END KEY-----`` tags. Also, the -certificate/key needs to be presented in a single line without line -breaks (``\n``), this can be done using the following shell command: - -``$ tail -n +2 cert.key | head -n -1 | tr -d '\n'`` -::: -``` - -```{cfgcmd} set pki certificate \<name\> private password-protected - -Mark the private key as password protected. User is asked for the password -when the key is referenced. -``` - -```{cfgcmd} set pki certificate \<name\> revoke - -If CA is present, this certificate will be included in generated CRLs -``` -### Import files to PKI format -VyOS provides this utility to import existing certificates/key files directly -into PKI from op-mode. Previous to VyOS 1.4, certificates were stored under the -/config folder permanently and will be retained post upgrade. -```{opcmd} import pki ca \<name\> file \<Path to CA certificate file\> - -Import the public CA certificate from the defined file to VyOS CLI. -``` - -```{opcmd} import pki ca \<name\> key-file \<Path to private key file\> - -Import the CAs private key portion to the CLI. This should never leave the -system as it is used to decrypt the data. The key is required if you use -VyOS as your certificate generator. -``` - -```{opcmd} import pki certificate \<name\> file \<path to certificate\> - -Import the certificate from the file to VyOS CLI. -``` - -```{opcmd} import pki certificate \<name\> key-file \<path to private key\> - -Import the private key of the certificate to the VyOS CLI. This should never -leave the system as it is used to decrypt the data. -``` - -```{opcmd} import pki openvpn shared-secret \<name\> file \<path to OpenVPN secret key\> - -Import the OpenVPN shared secret stored in file to the VyOS CLI. -``` -#### ACME -The VyOS PKI subsystem can also be used to automatically retrieve Certificates -using the {abbr}`ACME (Automatic Certificate Management Environment)` protocol. -```{cfgcmd} set pki certificate \<name\> acme domain-name \<name\> - -Domain names to apply, multiple domain-names can be specified. - -This is a mandatory option -``` - -```{cfgcmd} set pki certificate \<name\> acme email \<address\> - -Email used for registration and recovery contact. - -This is a mandatory option -``` - -```{cfgcmd} set pki certificate \<name\> acme listen-address \<address\> - -The address the server listens to during http-01 challenge -``` - -```{cfgcmd} set pki certificate \<name\> acme rsa-key-size \<2048 | 3072 | 4096\> - -Size of the RSA key. - -This options defaults to 2048 -``` - -```{cfgcmd} set pki certificate \<name\> acme url \<url\> - -ACME Directory Resource URI. - -This defaults to https://acme-v02.api.letsencrypt.org/directory - -:::{note} -During initial deployment we recommend using the staging API -of LetsEncrypt to prevent and blacklisting of your system. The API -endpoint is https://acme-staging-v02.api.letsencrypt.org/directory -::: -``` -## Operation -VyOS operational mode commands are not only available for generating keys but -also to display them. -```{opcmd} show pki ca - -Show a list of installed {abbr}`CA (Certificate Authority)` certificates. - -:::{code-block} none -vyos@vyos:~$ show pki ca -Certificate Authorities: -Name Subject Issuer CN Issued Expiry Private Key Parent --------------- ------------------------------------------------------- ----------------- ------------------- ------------------- ------------- -------------- -DST_Root_CA_X3 CN=ISRG Root X1,O=Internet Security Research Group,C=US CN=DST Root CA X3 2021-01-20 19:14:03 2024-09-30 18:14:03 No N/A -R3 CN=R3,O=Let's Encrypt,C=US CN=ISRG Root X1 2020-09-04 00:00:00 2025-09-15 16:00:00 No DST_Root_CA_X3 -vyos_rw CN=VyOS RW CA,O=VyOS,L=Some-City,ST=Some-State,C=GB CN=VyOS RW CA 2021-07-05 13:46:03 2026-07-04 13:46:03 Yes N/A -::: -``` - -```{opcmd} show pki ca \<name\> - -Show only information for specified Certificate Authority. -``` - -```{opcmd} show pki certificate - -Show a list of installed certificates - -:::{code-block} none -vyos@vyos:~$ show pki certificate -Certificates: -Name Type Subject CN Issuer CN Issued Expiry Revoked Private Key CA Present ---------- ------ --------------------- ------------- ------------------- ------------------- --------- ------------- ------------- -ac2 Server CN=ac2.vyos.net CN=R3 2021-07-05 07:29:59 2021-10-03 07:29:58 No Yes Yes (R3) -rw_server Server CN=VyOS RW CN=VyOS RW CA 2021-07-05 13:48:02 2022-07-05 13:48:02 No Yes Yes (vyos_rw) -::: -``` - -```{opcmd} show pki certificate \<name\> - -Show only information for specified certificate. -``` - -```{opcmd} show pki crl - -Show a list of installed {abbr}`CRLs (Certificate Revocation List)`. -``` - -```{opcmd} renew certbot - -Manually trigger certificate renewal. This will be done twice a day. -``` -## Examples - -### Create a CA chain and leaf certificates -This configuration generates & installs into the VyOS PKI system a root -certificate authority, alongside two intermediary certificate authorities for -client & server certificates. These CAs are then used to generate a server -certificate for the router, and a client certificate for a user. -- `vyos_root_ca` is the root certificate authority. -- `vyos_client_ca` and `vyos_server_ca` are intermediary certificate authorities, - which are signed by the root CA. -- `vyos_cert` is a leaf server certificate used to identify the VyOS router, - signed by the server intermediary CA. -- `vyos_example_user` is a leaf client certificate used to identify a user, - signed by client intermediary CA. - -First, we create the root certificate authority. -```none -[edit] -vyos@vyos# run generate pki ca install vyos_root_ca -Enter private key type: [rsa, dsa, ec] (Default: rsa) rsa -Enter private key bits: (Default: 2048) 2048 -Enter country code: (Default: GB) GB -Enter state: (Default: Some-State) Some-State -Enter locality: (Default: Some-City) Some-City -Enter organization name: (Default: VyOS) VyOS -Enter common name: (Default: vyos.io) VyOS Root CA -Enter how many days certificate will be valid: (Default: 1825) 1825 -Note: If you plan to use the generated key on this router, do not encrypt the private key. -Do you want to encrypt the private key with a passphrase? [y/N] n -2 value(s) installed. Use "compare" to see the pending changes, and "commit" to apply. -``` -Secondly, we create the intermediary certificate authorities, which are used to -sign the leaf certificates. -```none -[edit] -vyos@vyos# run generate pki ca sign vyos_root_ca install vyos_server_ca -Do you already have a certificate request? [y/N] n -Enter private key type: [rsa, dsa, ec] (Default: rsa) rsa -Enter private key bits: (Default: 2048) 2048 -Enter country code: (Default: GB) GB -Enter state: (Default: Some-State) Some-State -Enter locality: (Default: Some-City) Some-City -Enter organization name: (Default: VyOS) VyOS -Enter common name: (Default: vyos.io) VyOS Intermediary Server CA -Enter how many days certificate will be valid: (Default: 1825) 1095 -Note: If you plan to use the generated key on this router, do not encrypt the private key. -Do you want to encrypt the private key with a passphrase? [y/N] n -2 value(s) installed. Use "compare" to see the pending changes, and "commit" to apply. - - -[edit] -vyos@vyos# run generate pki ca sign vyos_root_ca install vyos_client_ca -Do you already have a certificate request? [y/N] n -Enter private key type: [rsa, dsa, ec] (Default: rsa) rsa -Enter private key bits: (Default: 2048) 2048 -Enter country code: (Default: GB) GB -Enter state: (Default: Some-State) Some-State -Enter locality: (Default: Some-City) Some-City -Enter organization name: (Default: VyOS) VyOS -Enter common name: (Default: vyos.io) VyOS Intermediary Client CA -Enter how many days certificate will be valid: (Default: 1825) 1095 -Note: If you plan to use the generated key on this router, do not encrypt the private key. -Do you want to encrypt the private key with a passphrase? [y/N] n -2 value(s) installed. Use "compare" to see the pending changes, and "commit" to apply. -``` -Lastly, we can create the leaf certificates that devices and users will utilise. -```none -[edit] -vyos@vyos# run generate pki certificate sign vyos_server_ca install vyos_cert -Do you already have a certificate request? [y/N] n -Enter private key type: [rsa, dsa, ec] (Default: rsa) rsa -Enter private key bits: (Default: 2048) 2048 -Enter country code: (Default: GB) GB -Enter state: (Default: Some-State) Some-State -Enter locality: (Default: Some-City) Some-City -Enter organization name: (Default: VyOS) VyOS -Enter common name: (Default: vyos.io) vyos.net -Do you want to configure Subject Alternative Names? [y/N] y -Enter alternative names in a comma separate list, example: ipv4:1.1.1.1,ipv6:fe80::1,dns:vyos.net -Enter Subject Alternative Names: dns:vyos.net,dns:www.vyos.net -Enter how many days certificate will be valid: (Default: 365) 365 -Enter certificate type: (client, server) (Default: server) server -Note: If you plan to use the generated key on this router, do not encrypt the private key. -Do you want to encrypt the private key with a passphrase? [y/N] n -2 value(s) installed. Use "compare" to see the pending changes, and "commit" to apply. - - -[edit] -vyos@vyos# run generate pki certificate sign vyos_client_ca install vyos_example_user -Do you already have a certificate request? [y/N] n -Enter private key type: [rsa, dsa, ec] (Default: rsa) rsa -Enter private key bits: (Default: 2048) 2048 -Enter country code: (Default: GB) GB -Enter state: (Default: Some-State) Some-State -Enter locality: (Default: Some-City) Some-City -Enter organization name: (Default: VyOS) VyOS -Enter common name: (Default: vyos.io) Example User -Do you want to configure Subject Alternative Names? [y/N] y -Enter alternative names in a comma separate list, example: ipv4:1.1.1.1,ipv6:fe80::1,dns:vyos.net,rfc822:user@vyos.net -Enter Subject Alternative Names: rfc822:example.user@vyos.net -Enter how many days certificate will be valid: (Default: 365) 365 -Enter certificate type: (client, server) (Default: server) client -Note: If you plan to use the generated key on this router, do not encrypt the private key. -Do you want to encrypt the private key with a passphrase? [y/N] n -2 value(s) installed. Use "compare" to see the pending changes, and "commit" to apply. -``` diff --git a/docs/configuration/policy/md-as-path-list.md b/docs/configuration/policy/md-as-path-list.md deleted file mode 100644 index 1fcece91..00000000 --- a/docs/configuration/policy/md-as-path-list.md +++ /dev/null @@ -1,29 +0,0 @@ -# BGP - AS Path Policy - -VyOS provides policies commands exclusively for BGP traffic filtering and -manipulation: **as-path-list** is one of them. - -## Configuration - -### policy as-path-list - -```{cfgcmd} set policy as-path-list \<text\> - -Create as-path-policy identified by name `<text>`. -``` -```{cfgcmd} set policy as-path-list \<text\> description \<text\> - -Set description for as-path-list policy. -``` -```{cfgcmd} set policy as-path-list \<text\> rule \<1-65535\> action \<permit|deny\> - -Set action to take on entries matching this rule. -``` -```{cfgcmd} set policy as-path-list \<text\> rule \<1-65535\> description \<text\> - -Set description for rule. -``` -```{cfgcmd} set policy as-path-list \<text\> rule \<1-65535\> regex \<text\> - -Regular expression to match against an AS path. For example "64501 64502". -```
\ No newline at end of file diff --git a/docs/configuration/policy/md-community-list.md b/docs/configuration/policy/md-community-list.md deleted file mode 100644 index bdcf4140..00000000 --- a/docs/configuration/policy/md-community-list.md +++ /dev/null @@ -1,29 +0,0 @@ -# BGP - Community List - -VyOS provides policies commands exclusively for BGP traffic filtering and -manipulation: **community-list** is one of them. - -## Configuration - -### policy community-list - -```{cfgcmd} set policy community-list \<text\> - -Creat community-list policy identified by name `<text>`. -``` -```{cfgcmd} set policy community-list \<text\> description \<text\> - -Set description for community-list policy. -``` -```{cfgcmd} set policy community-list \<text\> rule \<1-65535\> action \<permit|deny\> - -Set action to take on entries matching this rule. -``` -```{cfgcmd} set policy community-list \<text\> rule \<1-65535\> description \<text\> - -Set description for rule. -``` -```{cfgcmd} set policy community-list \<text\> rule \<1-65535\> regex \<aa:nn|local-AS|no-advertise|no-export|additive\> - -Regular expression to match against a community-list. -```
\ No newline at end of file diff --git a/docs/configuration/policy/md-examples.md b/docs/configuration/policy/md-examples.md deleted file mode 100644 index 992aa82c..00000000 --- a/docs/configuration/policy/md-examples.md +++ /dev/null @@ -1,203 +0,0 @@ -# BGP Example - -**Policy definition:** - -```none -# Create policy -set policy route-map setmet rule 2 action 'permit' -set policy route-map setmet rule 2 set as-path prepend '2 2 2' - -# Apply policy to BGP -set protocols bgp system-as 1 -set protocols bgp neighbor 203.0.113.2 address-family ipv4-unicast route-map import 'setmet' -set protocols bgp neighbor 203.0.113.2 address-family ipv4-unicast soft-reconfiguration 'inbound' -``` - -Using 'soft-reconfiguration' we get the policy update without bouncing the -neighbor. - -**Routes learned before routing policy applied:** - -```none -vyos@vos1:~$ show ip bgp -BGP table version is 0, local router ID is 192.168.56.101 -Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, - r RIB-failure, S Stale, R Removed -Origin codes: i - IGP, e - EGP, ? - incomplete - - Network Next Hop Metric LocPrf Weight Path -*> 198.51.100.3/32 203.0.113.2 1 0 2 i < Path - -Total number of prefixes 1 -``` - -**Routes learned after routing policy applied:** - -```none -vyos@vos1:~$ show ip bgp -BGP table version is 0, local router ID is 192.168.56.101 -Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, - r RIB-failure, S Stale, R Removed -Origin codes: i - IGP, e - EGP, ? - incomplete - - Network Next Hop Metric LocPrf Weight Path -*> 198.51.100.3/32 203.0.113.2 1 0 2 2 2 2 i - -Total number of prefixes 1 -vyos@vos1:~$ -``` - -You now see the longer AS path. - -# Transparent Proxy - -The following example will show how VyOS can be used to redirect web -traffic to an external transparent proxy: - -```none -set policy route FILTER-WEB rule 1000 destination port 80 -set policy route FILTER-WEB rule 1000 protocol tcp -set policy route FILTER-WEB rule 1000 set table 100 -``` - -This creates a route policy called FILTER-WEB with one rule to set the -routing table for matching traffic (TCP port 80) to table ID 100 -instead of the default routing table. - -To create routing table 100 and add a new default gateway to be used by -traffic matching our route policy: - -```none -set protocols static table 100 route 0.0.0.0/0 next-hop 10.255.0.2 -``` - -This can be confirmed using the `show ip route table 100` operational -command. - -Finally, to apply the policy route to ingress traffic on our LAN -interface, we use: - -```none -set policy route FILTER-WEB interface eth1 -``` - -# Multiple Uplinks - -VyOS Policy-Based Routing (PBR) works by matching source IP address -ranges and forwarding the traffic using different routing tables. - -Routing tables that will be used in this example are: - -- `table 10` Routing table used for VLAN 10 (192.168.188.0/24) -- `table 11` Routing table used for VLAN 11 (192.168.189.0/24) -- `main` Routing table used by VyOS and other interfaces not - participating in PBR - -:::{figure} /_static/images/pbr_example_1.png -:alt: PBR multiple uplinks -:scale: 80 % - -Policy-Based Routing with multiple ISP uplinks -(source ./draw.io/pbr_example_1.drawio) -::: - -Add default routes for routing `table 10` and `table 11` - -```none -set protocols static table 10 route 0.0.0.0/0 next-hop 192.0.1.1 -set protocols static table 11 route 0.0.0.0/0 next-hop 192.0.2.2 -``` - -Add policy route matching VLAN source addresses - -```none -set policy route PBR rule 20 set table '10' -set policy route PBR rule 20 description 'Route VLAN10 traffic to table 10' -set policy route PBR rule 20 source address '192.168.188.0/24' - -set policy route PBR rule 30 set table '11' -set policy route PBR rule 30 description 'Route VLAN11 traffic to table 11' -set policy route PBR rule 30 source address '192.168.189.0/24' -``` - -Apply routing policy to **inbound** direction of out VLAN interfaces - -```none -set policy route 'PBR' interface eth0.10 -set policy route 'PBR' interface eth0.11 -``` - -**OPTIONAL:** Exclude Inter-VLAN traffic (between VLAN10 and VLAN11) -from PBR - -```none -set firewall group network-group VLANS-GR description 'VLANs networks' -set firewall group network-group VLANS-GR network '192.168.188.0/24' -set firewall group network-group VLANS-GR network '192.168.189.0/24' - -set policy route PBR rule 10 description 'VLAN10 <-> VLAN11 shortcut' -set policy route PBR rule 10 destination group network-group 'VLANS-GR' -set policy route PBR rule 10 set table 'main' -``` - -These commands allow the VLAN10 and VLAN11 hosts to communicate with -each other using the main routing table. - -## Local route - -The following example allows VyOS to use {abbr}`PBR (Policy-Based Routing)` -for traffic, which originated from the router itself. That solution for multiple -ISP's and VyOS router will respond from the same interface that the packet was -received. Also, it used, if we want that one VPN tunnel to be through one -provider, and the second through another. - -- `203.0.113.254` IP addreess on VyOS eth1 from ISP1 -- `192.168.2.254` IP addreess on VyOS eth2 from ISP2 -- `table 10` Routing table used for ISP1 -- `table 11` Routing table used for ISP2 - -```none -set policy local-route rule 101 set table '10' -set policy local-route rule 101 source address '203.0.113.254' -set policy local-route rule 102 set table '11' -set policy local-route rule 102 source address '192.0.2.254' -set protocols static table 10 route 0.0.0.0/0 next-hop '203.0.113.1' -set protocols static table 11 route 0.0.0.0/0 next-hop '192.0.2.2' -``` - -Add multiple source IP in one rule with same priority - -```none -set policy local-route rule 101 set table '10' -set policy local-route rule 101 source address '203.0.113.254' -set policy local-route rule 101 source address '203.0.113.253' -set policy local-route rule 101 source address '198.51.100.0/24' -``` - -# Clamp MSS for a specific IP - -This example shows how to target an MSS clamp (in our example to 1360 bytes) -to a specific destination IP. - -```none -set policy route IP-MSS-CLAMP rule 10 description 'Clamp TCP session MSS to 1360 for 198.51.100.30' -set policy route IP-MSS-CLAMP rule 10 destination address '198.51.100.30/32' -set policy route IP-MSS-CLAMP rule 10 protocol 'tcp' -set policy route IP-MSS-CLAMP rule 10 set tcp-mss '1360' -set policy route IP-MSS-CLAMP rule 10 tcp flags 'SYN' -``` - -To apply this policy to the correct interface, configure it on the -interface the inbound local host will send through to reach our -destined target host (in our example eth1). - -```none -set policy route IP-MSS-CLAMP interface eth1 -``` - -You can view that the policy is being correctly (or incorrectly) utilised -with the following command: - -```none -show policy route statistics -``` diff --git a/docs/configuration/policy/md-extcommunity-list.md b/docs/configuration/policy/md-extcommunity-list.md deleted file mode 100644 index fdfe6210..00000000 --- a/docs/configuration/policy/md-extcommunity-list.md +++ /dev/null @@ -1,32 +0,0 @@ -# BGP - Extended Community List - -VyOS provides policies commands exclusively for BGP traffic filtering and -manipulation: **extcommunity-list** is one of them. - -## Configuration - -### policy extcommunity-list - -```{cfgcmd} set policy extcommunity-list \<text\> - -Creat extcommunity-list policy identified by name \<text\>. -``` -```{cfgcmd} set policy extcommunity-list \<text\> description \<text\> - -Set description for extcommunity-list policy. -``` -```{cfgcmd} set policy extcommunity-list \<text\> rule \<1-65535\> action \<permit|deny\> - -Set action to take on entries matching this rule. -``` -```{cfgcmd} set policy extcommunity-list \<text\> rule \<1-65535\> description \<text\> - -Set description for rule. -``` -```{cfgcmd} set policy extcommunity-list \<text\> rule \<1-65535\> regex \<text\> -Regular expression to match against an extended community list, where text -could be: -* \<aa:nn:nn\>: Extended community list regular expression. -* \<rt aa:nn:nn\>: Route Target regular expression. -* \<soo aa:nn:nn\>: Site of Origin regular expression. -```
\ No newline at end of file diff --git a/docs/configuration/policy/md-index.md b/docs/configuration/policy/md-index.md deleted file mode 100644 index 29c9ca87..00000000 --- a/docs/configuration/policy/md-index.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -lastproofread: '2021-07-12' ---- - -```{include} /_include/need_improvement.txt -``` - -# Policy -Policies are used for filtering and traffic management. With policies, network -administrators could filter and treat traffic -according to their needs. - -There could be a wide range of routing policies. Some examples are listed -below: -- Filter traffic based on source/destination address. -- Set some metric to routes learned from a particular neighbor. -- Set some attributes (like AS PATH or Community value) to advertised routes - to neighbors. -- Prefer a specific routing protocol routes over another routing protocol - running on the same router. - -Policies, in VyOS, are implemented using FRR filtering and route maps. Detailed -information of FRR could be found in <http://docs.frrouting.org/> - -## Policy Sections -```{toctree} -:includehidden: true -:maxdepth: 1 - -access-list -prefix-list -route -route-map -local-route -as-path-list -community-list -extcommunity-list -large-community-list -``` -## Examples -Examples of policies usage: -```{toctree} -:includehidden: true -:maxdepth: 1 - -examples -``` diff --git a/docs/configuration/policy/md-large-community-list.md b/docs/configuration/policy/md-large-community-list.md deleted file mode 100644 index 23b9a85a..00000000 --- a/docs/configuration/policy/md-large-community-list.md +++ /dev/null @@ -1,29 +0,0 @@ -# BGP - Large Community List - -VyOS provides policies commands exclusively for BGP traffic filtering and -manipulation: **large-community-list** is one of them. - -## Configuration - -### policy large-community-list - -```{cfgcmd} set policy large-community-list \<text\> - -Create large-community-list policy identified by name `<text>`. -``` -```{cfgcmd} set policy large-community-list \<text\> description \<text\> - -Set description for large-community-list policy. -``` -```{cfgcmd} set policy large-community-list \<text\> rule \<1-65535\> action \<permit|deny\> - -Set action to take on entries matching this rule. -``` -```{cfgcmd} set policy large-community-list \<text\> rule \<1-65535\> description \<text\> - -Set description for rule. -``` -```{cfgcmd} set policy large-community-list \<text\> rule \<1-65535\> regex \<aa:nn:nn\> - -Regular expression to match against a large community list. -```
\ No newline at end of file diff --git a/docs/configuration/policy/md-local-route.md b/docs/configuration/policy/md-local-route.md deleted file mode 100644 index 5b2297f7..00000000 --- a/docs/configuration/policy/md-local-route.md +++ /dev/null @@ -1,99 +0,0 @@ -# Local Route Policy - -Policies for local traffic are defined in this section. - -## Configuration - -### Local Route IPv4 - -```{cfgcmd} set policy local-route rule \<1-32765\> set table \<1-200|main\> - -Set the routing table to use for forwarding matching packets. -``` - -```{cfgcmd} set policy local-route rule \<1-32765\> set vrf \<vrf|default\> - -Set the VRF to use for forwarding matching packets. -``` - -```{cfgcmd} set policy local-route rule \<1-32765\> protocol \<protocol\> - -Match specified protocol (name or number). -``` - -```{cfgcmd} set policy local-route rule \<1-32765\> fwmark \<1-2147483647\> - -Match specified firewall mark (fwmark). -``` - -```{cfgcmd} set policy local-route rule \<1-32765\> source address \<x.x.x.x|x.x.x.x/x\> - -Match specified source address or prefix. -``` - -```{cfgcmd} set policy local-route rule \<1-32765\> source port \<1-65535\> - -Match specified source port. -``` - -```{cfgcmd} set policy local-route rule \<1-32765\> destination address \<x.x.x.x|x.x.x.x/x\> - -Match specified destination address or prefix. -``` - -```{cfgcmd} set policy local-route rule \<1-32765\> destination port \<1-65535\> - -Match specified destination port. -``` - -```{cfgcmd} set policy local-route rule \<1-32765\> inbound-interface \<interface\> - -Match specified inbound interface. -``` - -### Local Route IPv6 - -```{cfgcmd} set policy local-route6 rule \<1-32765\> set table \<1-200|main\> - -Set the routing table to use for forwarding matching packets. -``` - -```{cfgcmd} set policy local-route6 rule \<1-32765\> set vrf \<vrf|default\> - -Set the VRF to use for forwarding matching packets. -``` - -```{cfgcmd} set policy local-route6 rule \<1-32765\> protocol \<protocol\> - -Match specified protocol (name or number). -``` - -```{cfgcmd} set policy local-route6 rule \<1-32765\> fwmark \<1-2147483647\> - -Match specified firewall mark (fwmark). -``` - -```{cfgcmd} set policy local-route6 rule \<1-32765\> source address \<h:h:h:h:h:h:h:h|h:h:h:h:h:h:h:h/x\> - -Match specified source address or prefix. -``` - -```{cfgcmd} set policy local-route6 rule \<1-32765\> source port \<1-65535\> - -Match specified source port. -``` - -```{cfgcmd} set policy local-route6 rule \<1-32765\> destination address \<h:h:h:h:h:h:h:h|h:h:h:h:h:h:h:h/x\> - -Match specified destination address or prefix. -``` - -```{cfgcmd} set policy local-route6 rule \<1-32765\> destination port \<1-65535\> - -Match specified destination port. -``` - -```{cfgcmd} set policy local-route6 rule \<1-32765\> inbound-interface \<interface\> - -Match specified inbound interface. -```
\ No newline at end of file diff --git a/docs/configuration/policy/md-prefix-list.md b/docs/configuration/policy/md-prefix-list.md deleted file mode 100644 index 6a3e66e6..00000000 --- a/docs/configuration/policy/md-prefix-list.md +++ /dev/null @@ -1,145 +0,0 @@ -# Prefix List Policy - -Prefix lists provides the most powerful prefix based filtering mechanism. In -addition to access-list functionality, ip prefix-list has prefix length range -specification. - -If no ip prefix list is specified, it acts as permit. If ip prefix list is -defined, and no match is found, default deny is applied. - -Prefix filtering can be done using prefix-list and prefix-list6. - -## Configuration - -### IPv4 Prefix Lists (prefix-list) - -```{cfgcmd} set policy prefix-list \<text\> - -This command creates the new prefix-list policy, identified by `<text>`. -``` - -```{cfgcmd} set policy prefix-list \<text\> description \<text\> - -Set description for the prefix-list policy. -``` - -```{cfgcmd} set policy prefix-list \<text\> rule \<1-65535\> action \<permit|deny\> - -This command creates a new rule in the prefix-list and defines an action. -``` - -```{cfgcmd} set policy prefix-list \<text\> rule \<1-65535\> description \<text\> - -Set description for rule in the prefix-list. -``` - -```{cfgcmd} set policy prefix-list \<text\> rule \<1-65535\> prefix \<x.x.x.x/x\> - -Prefix to match against. -``` - -```{cfgcmd} set policy prefix-list \<text\> rule \<1-65535\> ge \<0-32\> - -Netmask greater than length. -``` - -```{cfgcmd} set policy prefix-list \<text\> rule \<1-65535\> le \<0-32\> - -Netmask less than length -``` - -### Example: IPv4 Prefix Lists (prefix-list) -This example creates an IPv4 prefix-list named PL4-EXAMPLE-NAME, defines 3 -rules each with 1 prefix, and matches le (less than/equal to) /32. - -```{cfgcmd} set policy prefix-list PL4-EXAMPLE-NAME rule 10 action 'permit' - -``` -```{cfgcmd} set policy prefix-list PL4-EXAMPLE-NAME rule 10 le '32' -``` - -```{cfgcmd} set policy prefix-list PL4-EXAMPLE-NAME rule 10 prefix '192.0.2.0/24' -``` - -```{cfgcmd} set policy prefix-list PL4-EXAMPLE-NAME rule 20 action 'permit' -``` - -```{cfgcmd} set policy prefix-list PL4-EXAMPLE-NAME rule 20 le '32' -``` - -```{cfgcmd} set policy prefix-list PL4-EXAMPLE-NAME rule 20 prefix '198.51.100.0/24' -``` - -```{cfgcmd} set policy prefix-list PL4-EXAMPLE-NAME rule 30 action 'permit' -``` - -```{cfgcmd} set policy prefix-list PL4-EXAMPLE-NAME rule 30 le '32' -``` - -```{cfgcmd} set policy prefix-list PL4-EXAMPLE-NAME rule 30 prefix '203.0.113.0/24' -``` -### IPv6 Prefix Lists (prefix-list6) -```{cfgcmd} set policy prefix-list6 \<text\> - -This command creates the new IPv6 prefix-list policy, identified by `<text>`. -``` - -```{cfgcmd} set policy prefix-list6 \<text\> description \<text\> - -Set description for the IPv6 prefix-list policy. -``` - -```{cfgcmd} set policy prefix-list6 \<text\> rule \<1-65535\> action \<permit|deny\> - -This command creates a new rule in the IPv6 prefix-list and defines an -action. -``` - -```{cfgcmd} set policy prefix-list6 \<text\> rule \<1-65535\> description \<text\> - -Set description for rule in IPv6 prefix-list. -``` - -```{cfgcmd} set policy prefix-list6 \<text\> rule \<1-65535\> prefix \<h:h:h:h:h:h:h:h/x\> - -IPv6 prefix. -``` - -```{cfgcmd} set policy prefix-list6 \<text\> rule \<1-65535\> ge \<0-128\> - -Netmask greater than length. -``` - -```{cfgcmd} set policy prefix-list6 \<text\> rule \<1-65535\> le \<0-128\> - -Netmask less than length -``` -### Example: IPv6 Prefix Lists (prefix-list6) -This example creates an IPv6 prefix-list6 named PL6-EXAMPLE-NAME, defines 3 -rules each with 1 prefix, and matches le (less than/equal to) /128. -```{cfgcmd} set policy prefix-list6 PL6-EXAMPLE-NAME rule 10 action 'permit' -``` - -```{cfgcmd} set policy prefix-list6 PL6-EXAMPLE-NAME rule 10 le '128' -``` - -```{cfgcmd} set policy prefix-list6 PL6-EXAMPLE-NAME rule 10 prefix '2001:db8:0:0::/64' -``` - -```{cfgcmd} set policy prefix-list6 PL6-EXAMPLE-NAME rule 20 action 'permit' -``` - -```{cfgcmd} set policy prefix-list6 PL6-EXAMPLE-NAME rule 20 le '128' -``` - -```{cfgcmd} set policy prefix-list6 PL6-EXAMPLE-NAME rule 20 prefix '2001:db8:0:1::/64' -``` - -```{cfgcmd} set policy prefix-list6 PL6-EXAMPLE-NAME rule 30 action 'permit' -``` - -```{cfgcmd} set policy prefix-list6 PL6-EXAMPLE-NAME rule 30 le '128' -``` - -```{cfgcmd} set policy prefix-list6 PL6-EXAMPLE-NAME rule 30 prefix '2001:db8:0:2::/64' -```
\ No newline at end of file diff --git a/docs/configuration/policy/md-route.md b/docs/configuration/policy/md-route.md deleted file mode 100644 index 6db28683..00000000 --- a/docs/configuration/policy/md-route.md +++ /dev/null @@ -1,416 +0,0 @@ -# Route and Route6 Policy - -IPv4 route and IPv6 route policies are defined in this section. These route -policies can then be associated to interfaces. - -## Rule-Sets - -A rule-set is a named collection of rules that can be applied to an interface. -Each rule is numbered, has an action to apply if the rule is matched, and the -ability to specify the criteria to match. Data packets go through the rules -from 1 - 999999, at the first match the action of the rule will be executed. - -```{cfgcmd} set policy route \<name\> description \<text\> - -``` -```{cfgcmd} set policy route6 \<name\> description \<text\> - -Provide a rule-set description. -``` - -```{cfgcmd} set policy route \<name\> default-log -``` - -```{cfgcmd} set policy route6 \<name\> default-log - -Option to log packets hitting default-action. -``` - -```{cfgcmd} set policy route \<name\> interface \<interface\> -``` - -```{cfgcmd} set policy route6 \<name\> interface \<interface\> - -Apply routing policy to interface -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> description \<text\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> description \<text\> - -Provide a description for each rule. -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> log \<enable|disable\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> log \<enable|disable\> - -Option to enable or disable log matching rule. -``` -### Matching criteria -There are a lot of matching criteria options available, both for -`policy route` and `policy route6`. These options are listed -in this section. -```{cfgcmd} set policy route \<name\> rule \<n\> connection-mark \<1-2147483647\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> connection-mark \<1-2147483647\> - -Set match criteria based on connection mark. -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> mark \<match_criteria\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> mark \<match_criteria\> - -Match based on the firewall mark (fwmark), where \<match_criteria\> can be: - * \<0-2147483647\> a single fwmark - * !\<0-2147483647\> everything except a single fwmark - * <start-end> a range of marks - * !<start-end> everything except the range of marks - -:::{note} -When using the ``set table`` or ``set vrf`` commands the mark -settings are ignored and overwritten with a table-specific mark that -is set to 0x7FFFFFFF - the id of the table/VRF. -::: -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> source address \<match_criteria\> -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> destination address \<match_criteria\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> source address \<match_criteria\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> destination address \<match_criteria\> - -Set match criteria based on source or destination ipv4|ipv6 address, where -<match_criteria> could be: -``` -For ipv4: -: - \<x.x.x.x>: IP address to match. - - \<x.x.x.x/x>: Subnet to match. - - \<x.x.x.x>-\<x.x.x.x>: IP range to match. - - !\<x.x.x.x>: Match everything except the specified address. - - !\<x.x.x.x/x>: Match everything except the specified subnet. - - !\<x.x.x.x>-\<x.x.x.x>: Match everything except the specified range. - -And for ipv6: -: - \<h:h:h:h:h:h:h:h>: IPv6 address to match. - - \<h:h:h:h:h:h:h:h/x>: IPv6 prefix to match. - - \<h:h:h:h:h:h:h:h>-\<h:h:h:h:h:h:h:h>: IPv6 range to match. - - !\<h:h:h:h:h:h:h:h>: Match everything except the specified address. - - !\<h:h:h:h:h:h:h:h/x>: Match everything except the specified prefix. - - !\<h:h:h:h:h:h:h:h>-\<h:h:h:h:h:h:h:h>: Match everything except the - specified range. -```{cfgcmd} set policy route \<name\> rule \<n\> source group \<address-group|domain-group|mac-group|network-group|port-group\> \<text\> -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> destination group \<address-group|domain-group|mac-group|network-group|port-group\> \<text\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> source group \<address-group|domain-group|mac-group|network-group|port-group\> \<text\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> destination group \<address-group|domain-group|mac-group|network-group|port-group\> \<text\> - -Set match criteria based on source or destination groups, where <text> -would be the group name/identifier. Prepend character '!' for inverted -matching criteria. -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> destination port \<match_criteria\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> destination port \<match_criteria\> - -Set match criteria based on destination port, where \<match_criteria\> could -be: -* <port name>: Named port (any name in /etc/services, e.g., http). -* \<1-65535\>: Numbered port. -* <start>-<end>: Numbered port range (e.g., 1001-1005). - -Multiple destination ports can be specified as a comma-separated list. The -whole list can also be "negated" using '!'. For example: -'!22,telnet,http,123,1001-1005' -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> disable -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> disable - -Option to disable rule. -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> dscp \<text\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> dscp \<text\> -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> dscp-exclude \<text\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> dscp-exclude \<text\> - -Match based on dscp value criteria. Multiple values from 0 to 63 -and ranges are supported. -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> fragment \<match-grag|match-non-frag\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> fragment \<match-grag|match-non-frag\> - -Set IP fragment match, where: -* match-frag: Second and further fragments of fragmented packets. -* match-non-frag: Head fragments or unfragmented packets. -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> icmp \<code | type\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> icmpv6 \<code | type\> - -Match based on icmp|icmpv6 code and type. -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> icmp type-name \<text\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> icmpv6 type-name \<text\> - -Match based on icmp|icmpv6 type-name criteria. Use tab for information -about what type-name criteria are supported. -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> ipsec \<match-ipsec|match-none\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> ipsec \<match-ipsec|match-none\> - -Set IPSec inbound match criterias, where: -* match-ipsec: match inbound IPsec packets. -* match-none: match inbound non-IPsec packets. -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> limit burst \<0-4294967295\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> limit burst \<0-4294967295\> - -Set maximum number of packets to alow in excess of rate. -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> limit rate \<text\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> limit rate \<text\> - -Set maximum average matching rate. Format for rate: integer/time_unit, where -time_unit could be any one of second, minute, hour or day.For example -1/second implies rule to be matched at an average of once per second. -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> protocol \<text | 0-255 | tcp_udp | all \> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> protocol \<text | 0-255 | tcp_udp | all \> - -Match a protocol criteria. A protocol number or a name which is defined in: -``/etc/protocols``. Special names are ``all`` for all protocols and -``tcp_udp`` for tcp and udp based packets. The ``!`` negates the selected -protocol. -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> packet-length \<text\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> packet-length \<text\> -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> packet-length-exclude \<text\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> packet-length-exclude \<text\> - -Match based on packet length criteria. Multiple values from 1 to 65535 -and ranges are supported. -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> packet-type \[broadcast | host | multicast | other\] -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> packet-type \[broadcast | host | multicast | other\] - -Match based on packet type criteria. -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> recent count \<1-255\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> recent count \<1-255\> -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> recent time \<1-4294967295\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> recent time \<1-4294967295\> - -Set parameters for matching recently seen sources. This match could be used -by seeting count (source address seen more than <1-255> times) and/or time -(source address seen in the last <0-4294967295> seconds). -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> state \<established | invalid | new | related\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> state \<established | invalid | new | related\> - -Set match criteria based on session state. -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> tcp flags \<text\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> tcp flags \<text\> - -Set match criteria based on tcp flags. Allowed values for TCP flags: SYN ACK -FIN RST URG PSH ALL. When specifying more than one flag, flags should be -comma-separated. For example : value of 'SYN,!ACK,!FIN,!RST' will only match -packets with the SYN flag set, and the ACK, FIN and RST flags unset. -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> time monthdays \<text\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> time monthdays \<text\> -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> time startdate \<text\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> time startdate \<text\> -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> time starttime \<text\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> time starttime \<text\> -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> time stopdate \<text\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> time stopdate \<text\> -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> time stoptime \<text\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> time stoptime \<text\> -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> time weekdays \<text\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> time weekdays \<text\> -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> time utc -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> time utc - -Time to match the defined rule. -``` - -```{cfgcmd} set policy route rule \<n\> ttl \<eq | gt | lt\> \<0-255\> - -Match time to live parameter, where 'eq' stands for 'equal'; 'gt' stands for -'greater than', and 'lt' stands for 'less than'. -``` - -```{cfgcmd} set policy route6 rule \<n\> hop-limit \<eq | gt | lt\> \<0-255\> - -Match hop-limit parameter, where 'eq' stands for 'equal'; 'gt' stands for -'greater than', and 'lt' stands for 'less than'. -``` -### Actions -When mathcing all patterns defined in a rule, then different actions can -be made. This includes droping the packet, modifying certain data, or -setting a different routing table. -```{cfgcmd} set policy route \<name\> rule \<n\> action drop -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> action drop - -Set rule action to drop. -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> set connection-mark \<1-2147483647\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> set connection-mark \<1-2147483647\> - -Set a specific connection mark. -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> set dscp \<0-63\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> set dscp \<0-63\> - -Set packet modifications: Packet Differentiated Services Codepoint (DSCP) -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> set mark \<1-2147483647\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> set mark \<1-2147483647\> - -Set a specific packet mark. -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> set table \<main | 1-200\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> set table \<main | 1-200\> - -Set the routing table to forward packet with. - -:::{note} -When using the ``set table`` or ``set vrf`` commands matching -against the mark is not possible, because it gets overwritten with a -table-specific mark that is 0x7FFFFFFF - the id of the table/VRF. -::: -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> set tcp-mss \<500-1460\> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> set tcp-mss \<500-1460\> - -Set packet modifications: Explicitly set TCP Maximum segment size value. -``` - -```{cfgcmd} set policy route \<name\> rule \<n\> set vrf \<default | text \> -``` - -```{cfgcmd} set policy route6 \<name\> rule \<n\> set vrf \<default | text \> - -Set the VRF to forward packet with. - -:::{note} -When using the ``set table`` or ``set vrf`` commands matching -against the mark is not possible, because it gets overwritten with a -table-specific mark that is 0x7FFFFFFF - the id of the table/VRF. -::: -```
\ No newline at end of file diff --git a/docs/configuration/protocols/md-index.md b/docs/configuration/protocols/md-index.md deleted file mode 100644 index 5f190ce1..00000000 --- a/docs/configuration/protocols/md-index.md +++ /dev/null @@ -1,25 +0,0 @@ -# Protocols - -```{toctree} -:includehidden: true -:maxdepth: 1 - -arp -babel -bfd -bgp -failover -igmp-proxy -isis -mpls -multicast -segment-routing -traffic-engineering -openfabric -ospf -pim -pim6 -rip -rpki -static -``` diff --git a/docs/configuration/service/md-index.md b/docs/configuration/service/md-index.md deleted file mode 100644 index 4018c5be..00000000 --- a/docs/configuration/service/md-index.md +++ /dev/null @@ -1,29 +0,0 @@ -# Service - -```{toctree} -:includehidden: true -:maxdepth: 1 - -broadcast-relay -config-sync -conntrack-sync -console-server -dhcp-relay -dhcp-server -dns -eventhandler -https -ipoe-server -lldp -mdns -monitoring -ntp -pppoe-server -router-advert -salt-minion -snmp -ssh -tftp-server -webproxy -suricata -``` diff --git a/docs/configuration/service/md-salt-minion.md b/docs/configuration/service/md-salt-minion.md deleted file mode 100644 index d7aa7664..00000000 --- a/docs/configuration/service/md-salt-minion.md +++ /dev/null @@ -1,50 +0,0 @@ -(saltminion)= - -# Salt-Minion - -[SaltStack] is Python-based, open-source -software for event-driven IT automation, remote task execution, and -configuration management. Supporting the "infrastructure as code" -approach to data center system and network deployment and management, -configuration automation, SecOps orchestration, vulnerability remediation, -and hybrid cloud control. - -## Requirements - -To use the Salt-Minion, a running Salt-Master is required. You can find more -in the [Salt Project Documentation](https://docs.saltproject.io/en/latest/contents.html) - -## Configuration - -```{cfgcmd} set service salt-minion hash \<type\> - - The hash type used when discovering file on master server (default: sha256) -``` - - -```{cfgcmd} set service salt-minion id \<id\> - -Explicitly declare ID for this minion to use (default: hostname) -``` - - -```{cfgcmd} set service salt-minion interval \<1-1440\> - -Interval in minutes between updates (default: 60) -``` - - -```{cfgcmd} set service salt-minion master \<hostname | IP\> - -The hostname or IP address of the master -``` - - -```{cfgcmd} set service salt-minion master-key \<key\> - -URL with signature of master for auth reply verification -``` -Please take a look in the Automation section to find some usefull -Examples. - -[saltstack]: https://saltproject.io/ diff --git a/docs/configuration/service/md-snmp.md b/docs/configuration/service/md-snmp.md deleted file mode 100644 index 6a5a66e5..00000000 --- a/docs/configuration/service/md-snmp.md +++ /dev/null @@ -1,255 +0,0 @@ -(snmp)= - -# SNMP - -{abbr}`SNMP (Simple Network Management Protocol)` is an Internet Standard -protocol for collecting and organizing information about managed devices on -IP networks and for modifying that information to change device behavior. -Devices that typically support SNMP include cable modems, routers, switches, -servers, workstations, printers, and more. - -SNMP is widely used in network management for network monitoring. SNMP exposes -management data in the form of variables on the managed systems organized in -a management information base ([MIB]) which describe the system status and -configuration. These variables can then be remotely queried (and, in some -circumstances, manipulated) by managing applications. - -Three significant versions of SNMP have been developed and deployed. SNMPv1 is -the original version of the protocol. More recent versions, SNMPv2c and SNMPv3, -feature improvements in performance, flexibility and security. - -SNMP is a component of the Internet Protocol Suite as defined by the Internet -Engineering Task Force (IETF). It consists of a set of standards for network -management, including an application layer protocol, a database schema, and a -set of data objects. - -## Overview and basic concepts - -In typical uses of SNMP, one or more administrative computers called managers -have the task of monitoring or managing a group of hosts or devices on a -computer network. Each managed system executes a software component called an -agent which reports information via SNMP to the manager. - -An SNMP-managed network consists of three key components: - -- Managed devices -- Agent - software which runs on managed devices -- Network management station (NMS) - software which runs on the manager - -A managed device is a network node that implements an SNMP interface that -allows unidirectional (read-only) or bidirectional (read and write) access to -node-specific information. Managed devices exchange node-specific information -with the NMSs. Sometimes called network elements, the managed devices can be -any type of device, including, but not limited to, routers, access servers, -switches, cable modems, bridges, hubs, IP telephones, IP video cameras, -computer hosts, and printers. - -An agent is a network-management software module that resides on a managed -device. An agent has local knowledge of management information and translates -that information to or from an SNMP-specific form. - -A network management station executes applications that monitor and control -managed devices. NMSs provide the bulk of the processing and memory resources -required for network management. One or more NMSs may exist on any managed -network. - -:::{figure} /_static/images/service_snmp_communication_principles_diagram.png -:alt: Principle of SNMP Communication -:scale: 20 % - -Image thankfully borrowed from -<https://en.wikipedia.org/wiki/File:SNMP_communication_principles_diagram.PNG> -which is under the GNU Free Documentation License -::: - -:::{note} -VyOS SNMP supports both IPv4 and IPv6. -::: - -## SNMP Protocol Versions - -VyOS itself supports [SNMPv2] (version 2) and [SNMPv3] (version 3) where the -later is recommended because of improved security (optional authentication and -encryption). - -### SNMPv2 - -SNMPv2 is the original and most commonly used version. For authorizing clients, -SNMP uses the concept of communities. Communities may have authorization set -to read only (this is most common) or to read and write (this option is not -actively used in VyOS). - -SNMP can work synchronously or asynchronously. In synchronous communication, -the monitoring system queries the router periodically. In asynchronous, the -router sends notification to the "trap" (the monitoring host). - -SNMPv2 does not support any authentication mechanisms, other than client source -address, so you should specify addresses of clients allowed to monitor the -router. Note that SNMPv2 also supports no encryption and always sends data in -plain text. - -#### Example - -```none -# Define a community -set service snmp community routers authorization ro - -# Allow monitoring access from the entire network -set service snmp community routers network 192.0.2.0/24 -set service snmp community routers network 2001::db8:ffff:eeee::/64 - -# Allow monitoring access from specific addresses -set service snmp community routers client 203.0.113.10 -set service snmp community routers client 203.0.113.20 - -# Define optional router information -set service snmp location "UK, London" -set service snmp contact "admin@example.com" - -# Trap target if you want asynchronous communication -set service snmp trap-target 203.0.113.10 - -# Listen only on specific IP addresses (port defaults to 161) -set service snmp listen-address 172.16.254.36 port 161 -set service snmp listen-address 2001:db8::f00::1 -``` - -### SNMPv3 - -SNMPv3 (version 3 of the SNMP protocol) introduced a whole slew of new security -related features that have been missing from the previous versions. Security -was one of the biggest weakness of SNMP until v3. Authentication in SNMP -Versions 1 and 2 amounts to nothing more than a password (community string) -sent in clear text between a manager and agent. Each SNMPv3 message contains -security parameters which are encoded as an octet string. The meaning of these -security parameters depends on the security model being used. - -The security approach in SNMPv3 targets: - -- Confidentiality – Encryption of packets to prevent snooping by an - unauthorized source. -- Integrity – Message integrity to ensure that a packet has not been tampered - while in transit including an optional packet replay protection mechanism. -- Authentication – to verify that the message is from a valid source. - -(snmp-v3-example)= - -#### Example - -- Let SNMP daemon listen only on IP address 192.0.2.1 -- Configure new SNMP user named "vyos" with password "vyos12345678" -- New user will use SHA/AES for authentication and privacy - -```none -set service snmp listen-address 192.0.2.1 -set service snmp location 'VyOS Datacenter' -set service snmp v3 engineid '000000000000000000000002' -set service snmp v3 group default mode 'ro' -set service snmp v3 group default view 'default' -set service snmp v3 user vyos auth plaintext-password 'vyos12345678' -set service snmp v3 user vyos auth type 'sha' -set service snmp v3 user vyos group 'default' -set service snmp v3 user vyos privacy plaintext-password 'vyos12345678' -set service snmp v3 user vyos privacy type 'aes' -set service snmp v3 view default oid 1 -``` - -After commit the plaintext passwords will be hashed and stored in your -configuration. The resulting CLI config will look like: - -```none -vyos@vyos# show service snmp - listen-address 192.0.2.1 { - } - location "VyOS Datacenter" - v3 { - engineid 000000000000000000000002 - group default { - mode ro - view default - } - user vyos { - auth { - encrypted-password 4e52fe55fd011c9c51ae2c65f4b78ca93dcafdfe - type sha - } - group default - privacy { - encrypted-password 4e52fe55fd011c9c51ae2c65f4b78ca93dcafdfe - type aes - } - } - view default { - oid 1 { - } - } - } -``` - -You can test the SNMPv3 functionality from any linux based system, just run the -following command: `snmpwalk -v 3 -u vyos -a SHA -A vyos12345678 -x AES --X vyos12345678 -l authPriv 192.0.2.1 .1` - -## VyOS MIBs - -All SNMP MIBs are located in each image of VyOS here: `/usr/share/snmp/mibs/` - -You are be able to download the files using SCP, once the SSH service -has been activated like so - -```none -scp -r vyos@your_router:/usr/share/snmp/mibs /your_folder/mibs -``` - -## SNMP Extensions - -To extend SNMP agent functionality, custom scripts can be executed every time -the agent is being called. This can be achieved by using -`arbitrary extensioncommands`. The first step is to create a functional -script of course, then upload it to your VyOS instance via the command -`scp your_script.sh vyos@your_router:/config/user-data`. -Once the script is uploaded, it needs to be configured via the command below. - -```none -set service snmp script-extensions extension-name my-extension script your_script.sh -commit -``` - -The OID `.1.3.6.1.4.1.8072.1.3.2.3.1.1.4.116.101.115.116`, once called, will -contain the output of the extension. - -```none -root@vyos:/home/vyos# snmpwalk -v2c -c public 127.0.0.1 nsExtendOutput1 -NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."my-extension" = STRING: hello -NET-SNMP-EXTEND-MIB::nsExtendOutputFull."my-extension" = STRING: hello -NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."my-extension" = INTEGER: 1 -NET-SNMP-EXTEND-MIB::nsExtendResult."my-extension" = INTEGER: 0 -``` - -## SolarWinds - -If you happen to use SolarWinds Orion as NMS you can also use the Device -Templates Management. A template for VyOS can be easily imported. - -Create a file named `VyOS-1.3.6.1.4.1.44641.ConfigMgmt-Commands` using the -following content: - -```none -<Configuration-Management Device="VyOS" SystemOID="1.3.6.1.4.1.44641"> - <Commands> - <Command Name="Reset" Value="set terminal width 0${CRLF}set terminal length 0"/> - <Command Name="Reboot" Value="reboot${CRLF}Yes"/> - <Command Name="EnterConfigMode" Value="configure"/> - <Command Name="ExitConfigMode" Value="commit${CRLF}exit"/> - <Command Name="DownloadConfig" Value="show configuration commands"/> - <Command Name="SaveConfig" Value="commit${CRLF}save"/> - <Command Name="Version" Value="show version"/> - <Command Name="MenuBased" Value="False"/> - <Command Name="VirtualPrompt" Value=":~"/> - </Commands> -</Configuration-Management> -``` - -[mib]: https://en.wikipedia.org/wiki/Management_information_base -[snmpv2]: https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol#Version_2 -[snmpv3]: https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol#Version_3 diff --git a/docs/configuration/system/md-index.md b/docs/configuration/system/md-index.md deleted file mode 100644 index e0b8a5a1..00000000 --- a/docs/configuration/system/md-index.md +++ /dev/null @@ -1,34 +0,0 @@ -# System - -```{toctree} -:includehidden: true -:maxdepth: 1 - -acceleration -conntrack -console -flow-accounting -frr -host-name -ip -ipv6 -lcd -login -name-server -option -proxy -sflow -syslog -sysctl -task-scheduler -time-zone -updates -watchdog -``` - -```{toctree} -:includehidden: true -:maxdepth: 1 - -default-route -``` diff --git a/docs/configuration/system/md-sysctl.md b/docs/configuration/system/md-sysctl.md deleted file mode 100644 index 90434fb2..00000000 --- a/docs/configuration/system/md-sysctl.md +++ /dev/null @@ -1,16 +0,0 @@ -(sysctl)= - -# Sysctl - -:::{note} -This page is a stub and needs expansion. Contributions -welcome via the [VyOS documentation repository](https://github.com/vyos/vyos-documentation). -::: - -This chapter describes how to configure kernel parameters at runtime. - -`sysctl` is used to modify kernel parameters at runtime. The parameters -available are those listed under /proc/sys/. - -```{cfgcmd} set system sysctl parameter \<parameter\> value \<value\> -```
\ No newline at end of file diff --git a/docs/configuration/system/md-updates.md b/docs/configuration/system/md-updates.md deleted file mode 100644 index 8734788f..00000000 --- a/docs/configuration/system/md-updates.md +++ /dev/null @@ -1,35 +0,0 @@ -# Updates - -VyOS supports online checking for updates - -## Configuration - -```{cfgcmd} set system update-check auto-check - -Configure auto-checking for new images -``` - -```{cfgcmd} set system update-check url \<url\> - -Configure a URL that contains information about images. -``` - -## Example - -```none -set system update-check auto-check -set system update-check url 'https://raw.githubusercontent.com/vyos/vyos-rolling-nightly-builds/main/version.json' -``` - -Check: - -```none -vyos@r4:~$ show system updates -Current version: 1.5-rolling-202312220023 - -Update available: 1.5-rolling-202312250024 -Update URL: https://github.com/vyos/vyos-rolling-nightly-builds/releases/download/1.5-rolling-202312250024/1.5-rolling-202312250024-amd64.iso -vyos@r4:~$ - -vyos@r4:~$ add system image latest -``` diff --git a/docs/configuration/vpn/ipsec/md-index.md b/docs/configuration/vpn/ipsec/md-index.md deleted file mode 100644 index cc40b6f8..00000000 --- a/docs/configuration/vpn/ipsec/md-index.md +++ /dev/null @@ -1,11 +0,0 @@ -# IPsec - -```{toctree} -:includehidden: true -:maxdepth: 1 - -ipsec_general -site2site_ipsec -remoteaccess_ipsec -troubleshooting_ipsec -``` diff --git a/docs/configuration/vpn/ipsec/md-remoteaccess_ipsec.md b/docs/configuration/vpn/ipsec/md-remoteaccess_ipsec.md deleted file mode 100644 index de553aec..00000000 --- a/docs/configuration/vpn/ipsec/md-remoteaccess_ipsec.md +++ /dev/null @@ -1,181 +0,0 @@ -(remoteaccess-ipsec)= - -# IPSec IKEv2 Remote Access VPN - -```{todo} -Convert raw command blocks in this file to cfgcmd/opcmd -directives for command coverage tracking. -``` - -Internet Key Exchange version 2 (IKEv2) is a tunneling protocol, based on IPsec, -that establishes a secure VPN communication between VPN devices, and defines -negotiation and authentication processes for IPsec security associations (SAs). -It is often known as IKEv2/IPSec or IPSec IKEv2 remote-access — or road-warriors -as others call it. - -Key exchange and payload encryption is done using IKE and ESP proposals as known -from IKEv1 but the connections are faster to establish, more reliable, and also -support roaming from IP to IP (called MOBIKE which makes sure your connection -does not drop when changing networks from e.g. WIFI to LTE and back). -Authentication can be achieved with X.509 certificates. - -## Setting up certificates: -First of all, we need to create a CA root certificate and server certificate -on the server side. - -```none -vyos@vpn.vyos.net# run generate pki ca install ca_root -Enter private key type: [rsa, dsa, ec] (Default: rsa) -Enter private key bits: (Default: 2048) -Enter country code: (Default: GB) -Enter state: (Default: Some-State) -Enter locality: (Default: Some-City) -Enter organization name: (Default: VyOS) -Enter common name: (Default: vyos.io) -Enter how many days certificate will be valid: (Default: 1825) -Note: If you plan to use the generated key on this router, do not encrypt the private key. -Do you want to encrypt the private key with a passphrase? [y/N] N -2 value(s) installed. Use "compare" to see the pending changes, and "commit" to apply. -[edit] - - -vyos@vpn.vyos.net# comp -[pki ca] -+ ca_root { -+ certificate "MIIDnTCCAoWgAwI…." -+ private { -+ key "MIIEvAIBADANBgkqhkiG9….” - -vyos@vpn.vyos.net# run generate pki certificate sign ca_root install server_cert -Do you already have a certificate request? [y/N] N -Enter private key type: [rsa, dsa, ec] (Default: rsa) -Enter private key bits: (Default: 2048) -Enter country code: (Default: GB) -Enter state: (Default: Some-State) -Enter locality: (Default: Some-City) -Enter organization name: (Default: VyOS) -Enter common name: (Default: vyos.io) vpn.vyos.net -Do you want to configure Subject Alternative Names? [y/N] N -Enter how many days certificate will be valid: (Default: 365) -Enter certificate type: (client, server) (Default: server) -Note: If you plan to use the generated key on this router, do not encrypt the private key. -Do you want to encrypt the private key with a passphrase? [y/N] N -2 value(s) installed. Use "compare" to see the pending changes, and "commit" to apply. - -vyos@vpn.vyos.net# comp -[pki certificate] -+ server_cert { -+ certificate "MIIDuzCCAqOgAwIBAgIUaSrCPWx………" -+ private { -+ key "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBK….." -+ } -+ } -``` - -Once the command is completed, it will add the certificate to the configuration -session, to the pki subtree. You can then review the proposed changes and -commit them. - -## Setting up IPSec: -After the PKI certs are all set up we can start configuring our IPSec/IKE -proposals used for key-exchange end data encryption. The used encryption ciphers -and integrity algorithms vary from operating system to operating system. The -ones used in this example are validated to work on Windows 10. - -```none -set vpn ipsec esp-group ESP-RW lifetime '3600' -set vpn ipsec esp-group ESP-RW pfs 'disable' -set vpn ipsec esp-group ESP-RW proposal 10 encryption 'aes128gcm128' -set vpn ipsec esp-group ESP-RW proposal 10 hash 'sha256' - -set vpn ipsec ike-group IKE-RW key-exchange 'ikev2' -set vpn ipsec ike-group IKE-RW lifetime '7200' -set vpn ipsec ike-group IKE-RW proposal 10 dh-group '14' -set vpn ipsec ike-group IKE-RW proposal 10 encryption 'aes128gcm128' -set vpn ipsec ike-group IKE-RW proposal 10 hash 'sha256' -``` - -Every connection/remote-access pool we configure also needs a pool where we -can draw our client IP addresses from. We provide one IPv4 and IPv6 pool. -Authorized clients will receive an IPv4 address from the configured IPv4 prefix -and an IPv6 address from the IPv6 prefix. We can also send some DNS nameservers -down to our clients used on their connection. - -```none -set vpn ipsec remote-access pool ra-rw-ipv4 name-server '192.0.2.1' -set vpn ipsec remote-access pool ra-rw-ipv4 prefix '192.0.2.128/25' - -set vpn ipsec remote-access pool ra-rw-ipv6 name-server '2001:db8:1000::1' -set vpn ipsec remote-access pool ra-rw-ipv6 prefix '2001:db8:2000::/64' -``` - -## Setting up tunnel: - -```none -set vpn ipsec remote-access connection rw authentication local-id '192.0.2.1' -set vpn ipsec remote-access connection rw authentication server-mode 'x509' -set vpn ipsec remote-access connection rw authentication x509 ca-certificate 'ca_root' -set vpn ipsec remote-access connection rw authentication x509 certificate 'server_cert' -set vpn ipsec remote-access connection rw esp-group 'ESP-RW' -set vpn ipsec remote-access connection rw ike-group 'IKE-RW' -set vpn ipsec remote-access connection rw local-address '192.0.2.1' -set vpn ipsec remote-access connection rw pool 'ra-rw-ipv4' -set vpn ipsec remote-access connection rw pool 'ra-rw-ipv6' -``` - -VyOS also supports two different modes of authentication, local and RADIUS. -To create a new local user named "vyos" with a password of "vyos" use the -following commands. - -```none -set vpn ipsec remote-access connection rw authentication client-mode 'eap-mschapv2' -set vpn ipsec remote-access connection rw authentication local-users username vyos password 'vyos' -``` - -Some client operating systems like to see the servers certificate. The following -option causes the server to voluntarily send its certificate, even if it wasn't -requested. - -```none -set vpn ipsec remote-access connection rw authentication always-send-cert -``` - -## Client Configuration -Most operating systems include native client support for IPsec IKEv2 VPN -connections, and others typically have an app or add-on package which adds the -capability. -This section covers IPsec IKEv2 client configuration for Windows 10. - -VyOS provides a command to generate a connection profile used by Windows clients -that will connect to the "rw" connection on our VyOS server. - -:::{note} -Windows expects the server name to be also used in the server's -certificate common name, so it's best to use this DNS name for your VPN -connection. -::: - -```none -vyos@vpn.vyos.net:~$ generate ipsec profile windows-remote-access rw remote vpn.vyos.net - - -==== <snip> ==== -Add-VpnConnection -Name "VyOS IKEv2 VPN" -ServerAddress "vpn.vyos.net" -TunnelType "Ikev2" - -Set-VpnConnectionIPsecConfiguration -ConnectionName "VyOS IKEv2 VPN" -AuthenticationTransformConstants GCMAES128 -CipherTransformConstants -GCMAES128 -EncryptionMethod GCMAES128 -IntegrityCheckMethod SHA256128 -PfsGroup None -DHGroup "Group14" -PassThru -Force -==== </snip> ==== -``` - -Add the commands from Snippet in the Windows side via PowerShell. -Also import the root CA cert to the Windows “Trusted Root Certification -Authorities” and establish the connection. - -## Verification: - -```none -vyos@vpn.vyos.net:~$ show vpn ipsec remote-access summary - Connection ID Username Protocol State Uptime Tunnel IP Remote Host Remote ID IKE Proposal IPSec Proposal ---------------- ---------- ---------- ------- -------- ----------- ------------- ----------- ------------------------------------------ ------------------ - 5 vyos IKEv2 UP 37s 192.0.2.129 10.0.0.2 10.0.0.2 AES_GCM_16-128/PRF_HMAC_SHA2_256/MODP_2048 ESP:AES_GCM_16-128 -``` diff --git a/docs/configuration/vpn/ipsec/md-troubleshooting_ipsec.md b/docs/configuration/vpn/ipsec/md-troubleshooting_ipsec.md deleted file mode 100644 index 2dfd3fec..00000000 --- a/docs/configuration/vpn/ipsec/md-troubleshooting_ipsec.md +++ /dev/null @@ -1,302 +0,0 @@ -(troubleshooting-ipsec)= - -# Troubleshooting Site-to-Site VPN IPsec - -```{todo} -Convert raw command blocks in this file to cfgcmd/opcmd -directives for command coverage tracking. -``` - -## Introduction -This document describes the methodology to monitor and troubleshoot -Site-to-Site VPN IPsec. - -Steps for troubleshooting problems with Site-to-Site VPN IPsec: -: 1. Ping the remote site through the tunnel using the source and - destination IPs included in the policy. - 2. Check connectivity between the routers using the ping command - (if ICMP traffic is allowed). - 3. Check the IKE SAs' statuses. - 4. Check the IPsec SAs' statuses. - 5. Check logs to view debug messages. - -## Checking IKE SA Status -The next command shows IKE SAs' statuses. - -```none -vyos@vyos:~$ show vpn ike sa - -Peer ID / IP Local ID / IP ------------- ------------- -192.168.1.2 192.168.1.2 192.168.0.1 192.168.0.1 - - State IKEVer Encrypt Hash D-H Group NAT-T A-Time L-Time - ----- ------ ------- ---- --------- ----- ------ ------ - up IKEv2 AES_CBC_128 HMAC_SHA1_96 MODP_2048 no 162 27023 -``` - -This command shows the next information: -: - IKE SA status. - - Selected IKE version. - - Selected Encryption, Hash and Diffie-Hellman Group. - - NAT-T. - - ID and IP of both peers. - - A-Time: established time, L-Time: time for next rekeying. - -## IPsec SA (CHILD SA) Status -The next commands show IPsec SAs' statuses. - -```none -vyos@vyos:~$ show vpn ipsec sa -Connection State Uptime Bytes In/Out Packets In/Out Remote address Remote ID Proposal -------------- ------- -------- -------------- ---------------- ---------------- ----------- ---------------------------------- -PEER-tunnel-1 up 16m30s 168B/168B 2/2 192.168.1.2 192.168.1.2 AES_CBC_128/HMAC_SHA1_96/MODP_2048 -``` - -```none -vyos@vyos:~$ show vpn ipsec sa detail -PEER: #1, ESTABLISHED, IKEv2, 101275ac719d5a1b_i* 68ea4ec3bed3bf0c_r - local '192.168.0.1' @ 192.168.0.1[4500] - remote '192.168.1.2' @ 192.168.1.2[4500] - AES_CBC-128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_2048 - established 4054s ago, rekeying in 23131s - PEER-tunnel-1: #2, reqid 1, INSTALLED, TUNNEL, ESP:AES_CBC-128/HMAC_SHA1_96/MODP_2048 - installed 1065s ago, rekeying in 1998s, expires in 2535s - in c5821882, 168 bytes, 2 packets, 81s ago - out c433406a, 168 bytes, 2 packets, 81s ago - local 10.0.0.0/24 - remote 10.0.1.0/24 -``` - -These commands show the next information: -: - IPsec SA status. - - Uptime and time for the next rekeing. - - Amount of transferred data. - - Remote and local ID and IP. - - Selected Encryption, Hash and Diffie-Hellman Group. - - Mode (tunnel or transport). - - Remote and local prefixes which are use for policy. - -There is a possibility to view the summarized information of SAs' status - -```none -vyos@vyos:~$ show vpn ipsec connections -Connection State Type Remote address Local TS Remote TS Local id Remote id Proposal -------------- ------- ------ ---------------- ----------- ----------- ----------- ----------- ---------------------------------- -PEER up IKEv2 192.168.1.2 - - 192.168.0.1 192.168.1.2 AES_CBC/128/HMAC_SHA1_96/MODP_2048 -PEER-tunnel-1 up IPsec 192.168.1.2 10.0.0.0/24 10.0.1.0/24 192.168.0.1 192.168.1.2 AES_CBC/128/HMAC_SHA1_96/MODP_2048 -``` - -## Viewing Logs for Debugging -If IKE SAs or IPsec SAs are down, need to debug IPsec connectivity -using logs `show log ipsec` - -The next example of the successful IPsec connection initialization. - -```none -vyos@vyos:~$ show log ipsec -Jun 20 14:29:47 charon[2428]: 02[NET] <PEER|1> received packet: from 192.168.1.2[500] to 192.168.0.1[500] (472 bytes) -Jun 20 14:29:47 charon[2428]: 02[ENC] <PEER|1> parsed IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(CHDLESS_SUP) N(MULT_AUTH) ] -Jun 20 14:29:47 charon-systemd[2428]: received packet: from 192.168.1.2[500] to 192.168.0.1[500] (472 bytes) -Jun 20 14:29:47 charon[2428]: 02[CFG] <PEER|1> selected proposal: IKE:AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_2048 -Jun 20 14:29:47 charon-systemd[2428]: parsed IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(CHDLESS_SUP) N(MULT_AUTH) ] -Jun 20 14:29:47 charon-systemd[2428]: selected proposal: IKE:AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_2048 -Jun 20 14:29:47 charon[2428]: 02[IKE] <PEER|1> authentication of '192.168.0.1' (myself) with pre-shared key -Jun 20 14:29:47 charon-systemd[2428]: authentication of '192.168.0.1' (myself) with pre-shared key -Jun 20 14:29:47 charon[2428]: 02[IKE] <PEER|1> establishing CHILD_SA PEER-tunnel-1{1} -Jun 20 14:29:47 charon-systemd[2428]: establishing CHILD_SA PEER-tunnel-1{1} -Jun 20 14:29:47 charon[2428]: 02[ENC] <PEER|1> generating IKE_AUTH request 1 [ IDi N(INIT_CONTACT) IDr AUTH SA TSi TSr N(MOBIKE_SUP) N(NO_ADD_ADDR) N(MULT_AUTH) N(EAP_ONLY) N(MSG_ID_SYN_SUP) ] -Jun 20 14:29:47 charon-systemd[2428]: generating IKE_AUTH request 1 [ IDi N(INIT_CONTACT) IDr AUTH SA TSi TSr N(MOBIKE_SUP) N(NO_ADD_ADDR) N(MULT_AUTH) N(EAP_ONLY) N(MSG_ID_SYN_SUP) ] -Jun 20 14:29:47 charon[2428]: 02[NET] <PEER|1> sending packet: from 192.168.0.1[4500] to 192.168.1.2[4500] (268 bytes) -Jun 20 14:29:47 charon-systemd[2428]: sending packet: from 192.168.0.1[4500] to 192.168.1.2[4500] (268 bytes) -Jun 20 14:29:47 charon[2428]: 13[NET] <PEER|1> received packet: from 192.168.1.2[4500] to 192.168.0.1[4500] (220 bytes) -Jun 20 14:29:47 charon[2428]: 13[ENC] <PEER|1> parsed IKE_AUTH response 1 [ IDr AUTH SA TSi TSr N(MOBIKE_SUP) N(NO_ADD_ADDR) ] -Jun 20 14:29:47 charon-systemd[2428]: received packet: from 192.168.1.2[4500] to 192.168.0.1[4500] (220 bytes) -Jun 20 14:29:47 charon[2428]: 13[IKE] <PEER|1> authentication of '192.168.1.2' with pre-shared key successful -Jun 20 14:29:47 charon-systemd[2428]: parsed IKE_AUTH response 1 [ IDr AUTH SA TSi TSr N(MOBIKE_SUP) N(NO_ADD_ADDR) ] -Jun 20 14:29:47 charon[2428]: 13[IKE] <PEER|1> peer supports MOBIKE -Jun 20 14:29:47 charon-systemd[2428]: authentication of '192.168.1.2' with pre-shared key successful -Jun 20 14:29:47 charon[2428]: 13[IKE] <PEER|1> IKE_SA PEER[1] established between 192.168.0.1[192.168.0.1]...192.168.1.2[192.168.1.2] -Jun 20 14:29:47 charon-systemd[2428]: peer supports MOBIKE -Jun 20 14:29:47 charon[2428]: 13[IKE] <PEER|1> scheduling rekeying in 27703s -Jun 20 14:29:47 charon-systemd[2428]: IKE_SA PEER[1] established between 192.168.0.1[192.168.0.1]...192.168.1.2[192.168.1.2] -Jun 20 14:29:47 charon[2428]: 13[IKE] <PEER|1> maximum IKE_SA lifetime 30583s -Jun 20 14:29:47 charon-systemd[2428]: scheduling rekeying in 27703s -Jun 20 14:29:47 charon[2428]: 13[CFG] <PEER|1> selected proposal: ESP:AES_CBC_128/HMAC_SHA1_96/NO_EXT_SEQ -Jun 20 14:29:47 charon-systemd[2428]: maximum IKE_SA lifetime 30583s -Jun 20 14:29:47 charon-systemd[2428]: selected proposal: ESP:AES_CBC_128/HMAC_SHA1_96/NO_EXT_SEQ -Jun 20 14:29:47 charon[2428]: 13[IKE] <PEER|1> CHILD_SA PEER-tunnel-1{1} established with SPIs cb94fb3f_i ca99c8a9_o and TS 10.0.0.0/24 === 10.0.1.0/24 -Jun 20 14:29:47 charon-systemd[2428]: CHILD_SA PEER-tunnel-1{1} established with SPIs cb94fb3f_i ca99c8a9_o and TS 10.0.0.0/24 === 10.0.1.0/24 -``` - -## Troubleshooting Examples - -### IKE PROPOSAL are Different -In this situation, IKE SAs can be down or not active. - -```none -vyos@vyos:~$ show vpn ike sa -``` - -The problem is in IKE phase (Phase 1). The next step is checking debug logs. - -Responder Side: - -```none -Jun 23 07:36:33 charon[2440]: 01[CFG] <1> received proposals: IKE:AES_CBC_256/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_2048 -Jun 23 07:36:33 charon-systemd[2440]: received proposals: IKE:AES_CBC_256/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_2048 -Jun 23 07:36:33 charon[2440]: 01[CFG] <1> configured proposals: IKE:AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_2048 -Jun 23 07:36:33 charon-systemd[2440]: configured proposals: IKE:AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_2048 -Jun 23 07:36:33 charon[2440]: 01[IKE] <1> received proposals unacceptable -Jun 23 07:36:33 charon-systemd[2440]: received proposals unacceptable -Jun 23 07:36:33 charon[2440]: 01[ENC] <1> generating IKE_SA_INIT response 0 [ N(NO_PROP) ] -``` - -Initiator side: - -```none -Jun 23 07:36:32 charon-systemd[2444]: parsed IKE_SA_INIT response 0 [ N(NO_PROP) ] -Jun 23 07:36:32 charon[2444]: 14[IKE] <PEER|1> received NO_PROPOSAL_CHOSEN notify error -Jun 23 07:36:32 charon-systemd[2444]: received NO_PROPOSAL_CHOSEN notify error -``` - -The notification **NO_PROPOSAL_CHOSEN** means that the proposal mismatch. -On the Responder side there is concrete information where is mismatch. -Encryption **AES_CBC_128** is configured in IKE policy on the responder -but **AES_CBC_256** is configured on the initiator side. - -### PSK Secret Mismatch -In this situation, IKE SAs can be down or not active. - -```none -vyos@vyos:~$ show vpn ike sa -``` - -The problem is in IKE phase (Phase 1). The next step is checking debug logs. - -Responder: - -```none -Jun 23 08:07:26 charon-systemd[2440]: tried 1 shared key for '192.168.1.2' - '192.168.0.1', but MAC mismatched -Jun 23 08:07:26 charon[2440]: 13[ENC] <PEER|3> generating IKE_AUTH response 1 [ N(AUTH_FAILED) ] -``` - -Initiator side: - -```none -Jun 23 08:07:24 charon[2436]: 12[ENC] <PEER|1> parsed IKE_AUTH response 1 [ N(AUTH_FAILED) ] -Jun 23 08:07:24 charon-systemd[2436]: parsed IKE_AUTH response 1 [ N(AUTH_FAILED) ] -Jun 23 08:07:24 charon[2436]: 12[IKE] <PEER|1> received AUTHENTICATION_FAILED notify error -Jun 23 08:07:24 charon-systemd[2436]: received AUTHENTICATION_FAILED notify error -``` - -The notification **AUTHENTICATION_FAILED** means that the authentication -is failed. There is a reason to check PSK on both side. - -### ESP Proposal Mismatch -The output of **show** commands shows us that IKE SA is established but -IPSec SA is not. - -```none -vyos@vyos:~$ show vpn ike sa -Peer ID / IP Local ID / IP ------------- ------------- -192.168.1.2 192.168.1.2 192.168.0.1 192.168.0.1 - - State IKEVer Encrypt Hash D-H Group NAT-T A-Time L-Time - ----- ------ ------- ---- --------- ----- ------ ------ - up IKEv2 AES_CBC_128 HMAC_SHA1_96 MODP_2048 no 158 26817 -``` - -```none -vyos@vyos:~$ show vpn ipsec sa -Connection State Uptime Bytes In/Out Packets In/Out Remote address Remote ID Proposal ------------- ------- -------- -------------- ---------------- ---------------- ----------- ---------- -``` - -The next step is checking debug logs. - -Initiator side: - -```none -Jun 23 08:16:10 charon[3789]: 13[NET] <PEER|1> received packet: from 192.168.1.2[500] to 192.168.0.1[500] (472 bytes) -Jun 23 08:16:10 charon[3789]: 13[ENC] <PEER|1> parsed IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(CHDLESS_SUP) N(MULT_AUTH) ] -Jun 23 08:16:10 charon-systemd[3789]: received packet: from 192.168.1.2[500] to 192.168.0.1[500] (472 bytes) -Jun 23 08:16:10 charon[3789]: 13[CFG] <PEER|1> selected proposal: IKE:AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_2048 -Jun 23 08:16:10 charon-systemd[3789]: parsed IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(CHDLESS_SUP) N(MULT_AUTH) ] -Jun 23 08:16:10 charon-systemd[3789]: selected proposal: IKE:AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_2048 -Jun 23 08:16:10 charon[3789]: 13[IKE] <PEER|1> authentication of '192.168.0.1' (myself) with pre-shared key -Jun 23 08:16:10 charon-systemd[3789]: authentication of '192.168.0.1' (myself) with pre-shared key -Jun 23 08:16:10 charon[3789]: 13[IKE] <PEER|1> establishing CHILD_SA PEER-tunnel-1{1} -Jun 23 08:16:10 charon-systemd[3789]: establishing CHILD_SA PEER-tunnel-1{1} -Jun 23 08:16:10 charon[3789]: 13[ENC] <PEER|1> generating IKE_AUTH request 1 [ IDi N(INIT_CONTACT) IDr AUTH SA TSi TSr N(MOBIKE_SUP) N(NO_ADD_ADDR) N(MULT_AUTH) N(EAP_ONLY) N(MSG_ID_SYN_SUP) ] -Jun 23 08:16:10 charon-systemd[3789]: generating IKE_AUTH request 1 [ IDi N(INIT_CONTACT) IDr AUTH SA TSi TSr N(MOBIKE_SUP) N(NO_ADD_ADDR) N(MULT_AUTH) N(EAP_ONLY) N(MSG_ID_SYN_SUP) ] -Jun 23 08:16:10 charon[3789]: 13[NET] <PEER|1> sending packet: from 192.168.0.1[4500] to 192.168.1.2[4500] (268 bytes) -Jun 23 08:16:10 charon-systemd[3789]: sending packet: from 192.168.0.1[4500] to 192.168.1.2[4500] (268 bytes) -Jun 23 08:16:10 charon[3789]: 09[NET] <PEER|1> received packet: from 192.168.1.2[4500] to 192.168.0.1[4500] (140 bytes) -Jun 23 08:16:10 charon-systemd[3789]: received packet: from 192.168.1.2[4500] to 192.168.0.1[4500] (140 bytes) -Jun 23 08:16:10 charon[3789]: 09[ENC] <PEER|1> parsed IKE_AUTH response 1 [ IDr AUTH N(MOBIKE_SUP) N(NO_ADD_ADDR) N(NO_PROP) ] -Jun 23 08:16:10 charon-systemd[3789]: parsed IKE_AUTH response 1 [ IDr AUTH N(MOBIKE_SUP) N(NO_ADD_ADDR) N(NO_PROP) ] -Jun 23 08:16:10 charon[3789]: 09[IKE] <PEER|1> authentication of '192.168.1.2' with pre-shared key successful -Jun 23 08:16:10 charon-systemd[3789]: authentication of '192.168.1.2' with pre-shared key successful -Jun 23 08:16:10 charon[3789]: 09[IKE] <PEER|1> peer supports MOBIKE -Jun 23 08:16:10 charon-systemd[3789]: peer supports MOBIKE -Jun 23 08:16:10 charon[3789]: 09[IKE] <PEER|1> IKE_SA PEER[1] established between 192.168.0.1[192.168.0.1]...192.168.1.2[192.168.1.2] -Jun 23 08:16:10 charon-systemd[3789]: IKE_SA PEER[1] established between 192.168.0.1[192.168.0.1]...192.168.1.2[192.168.1.2] -Jun 23 08:16:10 charon[3789]: 09[IKE] <PEER|1> scheduling rekeying in 26975s -Jun 23 08:16:10 charon-systemd[3789]: scheduling rekeying in 26975s -Jun 23 08:16:10 charon[3789]: 09[IKE] <PEER|1> maximum IKE_SA lifetime 29855s -Jun 23 08:16:10 charon-systemd[3789]: maximum IKE_SA lifetime 29855s -Jun 23 08:16:10 charon[3789]: 09[IKE] <PEER|1> received NO_PROPOSAL_CHOSEN notify, no CHILD_SA built -Jun 23 08:16:10 charon-systemd[3789]: received NO_PROPOSAL_CHOSEN notify, no CHILD_SA built -Jun 23 08:16:10 charon[3789]: 09[IKE] <PEER|1> failed to establish CHILD_SA, keeping IKE_SA -Jun 23 08:16:10 charon-systemd[3789]: failed to establish CHILD_SA, keeping IKE_SA -``` - -There are messages: **NO_PROPOSAL_CHOSEN** and -**failed to establish CHILD_SA** which refers that the problem is in -the IPsec(ESP) proposal mismatch. - -The reason of this problem is showed on the responder side. - -```none -Jun 23 08:16:12 charon[2440]: 01[CFG] <PEER|5> received proposals: ESP:AES_CBC_256/HMAC_SHA1_96/NO_EXT_SEQ -Jun 23 08:16:12 charon-systemd[2440]: received proposals: ESP:AES_CBC_256/HMAC_SHA1_96/NO_EXT_SEQ -Jun 23 08:16:12 charon[2440]: 01[CFG] <PEER|5> configured proposals: ESP:AES_CBC_128/HMAC_SHA1_96/MODP_2048/NO_EXT_SEQ -Jun 23 08:16:12 charon-systemd[2440]: configured proposals: ESP:AES_CBC_128/HMAC_SHA1_96/MODP_2048/NO_EXT_SEQ -Jun 23 08:16:12 charon[2440]: 01[IKE] <PEER|5> no acceptable proposal found -Jun 23 08:16:12 charon-systemd[2440]: no acceptable proposal found -Jun 23 08:16:12 charon[2440]: 01[IKE] <PEER|5> failed to establish CHILD_SA, keeping IKE_SA -``` - -Encryption **AES_CBC_128** is configured in IKE policy on the responder but **AES_CBC_256** -is configured on the initiator side. - -### Prefixes in Policies Mismatch -As in previous situation, IKE SA is in up state but IPsec SA is not up. -According to logs we can see **TS_UNACCEPTABLE** notification. It means -that prefixes (traffic selectors) mismatch on both sides - -Initiator: - -```none -Jun 23 14:13:17 charon[4996]: 11[IKE] <PEER|1> received TS_UNACCEPTABLE notify, no CHILD_SA built -Jun 23 14:13:17 charon-systemd[4996]: maximum IKE_SA lifetime 29437s -Jun 23 14:13:17 charon[4996]: 11[IKE] <PEER|1> failed to establish CHILD_SA, keeping IKE_SA -Jun 23 14:13:17 charon-systemd[4996]: received TS_UNACCEPTABLE notify, no CHILD_SA built -Jun 23 14:13:17 charon-systemd[4996]: failed to establish CHILD_SA, keeping IKE_SA -``` - -The reason of this problem is showed on the responder side. - -```none -Jun 23 14:13:19 charon[2440]: 01[IKE] <PEER|7> traffic selectors 10.0.2.0/24 === 10.0.0.0/24 unacceptable -Jun 23 14:13:19 charon-systemd[2440]: traffic selectors 10.0.2.0/24 === 10.0.0.0/24 unacceptable -Jun 23 14:13:19 charon[2440]: 01[IKE] <PEER|7> failed to establish CHILD_SA, keeping IKE_SA -Jun 23 14:13:19 charon-systemd[2440]: failed to establish CHILD_SA, keeping IKE_SA -Jun 23 14:13:19 charon[2440]: 01[ENC] <PEER|7> generating IKE_AUTH response 1 [ IDr AUTH N(MOBIKE_SUP) N(NO_ADD_ADDR) N(TS_UNACCEPT) ] -Jun 23 14:13:19 charon-systemd[2440]: generating IKE_AUTH response 1 [ IDr AUTH N(MOBIKE_SUP) N(NO_ADD_ADDR) N(TS_UNACCEPT) ] -``` - -Traffic selectors **10.0.2.0/24 === 10.0.0.0/24** are unacceptable on the -responder side. diff --git a/docs/configuration/vpn/md-index.md b/docs/configuration/vpn/md-index.md deleted file mode 100644 index 9b06e5df..00000000 --- a/docs/configuration/vpn/md-index.md +++ /dev/null @@ -1,14 +0,0 @@ -# VPN - -```{toctree} -:includehidden: true -:maxdepth: 1 - -ipsec/index -l2tp -openconnect -pptp -rsa-keys -sstp -dmvpn -``` diff --git a/docs/configuration/vpn/md-rsa-keys.md b/docs/configuration/vpn/md-rsa-keys.md deleted file mode 100644 index b224b514..00000000 --- a/docs/configuration/vpn/md-rsa-keys.md +++ /dev/null @@ -1,114 +0,0 @@ -# RSA-Keys - -```{todo} -Convert raw command blocks in this file to cfgcmd/opcmd -directives for command coverage tracking. -``` - -RSA can be used for services such as key exchanges and for encryption purposes. -To make IPSec work with dynamic address on one/both sides, we will have to use -RSA keys for authentication. They are very fast and easy to setup. - -First, on both routers run the operational command "generate pki key-pair -install \<key-pair nam>>". You may choose different length than 2048 of course. - -```none -vyos@left# run generate pki key-pair install ipsec-LEFT -Enter private key type: [rsa, dsa, ec] (Default: rsa) -Enter private key bits: (Default: 2048) -Note: If you plan to use the generated key on this router, do not encrypt the private key. -Do you want to encrypt the private key with a passphrase? [y/N] N -Configure mode commands to install key pair: -Do you want to install the public key? [Y/n] Y -set pki key-pair ipsec-LEFT public key 'MIIBIjANBgkqh...' -Do you want to install the private key? [Y/n] Y -set pki key-pair ipsec-LEFT private key 'MIIEvgIBADAN...' -[edit] -``` - -Configuration commands will display. -Note the command with the public key -(set pki key-pair ipsec-LEFT public key 'MIIBIjANBgkqh...'). -Then do the same on the opposite router: - -```none -vyos@left# run generate pki key-pair install ipsec-RIGHT -``` - -Note the command with the public key -(set pki key-pair ipsec-RIGHT public key 'FAAOCAQ8AMII...'). - -The noted public keys should be entered on the opposite routers. - -On the LEFT: - -```none -set pki key-pair ipsec-RIGHT public key 'FAAOCAQ8AMII...' -``` - -On the RIGHT: - -```none -set pki key-pair ipsec-LEFT public key 'MIIBIjANBgkqh...' -``` - -Now you are ready to setup IPsec. The key points: -1. Since both routers do not know their effective public addresses, - we set the local-address of the peer to "any". -2. On the initiator, we set the peer address to its public address, - but on the responder we only set the id. -3. On the initiator, we need to set the remote-id option so that it - can identify IKE traffic from the responder correctly. -4. On the responder, we need to set the local id so that initiator - can know who's talking to it for the point #3 to work. - -On the LEFT (static address): - -```none -set vpn ipsec interface eth0 - -set vpn ipsec esp-group MyESPGroup proposal 1 encryption aes128 -set vpn ipsec esp-group MyESPGroup proposal 1 hash sha1 - -set vpn ipsec ike-group MyIKEGroup proposal 1 dh-group 2 -set vpn ipsec ike-group MyIKEGroup proposal 1 encryption aes128 -set vpn ipsec ike-group MyIKEGroup proposal 1 hash sha1 - -set vpn ipsec site-to-site peer @RIGHT authentication id LEFT -set vpn ipsec site-to-site peer @RIGHT authentication mode rsa -set vpn ipsec site-to-site peer @RIGHT authentication rsa local-key ipsec-LEFT -set vpn ipsec site-to-site peer @RIGHT authentication rsa remote-key ipsec-RIGHT -set vpn ipsec site-to-site peer @RIGHT authentication remote-id RIGHT -set vpn ipsec site-to-site peer @RIGHT default-esp-group MyESPGroup -set vpn ipsec site-to-site peer @RIGHT ike-group MyIKEGroup -set vpn ipsec site-to-site peer @RIGHT local-address 192.0.2.10 -set vpn ipsec site-to-site peer @RIGHT connection-type none -set vpn ipsec site-to-site peer @RIGHT tunnel 1 local prefix 192.168.99.1/32 # Additional loopback address on the local -set vpn ipsec site-to-site peer @RIGHT tunnel 1 remote prefix 192.168.99.2/32 # Additional loopback address on the remote -``` - -On the RIGHT (dynamic address): - -```none -set vpn ipsec interface eth0 - -set vpn ipsec esp-group MyESPGroup proposal 1 encryption aes128 -set vpn ipsec esp-group MyESPGroup proposal 1 hash sha1 - -set vpn ipsec ike-group MyIKEGroup proposal 1 dh-group 2 -set vpn ipsec ike-group MyIKEGroup proposal 1 encryption aes128 -set vpn ipsec ike-group MyIKEGroup proposal 1 hash sha1 - -set vpn ipsec site-to-site peer 192.0.2.10 authentication id RIGHT -set vpn ipsec site-to-site peer 192.0.2.10 authentication mode rsa -set vpn ipsec site-to-site peer 192.0.2.10 authentication rsa local-key ipsec-RIGHT -set vpn ipsec site-to-site peer 192.0.2.10 authentication rsa remote-key ipsec-LEFT -set vpn ipsec site-to-site peer 192.0.2.10 authentication remote-id LEFT -set vpn ipsec site-to-site peer 192.0.2.10 connection-type initiate -set vpn ipsec site-to-site peer 192.0.2.10 default-esp-group MyESPGroup -set vpn ipsec site-to-site peer 192.0.2.10 ike-group MyIKEGroup -set vpn ipsec site-to-site peer 192.0.2.10 local-address any -set vpn ipsec site-to-site peer 192.0.2.10 tunnel 1 local prefix 192.168.99.2/32 # Additional loopback address on the local -set vpn ipsec site-to-site peer 192.0.2.10 tunnel 1 remote prefix 192.168.99.1/32 # Additional loopback address on the remote -``` - diff --git a/docs/contributing/md-cla.md b/docs/contributing/md-cla.md deleted file mode 100644 index 01323111..00000000 --- a/docs/contributing/md-cla.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -lastproofread: '2025-12-05' ---- - -(cla)= - -# Contributor License Agreement - -Before we can accept your contributions to VyOS, you must sign a **Contributor -License Agreement (CLA)**. - -This is a standard open-source practice that protects both you and the project. - -The process is straightforward and fully automated: - -1. **Review the CLA document** - - Find the CLA text in our - [GitHub repository](https://github.com/vyos/vyos-cla-signatures/). - -2. **Submit a pull request** - - When you open a pull request, a CLA bot automatically checks whether all - commit authors have signed the CLA. - -3. **Follow the bot's instructions** - - If the CLA has not been signed, the bot leaves a comment with instructions. - Reply to that comment with the suggested text to sign the CLA. - -4. **Wait for confirmation** - - The CLA bot verifies your response and updates the pull request status. - Once all commit authors have signed, the bot confirms that the CLA - requirement is met and unlocks the pull request for merging. - -:::{note} -Each commit author must sign the CLA. - -If your pull request includes commits from multiple contributors, each one -must sign the CLA before the pull request can be accepted. -::: - -Once you sign the CLA, it remains valid for all your past and future -contributions to VyOS under the same GitHub identity. diff --git a/docs/contributing/md-debugging.md b/docs/contributing/md-debugging.md deleted file mode 100644 index d3b4b513..00000000 --- a/docs/contributing/md-debugging.md +++ /dev/null @@ -1,204 +0,0 @@ ---- -lastproofread: '2025-12-05' ---- - -(debugging)= - -# Debugging - -Two flags are available to help debug configuration scripts. Configuration -loading issues manifest during boot, so these flags are passed as kernel boot -parameters. - -## ISO image build - -If you have trouble compiling your own ISO image or debugging Jenkins issues, -follow the steps at {ref}`iso_build_issues`. - -## System Startup - -Debug system startup by examining the configuration file loading from -`/config/config.boot`. Extend the kernel command-line in the bootloader to -enable this. - -### Kernel - -- `vyos-debug` - Add this parameter to the Linux boot line to produce - timing results for script execution during commit. If you see an unexpected - delay during manual or boot commit, this parameter helps identify bottlenecks. - The internal flag is `VYOS_DEBUG`, found in [vyatta-cfg]. Output is directed - to `/var/log/vyatta/cfg-stdout.log`. -- `vyos-config-debug` - During development, coding errors can cause commit - failures on boot, potentially preventing CLI initialization. This kernel boot - parameter ensures access to the system as user `vyos` and logs a Python - stack trace to `/tmp/boot-config-trace`. The file is created only if the - configuration load fails. - -## Live System - -Several flags can be set to change VyOS behavior at runtime. Toggle these flags -using environment variables or by creating files. - -For each feature, create a file called `vyos.feature.debug` to enable it. -If a parameter is required, place it as the first line inside the file. - -Place the file in `/tmp` for one-time debugging (the file is removed on -reboot) or in `/config` to persist permanently. - -For example, `/tmp/vyos.ifconfig.debug` can be created to enable -interface debugging. - -You can also enable debugging using environment variables. -The environment variable name follows the convention `VYOS_FEATURE_DEBUG`. - -For example, `export VYOS_IFCONFIG_DEBUG=""` in your vbash has the same effect -as `touch /tmp/vyos.ifconfig.debug`. - -- `ifconfig` - Display all commands and their responses from the OS on - screen for inspection. -- `command` - Display all commands and their responses from the OS on screen - for inspection. -- `developer` - When a command fails, start a PDB post-mortem session instead - of showing a standard error message. This allows developers to debug issues - interactively. Because the debugger waits for input, it can prevent the router - from booting, so only enable this permanently on production systems if you are - ready for potential boot failures. -- `log` - Send all commands used by VyOS to a log file for inspection. This - is useful in rare cases when you need to see what the OS is doing, including - during boot. The default file is `/tmp/full-log`, but you can change it. - -:::{note} -To retrieve debug output on the command line, disable `vyos-configd` -in addition. You can do this one-time with -`sudo systemctl stop vyos-configd` -or permanently with `sudo systemctl disable vyos-configd`. -::: - -### FRR - -Recent versions use the `vyos.frr` framework. The Python class is located in -`vyos-1x:python/vyos/frr.py`. It includes an embedded debugger similar to the -one in `vyos.ifconfig`. - -Enable debugging by running: `touch /tmp/vyos.frr.debug` - -### Debug Python code with PDB - -Sometimes it is useful to debug Python code interactively on the live system -rather than in an IDE. You can do this using pdb. - -Assuming you want to debug a Python script called by an op-mode command, find -the script by looking up the op-mode definitions, then edit it on the live -system using vi: -`vi /usr/libexec/vyos/op_mode/show_xyz.py` - -Insert the following statement right before the section where you want to -investigate a problem (for example, a statement you see in a backtrace): -`import pdb; pdb.set_trace()` - -Optionally, surround this statement with an `if` condition that triggers only -for the conditions you are interested in. - -When you run `show xyz` and your condition triggers, you enter the Python -debugger: - -```none -> /usr/libexec/vyos/op_mode/show_nat_translations.py(109)process() --> rule_type = rule.get('type', '') -(Pdb) -``` - -You can type `help` to get an overview of the available commands, and -`help command` to get more information on each command. - -Common useful commands include: - -- examine variables using `pp(var)` -- continue execution using `cont` -- get a backtrace using `bt` - -### Config Migration Scripts - -Starting with VyOS 1.5, a new mechanism is used for config migration that -improves migration performance. New migrators use only the new format with a -`migration()` function. - -```python -from vyos.configtree import ConfigTree -base = ['vpn', 'ipsec'] -def migrate(config: ConfigTree) -> None: - if not config.exists(base): - # Nothing to do - return - # do your stuff here -``` - -New-style migration scripts can no longer run on their own. However, the new -migration subsystem handler includes a test kit: - -```none -vyos@vyos:~$ /usr/libexec/vyos/run-config-migration.py --help -usage: run-config-migration.py [-h] [--test-script TEST_SCRIPT] [--output-file OUTPUT_FILE] [--force] config_file - -positional arguments: - config_file configuration file to migrate - -options: - -h, --help show this help message and exit - --test-script TEST_SCRIPT - test named script - --output-file OUTPUT_FILE - write to named output file instead of config file - --force force run of all migration scripts -``` - -To test your migration, run: - -```none -vyos@vyos:~$ /usr/libexec/vyos/run-config-migration.py --test-script /opt/vyatta/etc/config-migrate/migrate/quagga/11-to-12 --output-file /tmp/foo /tmp/static-route-basic -vyos@vyos:~$ cat /tmp/foo -``` - -The file `/tmp/foo` contains the migrated configuration. - -### Configuration Error on System Boot - -Running the latest rolling releases sometimes exposes bugs due to edge cases -missed in design. File these bugs via [Phabricator](https://vyos.dev/), but you can help narrow -down the issue by following these steps: - -1. Log in to your VyOS system. -2. Enter configuration mode: `configure` -3. Reload your boot configuration: `load` - -You should see a Python backtrace that helps identify the issue. Attach it to -the [Phabricator](https://vyos.dev/) task. - -### Boot Timing - -During the migration and rewrite of functionality from Perl to Python, system -boot time increased significantly. You can analyze and graph boot time to see -detailed call sequences during startup. - -This uses the `systemd-bootchart` package, which is installed by default on -VyOS 1.3 (equuleus) and later. Configuration is versioned for comparable -results. Refer to [bootchart.conf] for the configuration file. - -To enable boot time graphing, add the following to the kernel command line: -`init=/usr/lib/systemd/systemd-bootchart` - -You can also make this permanent by editing `/boot/grub/grub.cfg`. - -## Priorities - -VyOS CLI depends heavily on priorities. Every CLI node has a corresponding -`node.def` file and possibly an attached script. Nodes can have priorities, -and on system bootup or any `commit` to the configuration, scripts execute -from lowest to highest priority. This provides deterministic behavior. - -To debug priority issues or see script execution order, use the -`/opt/vyatta/sbin/priority.pl` script, which lists the execution order of -scripts. - -[bootchart.conf]: https://github.com/vyos/vyos-build/blob/current/data/live-build-config/includes.chroot/etc/systemd/bootchart.conf -[vyatta-cfg]: https://github.com/vyos/vyatta-cfg diff --git a/docs/contributing/md-development.md b/docs/contributing/md-development.md deleted file mode 100644 index 4decbea3..00000000 --- a/docs/contributing/md-development.md +++ /dev/null @@ -1,543 +0,0 @@ ---- -lastproofread: '2025-12-12' ---- - -(development)= - -# Development - -Learn how to contribute to VyOS. - -(architecture-overview)= - -## Architecture overview - -VyOS source code is hosted on GitHub in the VyOS organization: -<https://github.com/vyos> - -VyOS is composed of multiple modules spread across different -repositories. Some modules contain forks of upstream -packages and are periodically synced. -VyOS consolidates most packages into the -[vyos-1x](https://github.com/vyos/vyos-1x) -repository while maintaining a consistent structure. -The base code is being rewritten -from Perl and Bash to Python using an XML-based CLI interface definition. - -VyOS ISO build scripts are hosted in the -[vyos-build](https://github.com/vyos/vyos-build) repository. See the -`vyos-build` repository -[README.md file](https://github.com/vyos/vyos-build/blob/current/README.md) -for more information on building VyOS ISO images. - -## Contributing code - -:::{warning} -You must sign the {doc}`Contributor License Agreement<cla>` -for your contributions to be accepted. -::: - -VyOS is open-source and welcomes patches. -All submissions must adhere to these guidelines: - -- Each commit addresses a single issue or feature. -- Each commit message references a [Phabricator](https://vyos.dev/) task ID - (for example, `T1234`). -- Each commit is associated with a username and email address - to identify the author (see [Configure your Git identity](configure-your-git-identity)). -- Only submit bugfixes in packages other than <https://github.com/vyos/vyos-1x>. -- Commits follow the [coding guidelines](coding-guidelines) outlined below. - -### Determining package ownership - -To determine which VyOS package contains a file you want to modify, use Debian's -`dpkg -S` command on your running VyOS installation. - -### Submitting your code - -Fork the repository and submit a GitHub pull request. This is the preferred way -to contribute changes to VyOS. - -To fork a VyOS repository: - -1. Append `/fork` to the repository URL on GitHub. For example, to fork - `vyos-1x`, use: <https://github.com/vyos/vyos-1x/fork> - -2. Clone your fork or add it as a remote to your local repository: - - - Clone: `git clone https://github.com/<user>/vyos-1x.git` - - Add remote: `git remote add myfork https://github.com/<user>/vyos-1x.git` - -(configure-your-git-identity)= - -3. Configure your Git identity: - - ```none - git config --global user.name "J. Random Hacker" - git config --global user.email "jrhacker@example.net" - ``` - -4. Make your changes and add files to the Git index: - - - Single file: `git add myfile` - - Directory: `git add somedir/*` - -5. Commit your changes with a meaningful headline and [Phabricator](https://vyos.dev/) reference: - - `git commit` - -6. Push to your fork and create a GitHub pull request: - - `git push` - -Alternatively, you can export commits as patches and send them to -<mailto:maintainers@vyos.net> or attach them directly to the [Phabricator](https://vyos.dev/) task: - -- Export last commit: `git format-patch` -- Export last two commits: `git format-patch -2` - -## Commit messages - -For guidance on writing commit messages, review the file history -with `git log path/to/file.txt`. - -Every change must be associated with a task number (prefixed with **T**) and -a component. If no bug report or feature request exists for your changes, -create a [Phabricator](https://vyos.dev/) task first. Reference the task ID in your commit message: - -- `ddclient: T1030: auto create runtime directories` -- `Jenkins: add current Git commit ID to build description` - -If your pull request lacks a [Phabricator](https://vyos.dev/) reference, maintainers will request -that you amend the commit message. - -### Writing good commit messages - -Follow the format described in -the [Git documentation](https://git-scm.com/book/ch5-2.html) -and [Chris Beams' guide](https://chris.beams.io/posts/git-commit/). - -Commit message format: - -1. **Summary line** (50 characters recommended, 80 maximum): Include the - component - prefix and [Phabricator](https://vyos.dev/) reference (for example, `snmp: T1111:` or - `ethernet: T2222:`). Concatenate multiple components with colons - (for example, `snmp: ethernet: T3333`). -2. **Blank line**: Separate the summary from the body. - This blank line is critical. - -4) **Message body** with details: - - - Describe what changed, why, and how. This helps with `git bisect`. - - Wrap text at 72 characters for readability with `git log` on an 80x25 - terminal. - - Reference previous commits when applicable: - `After commit abcd12ef ("snmp: this is a headline") - a Python import statement is missing, throwing the following exception: - ABCDEF` - -5) **Cherry-pick option**: Always use the `-x` option when back-porting or - forward-porting commits: - - `git cherry-pick -x <commit>` - - This appends `(cherry picked from commit <ID>)` to the commit message, - making bisecting easier. - -6) **Single responsibility**: Each commit must be self-contained. Do not fix - multiple bugs in a single commit. Use `git add --patch` to stage only - the parts related to one issue. - -Constraints: - -- Bugfixes are only accepted for packages other than - <https://github.com/vyos/vyos-1x>. - New functionality must use the new XML/Python interface, not old-style - templates (`node.def` files and Perl/Bash code). - -(coding-guidelines)= - -## Coding guidelines - -VyOS maintains consistent coding standards to help contributors navigate the -codebase and understand its logic. - -### Formatting - -- **Python**: Use 4 spaces per indentation level. Tabs **must not** be used. -- **XML**: Use 2 spaces per indentation level. Tabs **must not** be used. - -Use tools like VIM extensions (xmllint) to enforce correct indentation. Add this -to your `.vimrc` file: -```none -au FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null -``` -Then use `gg=G` in command mode to run the linter. - -### Text generation - -Use a template processor for generating config files: - -- **Jinja2** is the default template processor for VyOS code. -- Built-in string formatting **may** be used for simple line-oriented formats - (for example, iptables rules) where every line is self-contained. -- Template processors **must** be used for structured, multi-line formats - (for example, ISC DHCPd configuration). - -### Python code - -Configuration scripts and operation mode scripts written in Python3 should -follow these guidelines: - -- Wrap lines at 80 characters. This improves readability when browsing - GitHub on mobile devices and reads well in side-by-side diffs. - -Structure your scripts with these functions: -```python -#!/usr/bin/env python3 -# -# Copyright (C) 2020 VyOS maintainers and contributors -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 or later as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -import sys - -from vyos.config import Config -from vyos import ConfigError - -def get_config(config=None): - if config: - conf = config - else: - conf = Config() - - # Base path to CLI nodes - base = ['...', '...'] - # Convert the VyOS config to an abstract internal representation - config_data = conf.get_config_dict(base, key_mangling=('-', '_'), get_first_key=True) - return config_data - -def verify(config): - # Verify that configuration is valid - if invalid: - raise ConfigError("Descriptive message") - -def generate(config): - # Generate daemon configs - pass - -def apply(config): - # Apply the generated configs to the live system - pass - -try: - c = get_config() - verify(c) - generate(c) - apply(c) -except ConfigError as e: - print(e) - sys.exit(1) -``` -`get_config()`: This function converts a VyOS config object to an abstract -internal representation. No other function may call the `vyos.config.Config` -object directly. Limiting config reads to one function makes it easier to -modify the config syntax in the future. Additionally, this design improves -testability since you can construct an internal representation by hand rather -than mocking the entire config subsystem. - -`verify()`: This function validates the internal representation. It must -raise `ConfigError` with a descriptive message if the config is invalid. It -**must not** make any changes to the system. This design enables future features -like commit dry-run ("commit test" as in JunOS) where the system can abort a -commit before making changes. - -`generate()`: This function generates config files for system components. - -`apply()`: This function applies the generated configuration to the live -system. Prefer non-disruptive reload when possible. Disruptive operations like -daemon restarts are acceptable only when: - -- The component does not support non-disruptive reload, or -- The expected service degradation is minimal (for example, auxiliary services - like LLDPd) - -For high-impact services (VPN daemons, routing protocols), make effort to -determine if changes can be applied non-disruptively before resorting to -restarts. - -Never modify active configuration directly unless absolutely necessary. Instead, -generate configuration files and apply them with a single command like service -reload through systemd. For example, save iptables rules to a file and load them -with `iptables-restore` rather than executing iptables commands one by one. - -The `apply()` and `generate()` functions may raise `ConfigError` if the -daemon fails to start with the updated config. However, this is not a substitute -for proper config validation in the `verify()` function. Make reasonable -effort to verify that generated configuration is valid and will be accepted by -the daemon, including cross-checks with other VyOS configuration subtrees when -necessary. - -Exceptions like `VyOSError` (raised by `vyos.config.Config` on improper -operations) should not be silenced or caught. While this may produce less -polished error output for users, it generates better bug reports and helps -maintainers debug issues. - -For reference implementations, see `ntp.py` or `interfaces-bonding.py` (for -tag nodes) in the [vyos-1x](https://github.com/vyos/vyos-1x) repository. - -### Other considerations: `vyos-configd` - -All scripts now run under the config daemon and must conform to these -requirements: - -1. The signature and first four lines of `get_config(...)` **must** be as - specified above. -2. Each of `get_config`, `verify`, `apply`, and `generate` **must** - appear - with the correct signatures, even if they are a no-op. -3. `Config` objects other than those in `get_config` **must not** appear. -4. The legacy function `my_set` **must not** appear. Modifications to active - config **should not** appear in new code (alternative mechanisms may be used - if absolutely necessary). - -## XML for CLI definitions - -XML interface definitions define the VyOS CLI structure. -Before VyOS `1.2` (crux), these -files were created manually. After a redesign, new-style templates are -automatically generated from XML input files. - -VyOS interface definitions come with a RelaxNG schema located in the -[vyos-1x](https://github.com/vyos/vyos-1x/tree/current/schema) -repository. This schema is a modified version from `VyConf` (VyOS `2.0`). -VyOS `1.2.x` -interface definitions are reusable in future VyOS versions with minimal changes. - -Schemas provide two benefits: - -- Complete grammar verification -- Automatic validation against the schema - -The [build-command-templates](https://github.com/vyos/vyos-1x/blob/current/scripts/build-command-templates) -script converts XML definitions to -old-style templates and verifies them against the schema. A bad definition -causes the package build to fail. While the XML format is verbose, no other -format provides this level of verification. Specialized XML editors can help -manage verbosity. - -Example XML interface definition: -```xml -<?xml version="1.0"?> -<!-- Cron configuration --> -<interfaceDefinition> - <node name="system"> - <children> - <node name="task-scheduler"> - <properties> - <help>Task scheduler settings</help> - </properties> - <children> - <tagNode name="task" owner="${vyos_conf_scripts_dir}/task_scheduler.py"> - <properties> - <help>Scheduled task</help> - <valueHelp> - <format><string></format> - <description>Task name</description> - </valueHelp> - <priority>999</priority> - </properties> - <children> - <leafNode name="crontab-spec"> - <properties> - <help>UNIX crontab time specification string</help> - </properties> - </leafNode> - <leafNode name="interval"> - <properties> - <help>Execution interval</help> - <valueHelp> - <format><minutes></format> - <description>Execution interval in minutes</description> - </valueHelp> - <valueHelp> - <format><minutes>m</format> - <description>Execution interval in minutes</description> - </valueHelp> - <valueHelp> - <format><hours>h</format> - <description>Execution interval in hours</description> - </valueHelp> - <valueHelp> - <format><days>d</format> - <description>Execution interval in days</description> - </valueHelp> - <constraint> - <regex>[1-9]([0-9]*)([mhd]{0,1})</regex> - </constraint> - </properties> - </leafNode> - <node name="executable"> - <properties> - <help>Executable path and arguments</help> - </properties> - <children> - <leafNode name="path"> - <properties> - <help>Path to executable</help> - </properties> - </leafNode> - <leafNode name="arguments"> - <properties> - <help>Arguments passed to the executable</help> - </properties> - </leafNode> - </children> - </node> - </children> - </tagNode> - </children> - </node> - </children> - </node> -</interfaceDefinition> -``` -XML definitions are purely declarative and contain no logic. All logic for -generating config files, restarting services, and related tasks is implemented -in configuration scripts. - -### Template Processors - -XML interface definition files use the `.xml.in` file extension (implemented -in {vytask}`T1843`). These files use the GCC preprocessor to reduce code -duplication in common areas: - -- VIF (including VIF-S and VIF-C) -- Address configuration -- Description -- Enabled/Disabled state - -Instead of repeating XML nodes, use include files with predefined features: - -- [IPv4, IPv6, and DHCP(v6)](https://github.com/vyos/vyos-1x/blob/current/interface-definitions/include/interface/address-ipv4-ipv6-dhcp.xml.i) - address assignment. -- [IPv4 and IPv6](https://github.com/vyos/vyos-1x/blob/current/interface-definitions/include/interface/address-ipv4-ipv6.xml.i) - address assignment. -- [VLAN (VIF)](https://github.com/vyos/vyos-1x/blob/current/interface-definitions/include/accel-ppp/vlan.xml.i) - definition. -- [MAC address](https://github.com/vyos/vyos-1x/blob/current/interface-definitions/include/firewall/mac-address.xml.i) - assignment. - -The `.in` files are preprocessed and stored in the [interface-definitions](https://github.com/vyos/vyos-1x/tree/current/interface-definitions) -folder. The [scripts/build-command-templates](https://github.com/vyos/vyos-1x/blob/current/scripts/build-command-templates) -script then operates on this folder to generate all required CLI nodes. - -Example preprocessor output: -```none -$ make interface_definitions -install -d -m 0755 build/interface-definitions -install -d -m 0755 build/op-mode-definitions -Generating build/interface-definitions/intel_qat.xml from interface-definitions/intel_qat.xml.in -Generating build/interface-definitions/interfaces-bonding.xml from interface-definitions/interfaces-bonding.xml.in -Generating build/interface-definitions/cron.xml from interface-definitions/cron.xml.in -Generating build/interface-definitions/pppoe-server.xml from interface-definitions/pppoe-server.xml.in -Generating build/interface-definitions/mdns-repeater.xml from interface-definitions/mdns-repeater.xml.in -Generating build/interface-definitions/tftp-server.xml from interface-definitions/tftp-server.xml.in -[...] -``` - -### Command Definition Guidelines - -#### Use of Numbers - -Avoid using numbers in command names unless the number is part of a protocol -name or similar. For example, `protocols ospfv3` is appropriate, -but `server-1` is questionable. - -#### Help Strings - -Follow these guidelines for consistent, readable help strings: - -##### Capitalization and Punctuation - -- Capitalize the first word of every help string. -- Do not use a period at the end of help strings. - -This standard mirrors network device CLIs and improves aesthetics. - -Examples: - -- Good: "Frobnication algorithm" -- Bad: "frobnication algorithm" -- Bad: "Frobnication algorithm." -- Incorrect: "frobnication algorithm." - -##### Abbreviations and Acronyms - -- Capitalize all abbreviations and acronyms. - -Examples: - -- Good: "TCP connection timeout" -- Bad: "tcp connection timeout" -- Bad: "Tcp connection timeout" -- Capitalize acronyms to distinguish them from normal words. - -Examples: - -- Good: RADIUS (remote authentication for dial-in user services) -- Bad: radius (unless referring to circular distance) -- Follow accepted spelling conventions for mixed-case abbreviations. If it - contains "over" or "version", use lowercase. Follow RFC or standard spellings - when they exist. - -Examples: - -- Good: PPPoE, IPsec -- Bad: PPPOE, IPSEC -- Bad: pppoe, ipsec - -##### Verbs - -- Avoid verbs. If a verb can be omitted, omit it. - -Examples: - -- Good: "TCP connection timeout" -- Bad: "Set TCP connection timeout" -- When a verb is essential, use it. For example: "Disable IPv6 forwarding on - all interfaces" for `set system ipv6 disable-forwarding`. -- Use infinitive form for necessary verbs. - -Examples: - -- Good: "Disable IPv6 forwarding" -- Bad: "Disables IPv6 forwarding" - -## C++ Backend Code - -The VyOS CLI parser combines bash, bash-completion helpers, and the C++ backend -library [vyatta-cfg](https://github.com/vyos/vyatta-cfg). This section -references common CLI commands and their C/C++ entry points: - -`set`: - -- <https://github.com/vyos/vyatta-cfg/blob/0f42786a0b3/src/cstore/cstore.cpp#L352> -- <https://github.com/vyos/vyatta-cfg/blob/0f42786a0b3/src/cstore/cstore.cpp#L2549> - -`commit`: - -- <https://github.com/vyos/vyatta-cfg/blob/0f42786a0b3/src/commit/commit-algorithm.cpp#L1252> - - diff --git a/docs/contributing/md-index.md b/docs/contributing/md-index.md deleted file mode 100644 index f26a6b70..00000000 --- a/docs/contributing/md-index.md +++ /dev/null @@ -1,13 +0,0 @@ -# Contributing - -```{toctree} -:maxdepth: 1 - -build-vyos -development -cla -issues-features -upstream-packages -debugging -testing -``` diff --git a/docs/contributing/md-issues-features.md b/docs/contributing/md-issues-features.md deleted file mode 100644 index ab235326..00000000 --- a/docs/contributing/md-issues-features.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -lastproofread: '2025-12-08' ---- - -(issues_features)= - -# Issues/Feature requests - -(bug_report)= - -## Bug Report/Issue - -Issues and bugs occur in every software project, and VyOS is no exception. - -### I found a bug, what should I do? - -When you find a potential bug, first: - -- Consult the [documentation] to ensure you configured your system - correctly. -- Check if the VyOS community has identified a workaround for the bug through - [Slack] or the VyOS [Forum]. - -### Ensure the bug is reproducible - -Include the following information when reporting a bug: - -- A sequence of configuration commands or a complete configuration file needed - to recreate the bug. Avoid partial configurations: a sequence of commands is - easy to paste and a complete configuration is easy to load, but a partial - config is hard to reconstruct. -- Describe the expected behavior and how it differs from what you observe. - Include command outputs or traffic dumps. Explain briefly why these outputs - are incorrect and what the correct behavior should be. -- A sequence of actions that trigger the bug. While not always possible, this - helps developers and community members confirm the issue and verify fixes. -- If the bug is a regression, specify the VyOS version where the feature worked - correctly (any working version is acceptable). Identify the exact version - that the feature stopped working, if possible. - -If you are uncertain whether the behavior is a bug or what the correct behavior -is, or if you lack a reliable reproducing procedure, post on the forum or ask in -chat first. If you have a subscription, create a support ticket. The team and -community can help identify the issue, work around it, and create an actionable -bug report. - -### Report a Bug - -To open a bug report or feature request, create an account on -[vyos.dev](https://vyos.dev), the public issue tracker for VyOS. - -When creating a new issue, select the appropriate project and: - -- Provide as much information as you can. -- Specify which VyOS version you are using: `run show version`. -- Explain how to reproduce the bug. - -(feature-request)= - -## Feature Requests - -Have an idea to improve VyOS or need a feature that would benefit all users? -Before submitting a feature request, search the public issue tracker -[vyos.dev](https://vyos.dev) to check if a request already exists. You can -also enhance an existing request by providing additional information. - -Create a task before starting work on a feature, -even if it is a trivial feature. -The task tracker generates release notes, so all work must be reflected -in the tracker. - -Include at least the following information: - -- Provide a detailed description of the feature: what it is, how it works, and - how you would use it. Maintainers may not have experience with every feature, - protocol, and tool in VyOS. Detailed information helps VyOS contributors and - maintainers test new features they are unfamiliar with. -- Include proposed CLI syntax if the feature requires new commands. Provide both - configuration and operational mode commands if both are needed. - -Consider including the following information: - -- Is the feature already supported by the underlying component - (FreeRangeRouting, nftables, Kea, etc.)? -- How would you configure the feature manually within that component? -- Are there any limitations to using the feature - (hardware support, resource usage)? -- Are there any adverse or non-obvious interactions with other features? Should - the feature be mutually exclusive? -- Any relevant documentation or references about the feature. - -You do not need to provide all this information, but if you can, it simplifies -developers' work considerably. Research these questions when possible. - -## Task auto-closing - -A special task status exists for when all work by maintainers and contributors -is complete: **Needs reporter action**. - -VyOS assigns this status to: - -- Feature requests that do not include required information and need - clarification. -- Bug reports that lack reproducing procedures. -- Tasks that are implemented and tested by the implementation author, - but require testing in the real-world environment that only the reporter - can replicate (for example, hardware VyOS does not support or specific - network conditions). - -When a task is set to **Needs reporter action**: - -- If the reporter does not respond within two weeks, the task bot adds a comment - ("Any news?") to remind the reporter. -- If there is still no response after another two weeks, - the task is closed automatically. - -We do not auto-close tasks with any other status and do not close tasks due to -lack of maintainer activity. - -[documentation]: https://docs.vyos.io -[forum]: https://forum.vyos.io -[slack]: https://slack.vyos.io diff --git a/docs/contributing/md-testing.md b/docs/contributing/md-testing.md deleted file mode 100644 index 5e2371d6..00000000 --- a/docs/contributing/md-testing.md +++ /dev/null @@ -1,206 +0,0 @@ ---- -lastproofread: '2025-12-02' ---- - -(testing)= - -# Testing - -One of the major features introduced in VyOS 1.3 is an automated test -framework. When you assemble an ISO image, several things can go wrong. -VyOS uses this framework to detect issues before they cause downstream problems. - -This section describes how the automated testing process at VyOS works. - -## Smoketests - -Smoketests execute predefined VyOS CLI commands and check if the desired -daemon or service configuration is rendered. - -When an ISO image is assembled by the [VyOS CI](https://ci.vyos.net), the `BUILD_SMOKETEST` -parameter is enabled by default. This extends the ISO configuration line -with the following packages: - -```python -def CUSTOM_PACKAGES = '' - if (params.BUILD_SMOKETESTS) - CUSTOM_PACKAGES = '--custom-package vyos-1x-smoketest' -``` - -If you plan to build your own custom ISO image and want to use VyOS's -smoketests, ensure that you have the `vyos-1x-smoketest` package installed. - -The `make test` command from the [vyos-build](https://github.com/vyos/vyos-build) repository launches a new -QEMU instance, and the ISO image is first installed to the virtual hard disk. - -After the first boot into the newly installed system, the main Smoketest script -is executed. It can be found at `/usr/bin/vyos-smoketest`. - -The script searches for executable test cases under -`/usr/libexec/vyos/tests/smoke/cli/` and executes them one by one. - -:::{note} -Smoketests will alter the system configuration. If you are logged -in remotely, you may lose your connection to the system. -::: - -:::{note} -To enable smoketest debugging (print the CLI set commands used), -run: `touch /tmp/vyos.smoketest.debug`. -::: - -### Manual Smoketest Run - -Each test is contained in its own file, so you can execute a single Smoketest -manually by running the Python test script. - -Example: - -```none -vyos@vyos:~$ /usr/libexec/vyos/tests/smoke/cli/test_protocols_bgp.py -test_bgp_01_simple (__main__.TestProtocolsBGP) ... ok -test_bgp_02_neighbors (__main__.TestProtocolsBGP) ... ok -test_bgp_03_peer_groups (__main__.TestProtocolsBGP) ... ok -test_bgp_04_afi_ipv4 (__main__.TestProtocolsBGP) ... ok -test_bgp_05_afi_ipv6 (__main__.TestProtocolsBGP) ... ok -test_bgp_06_listen_range (__main__.TestProtocolsBGP) ... ok -test_bgp_07_l2vpn_evpn (__main__.TestProtocolsBGP) ... ok -test_bgp_08_zebra_route_map (__main__.TestProtocolsBGP) ... ok -test_bgp_09_distance_and_flowspec (__main__.TestProtocolsBGP) ... ok -test_bgp_10_vrf_simple (__main__.TestProtocolsBGP) ... ok -test_bgp_11_confederation (__main__.TestProtocolsBGP) ... ok -test_bgp_12_v6_link_local (__main__.TestProtocolsBGP) ... ok -test_bgp_13_solo (__main__.TestProtocolsBGP) ... ok - ----------------------------------------------------------------------- -Ran 13 tests in 348.191s - -OK -``` - -### Interface-based tests - -Our smoketests not only test daemons and services, but also check if interface -configuration works as expected. There is a common base class named -`base_interfaces_test.py` that holds all the common code for interface tests. - -These common tests consist of: - -- Add one or more IP addresses - -- DHCP client and DHCPv6 prefix delegation - -- MTU size - -- IP and IPv6 options - -- Port description - -- Port disable - -- VLANs (QinQ and regular 802.1q) - -- ... - -:::{note} -When you are working on interface configuration and want to test -if the Smoketests pass, you would normally lose the remote SSH connection -to your {abbr}`DUT (Device Under Test)`. To handle this, some interface-based -tests can be called with an environment variable beforehand to limit the -number of interfaces used in the test. By default, all interfaces (e.g., all -Ethernet interfaces) are used. -::: - -```none -vyos@vyos:~$ TEST_ETH="eth1 eth2" /usr/libexec/vyos/tests/smoke/cli/test_interfaces_bonding.py -test_add_multiple_ip_addresses (__main__.BondingInterfaceTest) ... ok -test_add_single_ip_address (__main__.BondingInterfaceTest) ... ok -test_bonding_hash_policy (__main__.BondingInterfaceTest) ... ok -test_bonding_lacp_rate (__main__.BondingInterfaceTest) ... ok -test_bonding_min_links (__main__.BondingInterfaceTest) ... ok -test_bonding_remove_member (__main__.BondingInterfaceTest) ... ok -test_dhcpv6_client_options (__main__.BondingInterfaceTest) ... ok -test_dhcpv6pd_auto_sla_id (__main__.BondingInterfaceTest) ... ok -test_dhcpv6pd_manual_sla_id (__main__.BondingInterfaceTest) ... ok -test_interface_description (__main__.BondingInterfaceTest) ... ok -test_interface_disable (__main__.BondingInterfaceTest) ... ok -test_interface_ip_options (__main__.BondingInterfaceTest) ... ok -test_interface_ipv6_options (__main__.BondingInterfaceTest) ... ok -test_interface_mtu (__main__.BondingInterfaceTest) ... ok -test_ipv6_link_local_address (__main__.BondingInterfaceTest) ... ok -test_mtu_1200_no_ipv6_interface (__main__.BondingInterfaceTest) ... ok -test_span_mirror (__main__.BondingInterfaceTest) ... ok -test_vif_8021q_interfaces (__main__.BondingInterfaceTest) ... ok -test_vif_8021q_lower_up_down (__main__.BondingInterfaceTest) ... ok -test_vif_8021q_mtu_limits (__main__.BondingInterfaceTest) ... ok -test_vif_8021q_qos_change (__main__.BondingInterfaceTest) ... ok -test_vif_s_8021ad_vlan_interfaces (__main__.BondingInterfaceTest) ... ok -test_vif_s_protocol_change (__main__.BondingInterfaceTest) ... ok - ----------------------------------------------------------------------- -Ran 23 tests in 244.694s - -OK -``` - -This will limit the `bond` interface test to use only `eth1` and `eth2` -as member ports. - -## Config Load Tests - -The other part of our tests are called "config load tests." Config load tests -sequentially load arbitrary configuration files to verify that configuration -migration scripts work as designed and that a given set of functionality can -still be loaded with a fresh VyOS ISO image. - -The configurations are all derived from production systems and can act as -test cases or as references for enabling certain features. The configurations -can be found here: -<https://github.com/vyos/vyos-1x/tree/current/smoketest/configs> - -The entire test is controlled by the main wrapper script -`/usr/bin/vyos-configtest`. -It behaves in the same way as the main smoketest script. It scans the folder -for potential configuration files and issues a `load` command for each file. - -### Manual config load test - -You do not have to load all configurations sequentially; you can also load -individual test configurations manually. - -```none -vyos@vyos:~$ configure -load[edit] - -vyos@vyos# load /usr/libexec/vyos/tests/config/ospf-small -Loading configuration from '/usr/libexec/vyos/tests/config/ospf-small' -Load complete. Use 'commit' to make changes effective. -[edit] -vyos@vyos# compare -[edit interfaces ethernet eth0] --hw-id 00:50:56:bf:c5:6d -[edit interfaces ethernet eth1] -+duplex auto --hw-id 00:50:56:b3:38:c5 -+speed auto -[edit interfaces] --ethernet eth2 { -- hw-id 00:50:56:b3:9c:1d --} --vti vti1 { -- address 192.0.2.1/30 --} -... - -vyos@vyos# commit -vyos@vyos# -``` - -:::{note} -Some configurations have preconditions that must be met. These most -likely include generation of cryptographic keys before the config can be -applied; otherwise, you will get a commit error. If you are interested in -how those preconditions are fulfilled, check the [vyos-build](https://github.com/vyos/vyos-build) repository and -the `scripts/check-qemu-install` file. -::: - diff --git a/docs/contributing/md-upstream-packages.md b/docs/contributing/md-upstream-packages.md deleted file mode 100644 index c7da9066..00000000 --- a/docs/contributing/md-upstream-packages.md +++ /dev/null @@ -1,149 +0,0 @@ ---- -lastproofread: '2026-01-30' ---- - -(upstream-packages)= - -# Upstream Packages - -Many base system packages are pulled straight from Debian's `main` and -`contrib` repositories, but there are exceptions. If you only want to build -a fresh ISO image, you can skip -this section. This information may be useful for a deeper dive into VyOS. - -System packages that are not directly pulled from Debian are built through a -separate build system, `build.py` in the [vyos-build](https://github.com/vyos/vyos-build/tree/current/scripts/package-build) repository. - -## Overview - -Previously, VyOS used Jenkins for building upstream packages. With the move away -from Jenkins, the build system was replaced with a Python-based solution using -`build.py` and `package.toml` configuration files. - -Each package directory contains: - -- A `package.toml` configuration file that defines how the package is built. -- A symlink to the common `build.py` script in the build system. - -## Building Packages - -To build a package, navigate to the package directory and execute the -build script: - -```console -cd package-build/<package-name> -./build.py -``` - -The script will: - -1. Check out the source code from the configured repository. -2. Apply any patches defined in the configuration. -3. Execute pre-build hooks (if configured). -4. Build the package using the specified build command. -5. Generate both binary (`.deb`) packages and source tarballs. - -## Package Configuration (package.toml) - -Each package directory contains a `package.toml` file that defines the build -parameters. The key configuration fields are: - -**name** - -: The package name (e.g., `frr`) - -**commit_id** - -: The specific commit, tag, or branch to check out from the source repository - (e.g., `stable/10.5`) - -**scm_url** - -: The Git URL of the upstream source repository - (e.g., `https://github.com/FRRouting/frr.git`) - -**build_cmd** - -: The command to execute for building the package. This replaces what was - previously defined in the Jenkins `Jenkinsfile`. - - Default if not specified: `dpkg-buildpackage -uc -us -tc -F --source-option=--tar-ignore=.git --source-option=--tar-ignore=.github` - - Example with custom build command: - - ```toml - build_cmd = "sudo dpkg -i ../*.deb; dpkg-buildpackage -us -uc -tc -b -Ppkg.frr.rtrlib,pkg.frr.lua" - ``` - -**pre_build_hook** (Optional) - -: A shell command or script that executes after the repository is checked out - and before the build process begins. This allows you to perform preparatory - tasks such as: - - - Creating directories - - Copying files - - Running custom setup scripts - - Installing dependencies - - Single command example: - - ```toml - pre_build_hook = "echo 'Preparing build environment'" - ``` - - Multi-line commands example: - - ```toml - pre_build_hook = """ - mkdir -p ../hello/vyos - mkdir -p ../vyos - cp example.txt ../vyos - """ - ``` - - Combined commands and scripts: - - ```toml - pre_build_hook = "ls -l; ./script.sh" - ``` - -**apply_patches** (Optional) - -: Boolean flag to control whether patches should be applied. Defaults to - `True`. - - ```toml - apply_patches = false - ``` - -**prepare_package** (Optional) - -: Boolean flag to enable package preparation. When set to `True`, the - `install_data` configuration is used. - -**install_data** (Optional) - -: Data used for package preparation when `prepare_package` is enabled. - -## Example package.toml file - -Here's an example configuration for the FRRouting (FRR) package: -```toml -name = "frr" -commit_id = "stable/10.5" -scm_url = "https://github.com/FRRouting/frr.git" -build_cmd = "sudo dpkg -i ../*.deb; dpkg-buildpackage -us -uc -tc -b -Ppkg.frr.rtrlib,pkg.frr.lua" -``` - -## Build Output - -After running `./build.py`, the following artifacts are generated in the -package directory: - -- `.deb` files - Binary Debian packages ready for installation -- `.tar.gz` files - Source tarballs of the checked-out repositories -- Additional build artifacts as produced by the Debian build system - -The build script also creates build dependency packages (`*build-deps*.deb`), -which are automatically cleaned up after the build completes. diff --git a/docs/installation/cloud/md-index.md b/docs/installation/cloud/md-index.md deleted file mode 100644 index cf7d447d..00000000 --- a/docs/installation/cloud/md-index.md +++ /dev/null @@ -1,10 +0,0 @@ -# Cloud Environments - -```{toctree} -:caption: Content - -aws -azure -gcp -oracle -``` diff --git a/docs/installation/md-bare-metal.md b/docs/installation/md-bare-metal.md deleted file mode 100644 index 7017b6a2..00000000 --- a/docs/installation/md-bare-metal.md +++ /dev/null @@ -1,623 +0,0 @@ -(vyosonbaremetal)= - -# Bare Metal Deployment - -## Supermicro A2SDi (Atom C3000) - -I opted to get one of the new Intel Atom C3000 CPUs to spawn VyOS on it. -Running VyOS on an UEFI only device is supported as of VyOS release 1.2. - -### Supermicro Shopping Cart - -- 1x Supermicro CSE-505-203B (19" 1U chassis, inkl. 200W PSU) -- 1x Supermicro MCP-260-00085-0B (I/O Shield for A2SDi-2C-HLN4F) -- 1x Supermicro A2SDi-2C-HLN4F (Intel Atom C3338, 2C/2T, 4MB cache, Quad LAN - with Intel C3000 SoC 1GbE) -- 1x Crucial CT4G4DFS824A (4GB DDR4 RAM 2400 MT/s, PC4-19200) -- 1x SanDisk Ultra Fit 32GB (USB-A 3.0 SDCZ43-032G-G46 mass storage for OS) -- 1x Supermicro MCP-320-81302-0B (optional FAN tray) - -### Optional (10GE) - -If you want to get additional ethernet ports or even 10GE connectivity -the following optional parts will be required: - -- 1x Supermicro RSC-RR1U-E8 (Riser Card) -- 1x Supermicro MCP-120-00063-0N (Riser Card Bracket) - -Latest VyOS rolling releases boot without any problem on this board. You also -receive a nice IPMI interface realized with an ASPEED AST2400 BMC (no -information about [OpenBMC](https://www.openbmc.org/) so far on this -motherboard). - -### Pictures - -:::{figure} /_static/images/1u_vyos_back.jpg -:alt: CSE-505-203B Back -:scale: 25 % -::: - -:::{figure} /_static/images/1u_vyos_front.jpg -:alt: CSE-505-203B Front -:scale: 25 % -::: - -:::{figure} /_static/images/1u_vyos_front_open_1.jpg -:alt: CSE-505-203B Open 1 -:scale: 25 % -::: - -:::{figure} /_static/images/1u_vyos_front_open_2.jpg -:alt: CSE-505-203B Open 2 -:scale: 25 % -::: - -:::{figure} /_static/images/1u_vyos_front_open_3.jpg -:alt: CSE-505-203B Open 3 -:scale: 25 % -::: - -:::{figure} /_static/images/1u_vyos_front_10ge_open_1.jpg -:alt: CSE-505-203B w/ 10GE Open 1 -:scale: 25 % -::: - -:::{figure} /_static/images/1u_vyos_front_10ge_open_2.jpg -:alt: CSE-505-203B w/ 10GE Open 2 -:scale: 25 % -::: - -:::{figure} /_static/images/1u_vyos_front_10ge_open_3.jpg -:alt: CSE-505-203B w/ 10GE Open 3 -:scale: 25 % -::: - -:::{figure} /_static/images/1u_vyos_front_10ge_open_4.jpg -:alt: CSE-505-203B w/ 10GE Open -:scale: 25 % -::: - -(pc-engines-apu4)= - -## PC Engines APU4 - -As this platform seems to be quite common in terms of noise, cost, power and -performance it makes sense to write a small installation manual. - -This guide was developed using an APU4C4 board with the following specs: - -- AMD Embedded G series GX-412TC, 1 GHz quad Jaguar core with 64 bit and AES-NI - support, 32K data + 32K instruction cache per core, shared 2MB L2 cache. -- 4 GB DDR3-1333 DRAM, with optional ECC support -- About 6 to 10W of 12V DC power depending on CPU load -- 2 miniPCI express (one with SIM socket for 3G modem). -- 4 Gigabit Ethernet channels using Intel i211AT NICs - -The board can be powered via 12V from the front or via a 5V onboard connector. - -(vyos-on-baremetal-apu4-shopping)= - -### APU4 Shopping Cart - -- 1x apu4c4 = 4 i211AT LAN / AMD GX-412TC CPU / 4 GB DRAM / dual SIM -- 1x Kingston SUV500MS/120G -- 1x VARIA Group Item 326745 19" dual rack for APU4 - -The 19" enclosure can accommodate up to two APU4 boards - there is a single and -dual front cover. - -#### Extension Modules - -##### WiFi - -Refer to {ref}`wireless-interface` for additional information, below listed -modules have been tested successfully on this Hardware platform: - -- Compex WLE900VX mini-PCIe WiFi module, only supported in mPCIe slot 1. -- Intel Corporation AX200 mini-PCIe WiFi module, only supported in mPCIe slot 1. - (see {ref}`wireless-interface-intel-ax200`) - -##### WWAN - -Refer to {ref}`wwan-interface` for additional information, below listed modules -have been tested successfully on this Hardware platform using VyOS 1.3 -(equuleus): - -- Sierra Wireless AirPrime MC7304 miniPCIe card (LTE) -- Sierra Wireless AirPrime MC7430 miniPCIe card (LTE) -- Sierra Wireless AirPrime MC7455 miniPCIe card (LTE) -- Sierra Wireless AirPrime MC7710 miniPCIe card (LTE) -- Huawei ME909u-521 miniPCIe card (LTE) - -### VyOS 1.4 (sagitta) - -Depending on the VyOS versions you intend to install there is a difference in -the serial port settings ({vytask}`T1327`). - -Create a bootable USB pendrive using e.g. [Rufus] on a Windows machine. - -Connect serial port to a PC through null modem cable (RXD / TXD crossed over). -Set terminal emulator to 115200 8N1. - -```none -PC Engines apu4 -coreboot build 20171130 -BIOS version v4.6.4 -4080 MB ECC DRAM -SeaBIOS (version rel-1.11.0.1-0-g90da88d) - -Press F10 key now for boot menu: - -Select boot device: - -1. ata0-0: KINGSTON SUV500MS120G ATA-11 Hard-Disk (111 GiBytes) -2. USB MSC Drive Generic Flash Disk 8.07 -3. Payload [memtest] -4. Payload [setup] -``` - -Now boot from the `USB MSC Drive Generic Flash Disk 8.07` media by pressing -`2`, the VyOS boot menu will appear, just wait 10 seconds or press `Enter` -to continue. - -```none -lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk -x VyOS - Boot Menu x -tqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqu -x Live system (amd64-vyos) x -x Live system (amd64-vyos fail-safe mode) x -x Live system (amd64-vyos) - Serial console x -x x -mqqqqqqPress ENAutomatic boot in 10 seconds...nu entryqqqqqqqj -``` - -The image will be loaded and the last lines you will get will be: - -```none -Loading /live/vmlinuz... ok -Loading /live/initrd.img... -... -Welcome to VyOS - vyos ttyS0 - -vyos login: -``` - -You can now proceed with a regular image installation as described in -{ref}`installation`. - -(vyos-on-baremetal-apu4-pictures)= - -### Pictures - -:::{note} -Both device types operate without any moving parts and emit zero -noise. -::: - -#### Rack Mount - -:::{figure} /_static/images/apu4_rack_1.jpg -:alt: APU4 rack closed -:scale: 25 % -::: - -:::{figure} /_static/images/apu4_rack_2.jpg -:alt: APU4 rack front -:scale: 25 % -::: - -:::{figure} /_static/images/apu4_rack_3.jpg -:alt: 'APU4 rack module #1' -:scale: 25 % -::: - -:::{figure} /_static/images/apu4_rack_4.jpg -:alt: 'APU4 rack module #2' -:scale: 25 % -::: - -:::{figure} /_static/images/apu4_rack_5.jpg -:alt: 'APU4 rack module #3 with PSU' -:scale: 25 % -::: - -##### VyOS custom print - -:::{figure} /_static/images/apu4_rack_vyos_print.jpg -:alt: APU4 custom VyOS powder coat -:scale: 25 % -::: - -#### Desktop / Bench Top - -:::{figure} /_static/images/apu4_desk_1.jpg -:alt: APU4 desktop closed -:scale: 25 % -::: - -:::{figure} /_static/images/apu4_desk_2.jpg -:alt: APU4 desktop closed -:scale: 25 % -::: - -:::{figure} /_static/images/apu4_desk_3.jpg -:alt: APU4 desktop back -:scale: 25 % -::: - -:::{figure} /_static/images/apu4_desk_4.jpg -:alt: APU4 desktop back -:scale: 25 % -::: - -## Qotom Q355G4 - -The install on this Q355G4 box is pretty much plug and play. The port numbering -the OS does might differ from the labels on the outside, but the UEFI firmware -has a port blink test built in with MAC addresses so you can very quickly -identify which is which. MAC labels are on the inside as well, and this test -can be done from VyOS or plain Linux too. Default settings in the UEFI will -make it boot, but depending on your installation wishes (i.e. storage type, -boot type, console type) you might want to adjust them. This Qotom company -seems to be the real OEM/ODM for many other relabelling companies like -Protectli. - -### Hardware - -There are a number of other options, but they all seem to be close to Intel -reference designs, with added features like more serial ports, more network -interfaces and the likes. Because they don't deviate too much from standard -designs all the hardware is well-supported by mainline. It accepts one LPDDR3 -SO-DIMM, but chances are that if you need more than that, you'll also want -something even beefier than an i5. There are options for antenna holes, and SIM -slots, so you could in theory add an LTE/Cell modem (not tested so far). - -The chassis is a U-shaped alu extrusion with removable I/O plates and removable -bottom plate. Cooling is completely passive with a heatsink on the SoC with -internal and external fins, a flat interface surface, thermal pad on top of -that, which then directly attaches to the chassis, which has fins as well. It -comes with mounting hardware and rubber feet, so you could place it like a -desktop model or mount it on a VESA mount, or even wall mount it with the -provided mounting plate. The closing plate doubles as internal 2.5" mounting -place for an HDD or SSD, and comes supplied with a small SATA cable and SATA -power cable. - -Power supply is a 12VDC barrel jack, and included switching power supply, which -is why SATA power regulation is on-board. Internally it has a NUC-board-style -on-board 12V input header as well, the molex locking style. - -There are WDT options and auto-boot on power enable, which is great for remote -setups. Firmware is reasonably secure (no backdoors found, BootGuard is enabled -in enforcement mode, which is good but also means no coreboot option), yet has -most options available to configure (so it's not locked out like most firmwares -are). - -An external RS232 serial port is available, internally a GPIO header as well. -It does have Realtek based audio on board for some reason, but you can disable -that. Booting works on both USB2 and USB3 ports. Switching between serial BIOS -mode and HDMI BIOS mode depends on what is connected at startup; it goes into -serial mode if you disconnect HDMI and plug in serial, in all other cases it's -HDMI mode. - -## Partaker i5 - -:::{figure} ../_static/images/600px-Partaker-i5.jpg -::: - -I believe this is actually the same hardware as the Protectli. I purchased it -in June 2018. It came pre-loaded with pfSense. - -[Manufacturer product page](http://www.inctel.com.cn/product/detail/338.html). - -### Installation - -- Write VyOS ISO to USB drive of some sort -- Plug in VGA, power, USB keyboard, and USB drive -- Press "SW" button on the front (this is the power button; I don't know what - "SW" is supposed to mean). -- Begin rapidly pressing delete on the keyboard. The boot prompt is very quick, - but with a few tries you should be able to get into the BIOS. -- Chipset > South Bridge > USB Configuration: set XHCI to Disabled and USB 2.0 - (EHCI) to Enabled. Without doing this, the USB drive won't boot. -- Boot to the VyOS installer and install as usual. - -Warning the interface labels on my device are backwards; the left-most "LAN4" -port is eth0 and the right-most "LAN1" port is eth3. - -## Acrosser AND-J190N1 - -:::{figure} ../_static/images/480px-Acrosser_ANDJ190N1_Front.jpg -::: - -:::{figure} ../_static/images/480px-Acrosser_ANDJ190N1_Back.jpg -::: - -This microbox network appliance was build to create OpenVPN bridges. It can -saturate a 100Mbps link. It is a small (serial console only) PC with 6 Gb LAN - -You may have to add your own RAM and HDD/SSD. There is no VGA connector. But -Acrosser provides a DB25 adapter for the VGA header on the motherboard (not -used). - -### BIOS Settings: - -First thing you want to do is getting a more user friendly console to configure -BIOS. Default VT100 brings a lot of issues. Configure VT100+ instead. - -For practical issues change speed from 115200 to 9600. 9600 is the default -speed at which both linux kernel and VyOS will reconfigure the serial port -when loading. - -Connect to serial (115200bps). Power on the appliance and press Del in the -console when requested to enter BIOS settings. - -Advanced > Serial Port Console Redirection > Console Redirection Settings: - -- Terminal Type : VT100+ -- Bits per second : 9600 - -Save, reboot and change serial speed to 9600 on your client. - -Some options have to be changed for VyOS to boot correctly. With XHCI enabled -the installer can’t access the USB key. Enable EHCI instead. - -Reboot into BIOS, Chipset > South Bridge > USB Configuration: - -- Disable XHCI -- Enable USB 2.0 (EHCI) Support - -Perform Image installation using `install image` CLI command. - -(gowin-gw-fn-1ur1-10g)= - -## Gowin GW-FN-1UR1-10G - -A platform utilizing an Intel Alder Lake-N100 CPU with 6M cache, TDP 6W. -Onboard LPDDR5 16GB RAM and 128GB eMMC (can be used for image installation). - -The appliance comes with 2 * 2.5GbE Intel I226-V and 3 * 1GbE Intel I210 -where one supports IEEE802.3at PoE+ (Typical 30W). - -In addition there is a Mellanox ConnectX-3 2\* 10GbE SFP+ NIC available. - -**NOTE:** This is the entry level platform. Other derivates exists with -i3-N305 CPU and 2x 25GbE! - -### Gowin Shopping Cart - -- 1x Gowin GW-FN-1UR1-10G -- 2x 128GB M.2 NVMe SSDs - -### Optional (WiFi + WWAN) - -- 1x MediaTek 7921E M.2 NGFF WIFI module (not tested as this currently leads to - a Kernel crash) -- 1x HP LT4120 Snapdragon X5 LTE WWAN module - -### Pictures - -:::{figure} ../_static/images/gowin-01.png -::: - -:::{figure} ../_static/images/gowin-02.png -::: - -:::{figure} ../_static/images/gowin-03.png -::: - -:::{figure} ../_static/images/gowin-04.png -::: - -### Cooling - -The device itself is passivly cooled, whereas the power supply has an active fan. -Even if the main processor is powered off, the power supply fan is operating and -the entire chassis draws 7.5W. During operation the chassis drew arround 38W. - -### BIOS Settings - -No settings needed to be altered, everything worked out of the box! - -### Installation - -The system provides a regular RS232 console port using 115200,8n1 setting which -is sufficient to install VyOS from a USB pendrive. - -### First Boot - -Please note that there is a weirdness on the network interface mapping. -The interface \<-> MAC mapping is going upwards but the NICs are placed -somehow swapped on the mainboard/MACs programmed in a swapped order. - -See interface description for more detailed mapping. - -```none -vyos@vyos:~$ show interfaces -Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down -Interface IP Address MAC VRF MTU S/L Description ------------ -------------- ----------------- ------- ----- ----- ------------- -eth0 - 00:f0:cb:00:00:99 default 1500 u/D Intel I226-V - Front eth2 -eth1 - 00:f0:cb:00:00:9a default 1500 u/D Intel I226-V - Front eth1 -eth2 - 00:f0:cb:00:00:9b default 1500 u/D Intel I210 - Front eth4 -eth3 - 00:f0:cb:00:00:9c default 1500 u/D Intel I210 - Front eth3 -eth4 - 00:f0:cb:00:00:9d default 1500 u/D Intel I210 - Front POE -eth5 - 00:02:c9:00:00:30 default 1500 u/D Mellanox ConnectX-3 - SFP2 -eth6 - 00:02:c9:00:00:31 default 1500 u/D Mellanox ConnectX-3 - SFP1 -lo 127.0.0.1/8 00:00:00:00:00:00 default 65536 u/u - ::1/128 -wwan0 - d2:39:76:8e:05:12 default 1500 A/D -``` - -#### VyOS 1.4 (sagitta) - -Connect serial port to a PC through a USB \<-> RJ45 console cable. Set terminal -emulator to 115200 8N1. You can also perform the installation using VGA or HDMI -ports. - -In this example I choose to install VyOS as RAID-1 on both NVMe drives. However, -a previous installation on the 128GB eMMC storage worked without any issues, -too. - -```none -Welcome to VyOS - vyos ttyS0 -vyos login: -``` - -Perform Image installation using `install image` CLI command. This installation -uses two 128GB NVMe disks setup as RAID1. - -```none -Welcome to VyOS! - - ┌── ┐ - . VyOS 1.4.0 - └ ──┘ sagitta - -* Support portal: https://support.vyos.io -* Documentation: https://docs.vyos.io/en/sagitta -* Project news: https://blog.vyos.io -* Bug reports: https://vyos.dev - -You can change this banner using "set system login banner post-login" command. - -VyOS is a free software distribution that includes multiple components, -you can check individual component licenses under /usr/share/doc/*/copyright -Use of this pre-built image is governed by the EULA you can find in -/usr/share/vyos/EULA - -vyos@vyos:~$ install image - -Welcome to VyOS installation! -This command will install VyOS to your permanent storage. -Would you like to continue? [y/N] y - -What would you like to name this image? (Default: 1.4.0) - -Please enter a password for the "vyos" user: -Please confirm password for the "vyos" user: - -What console should be used by default? (K: KVM, S: Serial)? (Default: S) - -Probing disks -4 disk(s) found -Would you like to configure RAID-1 mirroring? [Y/n] y - -The following disks were found: - /dev/sda (14.4 GB) - /dev/mmcblk0 (116.5 GB) -Would you like to configure RAID-1 mirroring on them? [Y/n] n - -Would you like to choose two disks for RAID-1 mirroring? [Y/n] y -Disks available: - 1: /dev/sda (14.4 GB) - 2: /dev/mmcblk0 (116.5 GB) - 3: /dev/nvme1n1 (119.2 GB) - 4: /dev/nvme0n1 (119.2 GB) -Select first disk: 3 - -Remaining disks: - 1: /dev/sda (14.4 GB) - 2: /dev/mmcblk0 (116.5 GB) - 3: /dev/nvme0n1 (119.2 GB) -Select second disk: 3 - -Installation will delete all data on both drives. Continue? [y/N] y - -Searching for data from previous installations -No previous installation found -Creating partitions on /dev/nvme1n1 -Creating partition table... -Creating partitions on /dev/nvme0n1 -Creating partition table... -Creating RAID array -Updating initramfs -Creating filesystem on RAID array -The following config files are available for boot: - 1: /opt/vyatta/etc/config/config.boot - 2: /opt/vyatta/etc/config.boot.default - -Which file would you like as boot config? (Default: 1) -Creating temporary directories -Mounting new partitions -Creating a configuration file -Copying system image files -Installing GRUB configuration files -Installing GRUB to the drives -Cleaning up -Unmounting target filesystems -Removing temporary files -The image installed successfully; please reboot now. -``` - -### Hardware - -```none -vyos@vyos:~$ lspci -00:00.0 Host bridge: Intel Corporation Device 461c -00:02.0 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics] -00:0a.0 Signal processing controller: Intel Corporation Platform Monitoring Technology (rev 01) -00:0d.0 USB controller: Intel Corporation Device 464e -00:14.0 USB controller: Intel Corporation Device 54ed -00:14.2 RAM memory: Intel Corporation Device 54ef -00:15.0 Serial bus controller: Intel Corporation Device 54e8 -00:16.0 Communication controller: Intel Corporation Device 54e0 -00:1a.0 SD Host controller: Intel Corporation Device 54c4 -00:1c.0 PCI bridge: Intel Corporation Device 54b8 -00:1c.2 PCI bridge: Intel Corporation Device 54ba -00:1c.3 PCI bridge: Intel Corporation Device 54bb -00:1c.6 PCI bridge: Intel Corporation Device 54be -00:1d.0 PCI bridge: Intel Corporation Device 54b0 -00:1f.0 ISA bridge: Intel Corporation Device 5481 -00:1f.4 SMBus: Intel Corporation Device 54a3 -00:1f.5 Serial bus controller: Intel Corporation Device 54a4 -01:00.0 PCI bridge: ASMedia Technology Inc. Device 1806 (rev 01) -02:00.0 PCI bridge: ASMedia Technology Inc. Device 1806 (rev 01) -02:02.0 PCI bridge: ASMedia Technology Inc. Device 1806 (rev 01) -02:06.0 PCI bridge: ASMedia Technology Inc. Device 1806 (rev 01) -02:0e.0 PCI bridge: ASMedia Technology Inc. Device 1806 (rev 01) -03:00.0 Ethernet controller: Intel Corporation Ethernet Controller I226-V (rev 04) -04:00.0 Ethernet controller: Intel Corporation Ethernet Controller I226-V (rev 04) -05:00.0 Network controller: MEDIATEK Corp. MT7922 802.11ax PCI Express Wireless Network Adapter -06:00.0 SATA controller: ASMedia Technology Inc. Device 0622 (rev 01) -07:00.0 PCI bridge: ASMedia Technology Inc. Device 1806 (rev 01) -08:00.0 PCI bridge: ASMedia Technology Inc. Device 1806 (rev 01) -08:02.0 PCI bridge: ASMedia Technology Inc. Device 1806 (rev 01) -08:06.0 PCI bridge: ASMedia Technology Inc. Device 1806 (rev 01) -08:0e.0 PCI bridge: ASMedia Technology Inc. Device 1806 (rev 01) -09:00.0 Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev 03) -0a:00.0 Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev 03) -0b:00.0 Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev 03) -0d:00.0 Non-Volatile memory controller: Device 1ed0:2283 -0f:00.0 Non-Volatile memory controller: Device 1ed0:2283 -11:00.0 Ethernet controller: Mellanox Technologies MT27500 Family [ConnectX-3] -``` - -```none -vyos@vyos:~$ lsusb -Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub -Bus 003 Device 005: ID 0e8d:c616 MediaTek Inc. Wireless_Device -Bus 003 Device 003: ID 413c:2113 Dell Computer Corp. KB216 Wired Keyboard -Bus 003 Device 004: ID 03f0:9d1d HP, Inc HP lt4120 Snapdragon X5 LTE -Bus 003 Device 002: ID 05e3:0610 Genesys Logic, Inc. Hub -Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub -Bus 002 Device 002: ID 05e3:0620 Genesys Logic, Inc. GL3523 Hub -Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub -Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub -``` - -#### WWAN - -The LTE module can be enabled as simple as this config snippet: - -```none -interfaces { - wwan wwan0 { - address "dhcp" - apn "YOUR-APN-GOES-HERE" - } -} -``` - -For more information please refer to chapter: {ref}`wwan-interface` - -[rufus]: https://rufus.ie/ diff --git a/docs/installation/md-index.md b/docs/installation/md-index.md deleted file mode 100644 index 4256aa9b..00000000 --- a/docs/installation/md-index.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -lastproofread: '2026-01-26' ---- - -# Installation and Image Management - -:::{note} -This information applies primarily to virtual installations: - -When installing VyOS, ensure that the MAC address you select for your NICs -is not a locally administered MAC address. Locally administered addresses are -distinguished from universally administered addresses by setting the -second-least-significant bit of the first octet to 1: - -Example: `02:00:00:00:00:01`, where the second-least-significant bit -(`02` in hexadecimal) is set to `1`. -::: - -```{toctree} -:caption: Content -:maxdepth: 2 - -install -virtual/index -cloud/index -bare-metal -update -image -secure-boot -``` diff --git a/docs/installation/md-install.md b/docs/installation/md-install.md deleted file mode 100644 index 789b0ec9..00000000 --- a/docs/installation/md-install.md +++ /dev/null @@ -1,460 +0,0 @@ ---- -lastproofread: '2026-01-26' ---- - -(installation)= - -# Installation - -VyOS installation requires a VyOS .iso file. This file is a live installation -image that you can use to boot a live VyOS system. From there, you can proceed -with a permanent installation on a hard drive or other storage device. - -:::{list-table} Comparison of VyOS image releases -:header-rows: 1 -:widths: 15 35 15 25 15 15 - -* - Release Type - - Description - - Release Cycle - - Intended Use - - Access to Images - - Access to Source - -* - Nightly (Current) - - Automatically built from the current branch. Always up to date - with cutting edge development but guaranteed to contain bugs. - - Every night - - Developing VyOS, testing new features, experimenting. - - Everyone - - Everyone - -* - Stream - - VyOS Stream serves as a technology preview and a quality gate - for the upcoming LTS release. Allows everyone to try new features - and check if they work well or need improvements. - - Every quarter - - Non-critical production environments, preparing for the LTS - release. - - Everyone - - Everyone - -* - Release Candidate - - Rather stable. All development focuses on testing and hunting - down remaining bugs following the feature freeze. - - Irregularly until EPA comes out - - Labs, small offices and non-critical production systems backed - by a high-availability setup. - - Everyone - - Everyone - -* - Early Production Access - - Highly stable with no known bugs. Needs to be tested repeatedly - under different conditions before it can become the final - release. - - Irregularly until LTS comes out - - Non-critical production environments, preparing for the LTS - release. - - Everyone - - Everyone - -* - Long-Term Support - - Guaranteed to be stable and carefully maintained for several - years after the release. No features are introduced but security - updates are released in a timely manner. - - Every major version - - Large-scale enterprise networks, internet service providers, - critical production environments that call for minimum downtime. - - Subscribers, contributors, non-profits, emergency services, - academic institutions - - Subscribers, contributors, non-profits, emergency services, - academic institutions -::: - -## Hardware requirements - -The minimum system requirements for VyOS are 4 GB RAM and 10 GB storage. -Depending on your use case, you might need additional RAM and CPU resources. - -## Download - -### Registered Subscribers - -Registered subscribers can log into <https://support.vyos.io/> to access -a variety of different downloads via the "Downloads" link. These -downloads include LTS (Long-Term Support), the associated hot-fix releases, -early public access releases, pre-built VM images, as well as device -specific installation ISOs. See this [article] for more information on -downloads. - -:::{note} -The `.qcow2` image provided for Proxmox deployment can also be -used to deploy VyOS on KVM environments. This image includes cloud-init -support. See {ref}`cloud-init` for more information. -::: - -:::{figure} /_static/images/vyosnew-downloads.png -::: - -### Building from source - -Subscribers can download the source code for the LTS release from the -"Downloads" link. Non-subscribers can access the source code for the -Rolling release. For instructions, see the {ref}`build` section. The -VyOS source code repository is available at -<https://github.com/vyos/vyos-build>. - -### Rolling Release - -Everyone can download bleeding-edge VyOS rolling images from: -<https://downloads.vyos.io/> - -:::{note} -Rolling releases contain the latest enhancements and fixes. -This means there may be new bugs. If you encounter a bug, follow the -guide at {ref}`bug_report`. We depend on your feedback to improve VyOS. -::: - -The following link contains the most recent VyOS builds for AMD64 -systems from the `current` branch: <https://vyos.net/get/nightly-builds/> - -### Download Verification - -LTS images are signed with the VyOS lead package maintainer's private key. -You can verify the authenticity of the package using the official public key -and Minisign. - -(minisign-verification)= - -#### Minisign verification - -VyOS uses [Minisign](https://github.com/jedisct1/minisign) for release -signing. Minisign is a tool for signing files and verifying signatures. - -OpenBSD introduced signify in 2015. Minisign is an alternative -implementation of the same protocol, available for Windows, macOS, and -most GNU/Linux distributions. Minisign is portable, lightweight, and -uses the Ed25519 public-key signature system. - -{vytask}`T2108` switched the validation system to prefer Minisign over GPG keys. - -To verify a VyOS image starting with VyOS `1.3.0-rc6`, run: - -```none -$ minisign -V -P RWSIhkR/dkM2DSaBRniv/bbbAf8hmDqdbOEmgXkf1RxRoxzodgKcDyGq -m vyos-1.5-rolling-202409250007-generic-amd64.iso vyos-1.5-rolling-202409250007-generic-amd64.iso.minisig - -Signature and comment signature verified -Trusted comment: timestamp:1727223408 file:vyos-1.5-rolling-202409250007-generic-amd64.iso hashed -``` - -During an image upgrade, VyOS runs the following command: - -```none -$ minisign -V -p /usr/share/vyos/keys/vyos-release.minisign.pub -m vyos-1.3.0-rc6-amd64.iso vyos-1.3.0-rc6-amd64.iso.minisig -Signature and comment signature verified -Trusted comment: timestamp:1629997936 file:vyos-1.3.0-rc6-amd64.iso -``` - -:::{note} -Starting with version `1.4.3`, VyOS uses Minisign exclusively. -If you see an unexpected verification error, update your system to version -`1.4.2` first. Support for GnuPG signatures has been -removed ({vytask}`T7301`). -::: - -(live_installation)= - -## Live installation - -:::{note} -To permanently install VyOS, you must first complete a live -installation. -::: - -You can test VyOS without installing it on your hard drive. **Using your -downloaded VyOS .iso file, you can create a bootable USB drive to boot -into a fully functional VyOS system**. After testing it, you can start a -{ref}`permanent_installation` on your hard drive or power off your system -and remove the USB drive. - -If you have a GNU/Linux system, you can create a bootable VyOS USB drive using -the `dd` command: - -1. Open your terminal emulator. - -2. Find the device name of your USB drive (use the `lsblk` command). - -3. Unmount the USB drive. Replace `X` with your device letter and keep the - asterisk (*) to unmount all partitions. - -```none -$ umount /dev/sdX* -``` - -4. Write the image (your VyOS .iso file) to the USB drive. Use the device - name (for example, `/dev/sdb`), not the partition name - (for example, `/dev/sdb1`). - -**Warning**: This will destroy all data on the USB drive! - -```none -# dd if=/path/to/vyos.iso of=/dev/sdX bs=8M; sync -``` - -5. Wait for the operation to complete (bytes copied). On some systems, this - may take more than one minute. - -6. Once `dd` has finished, pull the USB drive out and plug it into - the powered-off computer where you want to install (or test) VyOS. - -7. Power on the computer and ensure it boots from the USB drive - (you may need to select the boot device or change boot settings). - -8. When VyOS finishes loading, sign in using the default credentials - (login: `vyos`, password: `vyos`). - -If you encounter issues with this method, prefer a different operating -system, or want a GUI program, you can use other tools to create a -bootable USB drive, such as [balenaEtcher] (GNU/Linux, macOS, and Windows), -[Rufus] (Windows), and [many others]. Follow their instructions to create -a bootable USB drive from an `.iso` file. - -:::{hint} -The default username and password for the live system is *vyos*. -::: - -(permanent_installation)= - -## Permanent installation - -:::{note} -Before a permanent installation, VyOS requires a -{ref}`live_installation`. -::: - -Unlike general-purpose Linux distributions, VyOS uses "image installation", -which mimics the user experience of traditional hardware routers and allows -you to keep multiple VyOS versions installed simultaneously. This lets you -switch to a previous version if something breaks or misbehaves after an -image upgrade. - -Each version is contained in its own squashfs image mounted in a union -filesystem along with a directory for mutable data such as configurations, -keys, and custom scripts. - -In order to proceed with a permanent installation: - -1. Sign in to the VyOS live system using the default credentials - (login: `vyos`, password: `vyos`). - -2. Run the `install image` command and follow the wizard: - -```none -vyos@vyos:~$ install image -Welcome to VyOS installation! -This command will install VyOS to your permanent storage. -Would you like to continue? [y/N] y -What would you like to name this image? (Default: 2025.09.17-0018-rolling) -Please enter a password for the "vyos" user: -Please confirm password for the "vyos" user: -What console should be used by default? (K: KVM, S: Serial)? (Default: S) -Probing disks -1 disk(s) found -The following disks were found: -Drive: /dev/vda (10.0 GB) -Which one should be used for installation? (Default: /dev/vda) -Installation will delete all data on the drive. Continue? [y/N] y -Searching for data from previous installations -No previous installation found -Would you like to use all the free space on the drive? [Y/n] Y -Creating partition table... -The following config files are available for boot: - 1: /opt/vyatta/etc/config/config.boot - 2: /opt/vyatta/etc/config.boot.default -Which file would you like as boot config? (Default: 1) -Creating temporary directories -Mounting new partitions -Creating a configuration file -Copying system image files -Installing GRUB configuration files -Installing GRUB to the drive -Cleaning up -Unmounting target filesystems -Removing temporary files -The image installed successfully; please reboot now. -``` - -3. After installation completes, remove the live USB drive or CD. - -4. Reboot the system. - -```none -vyos@vyos:~$ reboot -Proceed with reboot? (Yes/No) [No] Yes -``` - -You will boot now into a permanent VyOS system. - -## PXE Boot - -You can also install VyOS using PXE, a more complex installation method that -allows you to deploy VyOS over the network. - -**Requirements** - -- A machine (client) with a PXE-enabled NIC. -- {ref}`dhcp-server` -- {ref}`tftp-server` -- Webserver (HTTP). Optional, but speeds up installation. -- VyOS ISO image (do not use images prior to VyOS `1.2.3`). -- Files *pxelinux.0* and *ldlinux.c32* from the - [Syslinux distribution](https://kernel.org/pub/linux/utils/boot/syslinux/). - -### Configuration - -#### Step 1: DHCP - -Configure a DHCP server to provide the client with: - -- An IP address -- The TFTP server address (DHCP option 66), sometimes referred to as the - *boot server* -- The *bootfile name* (DHCP option 67): *pxelinux.0* - -In this example we configured an existent VyOS as the DHCP server: - -```none -vyos@vyos# show service dhcp-server - shared-network-name mydhcp { - subnet 192.168.1.0/24 { - option { - bootfile-name pxelinux.0 - bootfile-server 192.168.1.50 - default-router 192.168.1.50 - } - range 0 { - start 192.168.1.70 - stop 192.168.1.100 - } - subnet-id 1 - } - } -``` - -(install_from_tftp)= - -#### Step 2: TFTP - -Configure a TFTP server to serve the following: - -- The *pxelinux.0* file from the Syslinux distribution -- The *ldlinux.c32* file from the Syslinux distribution -- The VyOS kernel you want to deploy (*vmlinuz* file from the - */live* directory in the extracted ISO file) -- The VyOS initial ramdisk (*initrd.img* file from the */live* directory - in the extracted ISO file). Do not use an empty (0 bytes) initrd.img - file; the correct file may have a longer name. -- A directory named *pxelinux.cfg* containing the configuration file. - By default, the VyOS configuration file is named [default]. - -In the example you configured your existent VyOS as the TFTP server too: - -```none -vyos@vyos# show service tftp-server - directory /config/tftpboot - listen-address 192.168.1.50 -``` - -Example of the contents of the TFTP server: - -```none -vyos@vyos# ls -hal /config/tftpboot/ -total 29M -drwxr-sr-x 3 tftp tftp 4.0K Oct 14 00:23 . -drwxrwsr-x 9 root vyattacfg 4.0K Oct 18 00:05 .. --r--r--r-- 1 root vyattacfg 25M Oct 13 23:24 initrd.img-4.19.54-amd64-vyos --rwxr-xr-x 1 root vyattacfg 120K Oct 13 23:44 ldlinux.c32 --rw-r--r-- 1 root vyattacfg 46K Oct 13 23:24 pxelinux.0 -drwxr-xr-x 2 root vyattacfg 4.0K Oct 14 01:10 pxelinux.cfg --r--r--r-- 1 root vyattacfg 3.7M Oct 13 23:24 vmlinuz - -vyos@vyos# ls -hal /config/tftpboot/pxelinux.cfg -total 12K -drwxr-xr-x 2 root vyattacfg 4.0K Oct 14 01:10 . -drwxr-sr-x 3 tftp tftp 4.0K Oct 14 00:23 .. --rw-r--r-- 1 root root 191 Oct 14 01:10 default -``` - -Example of simple (no menu) configuration file: - -```none -vyos@vyos# cat /config/tftpboot/pxelinux.cfg/default -DEFAULT VyOS123 - -LABEL VyOS123 - KERNEL vmlinuz - APPEND initrd=initrd.img-4.19.54-amd64-vyos boot=live nopersistence noautologin nonetworking fetch=http://address:8000/filesystem.squashfs -``` - -#### Step 3: HTTP - -You also need to provide the *filesystem.squashfs* file. Because this is a -large file and TFTP is slow, you can send it through HTTP to speed up the -transfer. In our example, we do this—see the configuration file above. - -1. Start a web server. You can use one like - [Python's SimpleHTTPServer] to serve the `filesystem.squashfs` file. - The file is in the `/live` directory of the extracted ISO file. -2. Edit the {ref}`install_from_tftp` configuration file to show the correct - URL: `fetch=http://<address_of_your_HTTP_server>/filesystem.squashfs`. - -:::{note} -Do not rename the *filesystem.squashfs* file. If you're working with -different versions, create different directories instead. -::: - -3. restart the TFTP service. If you're using VyOS as your TFTP server, restart - the service with `sudo service tftpd-hpa restart`. - -:::{note} -Ensure the directories and files on both the TFTP and HTTP servers -have the correct permissions for the booting clients to access them. -::: - -### Client Boot - -Finally, power on your PXE-enabled clients. They will automatically receive an -IP address from the DHCP server and boot into VyOS live using files from the -TFTP and HTTP servers. - -Once finished you will be able to proceed with the `install image` -command as in a regular VyOS installation. - -## Known Issues - -This is a list of known issues that can arise during installation. - -### Black screen on install - -GRUB redirects all output to a serial port to facilitate installation -on headless hosts. On some hardware that lacks a serial port, this causes -a hard lockup and displays a black screen after you select the -`Live system` option from the installation image. - -The workaround is to press `e` when the boot menu appears and edit the -GRUB boot options. Specifically, remove the: - -`console=ttyS0,115200` - -option, and type CTRL-X to boot. - -Installation can then continue as outlined above. - -[article]: https://customers.support.vyos.com/servicedesk/customer/portal/1/article/159055913 -[balenaetcher]: https://www.balena.io/etcher/ -[configuration]: https://wiki.syslinux.org/wiki/index.php?title=Config -[default]: https://wiki.syslinux.org/wiki/index.php?title=PXELINUX#Configuration -[many others]: https://en.wikipedia.org/wiki/List_of_tools_to_create_Live_USB_systems -[python's simplehttpserver]: https://docs.python.org/2/library/simplehttpserver.html -[rufus]: https://rufus.ie/ -[syslinux]: http://www.syslinux.org/ diff --git a/docs/installation/md-secure-boot.md b/docs/installation/md-secure-boot.md deleted file mode 100644 index 3c2013a4..00000000 --- a/docs/installation/md-secure-boot.md +++ /dev/null @@ -1,191 +0,0 @@ ---- -lastproofread: '2026-01-26' ---- - -(secure-boot)= - -# Secure Boot - -Initial UEFI Secure Boot support is available ({vytask}`T861`). VyOS uses -`shim` from Debian 12 (Bookworm), which is properly signed by the UEFI -Secure Boot key from Microsoft. - -:::{note} -There is yet no signed version of `shim` for VyOS, thus we -provide no signed image for secure boot yet. If you are interested in -secure boot you can build an image on your own. -::: - -To generate a custom ISO with your own secure boot keys, run the following -commands prior to your ISO image build: - -```bash -cd vyos-build -CA_DIR="data/certificates" -SHIM_CERT_NAME="vyos-dev-2025-shim" -VYOS_KERNEL_CERT_NAME="vyos-dev-2025-linux" - -openssl req -new -x509 -newkey rsa:4096 -keyout ${CA_DIR}/${SHIM_CERT_NAME}.key -out ${CA_DIR}/${SHIM_CERT_NAME}.der \ - -outform DER -days 36500 -subj "/CN=VyOS Networks Secure Boot CA/" -nodes -openssl x509 -inform der -in ${CA_DIR}/${SHIM_CERT_NAME}.der -out ${CA_DIR}/${SHIM_CERT_NAME}.pem - -openssl req -newkey rsa:4096 -sha256 -nodes -keyout ${CA_DIR}/${VYOS_KERNEL_CERT_NAME}.key \ - -out ${CA_DIR}/${VYOS_KERNEL_CERT_NAME}.csr -outform PEM -days 3650 \ - -subj "/CN=VyOS Networks Secure Boot Signer 2025 - linux/" -openssl x509 -req -in ${CA_DIR}/${VYOS_KERNEL_CERT_NAME}.csr -CA ${CA_DIR}/${SHIM_CERT_NAME}.pem \ - -CAkey ${CA_DIR}/${SHIM_CERT_NAME}.key -CAcreateserial -out ${CA_DIR}/${VYOS_KERNEL_CERT_NAME}.pem -days 3650 -sha256 -``` - -## Installation - -As our version of `shim` is not signed by Microsoft we need to enroll the -previously generated {abbr}`MOK (Machine Owner Key)` to the system. - -First, disable UEFI Secure Boot for the installation. - -:::{figure} /_static/images/uefi_secureboot_01.png -:alt: Disable UEFI secure boot -::: - -Proceed with the standard VyOS {ref}`installation <permanent_installation>` on -your system. Instead of the final `reboot` command, enroll the -{abbr}`MOK (Machine Owner Key)`. - -```none -vyos@vyos:~$ install mok -input password: -input password again: -``` - -You can set the `input password` to any value you choose. You'll need this -password after reboot when MOK Manager launches to permanently install the keys. - -With the next reboot, MOK Manager will automatically launch - -:::{figure} /_static/images/uefi_secureboot_02.png -:alt: Disable UEFI secure boot -::: - -Select `Enroll MOK` - -:::{figure} /_static/images/uefi_secureboot_03.png -:alt: Disable UEFI secure boot -::: - -You can now view the key to be installed and continue with key installation. - -:::{figure} /_static/images/uefi_secureboot_04.png -:alt: Disable UEFI secure boot -::: - -:::{figure} /_static/images/uefi_secureboot_05.png -:alt: Disable UEFI secure boot -::: - -Now you need to enter the password you defined previously. - -:::{figure} /_static/images/uefi_secureboot_06.png -:alt: Disable UEFI secure boot -::: - -Now reboot and re-enable UEFI Secure Boot. - -:::{figure} /_static/images/uefi_secureboot_07.png -:alt: Disable UEFI secure boot -::: - -VyOS will now launch in UEFI Secure Boot mode. You can verify this by running -one of the following commands: - -```none -vyos@vyos:~$ show secure-boot -SecureBoot enabled -``` - -```none -vyos@vyos:~$ show log kernel | match Secure -Oct 08 19:15:41 kernel: Secure boot enabled -``` - -```none -vyos@vyos:~$ show version -Version: VyOS 1.5-secureboot -Release train: current -Release flavor: generic - -Built by: autobuild@vyos.net -Built on: Tue 08 Oct 2024 18:00 UTC -Build UUID: 5702ca38-e6f4-470f-b89e-ffc29baee474 -Build commit ID: 9eb61d3b6cf426 - -Architecture: x86_64 -Boot via: installed image -System type: KVM guest -Secure Boot: enabled <-- UEFI secure boot indicator - -Hardware vendor: QEMU -Hardware model: Standard PC (i440FX + PIIX, 1996) -Hardware S/N: -Hardware UUID: 1f6e7f5c-fb52-4c33-96c9-782fbea36436 - -Copyright: VyOS maintainers and contributors -``` - -## Image Update - -:::{note} -Currently, there is no signed version of `shim` for VyOS. If you -want Secure Boot support, you can build a custom image with your own keys. -::: - -During image installation, you install your {abbr}`MOK (Machine Owner Key)` -into the UEFI variables to add trust to this key. After you re-enable Secure -Boot in UEFI, you can only boot into your signed image. - -You can no longer boot into a CI-generated rolling release because those -are not signed by a trusted party ({vytask}`T861` work in progress). This -also means you must sign all successor builds with the same key; otherwise, -you'll see this error: - -```none -error: bad shim signature -error: you need to load the kernel first -``` - -## Linux Kernel - -In addition to Secure Boot support, VyOS uses ephemeral key signing of Linux -Kernel modules for an extra security layer in both Secure and non-Secure boot -images. - -<https://patchwork.kernel.org/project/linux-integrity/patch/20210218220011.67625-5-nayna@linux.ibm.com/> - -When the CI system builds a Kernel package and required third-party modules, -it generates a temporary (ephemeral) key pair for signing the modules. The -public key is embedded in the Kernel binary to verify loaded modules. - -After the Kernel CI build completes, the generated key is discarded, meaning -we can no longer sign additional modules with that key. The Kernel configuration -also includes the option `CONFIG_MODULE_SIG_FORCE=y`, which enforces signature -verification for all modules. If you try to load an unsigned module, you'll -get this error: - -`insmod: ERROR: could not insert module malicious.ko: Key was rejected by -service` - -This prevents loading any malicious code after the image is assembled into the -Kernel as a module. You can disable this behavior on custom builds if needed. - -## Troubleshoot - -In most cases, if something goes wrong during system boot, you'll see this -error message: - -```none -error: bad shim signature -error: you need to load the kernel first -``` - -This error means the Machine Owner Key used to sign the Kernel is not trusted -by your UEFI. Install the MOK using the `install mok` command as described -above. diff --git a/docs/installation/virtual/md-docker.md b/docs/installation/virtual/md-docker.md deleted file mode 100644 index 901483bb..00000000 --- a/docs/installation/virtual/md-docker.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -lastproofread: '2026-02-02' ---- - -(docker)= - -# Run VyOS in a Docker Container - -Docker is an open-source project for deploying applications as standardized -units called containers. Deploying VyOS in a container provides a simple and -lightweight mechanism for both testing and packet routing for container -workloads. - -## IPv6 support for Docker - -VyOS requires an IPv6-enabled Docker network. Currently Linux distributions -do not enable Docker IPv6 support by default. You can enable IPv6 support in -two ways. - -### Method 1: Create a docker network with IPv6 support - -Here's an example using the `macvlan` driver. - -```none -docker network create --ipv6 -d macvlan -o parent=eth0 --subnet 2001:db8::/64 --subnet 192.0.2.0/24 mynet -``` - -### Method 2: Add IPv6 support to the Docker daemon - -Edit /etc/docker/daemon.json to set the `ipv6` key to `true` and specify -the `fixed-cidr-v6` to your desired IPv6 subnet. - -```none -{ - "ipv6": true, - "fixed-cidr-v6": "2001:db8::/64" -} -``` - -Reload the Docker configuration. - -```none -$ sudo systemctl reload docker -``` - -## Deploy container from ISO - -Download the ISO you want to base the container on. In this example, -the ISO is `vyos-1.4-rolling-202308240020-amd64.iso`. If you -created a custom IPv6-enabled network, include it as the `--net` parameter -to `docker run`. - -```none -$ mkdir vyos && cd vyos -$ curl -o vyos-1.4-rolling-202308240020-amd64.iso https://github.com/vyos/vyos-rolling-nightly-builds/releases/download/1.4-rolling-202308240020/vyos-1.4-rolling-202308240020-amd64.iso -$ mkdir rootfs -$ sudo mount -o loop vyos-1.4-rolling-202308240020-amd64.iso rootfs -$ sudo apt-get install -y squashfs-tools -$ mkdir unsquashfs -$ sudo unsquashfs -f -d unsquashfs/ rootfs/live/filesystem.squashfs -$ sudo tar -C unsquashfs -c . | docker import - vyos:1.4-rolling-202111281249 -$ sudo umount rootfs -$ cd .. -$ sudo rm -rf vyos -$ docker run -d --rm --name vyos --privileged -v /lib/modules:/lib/modules \ -> vyos:1.4-rolling-202111281249 /sbin/init -$ docker exec -ti vyos su - vyos -``` - -To stop the container, run `docker stop vyos`. diff --git a/docs/installation/virtual/md-eve-ng.md b/docs/installation/virtual/md-eve-ng.md deleted file mode 100644 index 1ee1c016..00000000 --- a/docs/installation/virtual/md-eve-ng.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -lastproofread: '2026-02-02' ---- - -# EVE-NG - -:::{note} -This page is a stub and needs expansion. Contributions -welcome via the [VyOS documentation repository](https://github.com/vyos/vyos-documentation). -::: - -## References - -<https://www.eve-ng.net/> diff --git a/docs/installation/virtual/md-gns3.md b/docs/installation/virtual/md-gns3.md deleted file mode 100644 index aeac7bbf..00000000 --- a/docs/installation/virtual/md-gns3.md +++ /dev/null @@ -1,191 +0,0 @@ ---- -lastproofread: '2026-02-02' ---- - -(vyos-on-gns3)= - -# Run VyOS on GNS3 - -You may want to test VyOS in a lab environment. -[GNS3](http://www.gns3.com) is a network emulation software that you -can use for this purpose. - -This guide will provide the necessary steps for installing -and setting up VyOS on GNS3. - -## Requirements - -The following items are required: - -- A VyOS installation image (.iso file). You - can find how to get it on the {ref}`installation` page -- A working GNS3 installation. For further information see the - [GNS3 documentation](https://docs.gns3.com/). - -(vm-setup)= - -## VM setup - -First, a virtual machine (VM) for the VyOS installation must be created -in GNS3. - -Go to the GNS3 **File** menu, click **New template**, and select -**Manually create a new Template**. - -:::{figure} /_static/images/gns3-01.png -::: - -Select **Qemu VMs** and then click the `New` button. - -:::{figure} /_static/images/gns3-02.png -::: - -Write a name for your VM, such as "VyOS", and click `Next`. - -:::{figure} /_static/images/gns3-03.png -::: - -Select **qemu-system-x86_64** as Quemu binary, then **512MB** of RAM -and click `Next`. - -:::{figure} /_static/images/gns3-04.png -::: - -Select **telnet** as your console type and click `Next`. - -:::{figure} /_static/images/gns3-05.png -::: - -Select **New image** for the base disk image of your VM and click -`Create`. - -:::{figure} /_static/images/gns3-06.png -::: - -Use the defaults in the **Binary and format** window and click -`Next`. - -:::{figure} /_static/images/gns3-07.png -::: - -Use the defaults in the **Qcow2 options** window and click `Next`. - -:::{figure} /_static/images/gns3-08.png -::: - -Set the disk size to 2000 MiB, and click `Finish` to end the **Quemu -image creator**. - -:::{figure} /_static/images/gns3-09.png -::: - -Click `Finish` to end the **New QEMU VM template** wizard. - -:::{figure} /_static/images/gns3-10.png -::: - -Now you need to edit the VM settings. - -In the **Preferences** window, with **Qemu VMs** selected and your new VM -selected, click the `Edit` button. - -:::{figure} /_static/images/gns3-11.png -::: - -In the **General settings** tab of your **QEMU VM template -configuration**, do the following: - -- Click on the `Browse...` button to choose the **Symbol** you want to - have representing your VM. -- In **Category** select in which group you want to find your VM. -- Set the **Boot priority** to **CD/DVD-ROM**. - -:::{figure} /_static/images/gns3-12.png -::: - -At the **HDD** tab, change the Disk interface to **sata** to speed up -the boot process. - -:::{figure} /_static/images/gns3-13.png -::: - -At the **CD/DVD** tab click on `Browse...` and locate the VyOS image -you want to install. - -:::{figure} /_static/images/gns3-14.png -::: - -:::{note} -You probably will want to accept to copy the .iso file to your -default image directory when you are asked. -::: - -In the **Network** tab, set the number of adapters to **0**, set the -**Name format** to **eth\{0}**, and set the **Type** to **Paravirtualized -Network I/O (virtio-net-pci)**. - -:::{figure} /_static/images/gns3-15.png -::: - -In the **Advanced** tab, unmark the checkbox **Use as a linked base -VM** and click `OK`, which will save and close the **QEMU VM template -configuration** window. - -:::{figure} /_static/images/gns3-16.png -::: - -At the general **Preferences** window, click `OK` to save and close. - -:::{figure} /_static/images/gns3-17.png -::: - -(vyos-installation)= - -## VyOS installation - -- Create a new project. -- Drag the newly created VyOS VM into it. -- Start the VM. -- Open a console. - The console displays the system booting. It prompts for login - credentials. You're now at the VyOS live system. -- {ref}`Install VyOS <installation>` - as normal (that is, using the `install image` command). -- After successful installation, shut down the VM with the `poweroff` - command. -- **Delete the VM** from the GNS3 project. - -The *VyOS-hda.qcow2* file now contains a working VyOS image and can be -used as a template. But it still needs some fixes before we can deploy -VyOS in our labs. - -(vyos-vm-configuration)= - -## VyOS VM configuration - -To turn the template into a working VyOS machine, further steps are -necessary as outlined below: - -**General settings** tab: Set the boot priority to **HDD** - -:::{figure} /_static/images/gns3-20.png -::: - -**CD/DVD** tab: Clear the **Image** entry field to unmount the installation -image. - -:::{figure} /_static/images/gns3-21.png -::: - -Set the number of required network adapters. For example, set it to **4**. - -:::{figure} /_static/images/gns3-215.png -::: - -**Advanced** settings tab: Check the **Use as a linked -base VM** checkbox and click `OK` to save the changes. - -:::{figure} /_static/images/gns3-22.png -::: - -The VyOS VM is now ready to be deployed. diff --git a/docs/installation/virtual/md-proxmox.md b/docs/installation/virtual/md-proxmox.md deleted file mode 100644 index 0eddc2c7..00000000 --- a/docs/installation/virtual/md-proxmox.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -lastproofread: '2026-02-02' ---- - -(proxmox)= - -# Running on Proxmox - -Proxmox is an open-source platform for virtualization. Visit -<https://vyos.io> to download a `.qcow2` image that you can import into -Proxmox. - -## Deploy VyOS from CLI with qcow2 image - -1. Copy the `.qcow2` image to a temporary directory on the Proxmox server. -2. The commands assume virtual machine ID 200 is unused and you want - the disk stored in a storage pool named `local-lvm`. - -```none -$ qm create 200 --name vyos2 --memory 2048 --net0 virtio,bridge=vmbr0 -$ qm importdisk 200 /path/to/image/vyos-1.2.8-proxmox-2G.qcow2 local-lvm -$ qm set 200 --virtio0 local-lvm:vm-200-disk-0 -$ qm set 200 --boot order=virtio0 -``` - -3. You can optionally attach a CDROM with an ISO as a cloud-init data - source. The command assumes the ISO is uploaded to the `local` - storage pool as `seed.iso`. - -```none -$ qm set 200 --ide2 media=cdrom,file=local:iso/seed.iso -``` - -4. Start the virtual machine using the Proxmox GUI or run `qm start 200`. - -## Deploy VyOS from CLI with rolling release ISO - -1. Download the rolling release ISO from - <https://vyos.net/get/nightly-builds/>. Non-subscribers can use the - LTS release by building from source. For instructions, see the - {ref}`build` section. The VyOS source code repository - is available at <https://github.com/vyos/vyos-build>. -2. Prepare the VM for ISO installation. The commands assume your ISO is - in storage pool 'local', you want VM ID '200', and you want to create - a new 15GB disk on storage pool 'local-lvm'. - -```none -qm create 200 --name vyos --memory 2048 --net0 virtio,bridge=vmbr0 --ide2 media=cdrom,file=local:iso/live-image-amd64.hybrid.iso --virtio0 local-lvm:15 -``` - -3. Start the VM using `qm start 200` or the start button in the - Proxmox GUI. -4. Open the virtual console for your VM using the Proxmox web GUI. - Login username and password are both `vyos`. -5. Once booted into the live system, type `install image` and follow - the prompts to install VyOS to the virtual drive. -6. After installation completes, remove the installation ISO using the - GUI or run `qm set 200 --ide2 none`. -7. Reboot the virtual machine using the GUI or run `qm reboot 200`. - -For more information about downloading and installing Proxmox, visit -<https://www.proxmox.com/en/>. diff --git a/docs/installation/virtual/md-vmware.md b/docs/installation/virtual/md-vmware.md deleted file mode 100644 index 34fb2197..00000000 --- a/docs/installation/virtual/md-vmware.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -lastproofread: '2026-02-02' ---- - -(vyosonvmware)= - -# Running on VMware ESXi - -## ESXi 5.5 or later - -`.ova` files are available for supporting users. You can also set up VyOS -using a generic Linux instance by attaching the bootable ISO file and -installing using the `install image` command. - -:::{NOTE} -Previous issues have been documented with GRE/IPSEC tunneling -using the E1000 adapter on VyOS guests. Use the VMXNET3 adapter instead. -::: - -### Memory Contention Considerations - -When the underlying ESXi host reaches approximately 92% memory utilization, -it begins the balloon process to reclaim memory from guest operating systems. -This creates artificial memory pressure through the `vmmemctl` driver. Because -VyOS does not have a swap file by default, this pressure cannot move memory -data to a paging file. Instead, it consumes memory and forces the guest into -a low memory state with no recovery option. The balloon can expand to 65% of -guest allocated memory, so a VyOS guest using more than 35% of memory can -encounter an out-of-memory situation and trigger the kernel `oom_kill` -process. The `oom_kill` process then terminates memory-hungry processes. - -To prevent ballooning, configure VyOS routers in a resource group with -adequate memory reservations. - -### References - -<https://muralidba.blogspot.com/2018/03/how-does-linux-out-of-memory-oom-killer.html> - diff --git a/docs/introducing/md-about.md b/docs/introducing/md-about.md deleted file mode 100644 index ec4ff30d..00000000 --- a/docs/introducing/md-about.md +++ /dev/null @@ -1,21 +0,0 @@ -(about)= - -# About - -VyOS is an open-source network operating system that provides a single unified -CLI and API to manage routing protocols, firewall and NAT, QoS, load balancing, -DHCP and DNS servers, and many other features. - -VyOS runs on a wide variety of commodity hardware, virtual machines, and -multiple cloud environments. - -We provide a dedicated user guide for each major -VyOS release that receives long-term support (LTS). We maintain multiple user -guide versions, all hosted at <https://docs.vyos.io>. -To switch between versions, select the appropriate version in the bottom-right -corner. - -VyOS CLI syntax may vary between major and sometimes minor releases. Always -refer to the documentation matching your current running installation. If -a change in the CLI is required, VyOS provides a migration script to handle -the syntax adjustments. No user action is required. diff --git a/docs/introducing/md-history.md b/docs/introducing/md-history.md deleted file mode 100644 index 190ee20c..00000000 --- a/docs/introducing/md-history.md +++ /dev/null @@ -1,127 +0,0 @@ -(history)= - -# History - -## In the beginning... - -There was a network operating system based on Debian GNU/Linux, called -Vyatta. :sup:`\*` Introduced in 2006, it served as a great free-software alternative -to proprietary products. Vyatta came in two editions: Vyatta Core -(formerly known as Vyatta Community Edition), which was free software, and -Vyatta Subscription Edition, which included proprietary features and was -available only to paying customers. - -Brocade Communications Systems acquired Vyatta in 2012. Shortly after, Brocade -renamed Vyatta Subscription Edition to Brocade vRouter, discontinued Vyatta -Core, and shut down the community forum without notice. The bug tracker and Git -repositories were closed the following year. - -By the time Brocade acquired Vyatta, the development of Vyatta Core had -already stagnated. The focus had shifted to Vyatta Subscription Edition, -where core components were replaced with proprietary software. As a result, -Vyatta Core received fewer new features, and some of those added faced issues. - -In 2013, shortly after Vyatta Core was discontinued, the community forked its -final version (6.6R1) to create the VyOS project. In 2014, the maintainers -established a company to fund VyOS development through technical support, -consulting services, and LTS release access subscriptions. The company was -originally named Sentrium and was later reorganized under the VyOS brand. - -## Major releases - -VyOS originally named its major versions after elements by atomic number. -Beginning with version 1.2, this naming scheme was changed. It now uses the -Latin names of constellations recognized by the International Astronomical -Union ([IAU](https://en.wikipedia.org/wiki/IAU_designated_constellations_by_area)), -ordered by their solid angle area, beginning with the smallest. - -### Hydrogen (1.0) - -Released just in time for the holidays on 22 December 2013, Hydrogen was -the first major VyOS release. It fixed features that were broken in -Vyatta Core 6.6, such as IPv4 BGP peer groups and DHCPv6 relay, and -introduced command scripting, a task scheduler, and web proxy LDAP -authentication. - -### Helium (1.1) - -Helium, released on 9 October 2014, marked the first anniversary of the -VyOS Project. The release introduced an event handler, L2TPv3 support, -802.1ad (QinQ), and IGMP proxy, as well as experimental support for VXLAN -and DMVPN. Notably, DMVPN remained non-functional in Vyatta Core due to its -reliance on a proprietary NHRP implementation. - -### Crux (1.2) - -Crux (the Southern Cross) was released on 28 January 2019 and marked a -departure from legacy Vyatta codebase and the start of the migration from -Perl to Python as the primary language. The underlying base system was -upgraded from Debian 6 (Squeeze) to Debian 8 (Jessie). - -Crux introduced many new features, some of the most noteworthy are: -an mDNS repeater, a broadcast relay, a high-performance PPPoE server, -an HFSC scheduler, and support for Wireguard, unicast VRRP, RPKI for BGP, -and fully 802.1ad-compliant QinQ ethertype. The telnet server and support -for P2P filtering were removed. - -Crux was the first VyOS release to feature a modular image build system. -CLI definitions were written using an XML syntax automatically checked -against a schema at build time. Python APIs were introduced for command -scripting and configuration migration. New Perl code and old-style (non-XML) -command definition were no longer accepted from that point. - -Crux reached the end of support in 2023. - -### Equuleus (1.3) - -Equuleus (the Little Horse) was a long-term support version released -on 21 December 2021, just in time for the winter holidays. - -Equuleus brought many long-awaited features, most notably an SSTP VPN -server, an IPoE server, an OpenConnect VPN server, and a serial console -server. It also introduced reworked support for WWAN interfaces, support -for GENEVE and MACSec interfaces, VRF, IS-IS routing, and preliminary support -for MPLS and LDP. - -Equuleus reached the end of support in 2025. - -### Sagitta (1.4) - -Sagitta (the Arrow), the current LTS release, became generally available on -4 June 2024. Its development began in late 2021 and focused on eliminating -remaining legacy components and reworking core subsystems. - -The transition to XML-defined command definitions and script refactoring with -separate verify, update, and apply stages were completed. The firewall -subsystem was rebuilt on nftables, introducing interface-independent rulesets -and the reimplemented zone-based firewall model. The PKI subsystem was -redesigned to manage cryptographic material directly within the configuration -file. - -Sagitta introduced rollback without reboot, support for Babel and PIM6 routing -protocols, failover routes, segment routing, NAT64, an IKEv2 remote-access VPN -server, Zabbix monitoring, HTTP load balancing, and configuration -synchronization using the HTTP API. - -The underlying base system was upgraded to Debian 12 (Bookworm). - -### Circinus (1.5) - -Circinus (the Drawing Compass) is the codename for the upcoming development -branch. VyOS 1.5 Circinus has not been released yet. - -## A note on copyright - -Unlike Vyatta, VyOS has never had closed-source code and never will. -The only proprietary material in VyOS is non-code assets, such as -graphics and the trademark "VyOS". :sup:`†` - -Note that we do not provide support for images distributed by a third party. -See the -[artwork license](https://github.com/vyos/vyos-build/blob/current/LICENSE.artwork) -and the end-user license agreement at `/usr/share/vyos/EULA` in -any pre-built image for more information. - -[\*] From the Sanskrit adjective "Vyātta" (व्यात्त), meaning opened. - -[†] This is similar to how Linus Torvalds owns the Linux trademark. diff --git a/docs/md-404.md b/docs/md-404.md deleted file mode 100644 index f5530747..00000000 --- a/docs/md-404.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -orphan: true ---- - -# Page Not Found - -Sorry, we could not find a page. -Try using the search box or go to the release homepage: - -- [1.2.x (crux)](https://docs.vyos.io/en/crux/) -- [1.3.x (equuleus)](https://docs.vyos.io/en/equuleus/) -- [1.4.x (sagitta)](https://docs.vyos.io/en/sagitta/) -- [rolling release (circinus)](https://docs.vyos.io/en/latest/) diff --git a/docs/md-index.md b/docs/md-index.md deleted file mode 100644 index 359fea44..00000000 --- a/docs/md-index.md +++ /dev/null @@ -1,113 +0,0 @@ -(index)= - -# VyOS User Guide - -::::::{grid} 3 -:gutter: 2 - -:::::{grid-item-card} Get / Build VyOS - -Quickly {ref}`Build<contributing/build-vyos:build vyos>` -your own Image or take a look at how to -{ref}`download<installation/install:download>` -a free or supported version. -::::: - -:::::{grid-item-card} Install VyOS - -Read about how to install VyOS on -{ref}`Bare Metal<installation/install:installation>` -or in a {ref}`VM <installation/virtual/index:Virtual Environments>` -and how to use an image with the usual -{ref}`cloud<installation/cloud/index:Cloud Environments>` -providers -::::: - -:::::{grid-item-card} Configuration and Operation - -Use the {ref}`Quickstart Guide<quick-start:Quick Start>`, -to have a fast overview. Or go deeper and set up -{ref}`advanced routing<configuration/protocols/index:protocols>`, -{ref}`VRFs<configuration/vrf/index:vrf>`, or -{ref}`VPNs<configuration/vpn/index:vpn>` for example. -::::: - -:::::{grid-item-card} Automate - -Integrate VyOS in your automation Workflow with -{ref}`Ansible<vyos-ansible>`, -have your own {ref}`local scripts<command-scripting>`, -or configure VyOS with the -{ref}`HTTPS-API<vyosapi>`. -::::: - -:::::{grid-item-card} Examples - -Get some inspiration from the -{ref}`Blueprints <configexamples/index:Configuration Blueprints>` -to build your infrastructure. -::::: - -:::::{grid-item-card} Contribute and Community - -There are many ways to contribute to the project. -Add missing parts or improve the -{ref}`Documentation<documentation:Write Documentation>`. - -Discuss in [Slack](https://slack.vyos.io/) -or the [Forum](https://forum.vyos.io). - -Or you can pick up a [Task](https://vyos.dev/) -and fix the -{ref}`code<contributing/development:development>`. -::::: -:::::: - -```{toctree} -:hidden: true -:maxdepth: 1 - -introducing/about -introducing/history -``` - -```{toctree} -:caption: First Steps -:hidden: true -:maxdepth: 2 - -installation/index -quick-start -cli -``` - -```{toctree} -:caption: Adminguide -:hidden: true -:maxdepth: 2 - -configuration/index -operation/index -automation/index -troubleshooting/index -configexamples/index -vpp/index -``` - -```{toctree} -:caption: Development -:hidden: true -:maxdepth: 2 - -contributing/index -``` - -```{toctree} -:caption: Misc -:hidden: true -:maxdepth: 2 - -documentation -coverage -copyright -``` diff --git a/docs/md-quick-start.md b/docs/md-quick-start.md deleted file mode 100644 index 8fac2f68..00000000 --- a/docs/md-quick-start.md +++ /dev/null @@ -1,369 +0,0 @@ -(quick-start)= - -# Quick Start - -This chapter will guide you on how to get up to speed quickly using your new -VyOS system. It will show you a very basic configuration example that will -provide a {ref}`nat` gateway for a device with two network interfaces -(`eth0` and `eth1`). - -(quick-start-configuration-mode)= - -## Configuration Mode - -By default, VyOS is in operational mode, and the command prompt displays -a `$`. To configure VyOS, you will need to enter configuration mode, resulting -in the command prompt displaying a `#`, as demonstrated below: - -```none -vyos@vyos$ configure -vyos@vyos# -``` - -## Commit and Save - -After every configuration change, you need to apply the changes by using the -following command: - -```none -commit -``` - -Once your configuration works as expected, you can save it permanently by using -the following command: - -```none -save -``` - -## Interface Configuration - -- Your outside/WAN interface will be `eth0`. It will receive its interface - address via DHCP. -- Your internal/LAN interface will be `eth1`. It will use a static IP address - of `192.168.0.1/24`. - -After switching to {ref}`quick-start-configuration-mode` issue the following -commands: - -```none -set interfaces ethernet eth0 address dhcp -set interfaces ethernet eth0 description 'OUTSIDE' -set interfaces ethernet eth1 address '192.168.0.1/24' -set interfaces ethernet eth1 description 'LAN' -``` - -## SSH Management - -After switching to {ref}`quick-start-configuration-mode` issue the following -commands, and your system will listen on every interface for incoming SSH -connections. You might want to check the {ref}`ssh` chapter on how to listen -on specific addresses only. - -```none -set service ssh port '22' -``` - -(dhcp-dns-quick-start)= - -## DHCP/DNS quick-start - -The following settings will configure DHCP and DNS services on -your internal/LAN network, where VyOS will act as the default gateway and -DNS server. - -- The default gateway and DNS recursor address will be `192.168.0.1/24` -- The address range `192.168.0.2/24 - 192.168.0.8/24` will be reserved for - static assignments -- DHCP clients will be assigned IP addresses within the range of - `192.168.0.9 - 192.168.0.254` and have a domain name of `internal-network` -- DHCP leases will hold for one day (86400 seconds) -- VyOS will serve as a full DNS recursor, replacing the need to utilize Google, - Cloudflare, or other public DNS servers (which is good for privacy) -- Only hosts from your internal/LAN network can use the DNS recursor - -```none -set service dhcp-server shared-network-name LAN subnet 192.168.0.0/24 option default-router '192.168.0.1' -set service dhcp-server shared-network-name LAN subnet 192.168.0.0/24 option name-server '192.168.0.1' -set service dhcp-server shared-network-name LAN subnet 192.168.0.0/24 option domain-name 'vyos.net' -set service dhcp-server shared-network-name LAN subnet 192.168.0.0/24 lease '86400' -set service dhcp-server shared-network-name LAN subnet 192.168.0.0/24 range 0 start '192.168.0.9' -set service dhcp-server shared-network-name LAN subnet 192.168.0.0/24 range 0 stop '192.168.0.254' -set service dhcp-server shared-network-name LAN subnet 192.168.0.0/24 subnet-id '1' - -set service dns forwarding cache-size '0' -set service dns forwarding listen-address '192.168.0.1' -set service dns forwarding allow-from '192.168.0.0/24' -``` - -## NAT - -The following settings will configure {ref}`source-nat` rules for our -internal/LAN network, allowing hosts to communicate through the outside/WAN -network via IP masquerade. - -```none -set nat source rule 100 outbound-interface name 'eth0' -set nat source rule 100 source address '192.168.0.0/24' -set nat source rule 100 translation address masquerade -``` - -## Firewall - -A new firewall structure—which uses the `nftables` backend, rather -than `iptables`—is available on all installations starting from -VyOS `1.4-rolling-202308040557`. The firewall supports creation of distinct, -interlinked chains for each [Netfilter hook](https://wiki.nftables.org/wiki-nftables/index.php/Netfilter_hooks) -and allows for more granular control over the packet filtering process. - -The firewall begins with the base `filter` tables you define for each of the -`forward`, `input`, and `output` Netfiter hooks. Each of these tables is -populated with rules that are processed in order and can jump to other chains -for more granular filtering. - -### Configure Firewall Groups - -To make firewall configuration easier, we can create groups of interfaces, -networks, addresses, ports, and domains that describe different parts of -our network. We can then use them for filtering within our firewall rulesets, -allowing for more concise and readable configuration. - -In this case, we will create two interface groups — a `WAN` group for our -interfaces connected to the public internet and a `LAN` group for the -interfaces connected to our internal network. Additionally, we will create a -network group, `NET-INSIDE-v4`, that contains our internal subnet. - -```none -set firewall group interface-group WAN interface eth0 -set firewall group interface-group LAN interface eth1 -set firewall group network-group NET-INSIDE-v4 network '192.168.0.0/24' -``` - -### Configure Stateful Packet Filtering - -With the new firewall structure, we have have a lot of flexibility in how we -group and order our rules, as shown by the three alternative approaches below. - -#### Option 1: Global State Policies - -Using options defined in `set firewall global-options state-policy`, state -policy rules that applies for both IPv4 and IPv6 are created. These global -state policies also applies for all traffic that passes through the router -(transit) and for traffic originated/destinated to/from the router itself, and -will be evaluated before any other rule defined in the firewall. - -Most installations would choose this option, and will contain: - -```none -set firewall global-options state-policy established action accept -set firewall global-options state-policy related action accept -set firewall global-options state-policy invalid action drop -``` - -#### Option 2: Common/Custom Chain - -We can create a common chain for stateful connection filtering of multiple -interfaces (or multiple netfilter hooks on one interface). Those individual -chains can then jump to the common chain for stateful connection filtering, -returning to the original chain for further rule processing if no action is -taken on the packet. - -The chain we will create is called `CONN_FILTER` and has three rules: - -- A default action of `return`, which returns the packet back to the original - chain if no action is taken. -- A rule to `accept` packets from established and related connections. -- A rule to `drop` packets from invalid connections. - -```none -set firewall ipv4 name CONN_FILTER default-action 'return' - -set firewall ipv4 name CONN_FILTER rule 10 action 'accept' -set firewall ipv4 name CONN_FILTER rule 10 state established -set firewall ipv4 name CONN_FILTER rule 10 state related - -set firewall ipv4 name CONN_FILTER rule 20 action 'drop' -set firewall ipv4 name CONN_FILTER rule 20 state invalid -``` - -Then, we can jump to the common chain from both the `forward` and `input` -hooks as the first filtering rule in the respective chains: - -```none -set firewall ipv4 forward filter rule 10 action 'jump' -set firewall ipv4 forward filter rule 10 jump-target CONN_FILTER - -set firewall ipv4 input filter rule 10 action 'jump' -set firewall ipv4 input filter rule 10 jump-target CONN_FILTER -``` - -#### Option 3: Per-Hook Chain - -Alternatively, you can take the more traditional stateful connection -filtering approach by creating rules on each base hook's chain: - -```none -set firewall ipv4 forward filter rule 5 action 'accept' -set firewall ipv4 forward filter rule 5 state established -set firewall ipv4 forward filter rule 5 state related -set firewall ipv4 forward filter rule 10 action 'drop' -set firewall ipv4 forward filter rule 10 state invalid - -set firewall ipv4 input filter rule 5 action 'accept' -set firewall ipv4 input filter rule 5 state established -set firewall ipv4 input filter rule 5 state related -set firewall ipv4 input filter rule 10 action 'drop' -set firewall ipv4 input filter rule 10 state invalid -``` - -### Block Incoming Traffic - -Now that we have configured stateful connection filtering to allow traffic from -established and related connections, we can block all other incoming traffic -addressed to our local network. - -Create a new chain (`OUTSIDE-IN`) which will drop all traffic that is not -explicitly allowed at some point in the chain. Then, we can jump to that chain -from the `forward` hook when traffic is coming from the `WAN` interface -group and is addressed to our local network. - -```none -set firewall ipv4 name OUTSIDE-IN default-action 'drop' - -set firewall ipv4 forward filter rule 100 action jump -set firewall ipv4 forward filter rule 100 jump-target OUTSIDE-IN -set firewall ipv4 forward filter rule 100 inbound-interface group WAN -set firewall ipv4 forward filter rule 100 destination group network-group NET-INSIDE-v4 -``` - -We should also block all traffic destinated to the router itself that isn't -explicitly allowed at some point in the chain for the `input` hook. As -we've already configured stateful packet filtering above, we only need to -set the default action to `drop`: - -```none -set firewall ipv4 input filter default-action 'drop' -``` - -### Allow Management Access - -We can now configure access to the router itself, allowing SSH -access from the inside/LAN network and rate limiting SSH access from the -outside/WAN network. - -First, create a new dedicated chain (`VyOS_MANAGEMENT`) for management -access, which returns to the parent chain if no action is taken. Add a rule -to accept traffic from the `LAN` interface group: - -```none -set firewall ipv4 name VyOS_MANAGEMENT default-action 'return' -``` - -Configure a rule on the `input` hook filter to jump to the `VyOS_MANAGEMENT` -chain when new connections are addressed to port 22 (SSH) on the router itself: - -```none -set firewall ipv4 input filter rule 20 action jump -set firewall ipv4 input filter rule 20 jump-target VyOS_MANAGEMENT -set firewall ipv4 input filter rule 20 destination port 22 -set firewall ipv4 input filter rule 20 protocol tcp -``` - -Finally, configure the `VyOS_MANAGEMENT` chain to accept connection from the -`LAN` interface group while limiting requests coming from the `WAN` -interface group to 4 per minute: - -```none -set firewall ipv4 name VyOS_MANAGEMENT rule 15 action 'accept' -set firewall ipv4 name VyOS_MANAGEMENT rule 15 inbound-interface group 'LAN' - -set firewall ipv4 name VyOS_MANAGEMENT rule 20 action 'drop' -set firewall ipv4 name VyOS_MANAGEMENT rule 20 recent count 4 -set firewall ipv4 name VyOS_MANAGEMENT rule 20 recent time minute -set firewall ipv4 name VyOS_MANAGEMENT rule 20 state new -set firewall ipv4 name VyOS_MANAGEMENT rule 20 inbound-interface group 'WAN' - -set firewall ipv4 name VyOS_MANAGEMENT rule 21 action 'accept' -set firewall ipv4 name VyOS_MANAGEMENT rule 21 state new -set firewall ipv4 name VyOS_MANAGEMENT rule 21 inbound-interface group 'WAN' -``` - -### Allow Access to Services - -Here we're allowing the router to respond to pings. Then, we can allow access to -the DNS recursor we configured earlier, accepting traffic bound for port 53 from -all hosts on the `NET-INSIDE-v4` network: - -```none -set firewall ipv4 input filter rule 30 action 'accept' -set firewall ipv4 input filter rule 30 icmp type-name 'echo-request' -set firewall ipv4 input filter rule 30 protocol 'icmp' -set firewall ipv4 input filter rule 30 state new - -set firewall ipv4 input filter rule 40 action 'accept' -set firewall ipv4 input filter rule 40 destination port '53' -set firewall ipv4 input filter rule 40 protocol 'tcp_udp' -set firewall ipv4 input filter rule 40 source group network-group NET-INSIDE-v4 -``` - -Finally, we can now configure access to the services running on this router, -allowing all connections coming from localhost: - -```none -set firewall ipv4 input filter rule 50 action 'accept' -set firewall ipv4 input filter rule 50 source address 127.0.0.0/8 -``` - -Commit changes, save the configuration, and exit configuration mode: - -```none -vyos@vyos# commit -vyos@vyos# save -Saving configuration to '/config/config.boot'... -Done -vyos@vyos# exit -vyos@vyos$ -``` - -## Hardening - -Especially if you are allowing SSH remote access from the outside/WAN -interface, there are a few additional configuration steps that should be taken. - -Replace the default `vyos` system user: - -```none -set system login user myvyosuser authentication plaintext-password mysecurepassword -``` - -Set up {ref}`ssh_key_based_authentication`: - -```none -set system login user myvyosuser authentication public-keys myusername@mydesktop type ssh-rsa -set system login user myvyosuser authentication public-keys myusername@mydesktop key contents_of_id_rsa.pub -``` - -Finally, try and SSH into the VyOS install as your new user. Once you have -confirmed that your new user can access your router without a password, delete -the original `vyos` user and completely disable password authentication for -{ref}`ssh`: - -```none -delete system login user vyos -set service ssh disable-password-authentication -``` - -As above, commit your changes, save the configuration, and exit -configuration mode: - -```none -vyos@vyos# commit -vyos@vyos# save -Saving configuration to '/config/config.boot'... -Done -vyos@vyos# exit -vyos@vyos$ -``` - -You now should have a simple yet secure and functioning router to experiment -with further. Enjoy! diff --git a/docs/operation/md-boot-options.md b/docs/operation/md-boot-options.md deleted file mode 100644 index e686bd3c..00000000 --- a/docs/operation/md-boot-options.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -lastproofread: '2025-11-14' ---- - -(boot-options)= - -# Boot Options - -:::{warning} -This function can disrupt services. -Run it only when necessary, and verify all input values before proceeding. -::: - -VyOS provides several kernel command-line options to modify the normal boot -process. -To add an option, select the desired image in the GRUB menu at load time. -Type **e** to edit the first line, then type **Ctrl+X** to boot. - -```{image} /_static/images/boot-options.png -:align: center -:width: 80% -``` - -## Specify custom config file -You can use a configuration file instead of the default `/config/config.boot` -file. If the specified file doesn't exist or isn't readable, the system uses the -default configuration file. No additional verification is performed, so specify -a valid configuration file. - -```none -vyos-config=/path/to/file -``` - -To load the *factory default* configuration, use: - -```none -vyos-config=/opt/vyatta/etc/config.boot.default -``` - -## Disable specific boot process steps - -These options disable certain steps in the boot process. Understand the -{ref}`boot process <boot-steps>` before using them. - -:::{glossary} -no-vyos-migrate - Do not perform config migration. - -no-vyos-firewall - Do not initialize default firewall chains, renders any firewall - configuration unusable. -::: diff --git a/docs/operation/md-index.md b/docs/operation/md-index.md deleted file mode 100644 index b3c02571..00000000 --- a/docs/operation/md-index.md +++ /dev/null @@ -1,12 +0,0 @@ -# Operation Mode - -```{toctree} -:includehidden: true -:maxdepth: 1 - -information -boot-options -upgrade-recovery -password-recovery -raid -``` diff --git a/docs/operation/md-password-recovery.md b/docs/operation/md-password-recovery.md deleted file mode 100644 index c828fb27..00000000 --- a/docs/operation/md-password-recovery.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -lastproofread: '2026-02-04' ---- - -(password-recovery)= - -# Password Recovery - -Restart VyOS from the console. The GRUB menu appears. -Select **Boot options**. - -:::{figure} /_static/images/reset-password-step-1.jpg -:width: 600 -::: - -Next, select **Select boot mode**. - -:::{figure} /_static/images/reset-password-step-2.jpg -:width: 600 -::: - -Select **Password reset**. - -:::{figure} /_static/images/reset-password-step-3.jpg -:width: 600 -::: - -Boot the desired VyOS version. - -:::{figure} /_static/images/reset-password-step-4.jpg -:width: 600 -::: - -The standalone user password recovery tool runs and prompts you to reset the -local system user password. VyOS automatically reboots after you reset your -password. - -```console -Do you wish to reset the admin password? (y or n) -y -Which admin account do you want to reset?[vyos] -my_username -Enter my_username password: -Retype my_username password: -System will reboot in 10 seconds... -``` diff --git a/docs/operation/md-raid.md b/docs/operation/md-raid.md deleted file mode 100644 index c4160a64..00000000 --- a/docs/operation/md-raid.md +++ /dev/null @@ -1,236 +0,0 @@ ---- -lastproofread: '2025-11-20' ---- - -(raid)= - -# RAID 1 - -A Redundant Array of Independent Disks (RAID) uses two or more hard disk drives -to improve disk speed, store more data, and/or provide fault tolerance. -There are several storage schemes possible in a RAID array, each offering a -different combination of storage, reliability, and performance. -VyOS supports **RAID 1** deployments. RAID 1 uses two or more -disks that mirror one another to provide system fault tolerance. In a RAID 1 -configuration, every sector on one disk is duplicated on every sector of all -disks in the array. Provided even one disk in the RAID 1 set is operational, -the system continues to run, even through disk replacement (provided that the -hardware supports in-service replacement of drives). -RAID 1 can be implemented using special hardware or it can be implemented in -software. VyOS supports software RAID 1 on two disks. -The VyOS implementation of RAID 1 features the following: - -- Detection and reporting of disk failure. -- Maintain system operation with one failed disk. -- Boot the system with one failed disk. -- Replace a failed disk and initiate re-mirroring. -- Monitor the status of re-mirroring. - -(raid-installation)= - -## Installation implications - -The VyOS installation utility provides several options for installing -to a RAID 1 set. You can: - -- Use the install system to create the RAID 1 set. -- Use the built-in Linux commands to create a RAID 1 set before running the - install system command. -- Use a previously-created RAID 1 set. - -:::{note} -Before a permanent installation, VyOS runs a live installation. -::: - -## Configuration - -### Standard installation on a single disk - -VyOS automatically detects the presence of two or more -disks that are not currently part of a RAID array when installed. The VyOS -installation utility automatically offers you the option to configure RAID 1 -mirroring for eligible drives with the following prompt: - -```none -Would you like to configure RAID 1 mirroring on them? -``` - -- If you do not want to configure RAID 1 mirroring, enter **No** at the prompt. - -### Empty 2+ disk - -If VyOS detects two identical disks that are not currently part of a -RAID 1 set, the VyOS installation utility automatically offers the option -to configure RAID 1 mirroring for the drives with the following prompt: - -```none -Would you like to configure RAID 1 mirroring on them? -``` - -1\. To create a new RAID 1 array, enter **Yes** at the prompt. If VyOS -detects a filesystem on the partitions being used for RAID 1, it will prompt you -to indicate whether you want to continue creating the RAID 1 array. - -```none -Continue creating array? -``` - -2. To overwrite the old filesystem, enter **Yes**. - -3\. The system informs you that all data on both drives will be erased. -Confirm you want to continue. - -```none -Are you sure you want to do this? -``` - -4\. Enter **Yes** at the prompt to retain the current VyOS configuration. -Enter **No** to delete the current VyOS configuration. - -```none -Would you like me to save the data on it before I delete it? -``` - -5\. Enter **Yes** at the prompt to retain the current VyOS configuration. -Enter **No** to delete the current VyOS configuration. - -6. Continue installing VyOS. - -### Preexisting RAID 1 configuration - -When VyOS detects a previously configured RAID 1 set, -the installation utility displays the following prompt: - -```none -Would you like to use this one? -``` - -1\. To break up the current RAID 1 set, enter **No** at the prompt. The -installation utility detects that there are two identical disks and offers you -the option of configuring RAID 1 mirroring with the following -prompt: - -```none -Would you like to configure RAID 1 mirroring on them? -``` - -2\. To decline to set up a new RAID 1 configuration on the disks, enter **No** -at the prompt. VyOS prompts you to indicate which partition you would -like the system installed on. - -```none -Which partition should I install the root on? [sda1]: -``` - -3\. Enter the partition where you would like the system installed. The system -then prompts you to indicate whether you want to save the old configuration -data. This represents the current VyOS configuration. - -```none -Would you like me to save the data on it before I delete it? -``` - -4\. Enter **Yes** at the prompt to retain the current VyOS configuration once -installation is complete. Enter **No** to delete the current VyOS configuration. - -5. Continue installing VyOS. - -### Detecting and replacing a failed RAID 1 disk - -VyOS system detects disk failures within a RAID 1 set and -reports them to the system console. You can verify the failure by running the -`show raid` command. - -To replace a bad disk within a RAID 1 set: - -1. Remove the failed disk from the RAID 1 set: - - ```{opcmd} delete raid \<RAID‐1‐device\> member \<disk‐partition\> - ``` - where `RAID-1-device` is the name of the RAID 1 device. For example, - `md0` and - `disk-partition` is the name of the failed disk partition. For example, - `sdb2`. -2. Physically remove the failed disk from the system. If the drives are not - hot-swappable, then you must shut down the system before removing the disk. -3. Replace the failed drive with a drive of the same size or larger. -4. Format the new disk for RAID 1 by running the following command: - - ```{opcmd} format disk \<disk‐device1\> like \<disk‐device2\> - ``` - where `disk-device1` is the replacement disk. For example, `sdb` and - `disk-device2` is the existing healthy disk. For example, `sda`. - -5. Add the replacement disk to the RAID 1 set by running the following command: - - ```{opcmd} add raid \<RAID‐1‐device\> member \<disk‐partition\> - ``` - where `RAID-1-device` is the name of the RAID 1 device. For example, - `md0` and `disk-partition` is the name of the replacement disk partition. - For example, `sdb2`. - -## Operation -Learn how to add a disk partition to a RAID 1 set, initiate -mirror synchronization, and check and display information. -```{opcmd} add raid \<RAID‐1‐device\> member \<disk‐partition\> - - Use this command to add a member disk partition to the RAID 1 set. Adding a - disk partition to a RAID 1 set initiates mirror synchronization, where all - data on the existing member partition is copied to the new partition. - -``` - -```{opcmd} format disk \<disk‐device1\> like \<disk‐device2\> - -This command is typically used to prepare a disk to be added to a preexisting -RAID 1 set (of which ``disk-device2`` is already a member). -``` - -```{opcmd} show raid \<RAID‐1‐device\> - -shows output for ``show raid md0`` as ``sdb1`` is being added to the RAID 1 -set and is in the process of being resynchronized. - - -:::{code-block} none -vyos@vyos:~$ show raid md0 -/dev/md0: - Version : 00.90 -Creation Time : Wed Oct 29 09:19:09 2008 - Raid Level : raid1 - Array Size : 1044800 (1020.48 MiB 1069.88 MB) -Used Dev Size : 1044800 (1020.48 MiB 1069.88 MB) - Raid Devices : 2 -Total Devices : 2 -Preferred Minor : 0 - Persistence : Superblock is persistent - Update Time : Wed Oct 29 19:34:23 2008 - State : active, degraded, recovering -Active Devices : 1 -Working Devices : 2 -Failed Devices : 0 -Spare Devices : 1 -Rebuild Status : 17% complete - UUID : 981abd77:9f8c8dd8:fdbf4de4:3436c70f - Events : 0.103 - Number Major Minor RaidDevice State - 0 8 1 0 active sync /dev/sda1 - 2 8 17 1 spare rebuilding /dev/sdb1 -::: -``` - -```{opcmd} show disk sda format - -Use this command to display the formatting of a hard disk. - - -:::{code-block} none -vyos@vyos:~$ show disk sda format -Disk /dev/sda: 1073 MB, 1073741824 bytes -85 heads, 9 sectors/track, 2741 cylinders -Units = cylinders of 765 * 512 = 391680 bytes -Disk identifier: 0x000b7179 -Device Boot Start End Blocks Id System -/dev/sda1 6 2737 1044922+ fd Linux raid autodetect -::: -```
\ No newline at end of file diff --git a/docs/operation/md-upgrade-recovery.md b/docs/operation/md-upgrade-recovery.md deleted file mode 100644 index a8754d3b..00000000 --- a/docs/operation/md-upgrade-recovery.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -lastproofread: '2025-11-20' ---- - -(upgrade-recovery)= - -# Recovery after Failed Upgrades - -Use **VyOS upgrade recovery** to restore the system to the last working -version after a failed upgrade. - -- {ref}`Configuration: <configuration>` How to enable upgrade recovery -- {ref}`How it works: <how-it-works>` Overview of the recovery process -- {ref}`Cancelling recovery: <cancelling-recovery>` Overview of the recovery - process - -(configuration)= - -## Configuration - -:::{warning} -Upgrade recovery is disabled by default. To use it, -**enable it first**. -::: - -To enable upgrade recovery, run the following command: - -```{cfgcmd} set system option reboot-on-upgrade-failure [timeout \<min\>] -``` - -- `timeout <min>:` The time in minutes (5 - 30) to cancel upgrade - recovery before VyOS reboots. - See {ref}`Cancelling Recovery <cancelling-recovery>`. -(how-it-works)= - -## How it works -After a VyOS upgrade, the system monitors the boot process. Upon detecting a -boot failure, VyOS initiates a revert to the last working version and displays -the following warning: -```none -Booting failed, reverting to previous image -Automatic reboot in xx minutes -Use "reboot cancel" to cancel -``` -If no action is taken, the reboot happens automatically after the configured -timeout. Upon successful recovery and reboot, the following message appears: -```none -WARNING: Image update to "VyOS 1.5.xxxx" failed -Please check the logs: -/usr/lib/live/mount/persistence/boot/NAME/rw/var/log -Message is cleared on next reboot! -``` -(cancelling-recovery)= - -## Cancelling recovery -Upon detecting a boot failure, you have the predefined timeout to cancel -upgrade recovery. This is useful if you want to troubleshoot the faulty VyOS -version on your own. - -To cancel upgrade recovery, run the following command: -```none -reboot cancel -``` diff --git a/docs/troubleshooting/md-index.md b/docs/troubleshooting/md-index.md deleted file mode 100644 index 31dbd87b..00000000 --- a/docs/troubleshooting/md-index.md +++ /dev/null @@ -1,17 +0,0 @@ -(troubleshooting)= - -# Troubleshooting - -Sometimes things break or don't work as expected. This section describes -several troubleshooting tools provided by VyOS that can help when something -goes wrong. - -```{toctree} -:maxdepth: 1 - -connectivity -interfaces -monitoring -terminal -system -``` diff --git a/docs/troubleshooting/md-interfaces.md b/docs/troubleshooting/md-interfaces.md deleted file mode 100644 index 553cbf90..00000000 --- a/docs/troubleshooting/md-interfaces.md +++ /dev/null @@ -1,36 +0,0 @@ -# Interface Names - -If you find the names of your interfaces have changed, this could be because -your MAC addresses have changed. - -- For example, you have a VyOS VM with 4 Ethernet interfaces named - eth0, eth1, eth2 and eth3. Then, you migrate your VyOS VM to a different - host and find your interfaces now are eth4, eth5, eth6 and eth7. - - One way to fix this issue **taking control of the MAC addresses** is: - - Log into VyOS and run this command to display your interface settings. - - ```none - show interfaces detail - ``` - - Take note of MAC addresses. - - Now, in order to update a MAC address in the configuration, run this command - specifying the interface name and MAC address you want. - - ```none - set interfaces ethernet eth0 hw-id 00:0c:29:da:a4:fe - ``` - - If it is a VM, go into the settings of the host and set the MAC address to - the settings found in the config.boot file. You can also set the MAC to - static if the host allows so. - -- Another example could be when cloning VyOS VMs in GNS3 and you get into the - same issue: interface names have changed. - - And **a more generic way to fix it** is just deleting every MAC address at - the configuration file of the cloned machine. They will be correctly - regenerated automatically. diff --git a/docs/troubleshooting/md-monitoring.md b/docs/troubleshooting/md-monitoring.md deleted file mode 100644 index 4016a949..00000000 --- a/docs/troubleshooting/md-monitoring.md +++ /dev/null @@ -1,148 +0,0 @@ -# Monitoring - -VyOS features several monitoring tools. - -```none -vyos@vyos:~$ monitor -Possible completions: - bandwidth Monitor interface bandwidth in real time - bandwidth-test - Initiate or wait for bandwidth test - cluster Monitor clustering service - command Monitor an operational mode command (refreshes every 2 seconds) - conntrack-sync - Monitor conntrack-sync - content-inspection - Monitor Content-Inspection - dhcp Monitor Dynamic Host Control Protocol (DHCP) - dns Monitor a Domain Name Service (DNS) daemon - firewall Monitor Firewall - https Monitor the Secure Hypertext Transfer Protocol (HTTPS) service - lldp Monitor Link Layer Discovery Protocol (LLDP) daemon - log Monitor last lines of messages file - nat Monitor network address translation (NAT) - ndp Monitor the NDP information received by the router through the device - openvpn Monitor OpenVPN - protocol Monitor routing protocols - snmp Monitor Simple Network Management Protocol (SNMP) daemon - stop-all Stop all current background monitoring processes - traceroute Monitor the path to a destination in realtime - traffic Monitor traffic dumps - vpn Monitor VPN - vrrp Monitor Virtual Router Redundancy Protocol (VRRP) - webproxy Monitor Webproxy service -``` - -## Traffic Dumps - -To monitor interface traffic, issue the {code}`monitor traffic interface <name>` -command, replacing `<name>` with your chosen interface. - -```none -vyos@vyos:~$ monitor traffic interface eth0 -tcpdump: verbose output suppressed, use -v or -vv for full protocol decode -listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes -15:54:28.581601 IP 192.168.0.1 > vyos: ICMP echo request, id 1870, seq 3848, length 64 -15:54:28.581660 IP vyos > 192.168.0.1: ICMP echo reply, id 1870, seq 3848, length 64 -15:54:29.583399 IP 192.168.0.1 > vyos: ICMP echo request, id 1870, seq 3849, length 64 -15:54:29.583454 IP vyos > 192.168.0.1: ICMP echo reply, id 1870, seq 3849, length 64 -^C -4 packets captured -4 packets received by filter -0 packets dropped by kernel -vyos@vyos:~$ -``` - -To quit monitoring, press {kbd}`Ctrl-C` and you'll be returned to the VyOS command -prompt. - -Traffic can be filtered and saved. - -```none -vyos@vyos:~$ monitor traffic interface eth0 -Possible completions: - <Enter> Execute the current command - filter Monitor traffic matching filter conditions - save Save traffic dump from an interface to a file -``` - -## Interface Bandwidth Usage - -To quickly view the bandwidth usage of an interface, use the `monitor bandwidth` command: - -```none -vyos@vyos:~$ monitor bandwidth interface eth0 -``` - -This shows the following: - -```none - B (RX Bytes/second) -198.00 .|....|..................................................... -165.00 .|....|..................................................... -132.00 ||..|.|..................................................... - 99.00 ||..|.|..................................................... - 66.00 |||||||..................................................... - 33.00 |||||||..................................................... - 1 5 10 15 20 25 30 35 40 45 50 55 60 - - KiB (TX Bytes/second) - 3.67 ......|..................................................... - 3.06 ......|..................................................... - 2.45 ......|..................................................... - 1.84 ......|..................................................... - 1.22 ......|..................................................... - 0.61 :::::||..................................................... - 1 5 10 15 20 25 30 35 40 45 50 55 60 -``` - -## Interface Performance - -To take a look on the network bandwidth between two nodes, the `monitor -bandwidth-test` command is used to run iperf. - -```none -vyos@vyos:~$ monitor bandwidth-test -Possible completions: - accept Wait for bandwidth test connections (port TCP/5001) - initiate Initiate a bandwidth test -``` - -- The `accept` command opens a listening iperf server on TCP Port 5001 -- The `initiate` command connects to that server to perform the test. - -```none -vyos@vyos:~$ monitor bandwidth-test initiate -Possible completions: - <hostname> Initiate a bandwidth test to specified host (port TCP/5001) - <x.x.x.x> - <h:h:h:h:h:h:h:h> -``` - -## Monitor command - -The `monitor command` command allows you to repeatedly run a command to view -a continuously refreshed output. The command is run and output every 2 seconds, -allowing you to monitor the output continuously without having to re-run the -command. This can be useful to follow routing adjacency formation. - -```none -vyos@router:~$ monitor command "show interfaces" -``` - -Will clear the screen and show you the output of `show interfaces` every -2 seconds. - -```none -Every 2.0s: /opt/vyatta/bin/vyatta-op-cmd-wrapper Sun Mar 26 02:49:46 2019 - -Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down -Interface IP Address S/L Description ---------- ---------- --- ----------- -eth0 192.168.1.1/24 u/u -eth0.5 198.51.100.4/24 u/u WAN -lo 127.0.0.1/8 u/u - ::1/128 -vti0 172.25.254.2/30 u/u -vti1 172.25.254.9/30 u/u -``` diff --git a/docs/troubleshooting/md-system.md b/docs/troubleshooting/md-system.md deleted file mode 100644 index e855e385..00000000 --- a/docs/troubleshooting/md-system.md +++ /dev/null @@ -1,48 +0,0 @@ -# System Information - -(boot-steps)= - -## Boot Steps - -VyOS 1.2 uses [Debian Jessie] as the base Linux operating system. Jessie was -the first version of Debian that uses [systemd] as the default init system. - -These are the boot steps for VyOS 1.2 - -1. The BIOS loads Grub (or isolinux for the Live CD) -2. Grub then starts the Linux boot and loads the Linux Kernel `/boot/vmlinuz` -3. Kernel Launches Systemd `/lib/systemd/systemd` -4. Systemd loads the VyOS service file - `/lib/systemd/system/vyos-router.service` -5. The service file launches the VyOS router init script - `/usr/libexec/vyos/init/vyos-router` - this is part of the [vyatta-cfg] - Debian package - -> 1. Starts [FRR] - successor to [GNU Zebra] and [Quagga] -> 2. Initialises the boot configuration file - copies over -> `config.boot.default` if there is no configuration -> 3. Runs the configuration migration, if the configuration is for an older -> version of VyOS -> 4. Runs The pre-config script, if there is one -> `/config/scripts/vyos-preconfig-bootup.script` -> 5. If the config file was upgraded, runs any post upgrade scripts -> `/config/scripts/post-upgrade.d` -> 6. Starts `rl-system` and `firewall` -> 7. Mounts the `/boot` partition -> 8. The boot configuration file is then applied by `/opt/vyatta/sbin/vyatta-boot-config-loader/opt/vyatta/etc/config/config.boot` -> -> > 1. The config loader script writes log entries to -> > `/var/log/vyatta-config-loader.log` -> -> 09. Runs `telinit q` to tell the init system to reload `/etc/inittab` -> 10. Finally it runs the post-config script -> `/config/scripts/vyos-postconfig-bootup.script` - -[debian jessie]: https://www.debian.org/releases/jessie/ -[frr]: https://frrouting.org/ -[gnu zebra]: https://www.gnu.org/software/zebra/ -[pcap filter expressions]: http://www.tcpdump.org/manpages/pcap-filter.7.html -[quagga]: https://www.quagga.net/ -[systemd]: https://freedesktop.org/wiki/Software/systemd/ -[tshark]: https://www.wireshark.org/docs/man-pages/tshark.html -[vyatta-cfg]: https://github.com/vyos/vyatta-cfg diff --git a/docs/troubleshooting/md-terminal.md b/docs/troubleshooting/md-terminal.md deleted file mode 100644 index 0d421972..00000000 --- a/docs/troubleshooting/md-terminal.md +++ /dev/null @@ -1,39 +0,0 @@ -# Terminal/Console - -Sometimes you need to clear counters or statistics to troubleshoot better. - -To do this use the `clear` command in Operational mode. - -to clear the console output - -```none -vyos@vyos:~$ clear console -``` - -to clear interface counters - -```none -# clear all interfaces -vyos@vyos:~$ clear interface ethernet counters -# clear specific interface -vyos@vyos:~$ clear interface ethernet eth0 counters -``` - -The command follows the same logic as the `set` command in configuration mode. - -```none -# clear all counters of an interface type -vyos@vyos:~$ clear interface <interface_type> counters -# clear counter of an interface in interface_type -vyos@vyos:~$ clear interface <interface_type> <interface_name> counters -``` - -to clear counters on firewall rulesets or single rules - -```none -vyos@vyos:~$ clear firewall name <ipv4 ruleset name> counters -vyos@vyos:~$ clear firewall name <ipv4 ruleset name> rule <rule#> counters - -vyos@vyos:~$ clear firewall ipv6-name <ipv6 ruleset name> counters -vyos@vyos:~$ clear firewall ipv6-name <ipv6 ruleset name> rule <rule#> counters -``` diff --git a/docs/vpp/configuration/dataplane/md-buffers.md b/docs/vpp/configuration/dataplane/md-buffers.md deleted file mode 100644 index e9bddec9..00000000 --- a/docs/vpp/configuration/dataplane/md-buffers.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -lastproofread: '2026-02-23' ---- - -(vpp-config-dataplane-buffers)= - -```{include} /_include/need_improvement.txt -``` - -# VPP Dataplane Buffers Configuration - -Buffers are essential for handling network packets efficiently. Proper -configuration enhances performance and reliability, and is mandatory for -VPP to work. Buffers temporarily store packets during processing. Therefore, -their configuration must be in sync with NIC configuration, CPU threads, and -overall system resources. - -:::{important} -VPP buffers are allocated from the physical memory pool (`physmem`). The -total amount of memory available for buffer allocation is controlled by the -`physmem-max-size` setting, while the buffer configuration parameters -below control how that memory is used for buffer allocation. - -See {ref}`VPP Physical Memory Configuration <vpp-config-dataplane-physmem>` -for details on configuring `physmem`. -::: - -## Buffer Configuration Parameters - -The following parameters can be configured for VPP buffers: - -### buffers-per-numa -Number of buffers allocated per NUMA node. This setting optimizes -memory access patterns for multi-CPU systems. - -Typically, you need to tune this value if: -- The system has many interfaces -- NICs have many queues -- NICs have large descriptor sizes - -Set this value carefully to balance memory usage and performance. -```{cfgcmd} set vpp settings resource-allocation buffers buffers-per-numa \<value\> -``` -The common approach for the calculation is to use the formula: -```none -buffers-per-numa = (num-rx-queues * num-rx-desc) + (num-tx-queues * num-tx-desc) -``` -Calculate this formula for each NIC and sum the results. Multiply the -total by 2.5 to get the minimum recommended value for -`buffers-per-numa`. - -Avoid setting this value too low to prevent packet drops. - -### data-size -This value sets how much payload data can be stored in a single buffer -allocated by VPP. Larger values reduce buffer chains for large packets, -while smaller values conserve memory for environments handling mostly -small packets. -```{cfgcmd} set vpp settings resource-allocation buffers data-size \<value\> -``` -Optimal size depends on the typical packet size in your network. If -unsure, use the largest MTU in your network plus overhead (for example, -128 bytes). - -### page-size -A memory pages type used for buffer allocation. Common values are 4K, 2M, or 1G. - -Use page sizes configured in your system settings. -```{cfgcmd} set vpp settings resource-allocation buffers page-size \<value\> -``` - -## Potential Issues and Troubleshooting - -Improper buffer configuration can lead to issues such as: - -- Increased latency and packet loss -- Inefficient CPU utilization -- Interface initialization failures - -Indicators of such issues are: - -- Errors during interfaces initialization in VPP logs -- Packet drops observed in VPP statistics - -To troubleshoot buffer-related issues, consider the following steps: - -- Review VPP logs for errors related to buffer allocation. Look for - error `-5` messages. -- Tune available buffers by adjusting the `buffers-per-numa` and - `data-size` parameters. diff --git a/docs/vpp/configuration/dataplane/md-cpu.md b/docs/vpp/configuration/dataplane/md-cpu.md deleted file mode 100644 index 9b798631..00000000 --- a/docs/vpp/configuration/dataplane/md-cpu.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -lastproofread: '2026-02-23' ---- - -(vpp-config-dataplane-cpu)= - -```{include} /_include/need_improvement.txt -``` - -# VPP Dataplane CPU Configuration -VPP can utilize multiple CPU cores for better packet processing -performance. Proper CPU configuration is essential for optimal -throughput and low latency. - -VPP CPU assignment is handled automatically. You specify how many CPU -cores VPP may use, and the system distributes them between the main -thread and worker threads. - -:::{important} -Review the system configuration settings page before changing CPU -settings: {doc}`system`. -::: -If you don't configure CPU settings, VPP uses a single core for the -main thread and doesn't create worker threads. - -## CPU Configuration Parameters - -### `cpu-cores` -This parameter defines the total number of CPU cores allocated to VPP. -```{cfgcmd} set vpp settings resource-allocation cpu-cores \<core-number\> -``` - -The system automatically assigns cores using the following rules: - -> - The first two CPU cores are always reserved for the operating system and -> other services. -> - The main VPP thread is assigned to the first available core after the -> reserved ones. -> - The remaining allocated cores are used for worker threads. - -For example: - -> - If cpu-cores is set to 1, VPP runs only a main thread. -> -> - If cpu-cores is set to 4, VPP uses: -> -> > - 1 core for the main thread -> > - 3 cores for worker threads - -Choose a value based on available hardware resources and expected -traffic load. Too few cores may limit performance, while too many can -negatively impact other system services. - -## Potential Issues and Troubleshooting - -Improper CPU configuration can lead to issues such as: - -- VPP underperformance when not enough cores are assigned, or kernel - underperformance when too many cores are assigned to VPP. -- Resource conflicts with other processes and services. - -Indicators of such issues are: - -- VPP or kernel forwarding performance is lower than expected -- Degraded performance of system components or services, such as DNS, - DHCP, and dynamic routing diff --git a/docs/vpp/configuration/dataplane/md-index.md b/docs/vpp/configuration/dataplane/md-index.md deleted file mode 100644 index f147ebe8..00000000 --- a/docs/vpp/configuration/dataplane/md-index.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -lastproofread: '2026-02-23' ---- - -(vpp-config-dataplane-index)= - -```{include} /_include/need_improvement.txt -``` -# VPP Dataplane Core Configuration -This section covers the core configuration options for the VPP dataplane in -VyOS. It includes settings for memory management, CPU allocation, hugepages, -and other essential parameters that influence the performance and behavior -of the VPP dataplane. -Please review the general system configuration, before starting to configure -VPP. Without proper VyOS preconditions, VPP will not start or its efficiency -will be significantly degraded. -```{toctree} -:includehidden: true -:maxdepth: 1 - -system -buffers -cpu -interface -ipsec -ipv6 -l2learn -lcp -logging -memory -unix -``` diff --git a/docs/vpp/configuration/dataplane/md-interface.md b/docs/vpp/configuration/dataplane/md-interface.md deleted file mode 100644 index 231a49a9..00000000 --- a/docs/vpp/configuration/dataplane/md-interface.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -lastproofread: '2026-02-23' ---- - -(vpp-config-dataplane-interface)= - -```{include} /_include/need_improvement.txt -``` - -# VPP Dataplane Interfaces Configuration -Only Ethernet interfaces (physical or virtual) can be connected to the -VPP dataplane. Interfaces configured here act as a bridge between VPP -and the outside world, allowing VPP to send and receive network -packets. - -## Interface Configuration Parameters -Interfaces connected to the VPP dataplane use the DPDK driver by default, -providing high performance and low latency. -```{cfgcmd} set vpp settings interface \<interface-name\> -``` -Some network interface cards (NICs) may not be compatible with the DPDK driver. - -### DPDK interface options -This section shows how to configures DPDK-specific settings for an interface. -```{cfgcmd} set vpp settings interface \<interface-name\> num-rx-queues \<value\> -``` -Specifies the number of receive queues for the interface. More queues -improve performance on multi-core systems by allowing parallel -processing of incoming packets. Each queue is assigned to a separate -CPU core. -```{cfgcmd} set vpp settings interface \<interface-name\> num-tx-queues \<value\> -``` -Specifies the number of transmit queues for the interface. Similar to -receive queues, more transmit queues improve performance by enabling -parallel processing of outgoing packets. By default, the VPP Dataplane -has one TX queue per enabled CPU worker, or a single queue if no -workers are configured. - -:::{seealso} -{doc}`cpu` -::: -```{cfgcmd} set vpp settings interface \<interface-name\> num-rx-desc \<value\> -``` -Defines the size of each receive queue. Larger queue sizes accommodate -bursts of incoming traffic and reduce the likelihood of packet drops -during high traffic periods. -```{cfgcmd} set vpp settings interface \<interface-name\> num-tx-desc \<value\> -``` -Defines the size of each transmit queue. Larger sizes help manage -bursts of outgoing traffic more effectively. - -## Global Interface Parameters -(vpp-config-dataplane-interface-rx-mode)= - -### interface-rx-mode -The `interface-rx-mode` parameter defines how VPP handles incoming -packets on interfaces. There are several modes available, each with its -own advantages and use cases: -- `interrupt`: In this mode, VPP relies on hardware interrupts to - notify it of incoming packets. This mode suits low to moderate - traffic loads and reduces CPU usage during idle periods. It is not - recommended for low-latency processing. Some NICs may not support - this mode. -- `polling`: In polling mode, VPP continuously checks the interface - for incoming packets. This mode is ideal for high-throughput - scenarios where low latency is critical, as it minimizes packet - waiting time. However, it can increase CPU usage, especially during - low traffic periods, as the polling process is always active. -- `adaptive`: Adaptive mode combines the benefits of interrupt and - polling modes. VPP starts in interrupt mode and switches to polling - mode when traffic load increases. -```{cfgcmd} set vpp settings interface-rx-mode \<mode\> -``` - -Choose an rx-mode based on expected traffic patterns and performance -requirements of your network. - -## Potential Issues and Troubleshooting - -Improper interface configuration can lead to issues such as: - -- Failure to initialize the interface -- Poor performance due to suboptimal driver selection or settings - -Indicators of such issues are: - -- Failed commits after adding or modifying an interface settings -- Low throughput or high latency on the interface diff --git a/docs/vpp/configuration/dataplane/md-ipsec.md b/docs/vpp/configuration/dataplane/md-ipsec.md deleted file mode 100644 index 17e16f8e..00000000 --- a/docs/vpp/configuration/dataplane/md-ipsec.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -lastproofread: '2026-02-23' ---- - -(vpp-config-dataplane-ipsec)= - -```{include} /_include/need_improvement.txt -``` - -# VPP IPsec Configuration -VPP supports IPsec (Internet Protocol Security) offloading from the -kernel, which speeds up cryptographic operations by leveraging VPP's -high-performance packet processing capabilities. - -IPsec does not require any specific configuration on VPP side. If both -sources and destinations of the IPsec traffic are reachable via VPP -interfaces, VPP will automatically offload the IPsec processing from -the kernel. IPsec tunnels are configured in the VPN configuration -section, see {ref}`ipsec_general`. - -## IPsec Configuration Parameters - -### enable IPsec acceleration -When VPP is used for offloading IPsec, it creates a virtual interface to -connect to peers. The interface type is always 'ipsec', which is used for -IPsec tunnels. -```{cfgcmd} set vpp settings ipsec-acceleration -``` -Enabling this option allows VPP to handle IPsec traffic more efficiently by -offloading processing from the kernel. - -### netlink -VPP uses netlink to receive IPsec event messages from the kernel. Proper -settings of the following parameters are crucial for ensuring that VPP can -process all such messages: -```{cfgcmd} set vpp settings lcp netlink batch-delay-ms \<milliseconds\> -``` -This parameter specifies the delay in milliseconds between processing -batch netlink messages. -```{cfgcmd} set vpp settings lcp netlink batch-size \<number\> -``` -This parameter specifies the maximum number of netlink messages to -process in a single batch. -```{cfgcmd} set vpp settings lcp netlink rx-buffer-size \<number\> -``` - -This parameter specifies the size of the receive buffer for netlink -socket. If you expect to offload many IPsec tunnels or get frequent and -intensive rekeying, you may need to increase this value. - -:::{note} -IPsec uses the same netlink parameters as LCP, so tuning them -affects both LCP and IPsec processing. -::: - -## Potential Issues and Troubleshooting - -Improper IPsec configuration can lead to various issues, including: - -- Failure to offload IPsec tunnels to VPP -- Lost IPsec event messages due to insufficient netlink buffer size or - batch settings -- IPsec states or SAs are not synchronized between kernel and VPP diff --git a/docs/vpp/configuration/dataplane/md-ipv6.md b/docs/vpp/configuration/dataplane/md-ipv6.md deleted file mode 100644 index a72dbbfa..00000000 --- a/docs/vpp/configuration/dataplane/md-ipv6.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -lastproofread: '2026-02-26' ---- - -(vpp-config-dataplane-ipv6)= - -```{include} /_include/need_improvement.txt -``` - -# VPP IPv6 Configuration -VPP lets you configure resources allocated for IPv6 traffic processing -independently from IPv4. This helps ensure that in networks without IPv6 -traffic, resources are not wasted. If IPv6 traffic is present, especially -with large routing tables, you must allocate additional resources for IPv6 -processing to keep the dataplane stable. - -You can configure two main resources for IPv6 traffic processing: -```{cfgcmd} set vpp settings resource-allocation ipv6 hash-buckets \<value\> -``` -This parameter configures the number of hash buckets used for IPv6 -routing. If you have a large IPv6 routing table, you may need to increase -this value to ensure efficient routing table performance and fast lookups. -```{cfgcmd} set vpp settings resource-allocation ipv6 heap-size \<value\> -``` - -This parameter configures the heap size used for IPv6 forwarding. If you -have a large IPv6 routing table, you may need to increase this value to -ensure the routing table can accommodate all routes. - -## Potential Issues and Troubleshooting - -Improper IPv6 configuration can lead to various issues, including: - -- Inefficient, slow routing table lookups and traffic processing due to - insufficient hash buckets -- Dataplane crashes or instability due to insufficient heap size when - handling a large number of IPv6 routes -- Overall dataplane instability when handling IPv6 traffic - -Consider increasing configuration values if you experience issues with -IPv6 traffic processing or if you have a large IPv6 routing table. diff --git a/docs/vpp/configuration/dataplane/md-l2learn.md b/docs/vpp/configuration/dataplane/md-l2learn.md deleted file mode 100644 index fe5deb55..00000000 --- a/docs/vpp/configuration/dataplane/md-l2learn.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -lastproofread: '2026-02-26' ---- - -(vpp-config-dataplane-l2learn)= - -```{include} /_include/need_improvement.txt -``` -# VPP L2LEARN Configuration - -When VPP dataplane connects to an L2 domain, it learns MAC addresses of -devices in the domain. By default, the number of MAC addresses it can -learn is limited. - -You can configure the limit using the following command: -```{cfgcmd} set vpp settings resource-allocation mac-limit \<value\> -``` -This parameter sets the maximum number of MAC addresses that can be -learned in the L2 domain. If you have many devices, you may need to -increase this limit to ensure VPP learns all MAC addresses. - -## Potential Issues and Troubleshooting - -Improper L2LEARN configuration can lead to various issues, including: - -- MAC address learning failure in the L2 domain if the limit is set too - low -- Increased packet loss or latency for devices that aren't learned -- Overall dataplane instability when handling L2 traffic - -Consider increasing the L2LEARN limit if you experience issues with MAC -address learning or if you have many devices in the L2 domain. diff --git a/docs/vpp/configuration/dataplane/md-lcp.md b/docs/vpp/configuration/dataplane/md-lcp.md deleted file mode 100644 index 82dc014e..00000000 --- a/docs/vpp/configuration/dataplane/md-lcp.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -lastproofread: '2026-02-26' ---- - -(vpp-config-dataplane-lcp)= - -```{include} /_include/need_improvement.txt -``` - -# VPP LCP Configuration -Linux Control Plane (LCP) is a core component of VPP that lets you -offload various control plane functions to the Linux kernel. LCP provides -seamless integration with other VyOS components, letting you use system -components like DHCP clients and routing daemons together with the VPP -dataplane. - -VPP integration in VyOS relies heavily on LCP. Almost all control plane -functions are handled by other daemons and services, while VPP handles -high-performance packet forwarding exclusively. This approach also reduces -VPP management processing load, improving overall dataplane performance and -stability. - -VyOS integrates the kernel and VPP routing tables uniquely. By default, -all routes, even those not directly connected to VPP interfaces, are -imported from the kernel routing table to the VPP routing table, pointing -to the kernel. This lets you forward traffic to any destination known to -the kernel, even if VPP doesn't have a route to that destination. - -However, in some scenarios this behavior may not be desired. For example, -if you have many routes in the kernel routing table not directly connected -to VPP interfaces, and you don't need forwarding between those -destinations and destinations reachable via VPP, you can disable this -behavior using the following command: -(vpp-config-dataplane-lcp-ignore-kernel-routes)= -(vpp_config_dataplane_lcp_ignore-kernel-routes)= -```{cfgcmd} set vpp settings ignore-kernel-routes -``` - -Pay attention that disabling this option leads to loss of connectivity to -destinations if there are no direct routes in VPP routing table. - -## Potential Issues and Troubleshooting - -Disabling kernel route import can result in: - -- Loss of connectivity to certain destinations if kernel routes are ignored -- Incomplete route synchronization between the kernel and VPP diff --git a/docs/vpp/configuration/dataplane/md-logging.md b/docs/vpp/configuration/dataplane/md-logging.md deleted file mode 100644 index e7fcf455..00000000 --- a/docs/vpp/configuration/dataplane/md-logging.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -lastproofread: '2026-02-27' ---- - -(vpp-config-dataplane-logging)= - -```{include} /_include/need_improvement.txt -``` - -# VPP Logging Configuration -VPP logging is an important part of monitoring and troubleshooting -the performance and behavior of the VPP dataplane. - -VPP stores logs in two places: -- `/var/log/vpp.log` — This file contains logs related to daemon - startup and logs of commands executed directly via VPP CLI. Pay - attention: VyOS does not use VPP CLI for configuration, so this log - will not contain any configuration changes made via VyOS CLI and will - not be informative in most cases. -- System journal — contains logs related to the VPP daemon work, - including errors, warnings, and informational messages. It is the - main destination of logs generated by VPP. - -Logging detail level can be configured via the next command: -```{cfgcmd} set vpp settings logging default-level \<level\> -``` - -Where `<level>` can be one of the following: - -- `emerg` (Emergency) - System is unusable. -- `alert` (Alert) - Immediate action required. -- `crit` (Critical) - Critical conditions. -- `error` (Error) - Error conditions. -- `warn` (Warning) - Warning conditions. -- `notice` (Notice) - Normal but significant. -- `info` (Informational) - Routine informational messages. -- `debug` (Debug) - Detailed debugging messages. -- `disabled` (Disabled) - Logging disabled. - -It is recommended to set logging level to `debug` only for -troubleshooting purposes, as it can generate a large volume of log -data. For regular operation, a level of `info` or `warn` is usually -sufficient. - -## Troubleshooting - -Improper logging configuration can lead to various issues, including: - -- Excessive log file sizes if the logging level is set too high - (for example, `debug`). -- Missing critical information if the logging level is set too low - (for example, `alert`). -- Performance degradation due to excessive logging overhead - -Consider adjusting the logging level if you experience issues mentioned -above. diff --git a/docs/vpp/configuration/dataplane/md-memory.md b/docs/vpp/configuration/dataplane/md-memory.md deleted file mode 100644 index 1c588e7c..00000000 --- a/docs/vpp/configuration/dataplane/md-memory.md +++ /dev/null @@ -1,128 +0,0 @@ ---- -lastproofread: '2026-02-27' ---- - -(vpp-config-dataplane-memory)= -(vpp_config_dataplane_memory)= - -```{include} /_include/need_improvement.txt -``` - -# VPP Memory Configuration -VPP heavily relies on hugepages for its memory management. Hugepages -are larger memory pages that reduce the overhead of page management and -improve performance for applications that require large amounts of -memory, such as VPP. - -VPP supports both 2MB and 1GB hugepages, but the default and most -commonly used size is 2MB. The choice of hugepage size can impact -performance, with larger pages generally providing better performance -for memory-intensive applications. - -Before configuring memory in VPP dataplane settings, you need to -ensure that hugepages are enabled and properly configured on your -system. - -:::{seealso} -{ref}`Hugepages in VyOS Configuration for VPP <vpp-config-hugepages>` -::: -To configure memory settings for VPP, you can use the following -commands in the VPP CLI: - -VPP uses a main heap as a central memory pool for FIB data structures -entry allocations. - -Efficient memory management is crucial for VPP's performance, and the -main heap plays a significant role in this. - -It can be configured using the following command: -```{cfgcmd} set vpp settings resource-allocation memory main-heap-page-size \<size\> -``` -Sets the main heap page size for VPP. -```{cfgcmd} set vpp settings resource-allocation memory main-heap-size \<size\> -``` -Sets the main heap size for VPP. -(vpp-config-dataplane-physmem)= - -## Physical Memory Configuration -VPP uses physical memory for packet buffers and interface operations. -The `physmem` setting controls how much memory VPP can allocate for -these operations. -```{cfgcmd} set vpp settings resource-allocation memory physmem-max-size \<size\> -``` -Sets the maximum amount of physical memory VPP can use for packet -processing and interface buffers. - -**Default**: 16GB (usually sufficient for most deployments) - -You may need to modify the value for high-throughput environments with -many interfaces, large packet buffers, very high packet rates, or -memory-constrained systems where you need to limit VPP's memory usage. - -**Physmem independent of main heap size** — physmem is for packet -buffers, main heap is for routing tables. - -:::{seealso} -- {ref}`Hugepages in VyOS Configuration for VPP <vpp-config-hugepages>` -- {ref}`VPP Buffer Configuration <vpp-config-dataplane-buffers>` - for - controlling buffer allocation within physmem -::: - -### Common configurations -```none -# Reduce for memory-constrained systems -set vpp settings physmem max-size 4G - -# Increase for high-throughput environments -set vpp settings physmem max-size 32G -``` -## Stats Memory Configuration -VPP uses a dedicated statistics memory segment to store runtime -counters and telemetry data. This segment is used by the VPP CLI and -monitoring tools to access performance and status information. - -The statistics segment is allocated from hugepage memory and can be -configured independently from the main heap and physmem settings. - -You can configure statistics memory using the following commands: -```{cfgcmd} set vpp settings resource-allocation memory stats page-size \<size\> -``` -Sets the hugepage page size used for the statistics memory segment. -```{cfgcmd} set vpp settings resource-allocation memory stats size \<size\> -``` - -Sets the total size of the statistics memory segment. - -Increasing this value may be required in large deployments with many -interfaces or enabled features that generate a high number of counters. - -Statistics memory is used only for telemetry and monitoring. It does -not affect packet buffer allocation or routing table memory. - -## Troubleshooting - -Improper configuration of main heap size can lead to performance -degradation or even system instability. If VPP runs out of memory in the -main heap, it may crash or exhibit erratic behavior. Symptoms you may -observe include: - -- Increased latency or packet loss -- Crashes or restarts of VPP processes, especially during routing table - population (for example, BGP session establishment) -- Error messages related to memory allocation failures - -You need to tune the main heap size based on expected FIB entries. Pay -attention: the same amount of routes with a single next-hop and with -multiple next-hops will consume different amounts of memory. - -For physmem, insufficient allocation can lead to packet drops, interface -initialization failures, and overall degraded performance. Symptoms -include: - -- Packet drops or failures to allocate buffers -- Increased latency or jitter in packet processing -- Crashes or restarts of VPP processes under heavy load - -You need to tune the physmem settings based on expected traffic patterns -and interface usage. Monitor memory usage closely and adjust the -configuration as needed to ensure optimal performance. diff --git a/docs/vpp/configuration/dataplane/md-unix.md b/docs/vpp/configuration/dataplane/md-unix.md deleted file mode 100644 index 9832b86d..00000000 --- a/docs/vpp/configuration/dataplane/md-unix.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -lastproofread: '2026-02-27' ---- - -(vpp-config-dataplane-unix)= - -```{include} /_include/need_improvement.txt -``` - -# VPP Unix Dataplane Configuration -The UNIX configuration section is used to control VPP's interaction -with the underlying operating system, including operations scheduling. - -VPP relies on the polling mechanism to efficiently manage I/O operations -and system events. By default VPP continuously polls for events, which -leads to permanent 100% CPU usage by all cores assigned to VPP dataplane. -This is optimal for performance, but may not be desirable in all -environments, especially where power consumption is a concern or where VPP -is running inside a hypervisor, especially if the VM has burstable -thresholds and CPU usage limits. - -To mitigate this, VPP provides a configurable polling delay that allows -reducing CPU usage by introducing a delay between polling cycles. This -introduces a trade-off between CPU usage and latency, as longer delays -can lead to increased latency in processing events. - -You can configure the polling delay using the following command in the -VyOS CLI: -```{cfgcmd} set vpp settings poll-sleep-usec \<delay\> -``` - -Sets the polling delay in microseconds. A value of 0 means no delay -(default), while higher values introduce a delay between polling cycles. - -## Troubleshooting - -Setting the polling delay too high can lead to increased latency and -reduced performance, as VPP may not respond to events as quickly. -Conversely, setting it too low may result in high CPU usage, which can be -problematic in resource-constrained environments. - -Symptoms of improper configuration may include: - -- Increased latency in packet processing -- Higher CPU usage than expected -- Packets lost due to buffer overruns - -If you do not need to reduce CPU usage, it is recommended to leave the -polling delay at its default value of 0 for optimal performance. - -If you need to reduce CPU usage, you may also consider using `interrupt` or -`adaptive` {ref}`DPDK driver modes <vpp-config-dataplane-interface-rx-mode>`, -which can provide a balance between performance and resource utilization -without affecting polling behavior. diff --git a/docs/vpp/configuration/interfaces/md-bonding.md b/docs/vpp/configuration/interfaces/md-bonding.md deleted file mode 100644 index 24868166..00000000 --- a/docs/vpp/configuration/interfaces/md-bonding.md +++ /dev/null @@ -1,206 +0,0 @@ ---- -lastproofread: '2026-03-09' ---- - -(vpp-config-interfaces-bonding)= - -```{include} /_include/need_improvement.txt -``` - -# VPP Bonding Configuration -VPP bonding interfaces provide link aggregation capabilities by combining -multiple physical interfaces into a single logical interface for increased -bandwidth and redundancy. VPP bonding offers high-performance packet -processing compared to traditional Linux bonding. - -## Basic Configuration - -### Creating a Bonding Interface -To create a VPP bonding interface: -```{cfgcmd} set interfaces vpp bonding \<vppbondN\> - -Create a bonding interface where ``<vppbondN>`` follows the naming -convention ``vppbond0``, ``vppbond1``, and so on. A kernel pair interface is -automatically created for the VPP bonding interface. This allows -standard Linux networking tools and services to interact with the VPP -bond. -``` -**Example:** -```none -set interfaces vpp bonding vppbond0 -``` -### Interface Description -```{cfgcmd} set interfaces vpp bonding \<vppbondN\> description \<description\> - -Set a descriptive name for the bonding interface. -``` -**Example:** -```none -set interfaces vpp bonding vppbond0 description "Primary uplink bond" -``` -### Administrative Control -```{cfgcmd} set interfaces vpp bonding \<vppbondN\> disable - -Administratively disable the bonding interface. By default, interfaces -are enabled. -``` -## Member Interface Configuration -### Adding Member Interfaces -```{cfgcmd} set interfaces vpp bonding \<vppbondN\> member interface \<interface-name\> - -Add physical interfaces as members of the bond. You can add multiple -interfaces to the same bond. -``` -**Example:** -```none -set interfaces vpp bonding vppbond0 member interface eth0 -set interfaces vpp bonding vppbond0 member interface eth1 -``` -:::{note} -Member interfaces must have the same speed and duplex for optimal -performance. They must already be attached to VPP. -::: - -## Bonding Modes -```{cfgcmd} set interfaces vpp bonding \<vppbondN\> mode \<mode\> - -Configure the bonding mode. Available modes: -* **802.3ad**: IEEE 802.3ad Dynamic Link Aggregation (LACP) - Default -* **active-backup**: Fault tolerant, only one slave interface active -* **broadcast**: Transmits everything on all slave interfaces -* **round-robin**: Load balance by transmitting packets in sequential order -* **xor-hash**: Distribute based on hash policy -``` -**Examples:** -```none -# Use LACP (recommended for switch environments) -set interfaces vpp bonding vppbond0 mode 802.3ad - -# Use active-backup for simple failover -set interfaces vpp bonding vppbond0 mode active-backup -``` -## Hash Policies -For load balancing modes, configure how the system distributes traffic -across member interfaces: -```{cfgcmd} set interfaces vpp bonding \<vppbondN\> hash-policy \<policy\> - -Set the transmit hash policy: -* **layer2**: Use MAC addresses to generate hash (default) -* **layer2+3**: Combine MAC addresses and IP addresses -* **layer3+4**: Combine IP addresses and port numbers -``` -**Examples:** -```none -# Layer 2 hashing (default) -set interfaces vpp bonding vppbond0 hash-policy layer2 - -# Layer 3+4 for better distribution with multiple flows -set interfaces vpp bonding vppbond0 hash-policy layer3+4 -``` -## MAC Address Configuration -```{cfgcmd} set interfaces vpp bonding \<vppbondN\> mac \<mac-address\> - -Set a specific MAC address for the bonding interface. -``` -**Example:** -```none -set interfaces vpp bonding vppbond0 mac 00:11:22:33:44:55 -``` -## IP Address Configuration -```{cfgcmd} set interfaces vpp bonding \<vppbondN\> address \<ip-address/prefix\> - -Configure IPv4 or IPv6 addresses on the kernel interface. You can -assign multiple addresses. -``` -**Examples:** -```none -# IPv4 address -set interfaces vpp bonding vppbond0 address 192.168.1.10/24 - -# IPv6 address -set interfaces vpp bonding vppbond0 address 2001:db8::10/64 - -# Multiple addresses -set interfaces vpp bonding vppbond0 address 192.168.1.10/24 -set interfaces vpp bonding vppbond0 address 10.0.0.10/8 -``` -## MTU Configuration -```{cfgcmd} set interfaces vpp bonding \<vppbondN\> mtu \<size\> - -Set the Maximum Transmission Unit (MTU) for the kernel interface. The -MTU must be compatible with the connected VPP interface. -``` -**Example:** -```none -set interfaces vpp bonding vppbond0 mtu 9000 -``` -:::{note} -The MTU setting must match or be smaller than the MTU supported by the -associated VPP interface. -::: - -## VLAN Configuration -VPP kernel interfaces support VLAN (Virtual LAN) sub-interfaces for -network segmentation. - -### Creating VLAN Sub-interfaces -```{cfgcmd} set interfaces vpp bonding \<vppbondN\> vif \<vlan-id\> - -Create a VLAN sub-interface with the specified VLAN ID (0-4094). -``` -**Example:** -```none -set interfaces vpp bonding vppbond0 vif 100 -``` -### VLAN Sub-interface Configuration -VLAN sub-interfaces support the same configuration options as the parent -interface: -```{cfgcmd} set interfaces vpp bonding \<vppbondN\> vif \<vlan-id\> address \<ip-address/prefix\> -``` - -```{cfgcmd} set interfaces vpp bonding \<vppbondN\> vif \<vlan-id\> description \<description\> -``` - -```{cfgcmd} set interfaces vpp bonding \<vppbondN\> vif \<vlan-id\> disable -``` - -```{cfgcmd} set interfaces vpp bonding \<vppbondN\> vif \<vlan-id\> mtu \<size\> -``` -**Examples:** -```none -# Configure VLAN 100 -set interfaces vpp bonding vppbond0 vif 100 address 192.168.100.1/24 -set interfaces vpp bonding vppbond0 vif 100 description "Management VLAN" -set interfaces vpp bonding vppbond0 vif 100 mtu 1500 - -# Configure VLAN 200 -set interfaces vpp bonding vppbond0 vif 200 address 192.168.200.1/24 -set interfaces vpp bonding vppbond0 vif 200 description "Guest VLAN" -``` -## Complete Configuration Example -Here's a complete example configuring a bonding interface with LACP: -```none -# Create bonding interface -set interfaces vpp bonding vppbond0 -set interfaces vpp bonding vppbond0 description "Server uplink bond" - -# Configure bonding parameters -set interfaces vpp bonding vppbond0 mode 802.3ad -set interfaces vpp bonding vppbond0 hash-policy layer3+4 - -# Add member interfaces -set interfaces vpp bonding vppbond0 member interface eth0 -set interfaces vpp bonding vppbond0 member interface eth1 - -# Configure IP on kernel interface -set interfaces vpp bonding vppbond0 address 192.168.1.10/24 -``` - -## Best Practices - -- Use **802.3ad mode** with LACP-capable switches for best performance - and standards compliance. -- Configure **layer3+4 hash policy** for environments with multiple - traffic flows. -- Ensure member interfaces have identical settings (speed, duplex, - MTU). diff --git a/docs/vpp/configuration/interfaces/md-bridge.md b/docs/vpp/configuration/interfaces/md-bridge.md deleted file mode 100644 index f7b24b1d..00000000 --- a/docs/vpp/configuration/interfaces/md-bridge.md +++ /dev/null @@ -1,169 +0,0 @@ ---- -lastproofread: '2026-03-10' ---- - -(vpp-config-interfaces-bridge)= - -```{include} /_include/need_improvement.txt -``` - -# VPP Bridge Configuration -VPP bridge interfaces provide Layer 2 switching functionality, allowing -multiple interfaces to be connected at the data link layer. - -VPP bridges operate as learning bridges, automatically discovering MAC -addresses and building forwarding tables to efficiently switch traffic -between member interfaces. This provides transparent connectivity between -different network segments while maintaining the performance benefits of -VPP's optimized data plane. - -**Supported Member Interface Types:** - -VPP bridges support various interface types as members: -- Physical Ethernet interfaces (managed through linux-cp) -- {doc}`bonding` - VPP bonding interfaces -- {doc}`gre` - GRE tunnel interfaces -- {doc}`loopback` - Loopback interfaces (required for BVI) -- {doc}`vxlan` - VXLAN tunnel interfaces - -This flexibility allows you to create complex Layer 2 topologies -combining different networking technologies. - -## Basic Configuration - -### Creating a Bridge Interface -```{cfgcmd} set interfaces vpp bridge \<vppbrN\> - -Create a bridge interface where ``<vppbrN>`` follows the naming -convention ``vppbr1``, ``vppbr2``, etc. -``` -:::{note} -Bridge domain `vppbr0` is reserved by VPP and cannot be -configured through VyOS. Start with `vppbr1` for your bridge -configurations. -::: -**Example:** -```none -set interfaces vpp bridge vppbr1 -``` -### Interface Description -```{cfgcmd} set interfaces vpp bridge \<vppbrN\> description \<description\> - -Set a descriptive name for the bridge interface. -``` -**Example:** -```none -set interfaces vpp bridge vppbr1 description "Main campus bridge" -``` -## Member Interface Configuration -### Adding Member Interfaces -```{cfgcmd} set interfaces vpp bridge \<vppbrN\> member interface \<interface-name\> - -Add an interface as a member of the bridge. -``` -**Examples:** -```none -# Add physical interfaces -set interfaces vpp bridge vppbr1 member interface eth0 -set interfaces vpp bridge vppbr1 member interface eth1 - -# Add other VPP interfaces -set interfaces vpp bridge vppbr1 member interface vppbond0 -set interfaces vpp bridge vppbr1 member interface vppgre1 -``` -:::{important} -Bridge members can include various interface types such as: -- Physical Ethernet interfaces (eth0, eth1, etc.) -- {doc}`bonding` - VPP bonding interfaces (vppbond0, vppbond1, etc.) -- {doc}`gre` - GRE tunnel interfaces -- {doc}`loopback` - Loopback interfaces -- {doc}`vxlan` - VXLAN tunnel interfaces -::: - -## Bridge Virtual Interface (BVI) -A Bridge Virtual Interface (BVI) provides Layer 3 connectivity to a -bridge domain, allowing the bridge to have an IP address and participate -in routing. - -### Configuring BVI -```{cfgcmd} set interfaces vpp bridge \<vppbrN\> member interface \<loopback-interface\> bvi - -Designate a loopback interface as the Bridge Virtual Interface for -the bridge domain. -``` -**Example:** -```none -# Create a loopback interface first -set interfaces vpp loopback vpplo1 - -# Add it to the bridge as BVI -set interfaces vpp bridge vppbr1 member interface vpplo1 bvi -``` -:::{important} -**BVI Restrictions:** -- Only loopback interfaces can be configured as BVI -- Each bridge domain can have only one BVI interface -::: - -## Configuration Examples - -### Basic Bridge Setup -```none -# Create bridge interface -set interfaces vpp bridge vppbr1 -set interfaces vpp bridge vppbr1 description "Office network bridge" - -# Add member interfaces -set interfaces vpp bridge vppbr1 member interface eth0 -set interfaces vpp bridge vppbr1 member interface eth1 -set interfaces vpp bridge vppbr1 member interface eth2 -``` -### Bridge with BVI -```none -# Create bridge and loopback for BVI -set interfaces vpp bridge vppbr2 -set interfaces vpp bridge vppbr2 description "Server segment with gateway" -set interfaces vpp loopback vpplo1 - -# Configure bridge members -set interfaces vpp bridge vppbr2 member interface eth3 -set interfaces vpp bridge vppbr2 member interface eth4 -set interfaces vpp bridge vppbr2 member interface vpplo1 bvi -``` -### Multi-Technology Bridge -```none -# Create bridge combining different interface types -set interfaces vpp bridge vppbr3 -set interfaces vpp bridge vppbr3 description "Hybrid network bridge" - -# Add various interface types -set interfaces vpp bridge vppbr3 member interface vppbond1 -set interfaces vpp bridge vppbr3 member interface vppgre1 -set interfaces vpp bridge vppbr3 member interface vppvxlan1 -set interfaces vpp bridge vppbr3 member interface vpplo2 bvi -``` -## Integration with Kernel Interfaces -Bridge interfaces can be integrated with kernel interfaces for -management and compatibility with standard Linux networking services. -This is accomplished by binding a kernel interface to the Bridge -Virtual Interface (BVI). - -**Example Integration:** -```none -# Create VPP bridge with member interfaces -set interfaces vpp bridge vppbr1 -set interfaces vpp bridge vppbr1 member interface eth1 -set interfaces vpp bridge vppbr1 member interface eth2 - -# Create loopback interface and configure as BVI -set interfaces vpp loopback vpplo1 -set interfaces vpp bridge vppbr1 member interface vpplo1 bvi - -# Bind LCP kernel interface to the BVI loopback -set interfaces vpp loopback vpplo1 address '192.0.2.1/24' -``` - -This configuration creates a kernel interface bound to the BVI, -allowing standard Linux applications and routing daemons to interact -with the VPP bridge. The kernel interface provides Layer 3 access to -the bridge domain. diff --git a/docs/vpp/configuration/interfaces/md-gre.md b/docs/vpp/configuration/interfaces/md-gre.md deleted file mode 100644 index fa91caae..00000000 --- a/docs/vpp/configuration/interfaces/md-gre.md +++ /dev/null @@ -1,140 +0,0 @@ ---- -lastproofread: '2026-03-13' ---- - -(vpp-config-interfaces-gre)= - -```{include} /_include/need_improvement.txt -``` - -# VPP GRE Configuration -VPP GRE interfaces provide Generic Routing Encapsulation tunneling with -high-performance packet processing. GRE tunnels encapsulate various -protocols within IP packets, enabling connectivity across Layer 3 -networks while maintaining the performance benefits of VPP's optimized -data plane. - -## Basic Configuration - -### Creating a GRE Interface -```{cfgcmd} set interfaces vpp gre \<vppgreN\> - -Create a GRE interface where ``<vppgreN>`` follows the naming convention -``vppgre1``, ``vppgre2``, etc. -``` - -```{cfgcmd} set interfaces vpp gre \<vppgreN\> remote \<address\> - -Set the tunnel remote endpoint address. Supports both IPv4 and IPv6 -addresses. -``` - -```{cfgcmd} set interfaces vpp gre \<vppgreN\> source-address \<address\> - -Set the tunnel source address. Must match an address configured on -the local system. -``` -**Basic Example:** -```none -set interfaces vpp gre vppgre1 -set interfaces vpp gre vppgre1 remote 203.0.113.2 -set interfaces vpp gre vppgre1 source-address 192.168.1.1 -``` -## Interface Configuration -### Description and Administrative Control -```{cfgcmd} set interfaces vpp gre \<vppgreN\> description \<description\> - -Set a descriptive name for the GRE interface. -``` - -```{cfgcmd} set interfaces vpp gre \<vppgreN\> disable - -Administratively disable the GRE interface. -``` -### Tunnel Type -```{cfgcmd} set interfaces vpp gre \<vppgreN\> tunnel-type \<type\> - -Set the GRE tunnel encapsulation type: -* ``l3`` - Generic Routing Encapsulation for network layer traffic (default). -* ``teb`` - Transparent Ethernet Bridge for Layer 2 frame transport. -* ``erspan`` - Encapsulated Remote Switched Port Analyzer for traffic - mirroring. -``` -### Kernel Interface Integration -LCP kernel pair interface bound to the VPP GRE interface is created -automatically. This allows standard Linux networking tools and -services to interact with the VPP GRE. - -## IP Address Configuration -```{cfgcmd} set interfaces vpp gre \<vppgreN\> address \<ip-address/prefix\> - -Configure IPv4 or IPv6 addresses on the kernel interface. Multiple -addresses can be assigned. -``` -**Examples:** -```none -# IPv4 address -set interfaces vpp gre vppgre0 address 192.168.1.10/24 - -# IPv6 address -set interfaces vpp gre vppgre0 address 2001:db8::10/64 -``` -## MTU Configuration -```{cfgcmd} set interfaces vpp gre \<vppgreN\> mtu \<size\> - -Set the Maximum Transmission Unit (MTU) for the kernel interface. -The MTU must be compatible with the connected VPP interface. -``` -**Example:** -```none -set interfaces vpp gre vppgre0 mtu 9000 -``` -:::{note} -The MTU size must not exceed the MTU size -supported by the associated VPP interface. -::: - -## Configuration Examples - -### Layer 3 GRE Tunnel -```none -# IPv4 GRE tunnel -set interfaces vpp gre vppgre1 -set interfaces vpp gre vppgre1 description "Site-to-site tunnel" -set interfaces vpp gre vppgre1 remote 203.0.113.10 -set interfaces vpp gre vppgre1 source-address 192.168.1.1 -set interfaces vpp gre vppgre1 tunnel-type l3 -``` -### Layer 2 GRE Tunnel (TEB) -```none -# Transparent Ethernet Bridge -set interfaces vpp gre vppgre2 -set interfaces vpp gre vppgre2 description "L2 extension tunnel" -set interfaces vpp gre vppgre2 remote 203.0.113.20 -set interfaces vpp gre vppgre2 source-address 192.168.1.1 -set interfaces vpp gre vppgre2 tunnel-type teb -``` -### IPv6 GRE Tunnel -```none -# IPv6 endpoints -set interfaces vpp gre vppgre3 -set interfaces vpp gre vppgre3 remote 2001:db8::2 -set interfaces vpp gre vppgre3 source-address 2001:db8::1 -``` -### GRE with Kernel Interface -```none -# GRE tunnel with management interface -set interfaces vpp gre vppgre4 -set interfaces vpp gre vppgre4 remote 203.0.113.30 -set interfaces vpp gre vppgre4 source-address 192.168.1.1 -set interfaces vpp gre vppgre4 address 10.0.1.1/30 -``` -## Bridge Integration -GRE interfaces can be added as members to VPP bridges for Layer 2 -switching. See {doc}`bridge` for detailed bridge configuration. -```none -# Add TEB GRE tunnel to bridge -set interfaces vpp bridge vppbr1 -set interfaces vpp bridge vppbr1 member interface vppgre2 -set interfaces vpp bridge vppbr1 member interface eth1 -``` diff --git a/docs/vpp/configuration/interfaces/md-index.md b/docs/vpp/configuration/interfaces/md-index.md deleted file mode 100644 index 662f37c5..00000000 --- a/docs/vpp/configuration/interfaces/md-index.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -lastproofread: '2026-03-13' ---- - -(vpp-config-interfaces-index)= - -```{include} /_include/need_improvement.txt -``` -# VPP Interfaces Configuration -```{toctree} -:includehidden: true -:maxdepth: 1 - -bonding -bridge -gre -ipip -loopback -vxlan -xconnect -``` - -VyOS utilizes VPP (Vector Packet Processor) to provide high-performance data -plane processing. While physical interfaces are typically managed through the -Linux kernel using `linux-cp` (Linux Control Plane) integration, VyOS also -supports creating dedicated VPP interfaces for enhanced flexibility and -performance. - -## Why VPP Interfaces? - -VPP interfaces offer several advantages: - -- **Total Isolation**: VPP interfaces operate entirely within the VPP data - plane, providing isolation from the Linux kernel when needed. -- **Advanced Features**: Access to VPP-specific functionality not available - in standard Linux interfaces. -- **Flexible Deployment**: Some interface types are only available as VPP - interfaces or may not be supported by the kernel. -- **Specific scenarios**: Not all use cases require integration with the - Linux Kernel. - -### Integration with Kernel - -VyOS provides seamless integration between VPP and kernel networking. -This allows you to leverage the strengths of both approaches: -create interfaces inside VPP, and access them from the Linux kernel and other -services. diff --git a/docs/vpp/configuration/interfaces/md-ipip.md b/docs/vpp/configuration/interfaces/md-ipip.md deleted file mode 100644 index 8a847e48..00000000 --- a/docs/vpp/configuration/interfaces/md-ipip.md +++ /dev/null @@ -1,99 +0,0 @@ ---- -lastproofread: '2026-03-13' ---- - -(vpp-config-interfaces-ipip)= - -```{include} /_include/need_improvement.txt -``` - -# VPP IPIP Configuration -VPP IPIP interfaces provide IP-in-IP tunneling with high-performance -packet processing. IPIP tunnels encapsulate IP packets within IP -packets, creating point-to-point connections across Layer 3 networks. - -## Basic Configuration - -### Creating an IPIP Interface -```{cfgcmd} set interfaces vpp ipip \<vppipipN\> - -Create an IPIP interface where ``<vppipipN>`` follows the naming -convention ``vppipip1``, ``vppipip2``, etc. -``` - -```{cfgcmd} set interfaces vpp ipip \<vppipipN\> remote \<address\> - -Set the tunnel remote endpoint address. Supports both IPv4 and IPv6 -addresses. -``` - -```{cfgcmd} set interfaces vpp ipip \<vppipipN\> source-address \<address\> - -Set the tunnel source address. The source address must match an address -configured on the local system. -``` -**Basic Example:** -```none -set interfaces vpp ipip vppipip1 -set interfaces vpp ipip vppipip1 remote 203.0.113.2 -set interfaces vpp ipip vppipip1 source-address 192.168.1.1 -``` -## Interface Configuration -### Description and Administrative Control -```{cfgcmd} set interfaces vpp ipip \<vppipipN\> description \<description\> - -Set a descriptive name for the IPIP interface. -``` - -```{cfgcmd} set interfaces vpp ipip \<vppipipN\> disable - -Administratively disable the IPIP interface. -``` -### Kernel Interface Integration -Kernel interface is bound to the VPP IPIP interface for management and -application compatibility. - -## IP Address Configuration -```{cfgcmd} set interfaces vpp ipip \<vppipipN\> address \<ip-address/prefix\> - -Configure IPv4 or IPv6 addresses on the kernel interface. Multiple -addresses can be assigned. -``` -**Examples:** -```none -# IPv4 address -set interfaces vpp ipip vppipip0 address 192.168.1.10/24 - -# IPv6 address -set interfaces vpp ipip vppipip0 address 2001:db8::10/64 -``` -## MTU Configuration -```{cfgcmd} set interfaces vpp ipip \<vppipipN\> mtu \<size\> - -Set the Maximum Transmission Unit (MTU) for the kernel interface. -The MTU must be compatible with the connected VPP interface. -``` -## Configuration Examples -### IPv4 IPIP Tunnel -```none -# Basic IPv4 IPIP tunnel -set interfaces vpp ipip vppipip1 -set interfaces vpp ipip vppipip1 description "Site-to-site IPIP tunnel" -set interfaces vpp ipip vppipip1 remote 203.0.113.10 -set interfaces vpp ipip vppipip1 source-address 192.168.1.1 -``` -### IPv6 IPIP Tunnel -```none -# IPv6 endpoints -set interfaces vpp ipip vppipip2 -set interfaces vpp ipip vppipip2 remote 2001:db8::2 -set interfaces vpp ipip vppipip2 source-address 2001:db8::1 -``` -### IPIP with Kernel Interface -```none -# IPIP tunnel with management interface -set interfaces vpp ipip vppipip3 -set interfaces vpp ipip vppipip3 remote 203.0.113.30 -set interfaces vpp ipip vppipip3 source-address 192.168.1.1 -set interfaces vpp ipip vppipip3 address 10.0.2.1/30 -``` diff --git a/docs/vpp/configuration/interfaces/md-loopback.md b/docs/vpp/configuration/interfaces/md-loopback.md deleted file mode 100644 index bc65338b..00000000 --- a/docs/vpp/configuration/interfaces/md-loopback.md +++ /dev/null @@ -1,120 +0,0 @@ ---- -lastproofread: '2026-03-13' ---- - -(vpp-config-interfaces-loopback)= - -```{include} /_include/need_improvement.txt -``` - -# VPP Loopback Interface Configuration -VPP loopback interfaces provide virtual interfaces that remain -administratively up and are commonly used for stable addressing, -routing protocols, and as Bridge Virtual Interfaces (BVI). Loopback -interfaces in VPP offer high-performance virtual connectivity with optimized -packet processing. - -## Basic Configuration - -### Creating a Loopback Interface -```{cfgcmd} set interfaces vpp loopback \<vpploN\> - -Create a loopback interface where ``<vpploN>`` follows the naming -convention ``vpplo1``, ``vpplo2``, etc. -``` -**Basic Example:** -```none -set interfaces vpp loopback vpplo1 -``` -## Interface Configuration -### Description and Administrative Control -```{cfgcmd} set interfaces vpp loopback \<vpploN\> description \<description\> - -Set a descriptive name for the loopback interface. -``` - -```{cfgcmd} set interfaces vpp loopback \<vpploN\> disable - -Administratively disable the loopback interface. -``` -### Kernel Interface Integration -Kernel interface is bounded to the VPP loopback interface for management -and application compatibility. - -## IP Address Configuration -```{cfgcmd} set interfaces vpp loopback \<vpploN\> address \<ip-address/prefix\> - -Configure IPv4 or IPv6 addresses on the kernel interface. Multiple -addresses can be assigned. -``` -**Examples:** -```none -# IPv4 address -set interfaces vpp loopback vpplo1 address 192.168.1.10/24 - -# IPv6 address -set interfaces vpp loopback vpplo1 address 2001:db8::10/64 -``` -## MTU Configuration -```{cfgcmd} set interfaces vpp loopback \<vpploN\> mtu \<size\> - -Set the Maximum Transmission Unit (MTU) for the kernel interface. -The MTU must be compatible with the connected VPP interface. -``` -## VLAN Configuration -VPP kernel interfaces support VLAN (Virtual LAN) sub-interfaces for network -segmentation. - -### Creating VLAN Sub-interfaces -```{cfgcmd} set interfaces vpp loopback \<vpploN\> vif \<vlan-id\> - -Create a VLAN sub-interface with the specified VLAN ID (0-4094). -``` -### VLAN Sub-interface Configuration -VLAN sub-interfaces support the same configuration options as the parent -interface: -```{cfgcmd} set interfaces vpp loopback \<vpploN\> vif \<vlan-id\> address \<ip-address/prefix\> -``` - -```{cfgcmd} set interfaces vpp loopback \<vpploN\> vif \<vlan-id\> description \<description\> -``` - -```{cfgcmd} set interfaces vpp loopback \<vpploN\> vif \<vlan-id\> disable -``` - -```{cfgcmd} set interfaces vpp loopback \<vpploN\> vif \<vlan-id\> mtu \<size\> -``` -**Examples:** -```none -# Configure VLAN 100 -set interfaces vpp loopback vpplo1 vif 100 address 192.168.100.1/24 -set interfaces vpp loopback vpplo1 vif 100 description "Management VLAN" -set interfaces vpp loopback vpplo1 vif 100 mtu 1500 - -# Configure VLAN 200 -set interfaces vpp loopback vpplo1 vif 200 address 192.168.200.1/24 -set interfaces vpp loopback vpplo1 vif 200 description "Guest VLAN" -``` -## Configuration Examples -### Basic Loopback Interface -```none -# Create simple loopback -set interfaces vpp loopback vpplo1 -set interfaces vpp loopback vpplo1 description "Router ID interface" -``` -### Loopback with Kernel Interface -```none -# Loopback with management access -set interfaces vpp loopback vpplo2 -set interfaces vpp loopback vpplo2 description "Management loopback" -set interfaces vpp loopback vpplo2 address 10.255.255.1/32 -``` -### Bridge Virtual Interface (BVI) -```none -# Loopback as BVI for bridge -set interfaces vpp loopback vpplo3 -set interfaces vpp loopback vpplo3 description "Bridge gateway interface" -set interfaces vpp bridge vppbr1 -set interfaces vpp bridge vppbr1 member interface vpplo3 bvi -set interfaces vpp loopback vpplo3 address 192.168.100.1/24 -``` diff --git a/docs/vpp/configuration/interfaces/md-vxlan.md b/docs/vpp/configuration/interfaces/md-vxlan.md deleted file mode 100644 index 6fa1322a..00000000 --- a/docs/vpp/configuration/interfaces/md-vxlan.md +++ /dev/null @@ -1,132 +0,0 @@ ---- -lastproofread: '2026-03-13' ---- - -(vpp-config-interfaces-vxlan)= - -```{include} /_include/need_improvement.txt -``` - -# VPP VXLAN Configuration -VPP VXLAN interfaces provide virtual extensible local area network (VXLAN) -tunneling with high-performance packet processing. VXLAN extends Layer 2 -domains across Layer 3 networks using UDP encapsulation, enabling scalable -multi-tenant networking while leveraging VPP's optimized data plane. - -## Basic Configuration - -### Creating a VXLAN Interface -```{cfgcmd} set interfaces vpp vxlan \<vppvxlanN\> - -Create a VXLAN interface where ``<vppvxlanN>`` follows the naming -convention ``vppvxlan1``, ``vppvxlan2``, etc. -``` - -```{cfgcmd} set interfaces vpp vxlan \<vppvxlanN\> vni \<vni\> - -Set the Virtual Network Identifier (VNI) for the VXLAN tunnel. Valid range -is 0-16777214. -``` - -```{cfgcmd} set interfaces vpp vxlan \<vppvxlanN\> remote \<address\> - -Set the tunnel remote endpoint address. Supports both IPv4 and IPv6 -addresses. -``` - -```{cfgcmd} set interfaces vpp vxlan \<vppvxlanN\> source-address \<address\> - -Set the tunnel source address. Must match an address configured on the -local system. -``` -**Basic Example:** -```none -set interfaces vpp vxlan vppvxlan1 -set interfaces vpp vxlan vppvxlan1 vni 100 -set interfaces vpp vxlan vppvxlan1 remote 203.0.113.2 -set interfaces vpp vxlan vppvxlan1 source-address 192.168.1.1 -``` -## Interface Configuration -### Description and Administrative Control -```{cfgcmd} set interfaces vpp vxlan \<vppvxlanN\> description \<description\> - -Set a descriptive name for the VXLAN interface. -``` - -```{cfgcmd} set interfaces vpp vxlan \<vppvxlanN\> disable - -Administratively disable the VXLAN interface. -``` -### Kernel Interface Integration -The kernel interface is bound to the VXLAN tunnel for management and -application compatibility. - -## IP Address Configuration -```{cfgcmd} set interfaces vpp vxlan \<vppvxlanN\> address \<ip-address/prefix\> - -Configure IPv4 or IPv6 addresses on the kernel interface. Multiple -addresses can be assigned. -``` -**Examples:** -```none -set interfaces vpp vxlan vppvxlan1 address 192.168.1.10/24 -set interfaces vpp vxlan vppvxlan1 address 2001:db8::10/64 -``` -## MTU Configuration -```{cfgcmd} set interfaces vpp vxlan \<vppvxlanN\> mtu \<size\> - -Set the Maximum Transmission Unit (MTU) for the kernel interface. The MTU -must be compatible with the connected VPP interface. -``` -## Configuration Examples -### Basic VXLAN Tunnel -```none -# IPv4 VXLAN tunnel -set interfaces vpp vxlan vppvxlan1 -set interfaces vpp vxlan vppvxlan1 description "Tenant A network extension" -set interfaces vpp vxlan vppvxlan1 vni 1000 -set interfaces vpp vxlan vppvxlan1 remote 203.0.113.10 -set interfaces vpp vxlan vppvxlan1 source-address 192.168.1.1 -``` -### IPv6 VXLAN Tunnel -```none -# IPv6 endpoints -set interfaces vpp vxlan vppvxlan2 -set interfaces vpp vxlan vppvxlan2 vni 2000 -set interfaces vpp vxlan vppvxlan2 remote 2001:db8::2 -set interfaces vpp vxlan vppvxlan2 source-address 2001:db8::1 -``` -### VXLAN with Kernel Interface -```none -# VXLAN tunnel with management interface -set interfaces vpp vxlan vppvxlan3 -set interfaces vpp vxlan vppvxlan3 vni 3000 -set interfaces vpp vxlan vppvxlan3 remote 203.0.113.30 -set interfaces vpp vxlan vppvxlan3 source-address 192.168.1.1 -set interfaces vpp vxlan vppvxlan3 address 10.0.3.1/24 -``` -## Bridge Integration -VXLAN interfaces are commonly used as members in VPP bridges for Layer 2 -extension. See {doc}`bridge` for more information. -```none -# Add VXLAN tunnel to bridge -set interfaces vpp bridge vppbr1 -set interfaces vpp bridge vppbr1 member interface vppvxlan1 -set interfaces vpp bridge vppbr1 member interface eth1 -set interfaces vpp bridge vppbr1 member interface vpplo1 bvi -``` -### Multi-Tenant Configuration -```none -# Multiple VNIs for tenant separation -set interfaces vpp vxlan vppvxlan10 -set interfaces vpp vxlan vppvxlan10 description "Tenant A - Production" -set interfaces vpp vxlan vppvxlan10 vni 1001 -set interfaces vpp vxlan vppvxlan10 remote 203.0.113.20 -set interfaces vpp vxlan vppvxlan10 source-address 192.168.1.1 - -set interfaces vpp vxlan vppvxlan11 -set interfaces vpp vxlan vppvxlan11 description "Tenant A - Development" -set interfaces vpp vxlan vppvxlan11 vni 1002 -set interfaces vpp vxlan vppvxlan11 remote 203.0.113.21 -set interfaces vpp vxlan vppvxlan11 source-address 192.168.1.1 -``` diff --git a/docs/vpp/configuration/interfaces/md-xconnect.md b/docs/vpp/configuration/interfaces/md-xconnect.md deleted file mode 100644 index 0ee052d2..00000000 --- a/docs/vpp/configuration/interfaces/md-xconnect.md +++ /dev/null @@ -1,94 +0,0 @@ ---- -lastproofread: '2026-03-13' ---- - -(vpp-config-interfaces-xconnect)= - -```{include} /_include/need_improvement.txt -``` - -# VPP XConnect Configuration -VPP XConnect provides direct Layer 2 packet forwarding between two -interfaces with maximum transparency and minimal overhead. XConnect -creates a simple point-to-point bridge that forwards all Layer 2 packets -bidirectionally without MAC learning or flooding, making it ideal for -transparent connectivity scenarios. - -XConnect operates as a super-transparent bridge, forwarding all frames -between the connected interfaces without any packet inspection or -modification. This provides the simplest possible Layer 2 forwarding with -VPP's high-performance packet processing. - -## Comparison with Bridges -- **XConnect**: Point-to-point only, no MAC learning, maximum - transparency, minimal overhead -- **Bridge**: Multi-port, MAC learning, broadcast handling, more - features but higher overhead - -Choose XConnect when you need simple point-to-point Layer 2 forwarding -with maximum performance and transparency. Use bridges when you need -multi-port switching with MAC learning and broadcast handling. - -## Basic Configuration - -### Creating an XConnect Interface -```{cfgcmd} set interfaces vpp xconnect \<vppxconN\> - -Create an XConnect interface where ``<vppxconN>`` follows the naming -convention ``vppxcon1``, ``vppxcon2``, etc. -``` - -```{cfgcmd} set interfaces vpp xconnect \<vppxconN\> member interface \<interface-name\> - -Add an interface as a member of the XConnect. Exactly two member -interfaces must be configured to create bidirectional forwarding. -``` -**Basic Example:** -```none -set interfaces vpp xconnect vppxcon1 -set interfaces vpp xconnect vppxcon1 member interface eth0 -set interfaces vpp xconnect vppxcon1 member interface eth1 -``` -This configuration creates transparent forwarding between `eth0` and `eth1`, -where any packet received on either interface is immediately forwarded to -the other without any processing. - -## Interface Configuration -```{cfgcmd} set interfaces vpp xconnect \<vppxconN\> description \<description\> - -Set a descriptive name for the XConnect interface. -``` -## Configuration Examples -### Physical Interface XConnect -```none -# Connect two physical interfaces -set interfaces vpp xconnect vppxcon1 -set interfaces vpp xconnect vppxcon1 description "Transparent wire between ports" -set interfaces vpp xconnect vppxcon1 member interface eth0 -set interfaces vpp xconnect vppxcon1 member interface eth1 -``` -This creates a transparent wire between two physical ports, effectively -making them function as a single cable. - -### Tunnel to Physical XConnect -```none -# Connect tunnel to physical interface -set interfaces vpp xconnect vppxcon2 -set interfaces vpp xconnect vppxcon2 description "GRE tunnel to physical bridge" -set interfaces vpp xconnect vppxcon2 member interface vppgre1 -set interfaces vpp xconnect vppxcon2 member interface eth2 -``` -This forwards all traffic from a GRE tunnel directly to a physical -interface and vice versa. - -### Mixed Interface Types -```none -# Connect different interface types -set interfaces vpp xconnect vppxcon3 -set interfaces vpp xconnect vppxcon3 description "VXLAN to bonding bridge" -set interfaces vpp xconnect vppxcon3 member interface vppvxlan1 -set interfaces vpp xconnect vppxcon3 member interface vppbond0 -``` - -This demonstrates XConnect's flexibility in connecting various VPP interface -types. diff --git a/docs/vpp/configuration/md-acl.md b/docs/vpp/configuration/md-acl.md deleted file mode 100644 index 59b96070..00000000 --- a/docs/vpp/configuration/md-acl.md +++ /dev/null @@ -1,485 +0,0 @@ ---- -lastproofread: '2025-09-04' ---- - -(vpp-config-acl)= - -```{include} /_include/need_improvement.txt -``` - -# VPP ACL Configuration -VPP ACLs (Access Control Lists) provide a way to filter traffic passing through VPP interfaces. They offer a high-performance packet filtering solution that can be used as a fast firewall alternative. - -VyOS VPP ACL implementation supports two main types of access control lists: -- **IP ACLs** - Layer 3 filtering based on IPv4/IPv6 addresses, ports, and protocols (can be applied to both input and output directions) -- **MAC ACLs** - Layer 2 filtering based on MAC addresses and IP prefixes (can only be applied to input direction) - -## Structure and Components - -### Tags -ACL tags are named rule sets that contain one or more access control entries (ACEs). Tags provide a way to group related rules and apply them consistently across different interfaces. -- Tag names are user-defined text strings -- Each tag can contain multiple numbered rules -- Tags can be applied to interfaces in input or output direction -- Multiple tags can be applied to a single interface - -### Interface Application -ACL tags are applied to interfaces to control traffic flow: -- **Input direction**: Filters traffic entering the interface -- **Output direction**: Filters traffic leaving the interface - -:::{note} -**Important Limitation**: MAC ACLs can only be applied to the input direction of interfaces. They cannot filter outbound traffic. Use IP ACLs if you need to filter traffic in both directions. -::: - -### Rule Processing -Rules within an ACL are processed in numerical order (lowest to highest). The first matching rule determines the action taken on the packet. - -Available actions: -- `permit` - Allow the packet to continue -- `deny` - Drop the packet -- `permit-reflect` - Allow traffic and automatically permit return traffic - -## L3/IP ACLs -IP ACLs provide Layer 3 filtering capabilities based on IPv4 and IPv6 addresses, port numbers, and protocols. They support both stateless and stateful (reflexive) filtering. - -### Creating IP ACL Tags -IP ACL tags are created under the `vpp acl ip` configuration node: -```none -set vpp acl ip tag-name <tag-name> -set vpp acl ip tag-name <tag-name> description '<description>' -``` -Example: -```none -set vpp acl ip tag-name 'WEB-FILTER' -set vpp acl ip tag-name 'WEB-FILTER' description 'Web server access control' -``` -### Adding Rules to IP ACL Tags -Rules are added to IP ACL tags with specific rule numbers: -```none -set vpp acl ip tag-name <tag-name> rule <rule-number> -``` -#### Basic IP ACL Rule Configuration -Each rule requires an action and matching criteria: -```none -set vpp acl ip tag-name <tag-name> rule <rule-number> action <permit|deny|permit-reflect> -set vpp acl ip tag-name <tag-name> rule <rule-number> description '<description>' -set vpp acl ip tag-name <tag-name> rule <rule-number> protocol <protocol> -``` -**Actions:** -- `permit` - Allow matching traffic -- `deny` - Block matching traffic -- `permit-reflect` - Allow outbound traffic and automatically permit return traffic - -**Protocols:** -- `all` - Match all IP protocols (default) -- Or specific protocol by name, e.g. `tcp`, `udp`, `icmp` - -#### Source and Destination Matching -Configure source and destination parameters: -```none -# Source configuration -set vpp acl ip tag-name <tag-name> rule <rule-number> source prefix <ip-prefix> -set vpp acl ip tag-name <tag-name> rule <rule-number> source port <port-spec> - -# Destination configuration -set vpp acl ip tag-name <tag-name> rule <rule-number> destination prefix <ip-prefix> -set vpp acl ip tag-name <tag-name> rule <rule-number> destination port <port-spec> -``` -**Prefix Specification:** -- `<x.x.x.x/x>` - IPv4 prefix in CIDR notation -- `<h:h:h:h:h:h:h:h/x>` - IPv6 prefix in CIDR notation - -**Port Specification:** -- `<1-65535>` - Single port number -- `<start>-<end>` - Port range (e.g., 1001-1005) - -#### TCP Flags Matching -For TCP protocol rules, you can match specific TCP flags: -```none -# Match packets with specific flags set -set vpp acl ip tag-name <tag-name> rule <rule-number> tcp-flags is-set <ack|cwr|ecn|fin|psh|rst|syn|urg> - -# Match packets without specific flags set -set vpp acl ip tag-name <tag-name> rule <rule-number> tcp-flags is-not-set <ack|cwr|ecn|fin|psh|rst|syn|urg> -``` -### IP ACL Configuration Examples -#### Example 1: Basic Web Server ACL -```none -# Create ACL for web server access -set vpp acl ip tag-name 'WEB-SERVER' -set vpp acl ip tag-name 'WEB-SERVER' description 'Web server access control' - -# Allow HTTP traffic -set vpp acl ip tag-name 'WEB-SERVER' rule 10 action permit -set vpp acl ip tag-name 'WEB-SERVER' rule 10 protocol tcp -set vpp acl ip tag-name 'WEB-SERVER' rule 10 destination port 80 - -# Allow HTTPS traffic -set vpp acl ip tag-name 'WEB-SERVER' rule 20 action permit -set vpp acl ip tag-name 'WEB-SERVER' rule 20 protocol tcp -set vpp acl ip tag-name 'WEB-SERVER' rule 20 destination port 443 - -# Deny all other traffic -set vpp acl ip tag-name 'WEB-SERVER' rule 999 action deny -set vpp acl ip tag-name 'WEB-SERVER' rule 999 protocol all -``` -#### Example 2: Network Segmentation ACL -```none -# Create ACL for network segmentation -set vpp acl ip tag-name 'DMZ-FILTER' -set vpp acl ip tag-name 'DMZ-FILTER' description 'DMZ to internal network filter' - -# Allow specific internal subnet access -set vpp acl ip tag-name 'DMZ-FILTER' rule 10 action permit -set vpp acl ip tag-name 'DMZ-FILTER' rule 10 destination prefix '192.168.100.0/24' -set vpp acl ip tag-name 'DMZ-FILTER' rule 10 protocol tcp -set vpp acl ip tag-name 'DMZ-FILTER' rule 10 destination port 443 - -# Allow DNS queries -set vpp acl ip tag-name 'DMZ-FILTER' rule 20 action permit -set vpp acl ip tag-name 'DMZ-FILTER' rule 20 destination prefix '192.168.1.10/32' -set vpp acl ip tag-name 'DMZ-FILTER' rule 20 protocol udp -set vpp acl ip tag-name 'DMZ-FILTER' rule 20 destination port 53 - -# Block everything else to internal networks -set vpp acl ip tag-name 'DMZ-FILTER' rule 100 action deny -set vpp acl ip tag-name 'DMZ-FILTER' rule 100 destination prefix '192.168.0.0/16' -``` -#### Example 3: Reflexive ACL -```none -# Create reflexive ACL for outbound connections -set vpp acl ip tag-name 'OUTBOUND-REFLECT' -set vpp acl ip tag-name 'OUTBOUND-REFLECT' description 'Allow outbound with return traffic' - -# Allow outbound HTTP/HTTPS with return traffic -set vpp acl ip tag-name 'OUTBOUND-REFLECT' rule 10 action permit-reflect -set vpp acl ip tag-name 'OUTBOUND-REFLECT' rule 10 protocol tcp -set vpp acl ip tag-name 'OUTBOUND-REFLECT' rule 10 destination port 80 - -set vpp acl ip tag-name 'OUTBOUND-REFLECT' rule 20 action permit-reflect -set vpp acl ip tag-name 'OUTBOUND-REFLECT' rule 20 protocol tcp -set vpp acl ip tag-name 'OUTBOUND-REFLECT' rule 20 destination port 443 -``` -### Applying IP ACL Tags to Interfaces -IP ACL tags are applied to interfaces using the interface configuration: -```none -# Apply to input direction -set vpp acl ip interface <interface> input acl-tag <number> tag-name <tag-name> - -# Apply to output direction -set vpp acl ip interface <interface> output acl-tag <number> tag-name <tag-name> -``` -Where: -- `<interface>` - Interface name (e.g., eth0, eth1) -- `<number>` - ACL rule number (0-4294967295) for ordering multiple ACL tags -- `<tag-name>` - Name of the ACL tag to apply - -Multiple tags can be applied to the same interface and direction by using different ACL rule numbers. - -Example: -```none -# Apply web server ACL to input direction -set vpp acl ip interface eth0 input acl-tag 10 tag-name 'WEB-SERVER' - -# Apply outbound reflexive ACL to output direction -set vpp acl ip interface eth1 output acl-tag 10 tag-name 'OUTBOUND-REFLECT' - -# Apply multiple ACLs to the same interface and direction -set vpp acl ip interface eth0 input acl-tag 20 tag-name 'FIREWALL' -``` -## L2/MAC ACLs -MAC ACLs provide Layer 2 filtering capabilities based on MAC addresses and IP prefixes. They are particularly useful for controlling access at the data link layer. - -:::{important} -**Direction Limitation**: MAC ACLs can **only** be applied to the **input direction** of interfaces. They cannot filter outbound/output traffic. If you need bidirectional filtering, use IP ACLs instead. -::: - -### Creating MAC ACL Tags -MAC ACL tags are created under the `vpp acl mac` configuration node: -```none -set vpp acl mac tag-name <tag-name> -set vpp acl mac tag-name <tag-name> description '<description>' -``` -Example: -```none -set vpp acl mac tag-name 'MAC-FILTER' -set vpp acl mac tag-name 'MAC-FILTER' description 'Layer 2 MAC address filtering' -``` -### Adding Rules to MAC ACL Tags -Rules are added to MAC ACL tags with specific rule numbers: -```none -set vpp acl mac tag-name <tag-name> rule <rule-number> -``` -#### Basic MAC ACL Rule Configuration -Each rule requires an action and matching criteria: -```none -set vpp acl mac tag-name <tag-name> rule <rule-number> action <permit|deny> -set vpp acl mac tag-name <tag-name> rule <rule-number> description '<description>' -``` -**Actions:** -- `permit` - Allow matching traffic -- `deny` - Block matching traffic - -Note: MAC ACLs do not support the `permit-reflect` action available in IP ACLs. - -#### MAC Address Matching -Configure MAC address matching criteria: -```none -set vpp acl mac tag-name <tag-name> rule <rule-number> mac-address <mac-address> -set vpp acl mac tag-name <tag-name> rule <rule-number> mac-mask <mac-mask> -``` -**MAC Address Specification:** -- `mac-address` - Source MAC address to match (format: xx:xx:xx:xx:xx:xx) -- `mac-mask` - MAC address mask (default: ff:ff:ff:ff:ff:ff for exact match) - -The MAC mask allows for partial MAC address matching. For example: -\- `ff:ff:ff:00:00:00` matches the first 3 octets (OUI) -\- `ff:ff:ff:ff:ff:ff` matches the complete MAC address (default) - -#### IP Prefix Matching -Configure IP prefix matching for the source: -```none -set vpp acl mac tag-name <tag-name> rule <rule-number> prefix <ip-prefix> -``` -**Prefix Specification:** -- Supports both IPv4 and IPv6 prefixes in CIDR notation -- Examples: `192.168.1.0/24`, `10.0.0.0/8`, `2001:db8::/32` - -### MAC ACL Configuration Examples - -#### Example 1: Device Whitelist -```none -# Create MAC ACL for device whitelisting -set vpp acl mac tag-name 'DEVICE-WHITELIST' -set vpp acl mac tag-name 'DEVICE-WHITELIST' description 'Allow only approved devices' - -# Allow specific workstation -set vpp acl mac tag-name 'DEVICE-WHITELIST' rule 10 action permit -set vpp acl mac tag-name 'DEVICE-WHITELIST' rule 10 mac-address '00:1b:21:12:34:56' -set vpp acl mac tag-name 'DEVICE-WHITELIST' rule 10 prefix '192.168.1.100/32' -set vpp acl mac tag-name 'DEVICE-WHITELIST' rule 10 description 'Admin workstation' - -# Allow specific server -set vpp acl mac tag-name 'DEVICE-WHITELIST' rule 20 action permit -set vpp acl mac tag-name 'DEVICE-WHITELIST' rule 20 mac-address '00:1b:21:78:90:ab' -set vpp acl mac tag-name 'DEVICE-WHITELIST' rule 20 prefix '192.168.1.10/32' -set vpp acl mac tag-name 'DEVICE-WHITELIST' rule 20 description 'Web server' - -# Deny everything else -set vpp acl mac tag-name 'DEVICE-WHITELIST' rule 999 action deny -set vpp acl mac tag-name 'DEVICE-WHITELIST' rule 999 mac-address '00:00:00:00:00:00' -set vpp acl mac tag-name 'DEVICE-WHITELIST' rule 999 mac-mask '00:00:00:00:00:00' -``` -#### Example 2: Vendor-Based Filtering -```none -# Create MAC ACL for vendor-based filtering -set vpp acl mac tag-name 'VENDOR-FILTER' -set vpp acl mac tag-name 'VENDOR-FILTER' description 'Filter by MAC vendor OUI' - -# Deny Realtek devices (OUI: 00:e0:4c) -set vpp acl mac tag-name 'VENDOR-FILTER' rule 10 action deny -set vpp acl mac tag-name 'VENDOR-FILTER' rule 10 mac-address '00:e0:4c:00:00:00' -set vpp acl mac tag-name 'VENDOR-FILTER' rule 10 mac-mask 'ff:ff:ff:00:00:00' -set vpp acl mac tag-name 'VENDOR-FILTER' rule 10 description 'Block Realtek devices' - -# Allow all other devices -set vpp acl mac tag-name 'VENDOR-FILTER' rule 100 action permit -set vpp acl mac tag-name 'VENDOR-FILTER' rule 100 mac-address '00:00:00:00:00:00' -set vpp acl mac tag-name 'VENDOR-FILTER' rule 100 mac-mask '00:00:00:00:00:00' -set vpp acl mac tag-name 'VENDOR-FILTER' rule 100 description 'Allow all other vendors' -``` -#### Example 3: Network Segmentation by MAC -```none -# Create MAC ACL for network segmentation -set vpp acl mac tag-name 'SEGMENT-FILTER' -set vpp acl mac tag-name 'SEGMENT-FILTER' description 'Segment networks by MAC/IP binding' - -# Allow management VLAN devices -set vpp acl mac tag-name 'SEGMENT-FILTER' rule 10 action permit -set vpp acl mac tag-name 'SEGMENT-FILTER' rule 10 mac-address '02:01:00:00:00:00' -set vpp acl mac tag-name 'SEGMENT-FILTER' rule 10 mac-mask 'ff:ff:00:00:00:00' -set vpp acl mac tag-name 'SEGMENT-FILTER' rule 10 prefix '10.1.0.0/16' -set vpp acl mac tag-name 'SEGMENT-FILTER' rule 10 description 'Management VLAN' - -# Allow user VLAN devices -set vpp acl mac tag-name 'SEGMENT-FILTER' rule 20 action permit -set vpp acl mac tag-name 'SEGMENT-FILTER' rule 20 mac-address '02:02:00:00:00:00' -set vpp acl mac tag-name 'SEGMENT-FILTER' rule 20 mac-mask 'ff:ff:00:00:00:00' -set vpp acl mac tag-name 'SEGMENT-FILTER' rule 20 prefix '10.2.0.0/16' -set vpp acl mac tag-name 'SEGMENT-FILTER' rule 20 description 'User VLAN' -``` -### Applying MAC ACL Tags to Interfaces -MAC ACL tags can only be applied to the input direction of interfaces: -```none -set vpp acl mac interface <interface> tag-name <tag-name> -``` -:::{note} -**Syntax Difference**: Unlike IP ACLs, MAC ACL interface application does not use the `acl-tag <number>` structure since only single MAC ACLs can be applied. -::: - -:::{warning} -Unlike IP ACLs, MAC ACLs do **not** support output direction filtering. There is no `output` option available for MAC ACL interface application. -::: -Example: -```none -# Apply MAC filtering to interface input -set vpp acl mac interface eth0 tag-name 'MAC-FILTER' -set vpp acl mac interface eth1 tag-name 'DEVICE-WHITELIST' -``` -## Configuration Best Practices - -### Rule Ordering -- **Number rules strategically**: Use gaps between rule numbers (10, 20, 30) to allow for future insertions -- **Place specific rules first**: More specific matches should have lower rule numbers -- **End with catch-all**: Always include a final rule that matches all traffic with explicit action -- **Document rules**: Use descriptions for complex rules to aid troubleshooting - -### Performance Considerations -- **Minimize rule count**: Fewer rules generally mean better performance -- **Use appropriate ACL type**: Use MAC ACLs for Layer 2/3 filtering, IP ACLs for Layer 3/4 filtering -- **Consider direction limitations**: Remember that MAC ACLs only work on input traffic; use IP ACLs for filtering in both directions -- **Combine related rules**: Group similar filtering requirements into single ACL tags -- **Apply strategically**: Apply ACLs at ingress points where possible to minimize processing - -## Troubleshooting - -### Common Issues -- **ACL not taking effect:** - - Verify ACL is applied to correct interface and direction - - Check rule numbering and order - - Ensure interface is properly configured in VPP -- **Performance degradation:** - - Review ACL complexity and rule count - - Consider consolidating rules - - Check for unnecessary broad matches -- **Traffic blocked unexpectedly:** - - Review rule order (first match wins) - - Check for overly restrictive rules - - Verify protocol and port specifications - -### Verification Commands -Use these commands to verify ACL configuration and operation: -```none -# Show VPP ACL configuration -show configuration commands | grep "vpp acl" - -# Show VPP interface configuration -show configuration commands | grep "vpp acl.*interface" - -# View commit history for ACL changes -show configuration commit-revisions | grep -A5 -B5 "vpp acl" -``` -## Operational Commands -VyOS provides several operational commands to monitor and troubleshoot VPP ACL configurations and their status. - -### Viewing All ACLs -Display all configured ACLs (both IP and MAC): -```{opcmd} show vpp acl -``` -This command shows a summary of all configured ACL tags with their rules, displaying both IP ACLs and MAC ACLs in a tabular format. -Example output: -```none ---------------------------------- -IP ACL "tag-name WEB-SERVER" acl_index 0 - -Rule Action Src prefix Src port Dst prefix Dst port Proto TCP flags set TCP flags not set ------- -------- ------------ ---------- ------------ ---------- ------- --------------- ------------------- - 10 permit 0.0.0.0/0 0-65535 0.0.0.0/0 80 6 - 20 permit 0.0.0.0/0 0-65535 0.0.0.0/0 443 6 - 999 deny 0.0.0.0/0 0-65535 0.0.0.0/0 0-65535 0 - ---------------------------------- -MACIP ACL "tag-name VENDOR-FILTER" acl_index 0 - -Rule Action IP prefix MAC address MAC mask ------- -------- ----------- ----------------- ----------------- - 10 deny 0.0.0.0/0 00:e0:4c:00:00:00 ff:ff:ff:00:00:00 - 100 permit 0.0.0.0/0 00:00:00:00:00:00 00:00:00:00:00:00 -``` -### IP ACL Commands -View all IP ACLs: -```{opcmd} show vpp acl ip -``` -View IP ACL interface assignments: -```{opcmd} show vpp acl ip interface -``` -Example output: -```none -Interface Input ACLs Output ACLs ------------ ------------ ------------- -eth1 WEB-SERVER -``` -View specific IP ACL by tag name: -```{opcmd} show vpp acl ip tag-name \<tag-name\> -``` -Example: -```none -vyos@vyos:~$ show vpp acl ip tag-name WEB-SERVER - ---------------------------------- -IP ACL "tag-name WEB-SERVER" acl_index 0 - - Rule Action Src prefix Src port Dst prefix Dst port Proto TCP flags set TCP flags not set ------- -------- ------------ ---------- ------------ ---------- ------- --------------- ------------------- - 10 permit 0.0.0.0/0 0-65535 0.0.0.0/0 80 6 - 20 permit 0.0.0.0/0 0-65535 0.0.0.0/0 443 6 - 999 deny 0.0.0.0/0 0-65535 0.0.0.0/0 0-65535 0 -``` -### MAC ACL Commands -View all MAC ACLs: -```{opcmd} show vpp acl mac -``` -View MAC ACL interface assignments: -```{opcmd} show vpp acl mac interface -``` -Example output: -```none -Interface ACL ------------ ----- -eth0 VENDOR-FILTER -``` -View specific MAC ACL by tag name: -```{opcmd} show vpp acl mac tag-name \<tag-name\> -``` -Example: -```none -vyos@vyos:~$ show vpp acl mac tag-name VENDOR-FILTER - ---------------------------------- -MACIP ACL "tag-name VENDOR-FILTER" acl_index 0 - - Rule Action IP prefix MAC address MAC mask ------- -------- ----------- ----------------- ----------------- - 10 deny 0.0.0.0/0 00:e0:4c:00:00:00 ff:ff:ff:00:00:00 - 100 permit 0.0.0.0/0 00:00:00:00:00:00 00:00:00:00:00:00 -``` - -### Understanding Command Output - -**IP ACL Output Fields:** - -- **Rule**: Rule number within the ACL -- **Action**: permit, deny, or permit-reflect -- **Src prefix**: Source IP prefix (0.0.0.0/0 = any source) -- **Src port**: Source port range (0-65535 = any port) -- **Dst prefix**: Destination IP prefix -- **Dst port**: Destination port or port range -- **Proto**: IP protocol number (6=TCP, 17=UDP, 1=ICMP, 0=any) -- **TCP flags set**: Required TCP flags (for TCP protocol) -- **TCP flags not set**: Prohibited TCP flags (for TCP protocol) - -**MAC ACL Output Fields:** - -- **Rule**: Rule number within the ACL -- **Action**: permit or deny -- **IP prefix**: Source IP prefix constraint -- **MAC address**: Source MAC address to match -- **MAC mask**: MAC address mask for partial matching - -**Interface Assignment Output:** - -- Shows which interfaces have ACLs applied -- **Input ACLs**: ACL tags applied to incoming traffic -- **Output ACLs**: ACL tags applied to outgoing traffic (IP ACLs only) -- **ACL**: MAC ACL tag applied to interface (input only) diff --git a/docs/vpp/configuration/md-index.md b/docs/vpp/configuration/md-index.md deleted file mode 100644 index 7e02ae74..00000000 --- a/docs/vpp/configuration/md-index.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -lastproofread: '2025-09-04' ---- - -(vpp-dconfig-index)= - -```{include} /_include/need_improvement.txt -``` - -# VPP Configuration -VPP settings consist of several main sections. - -Main Dataplane settings and internal VPP interfaces: -```{toctree} -:includehidden: true -:maxdepth: 1 - -dataplane/index -interfaces/index -``` -Features that can be enabled on VPP Dataplane: -```{toctree} -:includehidden: true -:maxdepth: 1 - -acl -ipfix -ipsec -nat/index -sflow -``` - -## VPP Initialization - -When VPP Dataplane is configured and the configuration is committed, VyOS will attempt to start VPP and initialize all interfaces assigned to it. During this process the following steps occur: - -1. VyOS checks that the system meets all requirements for VPP operation. If any requirement is not met, VPP will not start and an error message will be displayed. -2. VPP is started and its initial configuration is applied. -3. All interfaces assigned to VPP are initialized and brought up. -4. A special virtual interfaces are reinstalled to the kernel with the same names as interfaces that were attached to VPP to maintain compatibility with the configuration. -5. VyOS configuration initializes those virtual interfaces, so that features that exist only in kernel dataplane continue to operate. diff --git a/docs/vpp/configuration/md-ipfix.md b/docs/vpp/configuration/md-ipfix.md deleted file mode 100644 index 7ed2aee3..00000000 --- a/docs/vpp/configuration/md-ipfix.md +++ /dev/null @@ -1,50 +0,0 @@ -# VPP IPFIX Configuration - -VPP IPFIX in VyOS allows monitoring and exporting network traffic flows -for analytics, security, and accounting. IPFIX works with the VPP -(Vector Packet Processing) backend to provide high-performance flow tracking. - -## Overview - -VyOS integrates VPP for high-performance packet processing. IPFIX -configuration controls how flows are monitored, exported, and which -interfaces are included. - -## Key IPFIX Concepts - -- **Active timeout**: Maximum time a flow is kept active before export. -- **Inactive timeout**: Maximum time an idle flow is kept before export. -- **Collector**: The remote host and port to which flow records are sent. -- **Flow layers**: Determines which layer information is included - (`l2`, `l3`, `l4`). -- **Interfaces**: Physical or virtual interfaces to monitor. -- **Direction**: Which traffic to monitor (`rx`, `tx`, `both`). -- **Flow variant**: Optional filter for IPv4 or IPv6 flows. - -## Configuration Options - -- **active-timeout**: Duration (in seconds) after which active flows - are exported. -- **inactive-timeout**: Duration (in seconds) after which idle flows - are exported. -- **collector \`\<ip>\` port \`\<port>\`**: IP and UDP port of the IPFIX collector. -- **collector \`\<ip>\` source-address \`\<ip>\`**: Source address for flow export. -- **flowprobe-record \`\<l2|l3|l4>\`**: Layers to include in flow records. -- **interface** `<interface>` **\[direction** `<rx|tx|both>`**\]** - **\[flow-variant** `<ipv4|ipv6>`**\]**: Interfaces to monitor, - direction of traffic, and optional flow variant filter. - -## Example Configuration - -```none -set vpp ipfix active-timeout '15' -set vpp ipfix inactive-timeout '120' -set vpp ipfix collector 192.0.2.2 port '4739' -set vpp ipfix collector 192.0.2.2 source-address '192.0.2.1' -set vpp ipfix flowprobe-record 'l2' -set vpp ipfix flowprobe-record 'l3' -set vpp ipfix flowprobe-record 'l4' -set vpp ipfix interface eth0 -set vpp ipfix interface eth1 direction 'both' -set vpp ipfix interface eth1 flow-variant 'ipv4' -``` diff --git a/docs/vpp/configuration/md-sflow.md b/docs/vpp/configuration/md-sflow.md deleted file mode 100644 index 752b8377..00000000 --- a/docs/vpp/configuration/md-sflow.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -lastproofread: '2025-09-04' ---- - -(vpp-config-sflow)= - -```{include} /_include/need_improvement.txt -``` - -# VPP sFlow Configuration -VPP Dataplane in VyOS support sFlow for traffic monitoring and analysis. - -The VPP Dataplane integration works hand-in-hand with normal kernel sFlow agent, which is responsible for collecting and exporting sFlow samples. VPP itself is responsible for generating the samples. - -To enable sFlow in VPP, you first need to configure the service using the same steps as for normal kernel sFlow agent, as described in {doc}`/configuration/system/sflow`. Then you can enable sFlow on VPP interfaces. - -Then, you need to enable sFlow on the VPP interfaces you want to monitor. This is done using the following commands: -```{cfgcmd} set vpp sflow interface \<interface-name\> -``` -This will enable sFlow on the specified interface. You can repeat this command for each interface you want to monitor. - -:::{note} -sFlow collects statistics only for traffic *received* on the interface. If you want to monitor traffic *sent* on the interface, you need to enable sFlow on the corresponding interface in the opposite direction. -::: -Optionally, you can specify the number of bytes from each packet that should be included in the sFlow sample using the following command: -```{cfgcmd} set vpp sflow header-bytes \<bytes\> -``` -This defines the size of the packet header (in bytes) captured for each sFlow sample. - -The sampling rate is configured globally under the `system sflow` section and automatically applied to VPP sFlow. -This ensures consistent sampling behavior between the system and VPP, and prevents configuration conflicts. - -Finally, you need to enable integration between VPP and the kernel sFlow agent using the following command: -```{cfgcmd} set system sflow vpp -``` - -After this, collecting and exporting sFlow samples will be handled by the kernel sFlow agent, while VPP will generate the samples. diff --git a/docs/vpp/configuration/nat/md-index.md b/docs/vpp/configuration/nat/md-index.md deleted file mode 100644 index 4d5c01d1..00000000 --- a/docs/vpp/configuration/nat/md-index.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -lastproofread: '2026-03-05' ---- - -(vpp-config-nat-index)= - -```{include} /_include/need_improvement.txt - -``` -# VPP NAT Configuration - -```{toctree} -:includehidden: true -:maxdepth: 1 - -cgnat -nat44 -``` - -VPP Dataplane in VyOS supports two types of NAT: - -## NAT44 - -This type is a classic NAT implementation where you can configure static -and dynamic NAT rules. It supports both source and destination NAT. While the -configuration may look a bit unusual compared to traditional NAT -implementations, it provides flexibility in network configurations. - -## CGNAT - -CGNAT is a special type of NAT44, which is highly useful when you have -multiple local customers and a limited number of public IP addresses. It -shares the public IP address space fairly between customers by using a -combination of IP address and port number to distinguish between them. - -ISPs often use this NAT type to provide internet access to customers. - -It supports only source NAT. - -CGNAT also supports exclude rules (identity mappings) to bypass translation -for selected local addresses or protocol/port tuples. diff --git a/docs/vpp/configuration/nat/md-nat44.md b/docs/vpp/configuration/nat/md-nat44.md deleted file mode 100644 index a0805ed3..00000000 --- a/docs/vpp/configuration/nat/md-nat44.md +++ /dev/null @@ -1,653 +0,0 @@ ---- -lastproofread: '2026-03-05' ---- - -(vpp-config-nat-nat44)= - -```{include} /_include/need_improvement.txt -``` - -# VPP NAT44 Configuration -NAT44 has two main use cases: -- **Source NAT (SNAT)**: Enabling internet access for hosts in private - networks using dynamic or static address translation. -- **Destination NAT (DNAT)**: Providing external access to internal services - through static port forwarding rules. - -VyOS supports both dynamic translation using address pools and static -mappings for predictable address translation requirements. - -Configuring NAT44 involves a few steps: -1. Define the inside and outside interfaces. -2. Create NAT rules for SNAT or DNAT. - -## Dynamic and Static Operations -NAT44 configuration can be done in one of two ways or in both ways -simultaneously: -1. Dynamically performing NAT using a pool of public IP addresses. -2. Statically mapping private IP addresses to public IP addresses. - -To configure dynamic NAT, you need to define a pool of public IP -addresses that will be used for translation. This offers an easy way to -provide internet access to internal users. - -Static rules are suitable for scenarios where you need consistent and -predictable mappings between private and public IP addresses. They are also -the only way to configure DNAT. - -### NAT Rule Processing and Traffic Flow -This section explains how different combinations of NAT rules affect -traffic handling on a router. There are three possible combinations of NAT -rule configurations: -1. **Dynamic NAT Only** - - **All** traffic received on the "in" interface is processed by - dynamic NAT rules without exceptions. -2. **Dynamic + Static NAT** - - **All** traffic received on the "in" interface is first matched - against static NAT rules. - - If no match is found, it is then processed against dynamic NAT rules. -3. **Static NAT Only** - - **All** traffic on the "in" interface is checked against static NAT - rules. - - If no match is found, the traffic is routed **without NAT**. - -:::{important} -- If **dynamic NAT rules** are present, **all** traffic received on - "in" interfaces is subject to NAT processing. -- If **only static NAT rules** are configured, traffic that does not - match any static rule is routed unchanged. -::: - -## Interfaces Configuration -The first step in configuring NAT44 is defining which interfaces handle -inside (private) and outside (public) traffic. VyOS uses these interface -designations to determine the direction of translation. - -### Inside Interfaces -Inside interfaces connect to private networks where hosts need source NAT -to access external networks. -```{cfgcmd} set vpp nat nat44 interface inside \<inside-interface\> -``` -Traffic flowing **from** inside interfaces gets source NAT applied, -translating private source addresses to public addresses from the -translation pool. - -### Outside Interfaces -Outside interfaces connect to public networks where external hosts may -need to access internal services. -```{cfgcmd} set vpp nat nat44 interface outside \<outside-interface\> -``` -Traffic flowing **to** outside interfaces can trigger destination NAT -based on static rules, allowing external access to internal services. - -### Interface Roles and Traffic Flow - -:::{note} -While VyOS uses "inside" and "outside" as established conventions, -the technical definitions are: -- **Inside interface**: Interface where traffic originates that needs - source NAT (SNAT) -- **Outside interface**: Interface where traffic originates that needs - destination NAT (DNAT) - -In complex network topologies, the same physical interface can be -configured as both inside and outside to handle bidirectional NAT -scenarios. -::: -**Traffic Processing:** -1. **Inside → Outside** (SNAT): Private hosts accessing external networks -2. **Outside → Inside** (DNAT): External hosts accessing internal services - via static rules -3. **Dynamic NAT**: Created automatically for inside→outside traffic -4. **Static NAT**: Requires explicit configuration for outside→inside - traffic - -### Multiple Interface Support -You can configure multiple interfaces as inside or outside to support -complex network topologies: -```none -# Multiple inside interfaces (different private networks) -set vpp nat nat44 interface inside eth0 -set vpp nat nat44 interface inside eth2 - -# Multiple outside interfaces (redundancy or load balancing) -set vpp nat nat44 interface outside eth1 -set vpp nat nat44 interface outside eth3 -``` -## Address Pool Configuration -Address pools define ranges of IP addresses that can be used for NAT -translations. VyOS NAT44 supports two types of address pools, each serving -different purposes. - -### Translation Pools -Translation pools are used for dynamic source NAT (SNAT). They provide a -range of public IP addresses that can be dynamically assigned to private -hosts when they access external networks. -```{cfgcmd} set vpp nat nat44 address-pool translation address \<ip-address | ip-address-range\> -``` - -```{cfgcmd} set vpp nat nat44 address-pool translation interface \<interface-name\> -``` -**Examples:** -```none -# Single address pool -set vpp nat nat44 address-pool translation address 203.0.113.10 - -# Address range pool -set vpp nat nat44 address-pool translation address 203.0.113.10-203.0.113.20 - -# Interface-based pool (use a first IP assigned to the interface) -set vpp nat nat44 address-pool translation interface eth1 -``` -### Twice-NAT Pools -Twice-NAT pools are used when performing both source and destination NAT on -the same traffic flow. This is particularly useful in scenarios where you -need to: -- Translate both source and destination addresses -- Provide access between networks with overlapping IP ranges -- Implement advanced NAT scenarios like self-twice-nat -```{cfgcmd} set vpp nat nat44 address-pool twice-nat address \<ip-address | ip-address-range\> -``` - -```{cfgcmd} set vpp nat nat44 address-pool twice-nat interface \<interface-name\> -``` -**Examples:** -```none -# Twice-NAT pool for advanced scenarios -set vpp nat nat44 address-pool twice-nat address 192.168.100.1-192.168.100.10 - -# Interface-based twice-nat pool -set vpp nat nat44 address-pool twice-nat interface eth2 -``` -### Pool Requirements - -:::{important} -- For dynamic NAT to work, you must configure at least one - **translation** pool. -- For static rules with twice-nat options, you must configure a - **twice-nat** pool. -- Interface-based pools automatically include main (first) IP address - assigned to the specified interface. -::: - -### Pool Selection Priority -When multiple pools are configured, VyOS uses the following selection -priority: -1. **Static mappings**: Always use the specific external address defined in - the rule. -2. **Dynamic NAT**: Use available addresses from translation pools in the - order they were configured. -3. **Twice-NAT**: Use addresses from twice-nat pools for secondary - translation. - -:::{note} -As soon as you have configured interfaces and pool, the NAT44 is -operational. -::: - -## Static Rules Configuration -Static NAT rules provide predictable and consistent mappings between private -and public IP addresses. They are essential for: -- **Destination NAT (DNAT)**: Allowing external hosts to access services in - the private network. -- **Server publishing**: Making internal services available from the - Internet. -- **Consistent mappings**: Ensuring the same private IP always maps to the - same public IP. - -Unlike dynamic NAT that uses a pool of addresses, static rules create -one-to-one mappings that persist until explicitly removed. - -### Basic Static Rule Configuration -To create a static NAT rule, you need to define the local (internal) and -external (public) address mappings: -```{cfgcmd} set vpp nat nat44 static rule \<rule-number\> local address \<internal-ip\> -``` - -```{cfgcmd} set vpp nat nat44 static rule \<rule-number\> external address \<external-ip\> -``` -Where: -- `<rule-number>` is a unique identifier for the rule -- `<internal-ip>` is the private IP address in your local network -- `<external-ip>` is the public IP address that external hosts will use - -This basic configuration creates a static one-to-one mapping. Traffic from -outside to the external IP will be translated to the internal IP, and vice -versa. - -### Port-based Static Rules -For more granular control, you can create port-specific static rules. This -is useful when you want to publish specific services: -```{cfgcmd} set vpp nat nat44 static rule \<rule-number\> local address \<internal-ip\> -``` - -```{cfgcmd} set vpp nat nat44 static rule \<rule-number\> local port \<internal-port\> -``` - -```{cfgcmd} set vpp nat nat44 static rule \<rule-number\> external address \<external-ip\> -``` - -```{cfgcmd} set vpp nat nat44 static rule \<rule-number\> external port \<external-port\> -``` - -```{cfgcmd} set vpp nat nat44 static rule \<rule-number\> protocol \<protocol\> -``` -Where: -- `<internal-port>` and `<external-port>` are the port numbers used by - the connection. -- `<protocol>` specifies the protocol (tcp, udp, icmp). - -:::{important} -If you do not specify ports and protocol, the rule will apply to *all* -traffic between the specified internal and external addresses. - -Rules must contain either both ports and protocol, or neither. -::: - -### Advanced Static Rule Options -VyOS NAT44 supports several advanced options for static rules: - -#### Twice-NAT -Twice-NAT performs both source and destination NAT. When an external host -accesses an internal service, the source IP of such a connection is -translated to an address from the twice-NAT address pool. - -This is practical in scenarios where internal services cannot connect to -public networks, so they see such traffic as internal. - -The twice-NAT option can be enabled with the following command: -```{cfgcmd} set vpp nat nat44 static rule \<rule-number\> options twice-nat -``` -#### Self Twice-NAT -Self Twice-NAT is used when a local host needs to access itself via the -external address: -```{cfgcmd} set vpp nat nat44 static rule \<rule-number\> options self-twice-nat -``` -This option rewrites source IP addresses on packets sent only from a local -address to an external address configured in a rule. - -:::{important} -- Using `self-twice-nat` option requires you to set the interface - connected to the local network as both inside and outside, because - both source and destination NAT need to be applied. -- External IP address used in static rules must belong to one of the - configured translation pools. -::: - -#### Out-to-In Only -Restricts the rule to only apply to traffic from outside to inside -interfaces: -```{cfgcmd} set vpp nat nat44 static rule \<rule-number\> options out-to-in-only -``` -This prevents the creation of sessions from the inside interface, making it -a purely DNAT rule. - -#### Force Twice-NAT Address -When using twice-nat, you can force the use of a specific IP address from -the twice-nat address pool: -```{cfgcmd} set vpp nat nat44 static rule \<rule-number\> options twice-nat-address \<ip-address\> -``` -#### Rule Description -To document your rules, you can add a description: -```{cfgcmd} set vpp nat nat44 static rule \<rule-number\> description \<description\> -``` -### Static Rules Configuration Examples -**Full one-to-one NAT mapping:** -```none -set vpp nat nat44 static rule 100 local address 192.168.1.10 -set vpp nat nat44 static rule 100 external address 203.0.113.10 -set vpp nat nat44 static rule 100 description "One-to-one mapping" -``` -**Port-specific SSH access:** -```none -set vpp nat nat44 static rule 200 local address 192.168.1.20 -set vpp nat nat44 static rule 200 local port 22 -set vpp nat nat44 static rule 200 external address 203.0.113.10 -set vpp nat nat44 static rule 200 external port 2222 -set vpp nat nat44 static rule 200 protocol tcp -set vpp nat nat44 static rule 200 description "SSH access to server" -``` -**Twice-NAT for local service access:** -```none -set vpp nat nat44 static rule 300 local address 192.168.1.30 -set vpp nat nat44 static rule 300 local port 80 -set vpp nat nat44 static rule 300 external address 203.0.113.10 -set vpp nat nat44 static rule 300 external port 80 -set vpp nat nat44 static rule 300 protocol tcp -set vpp nat nat44 static rule 300 options twice-nat -set vpp nat nat44 static rule 300 description "Web service with twice-nat" -``` -:::{note} -When using twice-nat or self-twice-nat options, ensure you have -configured a twice-nat address pool using: -```none -set vpp nat nat44 address-pool twice-nat address <twice-nat-ip-range> -``` -::: - -## Exclude Rules Configuration -Exclude rules allow you to prevent specific traffic from undergoing NAT -translation. This is particularly useful for: -- **Router management**: Allowing SSH access to the router itself from - external networks. -- **Service bypass**: Excluding specific services from NAT processing -- **Traffic forwarding**: Allowing forwarded traffic to bypass NAT with 1-to-1 - mapping. - -Exclude rules take precedence over both dynamic and static NAT rules, -ensuring that matching traffic bypasses NAT processing. For forwarded -traffic, exclude rules create invisible 1-to-1 mappings that allow packets -to pass through without NAT modifications. - -### Basic Exclude Rule Configuration -To create an exclude rule, you need to specify the traffic characteristics -that should bypass NAT. You can configure exclude rules in two ways: - -**Option 1: Using local address** -```{cfgcmd} set vpp nat nat44 exclude rule \<rule-number\> local-address \<internal-ip\> -``` -**Option 2: Using external interface** -```{cfgcmd} set vpp nat nat44 exclude rule \<rule-number\> external-interface \<interface-name\> -``` -Where: -- `<rule-number>` is a unique identifier for the exclude rule. -- `<internal-ip>` is the local IP address that should be excluded from - : NAT. -- `<interface-name>` is the external interface where the traffic - : originates. - -:::{important} -You must use either `local-address` OR `external-interface` in an -exclude rule, but not both simultaneously. These options are mutually -exclusive. -::: - -### Port-specific Exclude Rules -For more granular control, you can exclude only specific ports and protocols. -You can combine port and protocol specifications with either `local-address` or -`external-interface`: - -**With local address:** -```{cfgcmd} set vpp nat nat44 exclude rule \<rule-number\> local-address \<internal-ip\> -``` - -```{cfgcmd} set vpp nat nat44 exclude rule \<rule-number\> local-port \<port-number\> -``` - -```{cfgcmd} set vpp nat nat44 exclude rule \<rule-number\> protocol \<protocol\> -``` -**With external interface:** -```{cfgcmd} set vpp nat nat44 exclude rule \<rule-number\> external-interface \<interface-name\> -``` - -```{cfgcmd} set vpp nat nat44 exclude rule \<rule-number\> local-port \<port-number\> -``` - -```{cfgcmd} set vpp nat nat44 exclude rule \<rule-number\> protocol \<protocol\> -``` -Where: -- `<port-number>` is the specific port to exclude (1-65535) -- `<protocol>` can be `tcp`, `udp`, `icmp`, or `all` (default) - -### Rule Documentation -Add descriptions to your exclude rules for better management: -```{cfgcmd} set vpp nat nat44 exclude rule \<rule-number\> description \<description\> -``` -### Exclude Rules Configuration Examples -**Exclude SSH access to router:** -```none -# Allow external SSH access to router without NAT -set vpp nat nat44 exclude rule 10 local-address 192.168.1.1 -set vpp nat nat44 exclude rule 10 local-port 22 -set vpp nat nat44 exclude rule 10 protocol tcp -set vpp nat nat44 exclude rule 10 description "SSH access to router" -``` -**Exclude SNMP monitoring:** -```none -# Allow SNMP monitoring without NAT translation -set vpp nat nat44 exclude rule 20 local-port 161 -set vpp nat nat44 exclude rule 20 protocol udp -set vpp nat nat44 exclude rule 20 external-interface eth1 -set vpp nat nat44 exclude rule 20 description "SNMP monitoring" -``` -**Exclude all traffic to router management interface:** -```none -# Exclude all traffic to router's management IP -set vpp nat nat44 exclude rule 30 local-address 192.168.100.1 -set vpp nat nat44 exclude rule 30 description "Management interface bypass" -``` -**Exclude all traffic from external interface:** -```none -# Exclude all traffic from external interface (alternative approach) -set vpp nat nat44 exclude rule 31 external-interface eth1 -set vpp nat nat44 exclude rule 31 description "External interface bypass" -``` -**Exclude forwarded traffic for specific service:** -```none -# Allow external access to internal server without NAT translation -set vpp nat nat44 exclude rule 40 local-address 192.168.1.50 -set vpp nat nat44 exclude rule 40 local-port 8080 -set vpp nat nat44 exclude rule 40 protocol tcp -set vpp nat nat44 exclude rule 40 description "Direct access to internal service" -``` -### Common Use Cases -**Router Administration:** - -Exclude rules are essential when you need to manage the router from external -networks. Without exclude rules, NAT would attempt to translate the router's -own traffic, potentially breaking management connections. - -**Service Monitoring:** - -Network monitoring systems often need direct access to router services. -Exclude rules ensure that monitoring traffic bypasses NAT translation. - -**Routing Protocols:** - -Some routing protocols or network services may require direct communication -without NAT interference. - -**Traffic Forwarding:** - -Exclude rules also work for forwarded traffic between networks. Without -exclude rules, traffic from external to local networks must either match a -static rule or be dropped. With exclude rules, traffic can bypass NAT -processing with invisible 1-to-1 mappings. - -:::{important} -Exclude rules affect both traffic destined for the router itself and -forwarded traffic flowing through the router. For forwarded traffic, exclude -rules create transparent 1-to-1 mappings that allow packets to pass without -NAT modifications, while from the outside perspective, the traffic appears to -bypass NAT entirely. -::: - -## Advanced NAT44 Settings -VyOS provides additional NAT44 settings for fine-tuning performance and -behavior. - -### Session Timeouts -NAT44 maintains translation sessions with configurable timeout values for -different protocols: -```{cfgcmd} set vpp nat nat44 timeout icmp \<seconds\> - -Set the timeout for ICMP sessions (Default: 60 seconds). -``` - -```{cfgcmd} set vpp nat nat44 timeout tcp-established \<seconds\> - -Set the timeout for established TCP connections (Default: 7440 seconds -or 2 hours 4 minutes). -``` - -```{cfgcmd} set vpp nat nat44 timeout tcp-transitory \<seconds\> - -Set the timeout for transitory TCP connections (setup/teardown) (Default: -240 seconds or 4 minutes). -``` - -```{cfgcmd} set vpp nat nat44 timeout udp \<seconds\> - -Set the timeout for UDP sessions (Default: 300 seconds or 5 minutes). -``` -**Example:** -```none -# Customize timeouts for high-traffic environment -set vpp nat nat44 timeout tcp-established 3600 -set vpp nat nat44 timeout udp 600 -set vpp nat nat44 timeout icmp 30 -``` -### Session Limits -Control the maximum number of concurrent NAT sessions: -```{cfgcmd} set vpp nat nat44 session-limit \<number\> - -Set the maximum number of NAT sessions per worker thread (Default: -64512). -``` -This setting helps prevent memory exhaustion and ensures predictable -performance under high load. - -**Example:** -```none -# Increase session limit for high-capacity deployment -set vpp nat nat44 session-limit 100000 -``` -## Complete Configuration Example -Here's a complete example showing how to configure VyOS NAT44 for a typical -network setup: - -**Network Topology:** -```none -Internet (203.0.113.0/24) - | -┌───────────────────┐ -│ eth1 (outside) │ 203.0.113.1/24 -│ VyOS Router │ -│ eth0 (inside) │ 192.168.1.1/24 -└───────────────────┘ - | -Internal Network (192.168.1.0/24) -├── 192.168.1.10 (Web Server) -├── 192.168.1.20 (SSH Server) -└── 192.168.1.30 (API Service) -``` -**Configuration:** -```none -# Configure interfaces -set vpp nat nat44 interface inside eth0 -set vpp nat nat44 interface outside eth1 - -# Configure address pools -set vpp nat nat44 address-pool translation address 203.0.113.10-203.0.113.50 -set vpp nat nat44 address-pool twice-nat address 203.0.113.100-203.0.113.110 - -# Exclude rules for router management -set vpp nat nat44 exclude rule 10 local-address 203.0.113.1 -set vpp nat nat44 exclude rule 10 local-port 22 -set vpp nat nat44 exclude rule 10 protocol tcp -set vpp nat nat44 exclude rule 10 description "SSH access to router" - -set vpp nat nat44 exclude rule 11 local-address 203.0.113.1 -set vpp nat nat44 exclude rule 11 local-port 443 -set vpp nat nat44 exclude rule 11 protocol tcp -set vpp nat nat44 exclude rule 11 description "HTTPS access to router web interface" - -# Static rule for web server (HTTP) -set vpp nat nat44 static rule 100 local address 192.168.1.10 -set vpp nat nat44 static rule 100 local port 80 -set vpp nat nat44 static rule 100 external address 203.0.113.10 -set vpp nat nat44 static rule 100 external port 80 -set vpp nat nat44 static rule 100 protocol tcp -set vpp nat nat44 static rule 100 description "Public web server" - -# Static rule for web server (HTTPS) -set vpp nat nat44 static rule 101 local address 192.168.1.10 -set vpp nat nat44 static rule 101 local port 443 -set vpp nat nat44 static rule 101 external address 203.0.113.10 -set vpp nat nat44 static rule 101 external port 443 -set vpp nat nat44 static rule 101 protocol tcp -set vpp nat nat44 static rule 101 description "Public web server HTTPS" - -# Static rule for SSH server with custom port -set vpp nat nat44 static rule 200 local address 192.168.1.20 -set vpp nat nat44 static rule 200 local port 22 -set vpp nat nat44 static rule 200 external address 203.0.113.11 -set vpp nat nat44 static rule 200 external port 2222 -set vpp nat nat44 static rule 200 protocol tcp -set vpp nat nat44 static rule 200 description "SSH access" - -# Static rule for API service (out-to-in only for security) -set vpp nat nat44 static rule 300 local address 192.168.1.30 -set vpp nat nat44 static rule 300 local port 8080 -set vpp nat nat44 static rule 300 external address 203.0.113.12 -set vpp nat nat44 static rule 300 external port 8080 -set vpp nat nat44 static rule 300 protocol tcp -set vpp nat nat44 static rule 300 options out-to-in-only -set vpp nat nat44 static rule 300 description "API service (No Internet access for it)" -``` -## Best Practices and Troubleshooting - -### Recommendations -- **Use exclude rules** for router management services like SSH -- **Use out-to-in-only** for services that do not need access to external - : networks. -- **Limit port ranges** in static rules to only necessary ports. -- **Document all rules** using descriptions for easier management. -- **Use non-standard ports** for publishing SSH and other administrative - : services. -- **Configure appropriate pool sizes** based on expected concurrent - : connections in your network. - -### Common Configuration Issues -**Static rules not working:** - -1. Verify that the external IP address is included in an address pool -2. Check that interfaces are correctly configured as inside or outside -3. Ensure firewall rules allow the traffic - -**Twice-NAT not functioning:** - -1. Confirm twice-nat pool is configured -2. Verify static rules have the correct twice-nat option -3. Check that both translation and twice-nat pools are properly defined - -**Router management access issues:** - -1. Verify exclude rules are configured for management services -2. Check that local-address matches the router's interface IP -3. Ensure external-interface is correctly specified - -**Forwarded traffic from external networks not bypassing NAT:** - -1. Verify exclude rules are configured for the specific traffic flow -2. Check that local-address matches the destination IP in the internal - network -3. Ensure protocol and port specifications match the traffic requirements - -## Operational Commands -Monitor NAT44 status and active connections using VyOS operational -commands: -```{opcmd} show vpp nat nat44 addresses - -Display configured NAT44 address pools. -``` - -```{opcmd} show vpp nat nat44 interfaces - -Show which interfaces are configured as inside or outside for NAT44. -``` - -```{opcmd} show vpp nat nat44 sessions - -Display active NAT44 translation sessions. -``` - -```{opcmd} show vpp nat nat44 static - -Show all configured static NAT mappings. -``` - -```{opcmd} show vpp nat nat44 summary - -Display a summary of NAT44 and statistics. -```
\ No newline at end of file diff --git a/docs/vpp/md-description.md b/docs/vpp/md-description.md deleted file mode 100644 index 03ade42c..00000000 --- a/docs/vpp/md-description.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -lastproofread: '2026-02-16' ---- - -(vpp-description)= - -```{include} /_include/need_improvement.txt -``` - -# VPP Dataplane Description - -## What is VPP in VyOS? -VyOS supports two packet forwarding dataplanes: -- **Linux kernel dataplane** (traditional) -- **Vector Packet Processor (VPP) dataplane** (optional) - -VPP is a high-performance user space packet processor that improves -throughput for demanding network workloads. - -## Key Benefits - -**Performance Improvement** - -VPP uses vector-based packet processing instead of one-by-one handling, -delivering: -- **Higher throughput** compared to kernel forwarding. -- **Lower and more consistent latency** for time-sensitive applications. -- **Linear scaling** with additional CPU cores. - -**VyOS Hybrid Integration** - -VyOS supports both dataplanes simultaneously, providing: -- **Cross-dataplane forwarding**: Traffic can flow between the VPP dataplane - and kernel interfaces seamlessly. -- **Transparent configuration**: Same CLI commands and most services work - regardless of dataplane. -- **Gradual migration**: Enable VPP on high-traffic interfaces while keeping - others on kernel. - -## When to Use VPP -**Consider VPP if you have:** -- High-throughput requirements -- Latency-sensitive applications requiring consistent performance - -**Stay with kernel dataplane if you have:** -- Low to moderate traffic volumes -- No latency-sensitive workloads -- Applications requiring specific features not supported by VPP Dataplane - -## Packet Processing Integration -VPP Dataplane integration minimizes configuration changes. Features in the -kernel dataplane continue to operate there. VPP Dataplane only handles packet -forwarding for interfaces explicitly assigned to it. - -Traffic flow examples between VPP and kernel dataplane interfaces: -```{image} /_static/images/vpp/vyos_vpp_integration.svg -:align: center -``` - -### Green path - -Traffic between two VPP interfaces stays within VPP for maximum performance -and can use only VPP dataplane features. - -### Blue path - -Traffic between a VPP interface and a kernel interface is processed by both -dataplanes and can use features from both. - -**Note:** This path has slower performance than pure VPP or pure kernel -forwarding because packets traverse both dataplanes. - -### Red path - -Traffic between two kernel interfaces stays within the kernel dataplane without -VPP acceleration. This is the traditional VyOS dataplane operation. - -## CLI Integration - -VyOS CLI commands work with both dataplanes. Use the same commands to -configure interfaces, routing, and other features regardless of the dataplane. diff --git a/docs/vpp/md-index.md b/docs/vpp/md-index.md deleted file mode 100644 index 06b48792..00000000 --- a/docs/vpp/md-index.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -lastproofread: '2025-09-04' ---- - -(vpp-index)= - -```{include} /_include/need_improvement.txt -``` -# VPP Dataplane -VPP (Vector Packet Processing) is a high performance packet processing stack -that runs in user space. VyOS can use VPP as an alternative dataplane to -the Linux kernel networking stack. -```{toctree} -:includehidden: true -:maxdepth: 1 - -description -requirements -limitations -configuration/index -troubleshooting -``` diff --git a/docs/vpp/md-limitations.md b/docs/vpp/md-limitations.md deleted file mode 100644 index e6d43b85..00000000 --- a/docs/vpp/md-limitations.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -lastproofread: '2026-02-17' ---- - -(vpp-limitations)= - -```{include} /_include/need_improvement.txt -``` -# VPP Dataplane Limitations - -VPP Dataplane provides significant performance advantages, but has some -limitations you should consider. - -- **Feature Parity** - - VPP does not support all features available in the Linux kernel dataplane. - Some networking features, specific protocols, or services may not be - available. - - While VPP supports various interface types similar to the kernel, their - capabilities may differ. - -- **NIC and Driver Compatibility** - - VyOS currently supports only DPDK drivers for network interfaces. - Not all network interface cards are compatible with DPDK drivers. - -- **Data Path Limitations** - - If a feature exists only in the kernel dataplane, traffic that uses that - feature cannot traverse VPP interfaces. Examples include: - - - Firewall - - QoS - - When traffic uses the pure VPP path, it does not reach the kernel, where - such features are implemented. Plan how traffic flows through your VyOS - instance to ensure it reaches the necessary features. - - VPP provides native alternatives for some features. For example, VPP - native ACLs provide basic firewall functionality. diff --git a/docs/vpp/md-requirements.md b/docs/vpp/md-requirements.md deleted file mode 100644 index 7758cabd..00000000 --- a/docs/vpp/md-requirements.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -lastproofread: '2026-02-16' ---- - -(vpp-requirements)= - -```{include} /_include/need_improvement.txt -``` - -# VPP Dataplane Requirements - -VPP Dataplane requires specific hardware. Ensure your system meets these -prerequisites before enabling VPP: - -- **Deployment Platform** - - VPP Dataplane is available on both bare-metal, on-premise virtualized, and - cloud deployment platforms. - -- **CPU Requirements** - - Regardless of the platform, VPP Dataplane requires a CPU with: - - - SSE4.2 support (available on most modern Intel and AMD CPUs). - - At least 4 physical CPU cores for a minimum configuration (more cores - recommended for higher throughput). - - :::{important} - **Physical Cores vs Logical Cores** - - VPP Dataplane requires 4 *physical* CPU cores, not logical cores. - Systems with Simultaneous Multithreading (SMT) or Hyper-Threading (HT) - present each physical core as 2 logical cores. - - Cloud providers often display logical cores as "cores" or "vCPUs". - For example, a cloud instance showing "4 cores" may have only 2 physical - cores with SMT/HT enabled. Always verify the actual physical core count - in your cloud provider's documentation. - ::: - - For virtualized environments, ensure CPU features are passed through to the - VM and that sufficient physical cores are allocated. - -- **Memory Requirements** - - Memory significantly affects VPP stability. Insufficient RAM can cause - initialization failures or prevent the dataplane from starting. - - - Minimum: 8 GB RAM. VyOS will not start the VPP Dataplane if less than 8 GB - is available. - - Recommended: 16 GB or more (especially for high throughput, many interfaces, - or large routing tables). - -- **Network Interface Cards (NICs)** - - :::{warning} - VyOS supports only specific NICs for the VPP dataplane. Using unsupported - hardware may cause activation failures, initialization errors, crashes, - or degraded performance. - ::: - - When enabling VPP, VyOS checks detected network interfaces against a list - of validated NICs. Validation is based on the **PCI ID** of the device or - the **kernel driver** used by the interface. - - Supported NICs: - - :::{list-table} - :widths: 15 18 40 35 - :header-rows: 1 - - * - **Filter Type** - - **Filter Value** - - **NIC Name/Description** - - **Platform Where NIC Can Be Found** - * - PCI ID - - 15b3:1019 - - Mellanox Technologies MT28800 Family - [ConnectX-5 Ex] - - Bare-metal - * - PCI ID - - 15b3:101d - - Mellanox Technologies MT2892 Family - [ConnectX-6 Dx] - - Bare-metal - * - PCI ID - - 15b3:101e - - Mellanox Technologies ConnectX Family - mlx5Gen Virtual Function - - Oracle Cloud - * - PCI ID - - 8086:1592 - - Intel Corporation Ethernet Controller - E810-C for QSFP - - Bare-metal - * - PCI ID - - 1ae0:0042 - - Google, Inc. Compute Engine Virtual - Ethernet [gVNIC] - - Google Cloud - * - PCI ID - - 1af4:1000 - - Red Hat, Inc. Virtio network device - - KVM-based hypervisors, including with - Open vSwitch; Google Cloud - * - PCI ID - - 1d0f:ec20 - - Amazon.com, Inc. Elastic Network - Adapter (ENA) - - AWS - * - Kernel Driver - - hv_netvsc - - Microsoft Hyper-V network interface - card - - Microsoft Azure - ::: - - If no supported NIC is detected, VPP activation will be rejected. - - In testing or advanced deployments, unsupported hardware can be explicitly - allowed in the configuration: - - ```{cfgcmd} set vpp settings allow-unsupported-nics - ``` - - :::{note} - This option bypass the hardware validation checks for the specified - devices. Stability and performance are not guaranteed when using - unsupported NICs or drivers. - ::: diff --git a/docs/vpp/md-troubleshooting.md b/docs/vpp/md-troubleshooting.md deleted file mode 100644 index 8e3f977c..00000000 --- a/docs/vpp/md-troubleshooting.md +++ /dev/null @@ -1,412 +0,0 @@ ---- -lastproofread: '2026-02-18' ---- - -(vpp-troubleshooting)= - -```{include} /_include/need_improvement.txt -``` - -# VPP Dataplane Troubleshooting -This page shows you how to collect diagnostic information to troubleshoot VPP -dataplane issues. These techniques help you resolve problems yourself and -provide support teams with the information they need. - -Collecting the right diagnostic data is crucial for effective troubleshooting. - -## Packet Capture (PCAP) -Packet capture is a valuable debugging tool for analyzing network traffic and -identifying issues with packet processing, routing, and filtering. - -`pcap trace` in VPP captures packets at different states: received (rx), -transmitted (tx), and dropped (drop). - -### Starting Packet Capture -**Command syntax:** -```{opcmd} sudo vppctl pcap trace [rx] [tx] [drop] [max \<n\>] [intfc \<interface-name|any\>] [file \<name\>] [max-bytes-per-pkt \<n\>] -``` -**Parameters:** -- `rx` - Capture received packets -- `tx` - Capture transmitted packets -- `drop` - Capture dropped packets -- `max <n>` - Depth of the local buffer. After `n` packets arrive, the - buffer flushes to file. When the next `n` packets arrive, the file - overwrites with new data. (default: 100) -- `intfc <interface-name|any>` - Specify an interface or use `any` for - all interfaces (default: any) -- `file <name>` - Output filename. The PCAP file is stored in the `/tmp/` - directory. -- `max-bytes-per-pkt <n>` - Maximum bytes to capture per packet - (must be >= 32, \<= 9000) - -**Examples:** -```none -# Start capturing tx packets with specific parameters -sudo vppctl pcap trace tx max 35 intfc eth1 file vpp_eth1.pcap - -# Capture all packet types from any interface -sudo vppctl pcap trace rx tx drop max 1000 intfc any file vpp_capture.pcap max-bytes-per-pkt 128 -``` -### Monitoring Capture Status -To check the capture status: -```{opcmd} sudo vppctl pcap trace status -``` -This command displays: -- Whether capture is active -- Capture parameters -- Number of packets captured -- Output file location - -### Stopping Packet Capture - -:::{warning} -VPP does not automatically stop packet captures. If left running, captures -consume resources indefinitely. Always stop captures when you're done -with them. -::: -To stop the active packet capture: -```{opcmd} sudo vppctl pcap trace off -``` -Example output when stopping: -```none -Write 35 packets to /tmp/vpp_eth1.pcap, and stop capture... -``` -**Notes:** -- PCAP files are stored in the `/tmp/` directory. -- Existing files are overwritten. -- If you don't specify a filename, default names are used: `/tmp/rx.pcap`, - `/tmp/tx.pcap`, and `/tmp/rxandtx.pcap`. -- Large captures consume significant disk space—monitor available space. -- Stop captures promptly to avoid filling storage. - -## Packet Tracing -VPP packet tracing shows how packets flow through the VPP processing graph, -including which nodes process each packet and what transformations occur. - -:::{warning} -Tracing generates large amounts of data, especially on high-traffic -systems. Limit the number of traced packets to avoid overwhelming the system. -::: - -### Basic Packet Tracing Commands - -#### Start tracing -To start tracing packets at a specific graph node: -```{opcmd} sudo vppctl trace add \<input-graph-node\> \<pkts\> [verbose] -``` -- `<input-graph-node>` - Graph node name where tracing starts - (for example, `dpdk-input`, `ethernet-input`, or `ip4-input`). -- `<pkts>` - Number of packets to trace (for example, 100). -- `[verbose]` - Optional flag to include detailed buffer information in the - trace output. - -**Common node names for tracing:** -- `dpdk-input`: Packets received from DPDK interfaces -- `ethernet-input`: Ethernet frame processing -- `ip4-input`: IPv4 packet processing -- `ip6-input`: IPv6 packet processing -- `ip4-lookup`: IPv4 routing table lookup -- `ip6-lookup`: IPv6 routing table lookup - -#### View traces -After packets are traced, view the results: -```{opcmd} sudo vppctl show trace [max COUNT] -``` -- `[max COUNT]` - Optional limit on number of packets to display - (default: all) - -#### Clear traces -After reviewing traces, clear them to free up resources: -```{opcmd} sudo vppctl clear trace -``` -#### Example Workflow -```none -# Add traces for 100 packets on dpdk-input node -sudo vppctl trace add dpdk-input 100 - -# Send some traffic, then view results -sudo vppctl show trace - -# Clear traces for next test -sudo vppctl clear trace -``` -### Understanding Trace Output -Trace output shows how packets flow through VPP processing nodes: -```none -Packet 1 - -01:00:09:508438: dpdk-input - eth2 rx queue 0 - buffer 0x8533: current data 0, length 98, buffer-pool 0, ref-count 1, trace handle 0x1000000 - ext-hdr-valid - PKT MBUF: port 1, nb_segs 1, pkt_len 98 - buf_len 1828, data_len 98, ol_flags 0x0, data_off 128, phys_addr 0x78814d40 - packet_type 0x0 l2_len 0 l3_len 0 outer_l2_len 0 outer_l3_len 0 - rss 0x0 fdir.hi 0x0 fdir.lo 0x0 - IP4: 0c:87:6c:4e:00:01 -> 0c:de:0d:e2:00:02 - ICMP: 192.168.102.2 -> 192.168.99.3 - tos 0x00, ttl 64, length 84, checksum 0xb88d dscp CS0 ecn NON_ECN - fragment id 0x37c5, flags DONT_FRAGMENT - ICMP echo_request checksum 0x64e id 3024 -01:00:09:508449: ethernet-input - frame: flags 0x1, hw-if-index 2, sw-if-index 2 - IP4: 0c:87:6c:4e:00:01 -> 0c:de:0d:e2:00:02 -01:00:09:508455: ip4-input - ICMP: 192.168.102.2 -> 192.168.99.3 - tos 0x00, ttl 64, length 84, checksum 0xb88d dscp CS0 ecn NON_ECN - fragment id 0x37c5, flags DONT_FRAGMENT - ICMP echo_request checksum 0x64e id 3024 -01:00:09:508458: ip4-sv-reassembly-feature - [not-fragmented] -01:00:09:508460: nat-pre-in2out - in2out next_index 2 arc_next_index 10 -01:00:09:508462: nat44-ed-in2out - NAT44_IN2OUT_ED_FAST_PATH: sw_if_index 2, next index 10, session 0, translation result 'success' via i2of - i2of match: saddr 192.168.102.2 sport 3024 daddr 192.168.99.3 dport 3024 proto ICMP fib_idx 0 rewrite: saddr 192.168.99.1 daddr 192.168.99.3 icmp-id 3024 txfib 0 - o2if match: saddr 192.168.99.3 sport 3024 daddr 192.168.99.1 dport 3024 proto ICMP fib_idx 0 rewrite: saddr 192.168.99.3 daddr 192.168.102.2 icmp-id 3024 txfib 0 - search key local 192.168.102.2:3024 remote 192.168.99.3:3024 proto ICMP fib 0 thread-index 0 session-index 0 -01:00:09:508469: ip4-lookup - fib 0 dpo-idx 10 flow hash: 0x00000000 - ICMP: 192.168.99.1 -> 192.168.99.3 - tos 0x00, ttl 64, length 84, checksum 0xbb8e dscp CS0 ecn NON_ECN - fragment id 0x37c5, flags DONT_FRAGMENT - ICMP echo_request checksum 0x64e id 3024 -01:00:09:508472: ip4-rewrite - tx_sw_if_index 1 dpo-idx 10 : ipv4 via 192.168.99.3 eth1: mtu:1500 next:5 flags:[] 0ccea70400010cde0de200010800 flow hash: 0x00000000 - 00000000: 0ccea70400010cde0de2000108004500005437c540003f01bc8ec0a86301c0a8 - 00000020: 63030800064e0bd00d9a52c2d26800000000f4490000000000001011 -01:00:09:508474: eth1-output - eth1 flags 0x0038000d - IP4: 0c:de:0d:e2:00:01 -> 0c:ce:a7:04:00:01 - ICMP: 192.168.99.1 -> 192.168.99.3 - tos 0x00, ttl 63, length 84, checksum 0xbc8e dscp CS0 ecn NON_ECN - fragment id 0x37c5, flags DONT_FRAGMENT - ICMP echo_request checksum 0x64e id 3024 -01:00:09:508477: eth1-tx - eth1 tx queue 0 - buffer 0x8533: current data 0, length 98, buffer-pool 0, ref-count 1, trace handle 0x1000000 - ext-hdr-valid - natted l2-hdr-offset 0 l3-hdr-offset 14 - PKT MBUF: port 1, nb_segs 1, pkt_len 98 - buf_len 1828, data_len 98, ol_flags 0x0, data_off 128, phys_addr 0x78814d40 - packet_type 0x0 l2_len 0 l3_len 0 outer_l2_len 0 outer_l3_len 0 - rss 0x0 fdir.hi 0x0 fdir.lo 0x0 - IP4: 0c:de:0d:e2:00:01 -> 0c:ce:a7:04:00:01 - ICMP: 192.168.99.1 -> 192.168.99.3 - tos 0x00, ttl 63, length 84, checksum 0xbc8e dscp CS0 ecn NON_ECN - fragment id 0x37c5, flags DONT_FRAGMENT - ICMP echo_request checksum 0x64e id 3024 -``` -In this example, the trace shows: -- The packet is received on `eth2` interface at the `dpdk-input` node. -- It flows through `ethernet-input` and `ip4-input` nodes. -- NAT translation occurs at the `nat44-ed-in2out` node, changing the source - IP. -- The packet is routed through `ip4-lookup` and `ip4-rewrite` nodes. -- It transmits out of `eth1` interface at the `eth1-tx` node. - -## Additional Diagnostic Information -When reporting issues to support teams or performing advanced troubleshooting, -collect additional diagnostic information. - -### Before/After Traffic Analysis -Before you send traffic: -```none -sudo vppctl clear hardware-interfaces -sudo vppctl clear interfaces -sudo vppctl clear error -sudo vppctl clear runtime -``` -After you send traffic: -```none -sudo vppctl show version verbose -sudo vppctl show hardware-interfaces -sudo vppctl show interface address -sudo vppctl show interface -sudo vppctl show runtime -sudo vppctl show error -``` -### Core System Information -**Memory and buffer information:** -```none -sudo vppctl show memory api-segment stats-segment numa-heaps main-heap map verbose -sudo vppctl show buffers -sudo vppctl show physmem detail -sudo vppctl show physmem map -``` -**Runtime and performance data:** -```none -sudo vppctl show cpu -sudo vppctl show threads -sudo vppctl show runtime -sudo vppctl show node counters -``` -### Protocol-Specific Information -**Layer 2 data (if configured):** -```none -sudo vppctl show l2fib -sudo vppctl show bridge-domain -``` -**IPv4 data (if configured):** -```none -sudo vppctl show ip fib -sudo vppctl show ip neighbors -``` -**IPv6 data (if configured):** -```none -sudo vppctl show ip6 fib -sudo vppctl show ip6 neighbors -``` -**MPLS data (if configured):** -```none -sudo vppctl show mpls fib -sudo vppctl show mpls tunnel -``` -## Creating Support Packages -Use the automated diagnostic collection script to gather comprehensive VPP -troubleshooting information when contacting support or reporting issues. - -### VPP Diagnostic Collection Script -Create the diagnostic collection script: -```python -#!/usr/bin/env python3 -"""VyOS VPP Diagnostic Collection Script""" - -import datetime -import shutil -import subprocess -import tarfile -from pathlib import Path - - -def run_cmd(cmd, output_file, diag_dir): - """Run command and save output to file.""" - try: - result = subprocess.run( - cmd, shell=True, capture_output=True, text=True, timeout=30 - ) - content = f"Command: {cmd}\nExit code: {result.returncode}\nTimestamp: {datetime.datetime.now()}\n{'-' * 50}\n" - if result.stdout: - content += f"\nSTDOUT:\n{result.stdout}" - if result.stderr: - content += f"\nSTDERR:\n{result.stderr}" - (diag_dir / output_file).write_text(content) - except Exception as e: - (diag_dir / output_file).write_text(f"Command: {cmd}\nERROR: {e}") - - -def collect_diagnostics(): - """Collect all VPP diagnostics and create archive.""" - timestamp = datetime.datetime.now().strftime("%Y%m%d-%H%M%S") - diag_dir = Path.home() / f"vpp-diagnostics-{timestamp}" - - # VPP commands to collect - commands = [ - ("sudo vppctl show version verbose cmdline", "vpp-version.txt"), - ("sudo vppctl show hardware-interfaces", "hardware-interfaces.txt"), - ("sudo vppctl show interface address", "interface-addresses.txt"), - ("sudo vppctl show interface", "interfaces.txt"), - ("sudo vppctl show errors", "errors.txt"), - ("sudo vppctl show runtime", "runtime.txt"), - ( - "sudo vppctl show memory api-segment stats-segment numa-heaps main-heap map verbose", - "memory.txt", - ), - ("sudo vppctl show buffers", "buffers.txt"), - ("sudo vppctl show physmem detail", "physmem.txt"), - ("sudo vppctl show physmem map", "physmem-map.txt"), - ("sudo vppctl show cpu", "cpu.txt"), - ("sudo vppctl show threads", "threads.txt"), - ("sudo vppctl show node counters", "node-counters.txt"), - ("sudo vppctl show l2fib", "l2fib.txt"), - ("sudo vppctl show bridge-domain", "bridge-domains.txt"), - ("sudo vppctl show ip fib", "ip4-fib.txt"), - ("sudo vppctl show ip neighbors", "ip4-neighbors.txt"), - ("sudo vppctl show ip6 fib", "ip6-fib.txt"), - ("sudo vppctl show ip6 neighbors", "ip6-neighbors.txt"), - ("sudo vppctl show mpls fib", "mpls-fib.txt"), - ("sudo vppctl show mpls tunnel", "mpls-tunnels.txt"), - ("sudo vppctl show trace", "packet-traces.txt"), - ] - - try: - # Create diagnostics directory - diag_dir.mkdir(parents=True, exist_ok=True) - - # Collect VPP data - for cmd, output_file in commands: - run_cmd(cmd, output_file, diag_dir) - - # Collect PCAP files - pcap_files = list(Path("/tmp").glob("*.pcap")) - if pcap_files: - pcap_dir = diag_dir / "pcap-files" - pcap_dir.mkdir(exist_ok=True) - for pcap_file in pcap_files: - try: - shutil.copy2(pcap_file, pcap_dir) - except (PermissionError, OSError): - pass - - # Create archive - archive_name = f"vpp-diagnostics-{timestamp}.tar.gz" - archive_path = Path.home() / archive_name - - with tarfile.open(archive_path, "w:gz") as tar: - tar.add(diag_dir, arcname=diag_dir.name) - - # Cleanup - shutil.rmtree(diag_dir) - - print(f"VPP diagnostics collected: {archive_path}") - return archive_path - - except Exception as e: - if diag_dir.exists(): - shutil.rmtree(diag_dir) - print(f"Collection failed: {e}") - return None - - -def main(): - """Main function.""" - collect_diagnostics() - - -if __name__ == "__main__": - main() -``` -Save this script as `/config/scripts/vpp-collect-diagnostics` - -### Installation and Usage -**1. Make the script executable** -```{opcmd} sudo chmod +x /config/scripts/vpp-collect-diagnostics -``` -**2. Run VPP diagnostic collection** - -The script automatically collects all diagnostics and stores them in your home -directory. -```{opcmd} /config/scripts/vpp-collect-diagnostics -``` -**3. Generate VyOS tech-support archive separately** -You can also generate a tech-support archive with system-wide diagnostics: -```{opcmd} generate tech-support archive -``` - -### What the Script Collects - -- **System information**: Version details, build information, command-line - parameters. -- **Interface data**: Hardware interfaces, interface addresses, statistics, - and configurations. -- **Performance metrics**: Runtime statistics, error counters, node counters, - CPU, and thread information. -- **Memory analysis**: Memory usage (API segment, stats segment, NUMA heaps, - main heap), buffers, and physical memory. -- **Layer 2 data**: L2 forwarding table (L2FIB) and bridge domain - configurations. -- **IPv4 data**: IPv4 forwarding table (FIB) and IPv4 neighbor table. -- **IPv6 data**: IPv6 forwarding table (FIB) and IPv6 neighbor table. -- **MPLS data**: MPLS forwarding table (FIB) and MPLS tunnel information. -- **Packet traces**: Captured packet traces (if available). -- **Packet captures**: PCAP files from the `/tmp` directory (if available). |
