> ## Documentation Index
> Fetch the complete documentation index at: https://docs.siderolabs.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Virtual Ethernet Pairs

> Learn how to configure virtual Ethernet (veth) pairs.

export const VersionWarningBanner = () => {
  const latestVersion = "v1.13";
  const [latestUrl, setLatestUrl] = useState(null);
  const [currentVersion, setCurrentVersion] = useState(null);
  const [isBeta, setIsBeta] = useState(false);
  const parseVersion = v => v.replace("v", "").split(".").map(Number);
  const isGreaterVersion = (a, b) => {
    const [aMajor, aMinor] = parseVersion(a);
    const [bMajor, bMinor] = parseVersion(b);
    if (aMajor > bMajor) return true;
    if (aMajor === bMajor && aMinor > bMinor) return true;
    return false;
  };
  useEffect(() => {
    if (typeof window === "undefined") return;
    const {pathname, hash, search} = window.location;
    const match = pathname.match(/\/talos\/(v\d+\.\d+)\//);
    if (!match) return;
    const detectedVersion = match[1];
    if (detectedVersion === latestVersion) return;
    setCurrentVersion(detectedVersion);
    if (isGreaterVersion(detectedVersion, latestVersion)) {
      setIsBeta(true);
    }
    const newPath = pathname.replace(`/talos/${detectedVersion}/`, `/talos/${latestVersion}/`);
    setLatestUrl(`${newPath}${search}${hash}`);
  }, []);
  if (!latestUrl || !currentVersion) return null;
  return <div className="not-prose sticky top-6 z-50 my-6">
      <div className="border border-yellow-500/30 bg-yellow-500/10 px-4 py-3 rounded-xl">
        <div className="text-sm">
          {isBeta ? <>
              ⚠️ You are viewing a <strong>beta version</strong> of Talos ({currentVersion}).
              This version may be unstable.
              <a href={latestUrl} className="ml-2 underline text-yellow-400 hover:text-yellow-300 font-medium">
                View latest stable version {latestVersion} →
              </a>
            </> : <>
              ⚠️ You are viewing an older version of Talos ({currentVersion}).
              <a href={latestUrl} className="ml-2 underline text-yellow-400 hover:text-yellow-300 font-medium">
                View the latest version {latestVersion} →
              </a>
            </>}
        </div>
      </div>
    </div>;
};

<VersionWarningBanner />

A virtual Ethernet (veth) pair consists of two connected virtual network interfaces.
Traffic sent through either endpoint is received by the other endpoint.

Talos Linux creates both endpoints in the host network namespace.
You can keep both endpoints in the default routing domain or attach one endpoint to a Virtual Routing and Forwarding (VRF) device.

## Configure a veth pair

Create a [`VethConfig`](../../reference/configuration/network/vethconfig) document that defines both endpoints:

```yaml theme={null}
apiVersion: v1alpha1
kind: VethConfig
name: veth-host
mtu: 1500
addresses:
  - address: 192.0.2.1/30
peer:
  name: veth-router
  mtu: 1500
  addresses:
    - address: 192.0.2.2/30
```

This configuration creates `veth-host` and `veth-router` and assigns an address to each endpoint.
Each endpoint supports independent `up`, `mtu`, `addresses`, `routes`, and `multicast` settings.
When `up` is omitted, Talos brings the endpoint up.

The `name` and `peer.name` fields are literal kernel interface names, not [link aliases](../configuration/aliases).
The two names must differ, and no other link configuration document can claim either name.

## Attach an endpoint to a VRF

List an endpoint in a [`VRFConfig`](./vrf) document to move it into that routing domain:

```yaml theme={null}
apiVersion: v1alpha1
kind: VethConfig
name: veth-workload
addresses:
  - address: fda1:b2c3:d4e5:1::/127
peer:
  name: veth-router
  addresses:
    - address: fda1:b2c3:d4e5:1::1/127
---
apiVersion: v1alpha1
kind: VRFConfig
name: vrf-workload
links:
  - veth-router
table: "88"
```

In this example, `veth-workload` remains in the default routing domain and `veth-router` belongs to `vrf-workload`.
The pair provides a point-to-point connection between the two routing domains.

The [native BGP workload-speaker topology](../bgp/overview#connect-a-kubernetes-workload-speaker-to-the-fabric) uses this design to connect a host-networked Cilium or MetalLB speaker to a VRF-bound Talos BGP instance.

## Verify the endpoints

Set `NODE` to the address of the Talos machine:

```bash theme={null}
export NODE=<TALOS_NODE_IP>
```

Inspect each endpoint:

```bash theme={null}
talosctl get links veth-workload --nodes "$NODE" --output yaml
talosctl get links veth-router --nodes "$NODE" --output yaml
```

Each `LinkStatus` reports `kind: veth` and identifies the other endpoint in `veth.peerName`.
The endpoint indices also cross-reference each other through `index` and `linkIndex`.

Inspect the configured addresses:

```bash theme={null}
talosctl get addresses --nodes "$NODE" --output yaml
```

Confirm that each address reports the expected endpoint in `linkName`.

## Lifecycle

Talos creates the two endpoints as one kernel veth pair and reconciles their common link settings independently.
Removing the `VethConfig` removes the pair, and changing an endpoint name replaces the old pair with the newly named pair.
