OpenVPN

Traditionally, hardware routers use IPsec exclusively because it is easy to implement in hardware, and their CPUs lack sufficient power for software-based encryption. This limitation is less relevant for VyOS, as it is a software router.

OpenVPN has been widely used on UNIX platforms for a long time and is a popular choice for remote-access VPNs. It also supports site-to-site connections.

OpenVPN offers the following advantages:

  • It uses a single TCP or UDP connection and does not rely on packet source addresses, so it works even through double NAT. This makes it well-suited for public hotspots.

  • It is easy to set up and offers very flexible split tunneling.

  • A variety of client GUI frontends are available for any platform.

Disadvantages include:

  • It is slower than IPsec due to higher protocol overhead and because it runs in user mode, while IPsec on Linux runs in kernel mode.

  • No operating system includes OpenVPN client software by default.

In the VyOS CLI, OpenVPN is configured as a network interface using set interfaces openvpn rather than set vpn, which is often overlooked.

Configuration

set interfaces openvpn <interface> authentication password <text>

Configure the password for the auth-user-pass authentication method.

This option applies only to OpenVPN clients.

set interfaces openvpn <interface> authentication username <text>

Configure the username for the auth-user-pass authentication method.

This option applies only to OpenVPN clients.

set interfaces openvpn <interface> description <description>

Configure the description for the OpenVPN interface.

set interfaces openvpn <interface> device-type <tap | tun>

Configure the virtual network device type for the OpenVPN interface:

  • tun (default): Operates at Layer 3, encapsulating IPv4 or IPv6 packets.

  • tap: Operates at Layer 2, encapsulating Ethernet 802.3 frames.

set interfaces openvpn <interface> disable

Disable the specific OpenVPN interface.

set interfaces openvpn <interface> encryption cipher < 3des | aes128 | aes128gcm | aes192 | aes192gcm | aes256 | aes256gcm | none >

Configure the static encryption cipher for the OpenVPN tunnel.

The cipher option maps to OpenVPN’s --cipher directive and specifies the symmetric encryption algorithm for both control and data channels.

This was previously the default encryption method in all OpenVPN modes. In newer OpenVPN versions, the --cipher directive is considered legacy and should be used only in compatibility scenarios.

set interfaces openvpn <interface> encryption data-ciphers < 3des | aes128 | aes128gcm | aes192 | aes192gcm | aes256 | aes256gcm | none >

Configure a prioritized list of negotiated ciphers for OpenVPN in client or server mode.

The data-ciphers option represents a list of supported encryption algorithms. It corresponds to OpenVPN’s --data-ciphers directive and enables cipher negotiation, where both peers automatically agree on a mutually supported cipher during session startup.

Note

This option is not compatible with site-to-site mode.

set interfaces openvpn <interface> encryption data-ciphers-fallback < 3des | aes128 | aes128gcm | aes192 | aes192gcm | aes256 | aes256gcm | none >

Configure the fallback cipher for site-to-site mode.

The data-ciphers-fallback option maps to OpenVPN’s --data-ciphers- fallback directive. It defines the cipher to use if negotiation is not supported.

Note

This option ensures consistent encryption between two static peers without cipher negotiation capability.

set interfaces openvpn <interface> hash <md5 | sha1 | sha256 | …>

Configure the hashing algorithm for the OpenVPN interface.

set interfaces openvpn <interface> ip adjust-mss <mss | clamp-mss-to-pmtu>

Configure the MSS advertised in outgoing TCP SYN packets on the specified interface.

By clamping the MSS value in TCP SYN packets, you explicitly inform the remote side not to send packets larger than that size. This prevents connection issues that occur when Path MTU Discovery (PMTUD) fails.

The following options are available:

  • mss: Sets the MSS to a specific value, in bytes. Use this option if you need to enforce a specific MSS, for example, to troubleshoot connectivity issues or accommodate specific network requirements.

  • clamp-mss-to-pmtu: The router automatically calculates the MSS to be the interface’s MTU minus 40 bytes for IPv4 traffic (20 bytes for the IPv4 header and 20 bytes for the TCP header). This option is recommended to automatically set the proper value.

set interfaces openvpn <interface> ip arp-cache-timeout

Configure how long an ARP entry remains valid after learning an IP-to-MAC address mapping on this interface.

The default duration is 30 seconds.

An ARP entry remains valid if it receives positive feedback from higher-level protocols.

Example:

set interfaces openvpn vtun0 ip arp-cache-timeout 180
set interfaces openvpn <interface> ip disable-arp-filter

Configure ARP filtering on this interface.

Default behavior: The kernel responds to ARP requests on this interface only if the traffic would be routed back to the ARP sender through that specific interface.

If configured: The kernel responds to ARP requests on this interface for any IP address configured on the local host, regardless of which specific interface that IP address is assigned to, and regardless of the routing table. This reflects the Linux concept that IP addresses belong to the host, not individual interfaces.

Example:

set interfaces openvpn vtun0 ip disable-arp-filter
set interfaces openvpn <interface> ip disable-forwarding

Configure the interface for host or router behavior.

If configured, the interface switches to host mode, and IPv4 forwarding is disabled on it.

Example:

set interfaces openvpn vtun0 ip disable-forwarding
set interfaces openvpn <interface> ip enable-directed-broadcast

Configure whether to forward IP-directed broadcast packets received on this interface.

Default behavior: IP-directed broadcast packets are dropped.

If configured: IP-directed broadcast packets are forwarded to all hosts on the destination subnet, as defined in RFC 1812 and RFC 2644.

Example:

set interfaces openvpn vtun0 ip enable-directed-broadcast
set interfaces openvpn <interface> ip enable-arp-accept

Configure how to process gratuitous ARPs on this interface.

If configured, an IP-to-MAC address mapping is added to the ARP table based on gratuitous ARP requests or replies.

Note

If the ARP table already contains the IP address from a gratuitous ARP, its entry is updated regardless of whether this setting is configured.

Example:

set interfaces openvpn vtun0 ip enable-arp-accept
set interfaces openvpn <interface> ip enable-arp-announce

Configure the source IP selection for ARP requests on this interface.

Default behavior: The kernel can use any IP address the host owns as the source IP address in ARP requests on this interface.

If configured: The kernel first attempts to select a source IP address configured on the interface that shares a common subnet with the target IP address. If there is no such subnet, the kernel selects the IP address it would normally use (based on the routing table to reach the target destination).

Example:

set interfaces openvpn vtun0 ip enable-arp-announce
set interfaces openvpn <interface> ip enable-arp-ignore

Configure which ARP requests will be ignored on this interface.

Default behavior: The kernel responds to ARP requests for any local IP addresses, regardless of which interface they are assigned to.

If configured: The kernel responds to ARP requests only if the target IP address is assigned to this specific interface.

Example:

set interfaces openvpn vtun0 ip enable-arp-ignore
set interfaces openvpn <interface> ip enable-proxy-arp

Configure proxy ARP on this interface.

If configured, the router (kernel) intercepts ARP requests for non-local IP addresses and replies with the MAC address of the interface that received the request. Subsequent packets destined to these IP addresses are forwarded to their actual destinations on remote subnets.

Example:

set interfaces openvpn vtun0 ip enable-proxy-arp
set interfaces openvpn <interface> ip proxy-arp-pvlan

Configure local proxy ARP on the interface.

If configured, the router (kernel) responds to ARP requests on this VLAN interface even if the target IP address resides on the same subnet and interface.

This is used to support network isolation requirements (RFC 3069) for private VLANs (PVLANs). In PVLAN configurations, hosts on isolated ports are NOT allowed to communicate directly with each other at Layer 2, but they can communicate with the upstream router.

By replying to inter-host ARP requests with its own MAC address, the router (kernel) directs inter-host traffic through itself instead of directly between hosts.

Note

This command works independently and does not require enabling the standard proxy ARP on the interface.

Local proxy ARP is also known as:

  • VLAN aggregation (RFC 3069).

  • Private VLAN (Cisco, Allied Telesyn).

  • Source-port filtering or port isolation (Hewlett-Packard).

  • MAC-Forced Forwarding (Ericsson).

set interfaces openvpn <interface> ip source-validation <strict | loose | disable>

Configure source IP address validation using RPF on this interface, as specified in RFC 3704.

The following options are available:

  • strict: Each incoming packet’s source IP address is checked against the Forwarding Information Base (FIB). If the interface is not the best route back to that source, validation fails, and the packet is dropped.

  • loose: Each incoming packet’s source IP address is checked against the FIB. If the source IP address is unreachable through any interface, validation fails.

  • disable: No source IP address validation is performed. All incoming packets are accepted.

RFC 3704 recommends enabling strict mode to prevent IP spoofing, such as DDoS attacks. For asymmetric or other complex routing scenarios, use loose mode.

set interfaces openvpn <interface> ipv6 address autoconf

Configure the interface to automatically obtain an IPv6 address using SLAAC, as specified in RFC 4862.

IPv6 hosts can configure themselves automatically when connected to an IPv6 network using the Neighbor Discovery Protocol via ICMPv6 router discovery messages. When first connected to a network, a host sends a link-local router solicitation multicast request for its configuration parameters. The router responds with a router advertisement packet containing Internet Layer configuration parameters.

Note

This method automatically disables IPv6 traffic forwarding on the interface.

Example:

set interfaces openvpn vtun0 ipv6 address autoconf
set interfaces openvpn <interface> ipv6 address eui64 <prefix>

Configure the interface to assign itself an IPv6 address using the EUI-64 method, as specified in RFC 4291.

Example:

set interfaces openvpn vtun0 ipv6 address eui64 2001:db8:beef::/64
set interfaces openvpn <interface> ipv6 address no-default-link-local

Disable the automatic assignment of a link-local IPv6 address to this interface.

Example:

set interfaces openvpn vtun0 ipv6 address no-default-link-local
set interfaces openvpn <interface> ipv6 disable-forwarding

Configure the interface for host or router behavior.

If configured, the interface switches to host mode, and IPv6 forwarding is disabled on it.

Example:

set interfaces openvpn vtun0 ipv6 disable-forwarding
set interfaces openvpn <interface> ipv6 adjust-mss <mss | clamp-mss-to-pmtu>

Configure the MSS advertised in outgoing TCP SYN packets on the specified interface.

By clamping the MSS value in TCP SYN packets, you explicitly inform the remote side not to send packets larger than that size. This prevents connection issues when Path MTU Discovery (PMTUD) fails.

The following options are available:

  • mss: Set the MSS to a specific value, in bytes. Use this option to enforce a specific MSS, for example, to troubleshoot connectivity issues or accommodate specific network requirements.

  • clamp-mss-to-pmtu: The router calculates the MSS to be the interface’s MTU minus 60 bytes for IPv6 traffic (40 bytes for the IPv6 header and 20 bytes for the TCP header). This option is recommended to automatically set the proper value.

set interfaces openvpn <interface> ipv6 accept-dad <0 | 1 | 2>

Configure IPv6 DAD on the interface.

The following options are available:

  • 0: Disables DAD. No duplicate address detection is performed.

  • 1: Enables DAD (default). Duplicate addresses are detected. The interface’s IPv6 operation continues for valid IPv6 addresses.

  • 2: Enables DAD and, if a MAC-based duplicate link-local address is found, disables IPv6 operation on this interface.

Example:

set interfaces openvpn vtun0 ipv6 accept-dad 2
set interfaces openvpn <interface> ipv6 dup-addr-detect-transmits <n>

Configure the number of DAD messages that the router (kernel) sends during IPv6 address assignment on this interface.

The default value is 1.

Example:

set interfaces openvpn vtun0 ipv6 dup-addr-detect-transmits 5
set interfaces openvpn <interface> keep-alive failure-count <value>

Configure the number of tolerated keepalive packet failures.

Default: 60 consecutive failures.

set interfaces openvpn <interface> keep-alive interval <value>

Configure the frequency, in seconds, at which keepalive packets are sent.

Default: 10 seconds.

set interfaces openvpn <interface> local-address <address>

Configure the local tunnel IP address for site-to-site mode.

set interfaces openvpn <interface> local-host <address>

Configure the local IP address to accept connections.

If configured, OpenVPN binds to this IP address only.

By default, OpenVPN binds to all interfaces.

set interfaces openvpn <interface> local-port <port>

Configure the local port to accept connections.

set interfaces openvpn <interface> mirror egress <monitor-interface>

Configure mirroring of outgoing traffic from this OpenVPN interface to the designated monitor interface.

set interfaces openvpn <interface> mirror ingress <monitor-interface>

Configure mirroring of incoming traffic from this OpenVPN interface to the designated monitor interface.

set interfaces openvpn <interface> mode <site-to-site | server | client>

Configure OpenVPN operation mode:

  • site-to-site: Establishes a site-to-site VPN connection.

  • client: Operates as a client in server-client mode.

  • server: Operates as a server in server-client mode.

OpenVPN Data Channel Offload (DCO)

OpenVPN DCO improves the performance of encrypted OpenVPN data processing by keeping most data handling in the kernel and avoiding frequent context switches between the kernel and user space.

As a result, packet processing becomes more efficient and may utilize hardware encryption offload support available in the kernel.

Note

  • DCO is an experimental, not fully supported OpenVPN feature. Some OpenVPN features and deployment scenarios are not compatible with DCO.

    For a complete list of supported features, visit:

    https://community.openvpn.net/openvpn/wiki/DataChannelOffload/Features

  • DCO is configured per tunnel and disabled by default. Existing tunnels operate without DCO unless it is explicitly enabled.

  • Enabling DCO resets the interface.

Best practice: Create a new tunnel with DCO enabled to avoid compatibility issues with existing clients.

set interfaces openvpn <interface> offload dco

Enable DCO for the specified OpenVPN interface.

Example:

set interfaces openvpn vtun0 offload dco

This command enables DCO and loads the required kernel module.

set interfaces openvpn <interface> openvpn-option <text>

Add raw OpenVPN configuration options to the openvpn.conf file.

OpenVPN provides many configuration options, but not all are available in the VyOS CLI.

If a required option is missing, you may submit a feature request at Phabricator so all users can benefit from it (see Issues/Feature requests).

Alternatively, use openvpn-option to pass raw OpenVPN configuration options to the openvpn.conf file.

Warning

Use this option only as a last resort. Invalid options or syntax may prevent OpenVPN from starting. Check system logs for errors after applying changes.

Example:

set interfaces openvpn vtun0 openvpn-option 'persist-key'

This command adds persist-key to the configuration file. This solves the problem by persisting keys across resets, so they do not need to be re-read.

set interfaces openvpn vtun0 openvpn-option 'route-up &quot;/config/auth/tun_up.sh arg1&quot;'

This command adds route-up "/config/auth/tun_up.sh arg1" to the configuration file. This option is executed after connection authentication, either immediately or after a short delay, as defined.

Ensure the path and arguments are enclosed in single or double quotes.

Note

Some raw configuration options require quotes. To include them, use the &quot; statement.

set interfaces openvpn <interface> persistent-tunnel

Enable always-active mode for the TUN/TAP device.

When enabled, the TUN/TAP device remains active upon connection resets or daemon reloads.

set interfaces openvpn <interface> protocol <udp | tcp-passive | tcp-active >

Configure the protocol for OpenVPN communication with a remote host:

  • udp (default): Uses the UDP protocol.

  • tcp-passive: Uses the TCP protocol and accepts connections passively.

  • tcp-active: Uses the TCP protocol and initiates connections actively.

set interfaces openvpn <interface> redirect <interface>

Enable redirection of incoming packets to the specified interface.

set interfaces openvpn <interface> remote-address <address>

Configure the remote tunnel IP address for site-to-site mode.

set interfaces openvpn <interface> remote-host <address | host>

Configure the IPv4/IPv6 address or hostname for a server device if OpenVPN runs in client mode.

This setting is not used in server mode.

set interfaces openvpn <interface> remote-port <port>

Configure the remote port to connect to the server.

set interfaces openvpn <interface> replace-default-route

Configure the OpenVPN tunnel as the default route.

set interfaces openvpn <interface> server bridge disable

Disable the given instance.

set interfaces openvpn <interface> server bridge gateway <ipv4 address>

Configure the gateway IP address.

set interfaces openvpn <interface> server bridge start <ipv4 address>

Configure the first IP address in the pool to allocate to connecting clients.

set interfaces openvpn <interface> server bridge stop <ipv4 address>

Configure the last IP address in the pool to allocate to connecting clients.

set interfaces openvpn <interface> server bridge subnet-mask <ipv4 subnet mask>

Configure the subnet mask pushed to dynamic clients.

set interfaces openvpn <interface> server client <name>

Configure the Common Name (CN) specified in the client certificate.

set interfaces openvpn <interface> server client <name> disable

Disable the client connection.

set interfaces openvpn <interface> server client <name> ip <address>

Configure the IPv4/IPv6 address for the client.

set interfaces openvpn <interface> server client <name> push-route <subnet>

Configure a route to be pushed to the specific client.

set interfaces openvpn <interface> server client <name> subnet <subnet>

Configure a fixed subnet to be routed from the server to the specified client.

Used as OpenVPN’s iroute directive.

set interfaces openvpn <interface> server client-ip-pool start <address>

Configure the first IP address in the subnet’s IPv4 pool to be dynamically allocated to connecting clients.

set interfaces openvpn <interface> server client-ip-pool stop <address>

Configure the last IP address in the subnet’s IPv4 pool to be dynamically allocated to connecting clients.

set interfaces openvpn <interface> server client-ip-pool subnet <netmask>

Configure the subnet mask pushed to dynamic clients.

Use this command only for the TAP device type. Do not use it for bridged interfaces.

set interfaces openvpn <interface> server client-ipv6-pool base <ipv6addr/bits>

Configure the IPv6 address pool for dynamic assignment to clients.

set interfaces openvpn <interface> server domain-name <name>

Configure the DNS suffix to be pushed to all clients.

set interfaces openvpn <interface> server max-connections <1-4096>

Configure the maximum number of client connections.

set interfaces openvpn <interface> server mfa totp challenge <enable | disable>

If enabled, openvpn-otp expects a password as a result of the challenge/ response protocol.

set interfaces openvpn <interface> server mfa totp digits <1-65535>

Configure the number of digits to use for the TOTP hash.

Default: 6.

set interfaces openvpn <interface> server mfa totp drift <1-65535>

Configure the time drift in seconds.

Default: 0.

set interfaces openvpn <interface> server mfa totp slop <1-65535>

Configure the allowed clock slop in seconds.

Default: 180.

set interfaces openvpn <interface> server mfa totp step <1-65535>

Configure the step value for TOTP in seconds.

Default: 30.

set interfaces openvpn <interface> server name-server <address>

Define the client DNS configuration to be used with the connection.

set interfaces openvpn <interface> server push-route <subnet>

Configure the route to be pushed to all clients.

set interfaces openvpn <interface> server reject-unconfigured-client

Reject connections from clients that are not explicitly configured.

set interfaces openvpn <interface> server subnet <subnet>

Configure the IPv4 or IPv6 network.

This parameter is mandatory when operating in server mode.

set interfaces openvpn <interface> server topology < net30 | point-to-point | subnet>

Configure the virtual addressing topology for tun mode.

This command does not affect tap mode, which always uses the subnet topology.

  • subnet (default): Allocates a single IP address to each connecting client. This is the recommended topology.

  • net30: Allocates a /30 subnet to each connecting client. This is a legacy topology used to support Windows clients. It is now effectively deprecated.

  • point-to-point: Creates a point-to-point topology where the remote endpoint of the client’s tun interface always points to the local endpoint of the server’s tun interface.

    Like subnet, this topology allocates a single IP address per client. Use it only if no clients run Windows operating systems.

set interfaces openvpn <interface> shared-secret-key <key>

Configure the static secret key for a site-to-site OpenVPN connection.

set interfaces openvpn <interface> tls auth-key <key>

Configure the TLS secret key for tls-auth.

This adds an HMAC signature to all SSL/TLS handshake packets to verify integrity.

Use run generate pki openvpn shared-secret install <name> to generate the key.

set interfaces openvpn <interface> tls ca-certificate <name>

Configure the Certificate Authority chain in the PKI configuration.

set interfaces openvpn <interface> tls certificate <name>

Configure the certificate name in the PKI configuration.

set interfaces openvpn <interface> tls crypt-key

Configure a shared secret key to provide an additional level of security, a variant similar to tls-auth.

set interfaces openvpn <interface> tls dh-params

Configure Diffie-Hellman parameters for server mode.

set interfaces openvpn <interface> tls peer-fingerprint <text>

Configure the peer certificate SHA256 fingerprint for site-to-site mode.

set interfaces openvpn <interface> tls role <active | passive>

Configure the TLS negotiation role, preferably used in site-to-site mode:

  • active: Initiates TLS negotiation actively.

  • passive: Waits for incoming TLS connections.

set interfaces openvpn <interface> tls tls-version-min <1.0 | 1.1 | 1.2 | 1.3 >

Configure the minimum TLS version to be accepted from the peer.

set interfaces openvpn <interface> use-lzo-compression

Configure fast LZO compression on this TUN/TAP interface.

set interfaces openvpn <interface> vrf <name>

Assign the interface to a specific VRF instance.

Operation mode

show openvpn site-to-site

Show tunnel status for OpenVPN site-to-site interfaces.

show openvpn server

Show tunnel status for OpenVPN server interfaces.

show openvpn client

Show tunnel status for OpenVPN client interfaces.

show log openvpn

Show logs for all OpenVPN interfaces.

show log openvpn interface <interface>

Show logs for the specific OpenVPN interface.

reset openvpn client <text>

Reset the specified OpenVPN client.

reset openvpn interface <interface>

Reset the OpenVPN process on the specified interface.

generate openvpn client-config interface <interface> ca <name> certificate <name>

Generate an OpenVPN client configuration file in the .ovpn format for client machines.

Examples

This section covers examples of OpenVPN configurations for various deployments.