home | help
OPENVPN(8)		     System Manager's Manual		      OPENVPN(8)

NAME
     openvpn - Secure IP tunnel daemon

SYNOPSIS
     openvpn [ options ... ]
     openvpn  --help

INTRODUCTION
     OpenVPN  is an open source VPN daemon by James Yonan. Because OpenVPN tries
     to be a universal VPN tool offering a great deal of flexibility, there  are
     a	lot  of options on this manual page. If you're new to OpenVPN, you might
     want to skip ahead to the examples section where you will see how	to  con-
     struct simple VPNs on the command line without even needing a configuration
     file.

     Also  note  that there's more documentation and examples on the OpenVPN web
     site:  <https://openvpn.net/>

     And if you would like to see a shorter version  of  this  manual,	see  the
     openvpn  usage message which can be obtained by running openvpn without any
     parameters.

DESCRIPTION
     OpenVPN is a robust  and  highly  flexible  VPN  daemon.  OpenVPN	supports
     SSL/TLS  security,  ethernet  bridging, TCP or UDP tunnel transport through
     proxies or NAT, support for dynamic IP addresses and DHCP,  scalability  to
     hundreds or thousands of users, and portability to most major OS platforms.

     OpenVPN  is  tightly  bound to the OpenSSL library, and derives much of its
     crypto capabilities from it.

     OpenVPN supports conventional encryption  using  a  pre-shared  secret  key
     (Static  Key  mode)  or  public  key security (SSL/TLS mode) using client &
     server certificates. OpenVPN also supports non-encrypted TCP/UDP tunnels.

     OpenVPN is designed to work with the TUN/TAP virtual  networking  interface
     that exists on most platforms.

     Overall, OpenVPN aims to offer many of the key features of IPSec but with a
     relatively lightweight footprint.

OPTIONS
     OpenVPN  allows  any option to be placed either on the command line or in a
     configuration file. Though all command line options are preceded by a  dou-
     ble-leading-dash  ("--"),	this  prefix  can  be  removed when an option is
     placed in a configuration file.

   Generic Options
     This section covers generic options  which  are  accessible  regardless  of
     which mode OpenVPN is configured as.

     --help
	    Show options.

     --auth-nocache
	    Don't cache --askpass or --auth-user-pass username/passwords in vir-
	    tual memory.

	    If	specified, this directive will cause OpenVPN to immediately for-
	    get username/password inputs after they are used. As a result,  when
	    OpenVPN  needs  a  username/password,  it will prompt for input from
	    stdin, which may be multiple times during the duration of an OpenVPN
	    session.

	    When using --auth-nocache in combination with a  user/password  file
	    and --chroot or --daemon, make sure to use an absolute path.

     --cd dir
	    Change  directory to dir prior to reading any files such as configu-
	    ration files, key files, scripts, etc. dir	should	be  an	absolute
	    path,  with a leading "/", and without any references to the current
	    directory such as . or ...

	    This option is useful when you are running OpenVPN in --daemon mode,
	    and you want to consolidate all of your OpenVPN control files in one
	    location.

     --chroot dir
	    Chroot to dir after initialization. --chroot  essentially  redefines
	    dir  as  being the top level directory tree (/). OpenVPN will there-
	    fore be unable to access any files outside this tree.  This  can  be
	    desirable from a security standpoint.

	    Since  the	chroot	operation is delayed until after initialization,
	    most OpenVPN options that reference files will operate in a  pre-ch-
	    root context.

	    In	many  cases,  the dir parameter can point to an empty directory,
	    however complications can result when scripts or restarts  are  exe-
	    cuted after the chroot operation.

	    Note:  The	SSL library will probably need /dev/urandom to be avail-
	    able inside the chroot directory dir. This is because SSL  libraries
	    occasionally  need	to collect fresh randomness. Newer linux kernels
	    and some BSDs implement a getrandom() or getentropy()  syscall  that
	    removes the need for /dev/urandom to be available.

     --compat-mode version
	    This option provides a convenient way to alter the defaults of Open-
	    VPN to be more compatible with the version version specified. All of
	    the  changes this option applies can also be achieved using individ-
	    ual configuration options.

	    The version specified with this option is  the  version  of  OpenVPN
	    peer  OpenVPN  should  try to be compatible with. In general OpenVPN
	    should be compatible with the last two previous version without this
	    option. E.g.  OpenVPN 2.6.0 should	be  compatible	with  2.5.x  and
	    2.4.x  without this option.  However, there might be some edge cases
	    that still require this option even in these cases.

	    Note: Using this option reverts defaults to  no  longer  recommended
	    values and should be avoided if possible.

	    The  following  table details what defaults are changed depending on
	    the version specified.

	    * 2.5.x or lower: --allow-compression asym is automatically added to
	      the configuration if no other compression options are present.

	    * 2.4.x or lower: The cipher in --cipher is appended  to  --data-ci-
	      phers.

	    * 2.3.x  or  lower:  --data-ciphers-fallback  is automatically added
	      with the same cipher as --cipher.

	    * 2.3.6 or lower: --tls-version-min 1.0 is added to  the  configura-
	      tion when --tls-version-min is not explicitly set.

	    If	not required, this is option should be avoided. Setting this op-
	    tion can lower security or disable features  like  data-channel  of-
	    floading.

     --config file
	    Load additional config options from file where each line corresponds
	    to one command line option, but with the leading -- removed.

	    If	--config  file	is  the  only option to the openvpn command, the
	    --config can be removed, and the command can  be  given  as  openvpn
	    file

	    Note that configuration files can be nested to a reasonable depth.

	    Double quotation or single quotation characters ("", '') can be used
	    to	enclose  single parameters containing whitespace, and "#" or ";"
	    characters in the first column can be used to denote comments.

	    Note that OpenVPN 2.0 and higher performs backslash-based shell  es-
	    caping  for  characters  not  in single quotations, so the following
	    mappings should be observed:

	       \\	Maps to a single backslash character (\).
	       \"	Pass a literal doublequote character ("), don't
			interpret it as enclosing a parameter.
	       \[SPACE] Pass a literal space or tab character, don't
			interpret it as a parameter delimiter.

	    For example on Windows, use double backslashes  to	represent  path-
	    names:

	       secret "c:\\OpenVPN\\secret.key"

	    For examples of configuration files, see
	     <https://openvpn.net/community-resources/how-to/>

	    Here is an example configuration file:

	       #
	       # Sample OpenVPN configuration file for
	       # using a pre-shared static key.
	       #
	       # '#' or ';' may be used to delimit comments.

	       # Use a dynamic tun device.
	       dev tun

	       # Our remote peer
	       remote mypeer.mydomain

	       # 10.1.0.1 is our local VPN endpoint
	       # 10.1.0.2 is our remote VPN endpoint
	       ifconfig 10.1.0.1 10.1.0.2

	       # Our pre-shared static key
	       secret static.key

     --daemon progname
	    Become a daemon after all initialization functions are completed.

	    Valid syntaxes:

	       daemon
	       daemon progname

	    This  option  will	cause all message and error output to be sent to
	    the syslog file (such as /var/log/messages), except for  the  output
	    of	scripts and ifconfig commands, which will go to /dev/null unless
	    otherwise redirected. The syslog redirection occurs  immediately  at
	    the  point	that  --daemon is parsed on the command line even though
	    the daemonization point occurs later. If one of the --log options is
	    present, it will supersede syslog redirection.

	    The optional progname parameter will cause	OpenVPN  to  report  its
	    program name to the system logger as progname. This can be useful in
	    linking  OpenVPN  messages in the syslog file with specific tunnels.
	    When unspecified, progname defaults to openvpn.

	    When OpenVPN is run with the --daemon option, it will try  to  delay
	    daemonization  until  the majority of initialization functions which
	    are capable of generating fatal errors are complete. This means that
	    initialization scripts can test the return	status	of  the  openvpn
	    command  for a fairly reliable indication of whether the command has
	    correctly initialized and entered the packet forwarding event loop.

	    In OpenVPN, the vast majority of errors which occur  after	initial-
	    ization are non-fatal.

	    Note:  as  soon  as OpenVPN has daemonized, it can not ask for user-
	    names, passwords, or key pass phrases anymore. This has certain con-
	    sequences, namely that using a password-protected private  key  will
	    fail  unless the --askpass option is used to tell OpenVPN to ask for
	    the pass phrase (this requirement is new in v2.3.7, and is a  conse-
	    quence of calling daemon() before initializing the crypto layer).

	    Further,  using  --daemon together with --auth-user-pass (entered on
	    console) and --auth-nocache will fail as soon as  key  renegotiation
	    (and reauthentication) occurs.

     --disable-dco
	    Disable "data channel offload" (DCO).

	    On	Linux  don't  use the ovpn-dco device driver, but rather rely on
	    the legacy tun module.

	    You may want to use this  option  if  your	server	needs  to  allow
	    clients older than version 2.4 to connect.

     --disable-occ
	    DEPRECATED	Disable  "options consistency check" (OCC) in configura-
	    tions that do not use TLS.

	    Don't output a warning message if  option  inconsistencies	are  de-
	    tected between peers. An example of an option inconsistency would be
	    where one peer uses --dev tun while the other peer uses --dev tap.

	    Use  of  this  option is discouraged, but is provided as a temporary
	    fix in situations where a recent version of OpenVPN must connect  to
	    an old version.

     --engine engine-name
	    Enable OpenSSL hardware-based crypto engine functionality.

	    Valid syntaxes:

	       engine
	       engine engine-name

	    If	engine-name  is specified, use a specific crypto engine. Use the
	    --show-engines standalone option to list the  crypto  engines  which
	    are supported by OpenSSL.

     --group group
	    Similar  to  the  --user option, this option changes the group ID of
	    the OpenVPN process to group after initialization.

     --ignore-unknown-option args
	    Valid syntax:

	       ignore-unknown-options opt1 opt2 opt3 ... optN

	    When one of options opt1 ... optN is encountered in  the  configura-
	    tion file the configuration file parsing does not fail if this Open-
	    VPN  version  does	not  support  the  option. Multiple --ignore-un-
	    known-option options can be given to support a larger number of  op-
	    tions to ignore.

	    This  option should be used with caution, as there are good security
	    reasons for having OpenVPN fail if it detects problems in  a  config
	    file.   Having  said  that,  there are valid reasons for wanting new
	    software features to gracefully degrade when  encountered  by  older
	    software versions.

	    --ignore-unknown-option is available since OpenVPN 2.3.3.

     --iproute cmd
	    Set  alternate  command  to execute instead of default iproute2 com-
	    mand.  May be used in order to execute OpenVPN in unprivileged envi-
	    ronment.

     --keying-material-exporter args
	    Save Exported Keying Material [RFC5705] of len bytes  (must  be  be-
	    tween  16  and 4095 bytes) using label in environment (exported_key-
	    ing_material) for use by plugins in  OPENVPN_PLUGIN_TLS_FINAL  call-
	    back.

	    Valid syntax:

	       keying-material-exporter label len

	    Note  that exporter labels have the potential to collide with exist-
	    ing PRF labels. In order to prevent this, labels MUST begin with EX-
	    PORTER.

     --mlock
	    Disable paging by calling the POSIX mlockall function. Requires that
	    OpenVPN be initially run as root (though  OpenVPN  can  subsequently
	    downgrade its UID using the --user option).

	    Using  this  option  ensures  that	key material and tunnel data are
	    never written to disk due to virtual memory paging operations  which
	    occur  under  most modern operating systems. It ensures that even if
	    an attacker was able to crack the box running OpenVPN, he would  not
	    be	able  to  scan	the  system swap file to recover previously used
	    ephemeral keys, which are used for a period of time governed by  the
	    --reneg options (see below), then are discarded.

	    The  downside  of using --mlock is that it will reduce the amount of
	    physical memory available to other applications.

	    The limit on how much memory can be locked and how that limit is en-
	    forced are OS-dependent. On Linux the default limit that an unprivi-
	    leged process may lock (RLIMIT_MEMLOCK) is low,  and  if  privileges
	    are  dropped later, future memory allocations will very likely fail.
	    The limit can be increased using ulimit or	systemd  directives  de-
	    pending on how OpenVPN is started.

	    If the platform has the getrlimit(2) system call, OpenVPN will check
	    for  the amount of mlock-able memory before calling mlockall(2), and
	    tries to increase the limit to 100 MB if less than this  is  config-
	    ured.   100  Mb  is  somewhat  arbitrary - it is enough for a moder-
	    ately-sized OpenVPN deployment, but the memory usage might go beyond
	    that if the number of concurrent clients is high.

     --nice n
	    Change process priority after initialization (n greater  than  0  is
	    lower priority, n less than zero is higher priority).

     --providers providers
	    Load  the list of (OpenSSL) providers. This is mainly useful for us-
	    ing an external provider for key management like tpm2-openssl or  to
	    load the legacy provider with

	       --providers legacy default

	    Behaviour  of  changing this option between SIGHUP might not be well
	    behaving.  If you  need  to  change/add/remove  this  option,  fully
	    restart OpenVPN.

     --remap-usr1 signal
	    Control  whether  internally or externally generated SIGUSR1 signals
	    are remapped to SIGHUP (restart without persisting state) or SIGTERM
	    (exit).

	    signal can be set to SIGHUP or SIGTERM. By default, no remapping oc-
	    curs.

     --script-security level
	    This directive offers policy-level control over OpenVPN's  usage  of
	    external  programs and scripts. Lower level values are more restric-
	    tive, higher values are more permissive. Settings for level:

	    0	   Strictly no calling of external programs.

	    1	   (Default) Only call built-in executables  such  as  ifconfig,
		   ip, route, or netsh.

	    2	   Allow   calling  of	built-in  executables  and  user-defined
		   scripts.

	    3	   Allow passwords to be passed  to  scripts  via  environmental
		   variables (potentially unsafe).

	    OpenVPN  releases before v2.3 also supported a method flag which in-
	    dicated how OpenVPN should call external commands and scripts.  This
	    could be either execve or system. As of OpenVPN 2.3, this flag is no
	    longer accepted. In most *nix environments the execve() approach has
	    been used without any issues.

	    Some  directives  such as --up allow options to be passed to the ex-
	    ternal script. In these cases make sure the  script  name  does  not
	    contain any spaces or the configuration parser will choke because it
	    can't determine where the script name ends and script options start.

	    To	run scripts in Windows in earlier OpenVPN versions you needed to
	    either add a full path to the script interpreter which can parse the
	    script or use the system flag to run these scripts.  As  of  OpenVPN
	    2.3  it  is now a strict requirement to have full path to the script
	    interpreter when running non-executables files. This is  not  needed
	    for  executable  files,  such as .exe, .com, .bat or .cmd files. For
	    example, if you have a Visual Basic script, you must use this syntax
	    now:

	       --up 'C:\\Windows\\System32\\wscript.exe C:\\Program\ Files\\OpenVPN\\config\\my-up-script.vbs'

	    Please note the single quote marks and the	escaping  of  the  back-
	    slashes (\) and the space character.

	    The reason the support for the system flag was removed is due to the
	    security  implications  with shell expansions when executing scripts
	    via the system() call.

     --setcon context
	    Apply SELinux context after initialization.  This  essentially  pro-
	    vides  the	ability to restrict OpenVPN's rights to only network I/O
	    operations, thanks to SELinux. This goes  further  than  --user  and
	    --chroot in that those two, while being great security features, un-
	    fortunately do not protect against privilege escalation by exploita-
	    tion  of  a  vulnerable  system  call. You can of course combine all
	    three, but please note that since setcon requires  access  to  /proc
	    you  will  have to provide it inside the chroot directory (e.g. with
	    mount --bind).

	    Since the setcon operation is delayed  until  after  initialization,
	    OpenVPN  can  be  restricted  to  just network-related system calls,
	    whereas by applying the context before startup (such as the  OpenVPN
	    one provided in the SELinux Reference Policies) you will have to al-
	    low many things required only during initialization.

	    Like  with chroot, complications can result when scripts or restarts
	    are executed after the setcon operation, which is why you should re-
	    ally consider using the --persist-tun option.

     --status args
	    Write operational status to file every n seconds. n defaults  to  60
	    if not specified.

	    Valid syntaxes:

	       status file
	       status file n

	    Status  can  also be written to the syslog by sending a SIGUSR2 sig-
	    nal.

	    With multi-client capability enabled on a server,  the  status  file
	    includes  a  list  of clients and a routing table. The output format
	    can be controlled by the --status-version option in that case.

	    For clients or instances running in  point-to-point  mode,	it  will
	    contain the traffic statistics.

     --status-version n
	    Set the status file format version number to n.

	    This only affects the status file on servers with multi-client capa-
	    bility enabled.  Valid status version values:

	    1	   Traditional	format	(default).  The client list contains the
		   following fields comma-separated: Common Name, Real	Address,
		   Bytes Received, Bytes Sent, Connected Since.

	    2	   A  more  reliable format for external processing. Compared to
		   version 1, the client list contains some  additional  fields:
		   Virtual  Address,  Virtual IPv6 Address, Username, Client ID,
		   Peer ID, Data Channel Cipher. Future versions may extend  the
		   number of fields.

	    3	   Identical to 2, but fields are tab-separated.

     --test-crypto
	    Do	a  self-test  of  OpenVPN's crypto options by encrypting and de-
	    crypting test packets using  the  data  channel  encryption  options
	    specified  above.	This option does not require a peer to function,
	    and therefore can be specified without --dev or --remote.

	    The typical usage of --test-crypto would be something like this:

	       openvpn --test-crypto

	    or

	       openvpn --test-crypto --verb 9

	    This option is very useful to test OpenVPN after it has been  ported
	    to	a  new platform, or to isolate problems in the compiler, OpenSSL
	    crypto library, or OpenVPN's crypto code. Since it	is  a  self-test
	    mode,  problems  with  encryption and authentication can be debugged
	    independently of network and tunnel issues.

	    Older versions of OpenVPN used the --secret argument  to  specify  a
	    static  key  for  this test. Newer version generate a random key for
	    the test.

     --tmp-dir dir
	    Specify a directory dir for temporary files instead of  the  default
	    TMPDIR  (or  "/tmp"  if unset). Note that it must be writable by the
	    main process after it has dropped root privileges.

	    This directory will be used to communicate with scripts and plugins:

	    * --client-connect scripts and OPENVPN_PLUGIN_CLIENT_CONNECT plug-in
	      hook  to	dynamically   generate	 client-specific   configuration
	      client_connect_config_file    and   return   success/failure   via
	      client_connect_deferred_file when using  deferred  client  connect
	      method

	    * OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY  plug-in  hooks  returns suc-
	      cess/failure via auth_control_file when using deferred auth method
	      and pending authentication via auth_pending_file.

     --use-prediction-resistance
	    Enable prediction resistance on mbed TLS's RNG.

	    Enabling prediction resistance causes the RNG to reseed in each call
	    for random. Reseeding this often can quickly deplete the kernel  en-
	    tropy pool.

	    If	you need this option, please consider running a daemon that adds
	    entropy to the kernel pool.

     --user user
	    Change the user ID of the OpenVPN process to user after  initializa-
	    tion,  dropping  privileges in the process. This option is useful to
	    protect the system in the event that some hostile party was able  to
	    gain  control  of an OpenVPN session. Though OpenVPN's security fea-
	    tures make this unlikely, it is provided as a  second  line  of  de-
	    fense.

	    By	setting  user  to an unprivileged user dedicated to run openvpn,
	    the hostile party would be limited in what damage they could  cause.
	    Of	course	once you take away privileges, you cannot return them to
	    an OpenVPN session. This means, for example, that if you want to re-
	    set an OpenVPN daemon with a SIGUSR1 signal (for example in response
	    to a DHCP reset), you should make use of one or more of  the  --per-
	    sist  options  to  ensure  that  OpenVPN doesn't need to execute any
	    privileged operations in order to restart (such  as  re-reading  key
	    files or running ifconfig on the TUN device).

	    NOTE:  Previous  versions  of openvpn used nobody as the example un-
	    priviledged user. It is not recommended to actually  use  that  user
	    since  it  is  usually used by other system services already. Always
	    create a dedicated user for openvpn.

     --writepid file
	    Write OpenVPN's main process ID to file.

   Log options
     --echo parms
	    Echo parms to log output.

	    Designed to be used to send messages to  a	controlling  application
	    which is receiving the OpenVPN log output.

     --errors-to-stderr
	    Output errors to stderr instead of stdout unless log output is redi-
	    rected by one of the --log options.

     --log file
	    Output  logging  messages to file, including output to stdout/stderr
	    which is generated by called scripts. If file already exists it will
	    be truncated. This option takes effect immediately when it is parsed
	    in the command line and will supersede syslog output if --daemon  is
	    also  specified. This option is persistent over the entire course of
	    an OpenVPN instantiation and will not be reset by  SIGHUP,	SIGUSR1,
	    or --ping-restart.

	    Note  that on Windows, when OpenVPN is started as a service, logging
	    occurs by default without the need to specify this option.

     --log-append file
	    Append logging messages to file.  If file does not exist, it will be
	    created. This option behaves exactly like --log except that  it  ap-
	    pends to rather than truncating the log file.

     --machine-readable-output
	    Always write timestamps and message flags to log messages, even when
	    they otherwise would not be prefixed. In particular, this applies to
	    log messages sent to stdout.

     --mute n
	    Log  at  most  n  consecutive messages in the same category. This is
	    useful to limit repetitive logging of similar message types.

     --mute-replay-warnings
	    Silence the output of replay warnings,  which  are	a  common  false
	    alarm  on  WiFi  networks. This option preserves the security of the
	    replay protection code without the verbosity associated  with  warn-
	    ings about duplicate packets.

     --suppress-timestamps
	    Avoid  writing  timestamps to log messages, even when they otherwise
	    would be prepended. In particular, this applies to log messages sent
	    to stdout.

     --syslog progname
	    Direct log output to system logger, but do not become a daemon.  See
	    --daemon directive above for description of progname parameter.

     --verb n
	    Set  output  verbosity  to	n (default 1). Each level shows all info
	    from the previous levels. Level 3 is recommended if you want a  good
	    summary of what's happening without being swamped by output.

	    0	   No output except fatal errors.

	    1 to 4
		   Normal usage range.

	    5	   Outputs  R  and  W  characters to the console for each packet
		   read and write, uppercase is used  for  TCP/UDP  packets  and
		   lowercase is used for TUN/TAP packets.

	    6 to 11
		   Debug info range (see errlevel.h in the source code for addi-
		   tional information on debug levels).

   Protocol options
     Options  in this section affect features available in the OpenVPN wire pro-
     tocol.  Many of these options also define the  encryption	options  of  the
     data  channel  in the OpenVPN wire protocol.  These options must be config-
     ured in a compatible way between both the local and remote side.

     --allow-compression mode
	    As described in the --compress option, compression is a  potentially
	    dangerous  option.	 This option allows controlling the behaviour of
	    OpenVPN when compression is used and allowed.

	    The mode argument can be one of the following values:

	    asym   OpenVPN will only decompress incoming packets  but  not  com-
		   press  outgoing  packets.  This also allows migrating to dis-
		   able compression when changing both server and client config-
		   urations to remove compression at the same time is not a fea-
		   sible option.

	    no (default)
		   OpenVPN will refuse any  compression.   If  data-channel  of-
		   floading  is  enabled,  OpenVPN will additionally also refuse
		   compression framing (stub).

	    yes    DEPRECATED This option is an alias for  asym.  Previously  it
		   did	enable	compression  for  outgoing  packets, but OpenVPN
		   never compresses packets on send now.

     --auth alg
	    Authenticate data channel packets and (if enabled) tls-auth  control
	    channel  packets  with HMAC using message digest algorithm alg. (The
	    default is SHA1 ). HMAC is a commonly  used  message  authentication
	    algorithm (MAC) that uses a data string, a secure hash algorithm and
	    a key to produce a digital signature.

	    The  OpenVPN data channel protocol uses encrypt-then-mac (i.e. first
	    encrypt a packet then HMAC the resulting ciphertext), which prevents
	    padding oracle attacks.

	    If an AEAD cipher mode (e.g.  GCM)	is  chosen  then  the  specified
	    --auth algorithm is ignored for the data channel and the authentica-
	    tion  method of the AEAD cipher is used instead. Note that alg still
	    specifies the digest used for tls-auth.

	    In static-key encryption mode, the HMAC key is included in	the  key
	    file generated by --genkey. In TLS mode, the HMAC key is dynamically
	    generated  and  shared between peers via the TLS control channel. If
	    OpenVPN receives a packet with a bad HMAC it will drop  the  packet.
	    HMAC usually adds 16 or 20 bytes per packet. Set alg=none to disable
	    authentication.

	    For more information on HMAC see
	     <https://tools.ietf.org/html/rfc2104>

     --cipher alg
	    This  option should not be used any longer in TLS mode and still ex-
	    ists for two reasons:

	    * compatibility with old configurations still carrying it around;

	    * allow users connecting to OpenVPN peers older than 2.6.0	to  have
	      --cipher	configured  the same way as the remote counterpart. This
	      can avoid MTU/frame size warnings.

	    Before 2.4.0, this option was used to select the cipher to	be  con-
	    figured on the data channel, however, later versions usually ignored
	    this  directive  in  favour  of  a negotiated cipher.  Starting with
	    2.6.0, this option is always ignored in TLS mode when  it  comes  to
	    configuring the cipher.

	    If you wish to specify the cipher to use on the data channel, please
	    see   --data-ciphers   (for   regular  negotiation)  and  --data-ci-
	    phers-fallback (for a fallback option when	the  negotiation  cannot
	    take  place  because  the  other peer is old or has negotiation dis-
	    abled).

	    To see ciphers that are available with OpenVPN, use  the  --show-ci-
	    phers option.

	    Set alg to none to disable encryption.

     --compress algorithm
	    DEPRECATED	Enable a compression algorithm. Compression is generally
	    not recommended. VPN tunnels which use compression	are  susceptible
	    to the VORALCE attack vector. See also the migrate parameter below.

	    The  algorithm parameter may be lzo, lz4, lz4-v2, stub, stub-v2, mi-
	    grate or empty.  LZO and LZ4 are different	compression  algorithms,
	    with  LZ4 generally offering the best performance with least CPU us-
	    age.

	    The lz4-v2 and stub-v2 variants implement a better framing that does
	    not add overhead when packets cannot be compressed. All other  vari-
	    ants  always  add  one extra framing byte compared to no compression
	    framing.

	    Especially stub-v2 is essentially identical to no compression and no
	    compression framing as its header indicates IP version 5  in  a  tun
	    setup  and	can (ab)used to complete disable compression to clients.
	    (See the migrate option below)

	    If the algorithm parameter is stub, stub-v2  or  empty,  compression
	    will  be  turned  off,  but  the packet framing for compression will
	    still be enabled, allowing a different setting to be  pushed  later.
	    Additionally,  stub  and  stub-v2 wil disable announcing lzo and lz4
	    compression support via IV_ variables to the server.

	    Note: the stub (or empty) option is NOT compatible	with  the  older
	    option --comp-lzo no.

	    Using  migrate  as compression algorithm enables a special migration
	    mode.  It allows migration away from the  --compress/--comp-lzo  op-
	    tions to no compression.  This option sets the server to no compres-
	    sion  mode	and  the  server behaves identical to a server without a
	    compression option for all clients without a  compression  in  their
	    config.  However,  if  a client is detected that indicates that com-
	    pression is used (via OCC), the server will automatically add --push
	    compress stub-v2 to the client specific configuration  if  supported
	    by	the  client  and  otherwise switch to comp-lzo no and add --push
	    comp-lzo to the client specific configuration.

	    *Security Considerations*

	    Compression and encryption is a tricky combination. If  an	attacker
	    knows  or  is  able  to control (parts of) the plain-text of packets
	    that contain secrets, the attacker might be able to extract the  se-
	    cret  if  compression  is enabled. See e.g. the CRIME and BREACH at-
	    tacks on TLS and VORACLE on VPNs which also leverage  to  break  en-
	    cryption. If you are not entirely sure that the above does not apply
	    to your traffic, you are advised to not enable compression.

	    For  this  reason  compression support was removed from current ver-
	    sions of OpenVPN. It will still decompress	compressed  packets  re-
	    ceived  via a VPN connection but it will never compress any outgoing
	    packets.

     --comp-lzo mode
	    DEPRECATED Enable LZO compression algorithm.  Compression is  gener-
	    ally  not  recommended.  VPN tunnels which uses compression are sus-
	    pectible to the VORALCE attack vector.

	    Allows the other side of the connection to use LZO compression.  Due
	    to	difference  in	packet format this may add 1 additional byte per
	    packet.  With current versions of OpenVPN no actual compression will
	    happen.

	    mode may be yes, no, or adaptive but there is no  actual  change  in
	    behavior anymore.

     --comp-noadapt
	    DEPRECATED	This  option does not have any effect anymore since cur-
	    rent versions of OpenVPN never compress outgoing packets.

     --key-direction
	    Alternative way of specifying the optional direction  parameter  for
	    the  --tls-auth  option. Useful when using inline files (See section
	    on inline files).

     --data-ciphers cipher-list
	    Restrict the allowed ciphers to be negotiated to the ciphers in  ci-
	    pher-list. cipher-list is a colon-separated list of ciphers, and de-
	    faults     to     AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305     when
	    Chacha20-Poly1305	    is	     available	     and       otherwise
	    AES-256-GCM:AES-128-GCM.

	    For  servers,  the	first  cipher from cipher-list that is also sup-
	    ported by the client will be pushed to clients that  support  cipher
	    negotiation.

	    For more details see the chapter on Data channel cipher negotiation.
	    Especially	if  you  need  to  support clients with OpenVPN versions
	    older than 2.4!

	    Starting with OpenVPN 2.6 a cipher can be prefixed with a ? to  mark
	    it	as  optional. This allows including ciphers in the list that may
	    not     be	   available	  on	  all	   platforms.	    E.g.
	    AES-256-GCM:AES-128-GCM:?CHACHA20-POLY1305	  would    only   enable
	    Chacha20-Poly1305 if the underlying SSL library (and its  configura-
	    tion) supports it.

	    Starting with OpenVPN 2.7 the special keyword DEFAULT can be used in
	    the string and is replaced by the default ciphers.	This can be used
	    to	add  an  additional  allowed cipher to the allowed ciphers, e.g.
	    DEFAULT:AES-192-CBC to  use  the  default  ciphers	but  also  allow
	    AES-192-CBC.

	    Cipher  negotiation  is  enabled in client-server mode only. I.e. if
	    --mode is set to server (server-side, implied by setting --server ),
	    or	if  --pull  is	specified  (client-side,  implied   by	 setting
	    --client).

	    If	no common cipher is found during cipher negotiation, the connec-
	    tion is terminated. To support old clients/old servers that  do  not
	    provide any cipher negotiation support see --data-ciphers-fallback.

	    If	--compat-mode  is  set	to a version older than 2.5.0 the cipher
	    specified by --cipher will be appended to --data-ciphers if not  al-
	    ready present.

	    This  list	is  restricted	to be 127 chars long after conversion to
	    OpenVPN ciphers.

	    This option was called --ncp-ciphers in OpenVPN 2.4 but has been re-
	    named to --data-ciphers in OpenVPN 2.5 to  more  accurately  reflect
	    its meaning.

     --data-ciphers-fallback alg
	    Configure  a cipher that is used to fall back to if we could not de-
	    termine which cipher the peer is willing to use.

	    This option should only be needed to connect to peers that are  run-
	    ning  OpenVPN  2.3	or older versions, and have been configured with
	    --enable-small (typically used on  routers	or  other  embedded  de-
	    vices).

     --allow-deprecated-insecure-static-crypto
	    DEPRECATED	This allow using OpenVPN without TLS. This is deprecated
	    and will be removed in OpenVPN 2.8.

     --tran-window n
	    Transition window -- our old key can live this many seconds after  a
	    new  a key renegotiation begins (default 3600 seconds). This feature
	    allows for a graceful transition from old to new  key,  and  removes
	    the key renegotiation sequence from the critical path of tunnel data
	    forwarding.

     --force-tls-key-material-export
	    This  option  is  only  available in --mode server and forces to use
	    Keying Material Exporters (RFC 5705) for clients. This can	be  used
	    to	simulate an environment where the cryptographic library does not
	    support the older method to generate data channel keys anymore. This
	    option is intended to be a test option and might be removed in a fu-
	    ture OpenVPN version without notice.

   Client Options
     The client options are used when connecting to an OpenVPN server configured
     to use --server, --server-bridge, or --mode server in its configuration.

     --allow-pull-fqdn
	    Allow client to pull DNS names from server (rather than  being  lim-
	    ited to IP address) for --ifconfig, --route, and --route-gateway.

     --allow-recursive-routing
	    When  this option is set, OpenVPN will not drop incoming tun packets
	    with same destination as host.

     --auth-token token
	    This is not an option to  be  used	directly  in  any  configuration
	    files, but rather push this option from a --client-connect script or
	    a  --plugin  which	hooks  into the OPENVPN_PLUGIN_CLIENT_CONNECT or
	    OPENVPN_PLUGIN_CLIENT_CONNECT_V2 calls. This option provides a  pos-
	    sibility  to replace the clients password with an authentication to-
	    ken during the lifetime of the OpenVPN client.

	    Whenever	the    connection    is     renegotiated     and     the
	    --auth-user-pass-verify  script  or --plugin making use of the OPEN-
	    VPN_PLUGIN_AUTH_USER_PASS_VERIFY hook is  triggered,  it  will  pass
	    over  this	token  as  the password instead of the password the user
	    provided. The authentication token can only be reset by a  full  re-
	    connect  where  the  server  can push new options to the client. The
	    password the user entered is never preserved once an  authentication
	    token has been set. If the OpenVPN server side rejects the authenti-
	    cation token then the client will receive an AUTH_FAILED and discon-
	    nect.

	    The  purpose of this is to enable two factor authentication methods,
	    such as HOTP or TOTP, to be used without needing to retrieve  a  new
	    OTP  code each time the connection is renegotiated. Another use case
	    is to cache authentication data on the  client  without  needing  to
	    have the users password cached in memory during the life time of the
	    session.

	    To make use of this feature, the --client-connect script or --plugin
	    needs to put

	       push "auth-token UNIQUE_TOKEN_VALUE"

	    into  the file/buffer for dynamic configuration data. This will then
	    make the OpenVPN server to push this value to the client, which  re-
	    places the local password with the UNIQUE_TOKEN_VALUE.

	    Newer  clients  (2.4.7+)  will  fall  back	to the original password
	    method after a failed auth. Older clients will keep using the  token
	    value and react according to --auth-retry

     --auth-token-user base64username
	    Companion  option  to --auth-token. This options allows one to over-
	    ride the username used by the client when reauthenticating with  the
	    auth-token.   It  also allows one to use --auth-token in setups that
	    normally do not use username and password.

	    The username has to be base64 encoded.

     --auth-user-pass
	    Authenticate with server using username/password.

	    Valid syntaxes:

	       auth-user-pass
	       auth-user-pass up

	    If up is present, it must be a file containing username/password  on
	    2  lines.  If  the password line is missing, OpenVPN will prompt for
	    one.

	    If up is omitted, username/password will be prompted from  the  con-
	    sole.

	    This option can also be inlined

	       <auth-user-pass>
	       username
	       [password]
	       </auth-user-pass>

	    where password is optional, and will be prompted from the console if
	    missing.

	    The  server  configuration	must  specify an --auth-user-pass-verify
	    script to verify the username/password provided by the client.

     --auth-retry type
	    Controls how OpenVPN responds to username/password verification  er-
	    rors such as the client-side response to an AUTH_FAILED message from
	    the server or verification failure of the private key password.

	    Normally  used to prevent auth errors from being fatal on the client
	    side, and to permit username/password requeries in case of error.

	    An AUTH_FAILED message is generated by  the  server  if  the  client
	    fails   --auth-user-pass   authentication,	or  if	the  server-side
	    --client-connect script returns an	error  status  when  the  client
	    tries to connect.

	    type can be one of:

	    none   Client will exit with a fatal error (this is the default).

	    nointeract
		   Client  will  retry	the connection without requerying for an
		   --auth-user-pass username/password. Use this option for unat-
		   tended clients.

	    interact
		   Client will requery for an --auth-user-pass username/password
		   and/or private key password before attempting a reconnection.

	    Note that while this option cannot be pushed, it can  be  controlled
	    from the management interface.

     --client
	    A  helper  directive designed to simplify the configuration of Open-
	    VPN's client mode. This directive is equivalent to:

	       pull
	       tls-client

     --client-nat args
	    This pushable client option sets up a stateless one-to-one NAT  rule
	    on packet addresses (not ports), and is useful in cases where routes
	    or ifconfig settings pushed to the client would create an IP number-
	    ing conflict.

	    Examples:

	       client-nat snat 192.168.0.0/255.255.0.0
	       client-nat dnat 10.64.0.0/255.255.0.0

	    network/netmask  (for  example  192.168.0.0/255.255.0.0) defines the
	    local  view  of  a	resource  from	the  client  perspective,  while
	    alias/netmask (for example 10.64.0.0/255.255.0.0) defines the remote
	    view from the server perspective.

	    Use  snat  (source	NAT)  for resources owned by the client and dnat
	    (destination NAT) for remote resources.

	    Set --verb 6  for  debugging  info	showing  the  transformation  of
	    src/dest addresses in packets.

     --connect-retry args
	    Wait  n  seconds  between connection attempts (default 1).	Repeated
	    reconnection attempts are slowed down after 5 retries per remote  by
	    doubling the wait time after each unsuccessful attempt.

	    Valid syntaxes:

	       connect retry n
	       connect retry n max

	    If	the optional argument max is specified, the maximum wait time in
	    seconds gets capped at that value (default 300).

     --connect-retry-max n
	    n specifies the number of times each --remote or <connection>  entry
	    is	tried.	Specifying  n  as 1 would try each entry exactly once. A
	    successful connection resets the counter.  (default unlimited).

     --connect-timeout n
	    See --server-poll-timeout.

     --dns args
	    Client DNS configuration to be used with the connection.

	    Valid syntaxes:

	       dns search-domains domain [domain ...]
	       dns server n address addr[:port] [addr[:port] ...]
	       dns server n resolve-domains domain [domain ...]
	       dns server n dnssec yes|optional|no
	       dns server n transport DoH|DoT|plain
	       dns server n sni server-name

	    The --dns search-domains directive takes one or more domain names to
	    be added as DNS domain suffixes. If it is  repeated  multiple  times
	    within  a  configuration  the domains are appended, thus e.g. domain
	    names pushed by a server will amend locally defined ones.

	    The --dns server directive is used to configure DNS server	n.   The
	    server  id	n  must  be a value between -128 and 127. For pushed DNS
	    server options it must be between 0 and 127. The server id	is  used
	    to	group  options	and also for ordering the list of configured DNS
	    servers; lower numbers come first. DNS servers  being  pushed  to  a
	    client  replace  already configured DNS servers with the same server
	    id.

	    The address option configures the IPv4 and / or IPv6 address(es)  of
	    the  DNS  server.  Up  to  eight  addresses can be specified per DNS
	    server.  Optionally a port can be appended after a colon.  IPv6  ad-
	    dresses need to be enclosed in brackets if a port is appended.

	    The resolve-domains option takes one or more DNS domains used to de-
	    fine  a split-dns or dns-routing setup, where only the given domains
	    are resolved by the  server.  Systems  which  do  not  support  fine
	    grained DNS domain configuration will ignore this setting.

	    The dnssec option is used to configure validation of DNSSEC records.
	    While the exact semantics may differ for resolvers on different sys-
	    tems, yes likely makes validation mandatory, no disables it, and op-
	    tional uses it opportunistically.

	    The  transport  option  enables DNS-over-HTTPS (DoH) or DNS-over-TLS
	    (DoT) for a DNS server. The sni option can	be  used  with	them  to
	    specify the server-name for TLS server name indication.

	    Each  server  has to have at least one address configured for a con-
	    figuration to be valid. All the other options can be omitted.

	    Note that not all options may be supported on all platforms. As soon
	    support for different systems is implemented,  information	will  be
	    added here how unsupported options are treated.

	    The  --dns	option will eventually obsolete the --dhcp-option direc-
	    tive.  Until then  it  will  replace  configuration  at  the  places
	    --dhcp-option  puts it, so that --dns overrides --dhcp-option. Thus,
	    --dns can be used today to migrate from --dhcp-option.

     --explicit-exit-notify n
	    In UDP client mode or point-to-point mode, send server/peer an  exit
	    notification if tunnel is restarted or OpenVPN process is exited. In
	    client  mode,  on  exit/restart, this option will tell the server to
	    immediately close its client instance object rather than waiting for
	    a timeout.

	    If both server and client support sending  this  message  using  the
	    control  channel,  the  message will be sent as control-channel mes-
	    sage. Otherwise the message is sent as data-channel  message,  which
	    will be ignored by data-channel offloaded peers.

	    The n parameter (default 1 if not present) controls the maximum num-
	    ber  of attempts that the client will try to resend the exit notifi-
	    cation message if messages are sent in data-channel mode.

	    In UDP server mode, send RESTART control  channel  command	to  con-
	    nected  clients. The n parameter (default 1 if not present) controls
	    client behavior. With n = 1 client will attempt to reconnect to  the
	    same server, with n = 2 client will advance to the next server.

	    OpenVPN  will  not send any exit notifications unless this option is
	    enabled.

     --inactive args
	    Causes OpenVPN to exit after n seconds of inactivity on the  TUN/TAP
	    device. The time length of inactivity is measured since the last in-
	    coming  or	outgoing  tunnel packet. The default value is 0 seconds,
	    which disables this feature.

	    Valid syntaxes:

	       inactive n
	       inactive n bytes

	    If the optional bytes parameter is included, exit if less than bytes
	    of combined in/out traffic are produced on the tun/tap device  in  n
	    seconds.

	    In	any  case,  OpenVPN's  internal  ping  packets	(which	are just
	    keepalives) and TLS control packets are not  considered  "activity",
	    nor  are  they  counted  as  traffic, as they are used internally by
	    OpenVPN and are not an indication of actual user activity.

	    NOTE: on FreeBSD with DCO, due  to	platform  limits,  the	previous
	    paragraph  is not correct.	In that case, encapsulation overhead and
	    keepalives are  counted,  so  using  this  feature	needs  a  suffi-
	    ciently-high bytes value to take these extra numbers into account.

     --proto-force p
	    When  iterating  through connection profiles, only consider profiles
	    using protocol p (tcp | udp).

	    Note that this specifically only filters by the transport layer pro-
	    tocol, i.e. UDP or TCP. This does not affect whether IPv4 or IPv6 is
	    used as IP protocol.

	    For implementation reasons the option accepts the 4 and  6	suffixes
	    when specifying the protocol (i.e. udp4 / udp6 / tcp4 / tcp6).  How-
	    ever,  these  behave  the  same  as without the suffix and should be
	    avoided to prevent confusion.

     --pull
	    This option must be used on  a  client  which  is  connecting  to  a
	    multi-client  server.  It indicates to OpenVPN that it should accept
	    options pushed by the server, provided they are part  of  the  legal
	    set  of  pushable options (note that the --pull option is implied by
	    --client ).

	    In particular, --pull allows  the  server  to  push  routes  to  the
	    client, so you should not use --pull or --client in situations where
	    you don't trust the server to have control over the client's routing
	    table.

     --pull-filter args
	    Filter options on the client pushed by the server to the client.

	    Valid syntaxes:

	       pull-filter accept text
	       pull-filter ignore text
	       pull-filter reject text

	    Filter  options  received  from the server if the option starts with
	    text.  The action flag accept allows the option, ignore  removes  it
	    and  reject  flags an error and triggers a SIGUSR1 restart. The fil-
	    ters may be specified multiple times, and each filter is applied  in
	    the  order	it  is	specified. The filtering of each option stops as
	    soon as a match is found. Unmatched options are accepted by default.

	    Prefix comparison is used to match text against the received  option
	    so that

	       pull-filter ignore "route"

	    would  remove all pushed options starting with route which would in-
	    clude, for example, route-gateway. Enclose text in quotes  to  embed
	    spaces.

	       pull-filter accept "route 192.168.1."
	       pull-filter ignore "route "

	    would remove all routes that do not start with 192.168.1.

	    Note  that	reject may result in a repeated cycle of failure and re-
	    connect, unless multiple remotes are specified and connection to the
	    next remote succeeds. To silently ignore an  option  pushed  by  the
	    server, use ignore.

	    Warning:  pull-filter cannot be relied upon as a security measure to
	    protect against offending options pushed by a server.  For	example,
	    the  filter  could	be defeated by pushing options with extra spaces
	    between tokens or other formatting variations.

     --push-peer-info
	    Push additional information about the client to server. The  follow-
	    ing data is always pushed to the server:

	    IV_VER=<version>
		   The client OpenVPN version

	    IV_PLAT=[linux|solaris|openbsd|mac|netbsd|freebsd|win]
		   The client OS platform

	    IV_PROTO
		   Details about protocol extensions that the peer supports. The
		   variable is a bitfield and the bits are defined as follows:

		   * bit 0: Reserved, should always be zero

		   * bit 1: The peer supports peer-id floating mechanism

		   * bit  2:  The client expects a push-reply and the server may
		     send this reply without waiting for a push-request first.

		   * bit 3: The client is capable of doing key derivation  using
		     RFC5705 key material exporter.

		   * bit  4: The client is capable of accepting additional argu-
		     ments to the AUTH_PENDING message.

		   * bit 5: The client supports doing feature negotiation in P2P
		     mode

		   * bit 6: The client is capable of parsing and  receiving  the
		     --dns pushed option

		   * bit  7:  The client is capable of sending exit notification
		     via control channel using EXIT message. Also, the client is
		     accepting the protocol-flags pushed option for the EKM  ca-
		     pability

		   * bit  8: The client is capable of accepting AUTH_FAILED,TEMP
		     messages

		   * bit 9: The client is capable of dynamic tls-crypt

		   * bit 10: The client is capable of data epoch keys

	    IV_NCP=2
		   Negotiable ciphers, client supports --cipher  pushed  by  the
		   server,  a  value  of  2 or greater indicates client supports
		   AES-GCM-128 and AES-GCM-256. IV_NCP is deprecated in favor of
		   IV_CIPHERS.

	    IV_CIPHERS=<data-ciphers>
		   The client announces the list of supported ciphers configured
		   with the --data-ciphers option to the server.

	    IV_MTU=<max_mtu>
		   The client announces the support of pushable MTU and the max-
		   imum MTU it is willing to accept.

	    IV_GUI_VER=<gui_id> <version>
		   The UI version of  a  UI  if  one  is  running,  for  example
		   de.blinkt.openvpn  0.5.47  for  the Android app.  This may be
		   set by the client UI/GUI using --setenv.

	    IV_SSO=[crtext,][openurl,][proxy_url]
		   Additional authentication methods supported	by  the  client.
		   This may be set by the client UI/GUI using --setenv.

	    The following flags depend on which compression formats are compiled
	    in	and  whether compression is allowed by options. See Protocol op-
	    tions for more details.

	       IV_LZO=1
		      If client supports LZO compression.

	       IV_LZO_STUB=1
		      If client was built with LZO stub capability. This is only
		      sent if IV_LZO=1 is not sent. This means	the  client  can
		      talk to a server configured with --comp-lzo no.

	       IV_LZ4=1 and IV_LZ4v2=1
		      If the client supports LZ4 compression.

	       IV_COMP_STUB=1 and IV_COMP_STUBv2=1
		      If  the  client  supports stub compression. This means the
		      client can talk to a server configured with --compress.

	    When --push-peer-info is enabled the additional information consists
	    of the following data:

	    IV_HWADDR=<string>
		   This is intended to be a unique  and  persistent  ID  of  the
		   client.  The string value can be any readable ASCII string up
		   to  64 bytes.  OpenVPN 2.x and some other implementations use
		   the MAC address of the client's interface used to  reach  the
		   default  gateway.  If this string is generated by the client,
		   it should be consistent and preserved across independent ses-
		   sions and preferably re-installations and upgrades.

	    IV_SSL=<version string>
		   The ssl library version used by  the  client,  e.g.	 OpenSSL
		   1.0.2f 28 Jan 2016.

	    IV_PLAT_VER=x.y
		   The	version of the operating system, e.g. 6.1 for Windows 7.
		   This may be set by the client UI/GUI using --setenv.  On Win-
		   dows systems it is automatically determined	by  openvpn  it-
		   self.  On other platforms OpenVPN will default to sending the
		   information	returned  by  the uname() system call in the re-
		   lease field, which is usually the  currently  running  kernel
		   version.  This is highly system specific, though.

	    UV_<name>=<value>
		   Client environment variables whose names start with UV_

     --remote args
	    Remote host name or IP address, port and protocol.

	    Valid syntaxes:

	       remote host
	       remote host port
	       remote host port proto

	    The  port  and proto arguments are optional. The OpenVPN client will
	    try to connect to a server at host:port.  The proto  argument  indi-
	    cates  the	protocol to use when connecting with the remote, and may
	    be tcp or udp.  To enforce IPv4 or IPv6 connections add  a	4  or  6
	    suffix; like udp4 / udp6 / tcp4 / tcp6.

	    On the client, multiple --remote options may be specified for redun-
	    dancy,  each  referring  to a different OpenVPN server, in the order
	    specified by the list of --remote options. Specifying multiple --re-
	    mote options for this purpose is a special case of the more  general
	    connection-profile	feature.  See the <connection> documentation be-
	    low.

	    The client will move on to the next host in the list, in  the  event
	    of	connection  failure.  Note  that  at any given time, the OpenVPN
	    client will at most be connected to one server.

	    Examples:

	       remote server1.example.net
	       remote server1.example.net 1194
	       remote server2.example.net 1194 tcp

	    Note:  Since UDP is connectionless, connection failure is defined by
		   the --ping and --ping-restart options.

		   Also, if you use multiple --remote options, AND you are drop-
		   ping root privileges on the client with --user and/or --group
		   AND the client is running a non-Windows  OS,  if  the  client
		   needs to switch to a different server, and that server pushes
		   back different TUN/TAP or route settings, the client may lack
		   the	necessary privileges to close and reopen the TUN/TAP in-
		   terface. This could cause the client to exit with a fatal er-
		   ror.

	    If --remote is unspecified, OpenVPN will listen for packets from any
	    IP address, but will not act on those packets unless they  pass  all
	    authentication tests. This requirement for authentication is binding
	    on all potential peers, even those from known and supposedly trusted
	    IP	addresses (it is very easy to forge a source IP address on a UDP
	    packet).

	    When used in TCP mode, --remote will act as a filter, rejecting con-
	    nections from any host which does not match host.

	    If host is a DNS name which resolves to multiple IP addresses, Open-
	    VPN will try  them	in  the  order	that  the  system  getaddrinfo()
	    presents  them, so priorization and DNS randomization is done by the
	    system library. Unless an IP version is forced by the protocol spec-
	    ification (4/6 suffix), OpenVPN will try  both  IPv4  and  IPv6  ad-
	    dresses, in the order getaddrinfo() returns them.

     --remote-random
	    When multiple --remote address/ports are specified, or if connection
	    profiles  are  being used, initially randomize the order of the list
	    as a kind of basic load-balancing measure.

     --remote-random-hostname
	    Prepend a random string (6 bytes, 12 hex characters) to hostname  to
	    prevent DNS caching. For example, "foo.bar.gov" would be modified to
	    "<random-chars>.foo.bar.gov".

     --resolv-retry n
	    If	hostname resolve fails for --remote, retry resolve for n seconds
	    before failing.

	    Set n to infinite to retry indefinitely.

	    By default, --resolv-retry infinite is enabled. You can  disable  by
	    setting n=0.

     --single-session
	    After  initially  connecting to a remote peer, disallow any new con-
	    nections. Using this option means that a remote peer cannot connect,
	    disconnect, and then reconnect.

	    If the daemon is reset by a signal or --ping-restart, it will  allow
	    one new connection.

	    --single-session  can be used with --ping-exit or --inactive to cre-
	    ate a single dynamic session that will exit when finished.

     --server-poll-timeout n
	    When connecting to a remote server do not wait for more than n  sec-
	    onds for a response before trying the next server. The default value
	    is 120. This timeout includes proxy and TCP connect timeouts.

     --static-challenge args
	    Enable static challenge/response protocol

	    Valid syntax:

	       static-challenge text echo [format]

	    The  text  challenge  text	is presented to the user which describes
	    what information is requested.   The  echo	flag  indicates  if  the
	    user's  input should be echoed on the screen.  Valid echo values are
	    0 or 1. The optional format indicates whether the password	and  re-
	    sponse  should be combined using the SCRV1 protocol (format = scrv1)
	    or simply concatenated (format = concat).  scrv1 is the default.

	    See management-notes.txt in the OpenVPN distribution for a	descrip-
	    tion of the OpenVPN challenge/response protocol.

     --http-proxy args
	    Connect  to  remote  host  through	an HTTP proxy.	This requires at
	    least an address server and port argument.	If HTTP  Proxy-Authenti-
	    cate is required, a file name to an authfile file containing a user-
	    name  and  password on 2 lines can be given, or stdin to prompt from
	    console. Its content can also be specified in the config  file  with
	    the --http-proxy-user-pass option (See INLINE FILE SUPPORT).

	    The  last optional argument is an auth-method which should be one of
	    none, basic, or ntlm2.

	    HTTP Digest authentication is supported as well, but  only	via  the
	    auto  or auto-nct flags (below).  This must replace the authfile ar-
	    gument.

	    The  auto  flag  causes  OpenVPN  to  automatically  determine   the
	    auth-method  and  query  stdin or the management interface for user-
	    name/password credentials, if required. This flag exists on  OpenVPN
	    2.1 or higher.

	    The auto-nct flag (no clear-text auth) instructs OpenVPN to automat-
	    ically  determine  the authentication method, but to reject weak au-
	    thentication protocols such as HTTP Basic Authentication.

	    Examples:

	       # no authentication
	       http-proxy proxy.example.net 3128
	       # basic authentication, load credentials from file
	       http-proxy proxy.example.net 3128 authfile.txt
	       # basic authentication, ask user for credentials
	       http-proxy proxy.example.net 3128 stdin
	       # NTLM authentication, load credentials from file
	       http-proxy proxy.example.net 3128 authfile.txt ntlm2
	       # determine which authentication is required, ask user for credentials
	       http-proxy proxy.example.net 3128 auto
	       # determine which authentication is required, but reject basic
	       http-proxy proxy.example.net 3128 auto-nct
	       # determine which authentication is required, but set credentials
	       http-proxy proxy.example.net 3128 auto
	       http-proxy-user-pass authfile.txt
	       # basic authentication, specify credentials inline
	       http-proxy proxy.example.net 3128 "" basic
	       <http-proxy-user-pass>
	       username
	       password
	       </http-proxy-user-pass>

	    Note that support for NTLMv1 proxies was removed with  OpenVPN  2.7.
	    ntlm  now is an alias for ntlm2; i.e. OpenVPN will always attempt to
	    use NTLMv2 authentication.

     --http-proxy-user-pass userpass
	    Overwrite the username/password  information  for  --http-proxy.  If
	    specified  as an inline option (see INLINE FILE SUPPORT), it will be
	    interpreted as username/password separated by a newline. When speci-
	    fied on the command line it is interpreted as a filename same as the
	    third argument to --http-proxy.

	    Example:

	       <http-proxy-user-pass>
	       username
	       password
	       </http-proxy-user-pass>

     --http-proxy-option args
	    Set extended HTTP proxy options. Requires an option type as argument
	    and an optional parameter to the type.  Repeat to set  multiple  op-
	    tions.

	    VERSION version
		   Set HTTP version number to version (default 1.0).

	    AGENT user-agent
		   Set HTTP "User-Agent" string to user-agent.

	    CUSTOM-HEADER name content
		   Adds  the  custom Header with name as name and content as the
		   content of the custom HTTP header.

	    Examples:

	       http-proxy-option VERSION 1.1
	       http-proxy-option AGENT OpenVPN/2.4
	       http-proxy-option X-Proxy-Flag some-flags

     --socks-proxy args
	    Connect to remote host through a Socks5 proxy.   A	required  server
	    argument  is  needed.  Optionally a port (default 1080) and authfile
	    can be given.  The authfile is a  file  containing	a  username  and
	    password on 2 lines, or stdin can be used to prompt from console.

   Server Options
     Starting with OpenVPN 2.0, a multi-client TCP/UDP server mode is supported,
     and  can  be enabled with the --mode server option. In server mode, OpenVPN
     will listen on a single port for incoming client  connections.  All  client
     connections will be routed through a single tun or tap interface. This mode
     is  designed for scalability and should be able to support hundreds or even
     thousands of clients on sufficiently fast hardware. SSL/TLS  authentication
     must be used in this mode.

     --auth-gen-token args
	    Returns   an  authentication  token  to  successfully  authenticated
	    clients.

	    Valid syntax:

	       auth-gen-token [lifetime] [renewal-time] [external-auth]

	    After successful user/password authentication,  the  OpenVPN  server
	    will  with this option generate a temporary authentication token and
	    push that to the client. On the following renegotiations, the  Open-
	    VPN  client  will  pass this token instead of the users password. On
	    the server side the server will do the token  authentication  inter-
	    nally and it will NOT do any additional authentications against con-
	    figured external user/password authentication mechanisms.

	    The  tokens  implemented  by this mechanism include an initial time-
	    stamp and a renew timestamp and are secured by HMAC.

	    The lifetime argument defines how long the generated token is valid.
	    The lifetime is defined in seconds. If lifetime is not set or it  is
	    set to 0, the token will never expire.

	    If renewal-time is not set it defaults to reneg-sec.

	    The  token	will  expire either after the configured lifetime of the
	    token is reached or after not being renewed for more than  2  *  re-
	    newal-time seconds. Clients will be sent renewed tokens on every TLS
	    renegotiation.  If	renewal-time  is lower than reneg-sec the server
	    will push an   updated  temporary  authentication  token  every  re-
	    neweal-time  seconds. This is done to invalidate a token if a client
	    is disconnected for a sufficiently long time, while at the same time
	    permitting much longer token lifetimes for active clients.

	    This feature is useful for environments which are configured to  use
	    One  Time  Passwords  (OTP) as part of the user/password authentica-
	    tions and that  authentication  mechanism  does  not  implement  any
	    auth-token support.

	    When  the external-auth keyword is present the normal authentication
	    method will always be called even if auth-token succeeds.	Normally
	    other  authentications method are skipped if auth-token verification
	    succeeds or fails.

	    This option postpones this decision to the	external  authentication
	    methods and checks the validity of the account and do other checks.

	    In	this  mode  the environment will have a session_id variable that
	    holds the session id from auth-gen-token. Also an environment  vari-
	    able  session_state  is present. This variable indicates whether the
	    auth-token has succeeded or not. It can have the following values:

	    Initial
		   No token from client.

	    Authenticated
		   Token is valid and not expired.

	    Expired
		   Token is valid but has expired.

	    Invalid
		   Token is invalid (failed HMAC or wrong length)

	    AuthenticatedEmptyUser / ExpiredEmptyUser
		   The token is not valid with the username sent from the client
		   but would be valid (or expired) if we assume an  empty  user-
		   name  was used instead.  These two cases are a workaround for
		   behaviour in OpenVPN 3.  If this  workaround  is  not  needed
		   these two cases should be handled in the same way as Invalid.

	    Warning:  Use  this  feature  only	if  you want your authentication
	    method called on every verification. Since the external  authentica-
	    tion is called it needs to also indicate a success or failure of the
	    authentication.  It is strongly recommended to return an authentica-
	    tion failure in the case of the Invalid/Expired auth-token with  the
	    external-auth option unless the client could authenticate in another
	    acceptable	way  (e.g. client certificate), otherwise returning suc-
	    cess will lead to authentication bypass (as does  returning  success
	    on a wrong password from a script).

	    Note: the username for --auth-gen-token can be overridden by --over-
	    ride-user.	In  this  case	the  client  will  be  pushed  also  the
	    --auth-token-user option and an auth token that is	valid  for  that
	    username  instead of the original username that the client authenti-
	    cated with.

     --auth-gen-token-secret file
	    Specifies  a  file	that  holds  a	secret	for  the  HMAC	used  in
	    --auth-gen-token If file is not present OpenVPN will generate a ran-
	    dom secret on startup. This file should be used if auth-token should
	    validate  after  restarting  a server or if client should be able to
	    roam between multiple OpenVPN servers with their auth-token.

     --auth-user-pass-optional
	    Allow connections by clients that do not  specify  a  username/pass-
	    word.    Normally,	 when	--auth-user-pass-verify   or   --manage-
	    ment-client-auth are specified (or an authentication plugin module),
	    the OpenVPN server daemon will require connecting clients to specify
	    a username and password. This option makes the submission of a user-
	    name/password by clients optional, passing the responsibility to the
	    user-defined authentication module/script  to  accept  or  deny  the
	    client  based on other factors (such as the setting of X509 certifi-
	    cate fields).  When this option is used,  and  a  connecting  client
	    does not submit a username/password, the user-defined authentication
	    module/script  will  see  the  username and password as being set to
	    empty strings (""). The authentication module/script MUST have logic
	    to detect this condition and respond accordingly.

     --ccd-exclusive
	    Require, as a condition of authentication, that a connecting  client
	    has a --client-config-dir file.

     --client-config-dir dir
	    Specify a directory dir for custom client config files. After a con-
	    necting client has been authenticated, OpenVPN will look in this di-
	    rectory  for a file having the same name as the client's X509 common
	    name. If a matching file exists, it will be opened	and  parsed  for
	    client-specific configuration options. If no matching file is found,
	    OpenVPN  will  instead  try  to open and parse a default file called
	    "DEFAULT", which may be provided but is not required. Note that  the
	    configuration files must be readable by the OpenVPN process after it
	    has dropped it's root privileges.

	    This  file	can  specify a fixed IP address for a given client using
	    --ifconfig-push, as well as fixed subnets owned by the client  using
	    --iroute.

	    One of the useful properties of this option is that it allows client
	    configuration  files  to be conveniently created, edited, or removed
	    while the server is live, without needing to restart the server.

	    The following  options  are  legal	in  a  client-specific	context:
	    --push,   --push-reset,  --push-remove,  --iroute,	--ifconfig-push,
	    --vlan-pvid and --config.

	    Note: OpenVPN uses the CN exactly as  written  in  the  certificate.
	    But since this is a file access the filesystem might interfere.  Im-
	    portantly  OpenVPN will consider two CNs that only differ in case as
	    different names but a case-insensitive filesystem  (like  you  might
	    encounter on Windows or macOS) will treat them as the same. When you
	    generate  your  certificates make sure that the CNs are sufficiently
	    different to not cause issues. When trusting  an  external	CA  note
	    that  this	is  a  potential attack vector via maliciously generated
	    certificates that exploit this issue.

     --client-to-client
	    Because the OpenVPN server mode handles multiple clients  through  a
	    single  tun  or  tap  interface,  it  is  effectively  a router. The
	    --client-to-client	flag   tells   OpenVPN	 to   internally   route
	    client-to-client  traffic rather than pushing all client-originating
	    traffic to the TUN/TAP interface.

	    When this option is used, each client will "see" the  other  clients
	    which  are currently connected. Otherwise, each client will only see
	    the server. Don't use this option if you  want  to	firewall  tunnel
	    traffic using custom, per-client rules.

	    Please  note that when using data channel offload this option has no
	    effect. Packets are always sent to the  tunnel  interface  and  then
	    routed based on the system routing table.

     --disable
	    Disable a particular client (based on the common name) from connect-
	    ing.   Don't use this option to disable a client due to key or pass-
	    word compromise. Use a CRL	(certificate  revocation  list)  instead
	    (see the --crl-verify option).

	    This  option  must	be  associated	with a specific client instance,
	    which means that it must be specified either in  a	client	instance
	    config file using --client-config-dir or dynamically generated using
	    a --client-connect script.

     --connect-freq args
	    Allow a maximum of n new connections per sec seconds from clients.

	    Valid syntax:

	       connect-freq n sec

	    This  is designed to contain DoS attacks which flood the server with
	    connection requests using certificates which will ultimately fail to
	    authenticate.

	    This limit applies after --connect-freq-initial and only applies  to
	    client  that  have	completed the three-way handshake or client that
	    use --tls-crypt-v2 without cookie support (allow-noncookie	argument
	    to --tls-crypt-v2).

	    This  is  an  imperfect solution however, because in a real DoS sce-
	    nario, legitimate connections might also be refused.

	    For the best protection against DoS  attacks  in  server  mode,  use
	    --proto udp and either --tls-auth or --tls-crypt.

     --connect-freq-initial args
	    (UDP  only) Allow a maximum of n initial connection packet responses
	    per sec seconds from the OpenVPN server to clients.

	    Valid syntax:

	       connect-freq-initial n sec

	    OpenVPN starting at 2.6 is very efficient in responding  to  initial
	    connection packets. When not limiting the initial responses an Open-
	    VPN  daemon can be abused in reflection attacks.  This option is de-
	    signed to limit the rate OpenVPN will respond to initial attacks.

	    Connection attempts that complete the  initial  three-way  handshake
	    will  not  be counted against the limit. The default is to allow 100
	    initial connection per 10s.

     --duplicate-cn
	    Allow multiple clients with the same  common  name	to  concurrently
	    connect.  In  the  absence of this option, OpenVPN will disconnect a
	    client instance upon connection of a new client having the same com-
	    mon name.

     --ifconfig-pool args
	    Set aside a pool of subnets to be dynamically allocated to	connect-
	    ing clients, similar to a DHCP server.

	    Valid syntax:

	       ifconfig-pool start-IP end-IP [netmask]

	    For  tun-style  tunnels, each client will be given a /30 subnet (for
	    interoperability with Windows clients).  For tap-style tunnels,  in-
	    dividual addresses will be allocated, and the optional netmask para-
	    meter will also be pushed to clients.

     --ifconfig-ipv6-pool args
	    Specify an IPv6 address pool for dynamic assignment to clients.

	    Valid args:

	       ifconfig-ipv6-pool ipv6addr/bits

	    The  pool  starts at ipv6addr and matches the offset determined from
	    the start of the IPv4 pool.  If the host part of the given IPv6  ad-
	    dress is 0, the pool starts at ipv6addr +1.

     --ifconfig-pool-persist args
	    Persist/unpersist  ifconfig-pool  data to file, at seconds intervals
	    (default 600), as well as on program startup and shutdown.

	    Valid syntax:

	       ifconfig-pool-persist file [seconds]

	    The goal of this option is to provide a  long-term	association  be-
	    tween  clients (denoted by their common name) and the virtual IP ad-
	    dress  assigned  to  them  from  the  ifconfig-pool.  Maintaining  a
	    long-term  association is good for clients because it allows them to
	    effectively use the --persist-tun option.

	    file  is  a  comma-delimited  ASCII   file,   formatted   as   <Com-
	    mon-Name>,<IP-address>.

	    If seconds = 0, file will be treated as read-only. This is useful if
	    you would like to treat file as a configuration file.

	    Note that the entries in this file are treated by OpenVPN as sugges-
	    tions  only, based on past associations between a common name and IP
	    address.  They do not guarantee that the given common name will  al-
	    ways  receive  the	given IP address. If you want guaranteed assign-
	    ment, use --ifconfig-push

     --ifconfig-push args
	    Push virtual IP endpoints for client tunnel, overriding the --ifcon-
	    fig-pool dynamic allocation.

	    Valid syntax:

	       ifconfig-push local remote-netmask [alias]

	    The parameters local and remote-netmask are  set  according  to  the
	    --ifconfig directive which you want to execute on the client machine
	    to	configure the remote end of the tunnel. Note that the parameters
	    local and remote-netmask are from the perspective of the client, not
	    the server. They may be DNS names rather than IP addresses, in which
	    case they will be resolved on the server at the time of client  con-
	    nection.

	    The  optional  alias parameter may be used in cases where NAT causes
	    the client view of its local endpoint  to  differ  from  the  server
	    view.  In  this  case  local/remote-netmask will refer to the server
	    view while alias/remote-netmask will refer to the client view.

	    This option must be associated  with  a  specific  client  instance,
	    which  means  that	it must be specified either in a client instance
	    config file using --client-config-dir or dynamically generated using
	    a --client-connect script.

	    Remember also to include a --route directive  in  the  main  OpenVPN
	    config  file  which  encloses local, so that the kernel will know to
	    route it to the server's TUN/TAP interface.

	    OpenVPN's internal client IP address selection  algorithm  works  as
	    follows:

	    1. Use  --client-connect  script generated file for static IP (first
	       choice).

	    2. Use --client-config-dir file for static IP (next choice).

	    3. Use --ifconfig-pool allocation for dynamic IP (last choice).

	    When DCO is enabled and the IP is not in contained	in  the  network
	    specified  by  --ifconfig, OpenVPN will install a /32 host route for
	    the local IP address.

     --ifconfig-ipv6-push args
	    for --client-config-dir per-client static IPv6 interface  configura-
	    tion, see --client-config-dir and --ifconfig-push for more details.

	    Valid syntax:

	       ifconfig-ipv6-push ipv6addr/bits ipv6remote

	    When  DCO  is  enabled and the IP is not in contained in the network
	    specified by --ifconfig-ipv6, OpenVPN will install a /128 host route
	    for the ipv6addr IP address.

     --multihome [same-interface]
	    Configure a multi-homed UDP server. This option  needs  to	be  used
	    when  a  server  has  more than one IP address (e.g. multiple inter-
	    faces, or secondary IP addresses), and is not using --local to force
	    binding to one specific address only. This option will add some  ex-
	    tra  lookups to the packet path to ensure that the UDP reply packets
	    are always sent from the address that the client is talking to. This
	    is not supported on all platforms, and it adds more  processing,  so
	    it's not enabled by default.

	    Notes:

		   * This option is only relevant for UDP servers.

		   * Starting  with  2.7.0, OpenVPN will ignore the incoming in-
		     terface of the packet, and leave selection of the	outgoing
		     interface to the normal routing/policy mechanisms of the OS
		     ("set ipi_ifindex=0").

		   * if  the same-interface flag is added, OpenVPN will copy the
		     incoming interface index to the outgoing  interface  index,
		     trying to send the packet out over the same interface where
		     it came in on (= restoring earlier OpenVPN behaviour). This
		     might not work if there are no usable routes on that inter-
		     face.

		   * the *BSD systems use a different API for IPv4 that does not
		     provide  the  interface  index  anyway (IP_RECVDSTADDR), so
		     there the difference applies only to IPv6.

     --iroute args
	    Generate an internal route to a specific client. The netmask parame-
	    ter, if omitted, defaults to 255.255.255.255.

	    Valid syntax:

	       iroute network [netmask]

	    This directive can be used to route a fixed subnet from  the  server
	    to a particular client, regardless of where the client is connecting
	    from.  Remember that you must also add the route to the system rout-
	    ing table as well (such as by using the --route directive). The rea-
	    son  why  two routes are needed is that the --route directive routes
	    the packet from the kernel to OpenVPN. Once in OpenVPN, the --iroute
	    directive routes to the specific client.

	    However, when using DCO, the --iroute directive  is  usually  enough
	    for  DCO to fully configure the routing table. The extra --route di-
	    rective is required only if the expected behaviour is to  route  the
	    traffic  for  a  specific network to the VPN interface also when the
	    responsible client is not connected (traffic will then be dropped).

	    This option must be specified either in  a	client	instance  config
	    file  using  --client-config-dir  or  dynamically  generated using a
	    --client-connect script.

	    The --iroute directive also has an important interaction with --push
	    "route ...". --iroute essentially defines a subnet which is owned by
	    a particular client (we will call this client A). If you would  like
	    other  clients  to	be  able to reach A's subnet, you can use --push
	    "route ..." together with --client-to-client to effect this. In  or-
	    der  for all clients to see A's subnet, OpenVPN must push this route
	    to all clients EXCEPT for A, since the subnet is already owned by A.
	    OpenVPN accomplishes this by not not pushing a route to a client  if
	    it matches one of the client's iroutes.

     --iroute-ipv6 args
	    for  --client-config-dir per-client static IPv6 route configuration,
	    see --iroute for more details how to setup and  use  this,	and  how
	    --iroute and --route interact.

	    Valid syntax:

	       iroute-ipv6 ipv6addr/bits

     --max-clients n
	    Limit server to a maximum of n concurrent clients.

     --max-routes-per-client n
	    Allow  a maximum of n internal routes per client (default 256). This
	    is designed to help  contain  DoS  attacks	where  an  authenticated
	    client  floods  the  server with packets appearing to come from many
	    unique MAC addresses, forcing the server to deplete  virtual  memory
	    as its internal routing table expands. This directive can be used in
	    a  --client-config-dir  file or auto-generated by a --client-connect
	    script to override the global value for a particular client.

	    Note that this directive affects OpenVPN's internal  routing  table,
	    not the kernel routing table.

     --override-username username
	    Sets  the  username of a connection to the specified username.  This
	    username will also be used by --auth-gen-token. However,  the  over-
	    ridden username comes only into effect after the --client-config-dir
	    has  been  read and the --auth-user-pass-verify and --client-connect
	    scripts have been run.

	    Also --username-as-common-name will use the client provided username
	    as common-name. It is recommended to avoid the use	of  the  --over-
	    ride-username  option if the option --username-as-common-name is be-
	    ing used.

	    The changed username will be picked up by the status output and also
	    by the --auth-gen-token option. It will also be pushed to the client
	    using --auth-token-user if --auth-gen-token is enabled.

	    Internally on all  subsequent  renegotiations  the	client	provided
	    username  will  be	replaced  by  the  username  provided by --over-
	    ride-username.  If the client changes to a username that is  differ-
	    ent  from  both  the initial and the overridden username, the client
	    will be rejected.

	    Special care should be taken that both the initial username  of  the
	    client  and the overridden username are handled correctly when using
	    --override-username and the related  options  to  avoid  authentica-
	    tion/authorisation bypasses.

	    This  option  is mainly intended for use cases that use certificates
	    and multi factor authentication and therefore do not provide a user-
	    name that can be used for  --auth-gen-token  to  allow  providing  a
	    username in these scenarios.

	    If	the --auth-token directive is pushed by another script/plugin or
	    management	interface,  consider   also   generating   and	 pushing
	    --auth-token-user.

     --port-share args
	    Share OpenVPN TCP with another service

	    Valid syntax:

	       port-share host port [dir]

	    When run in TCP server mode, share the OpenVPN port with another ap-
	    plication,	such  as an HTTPS server. If OpenVPN senses a connection
	    to its port which is using a non-OpenVPN protocol, it will proxy the
	    connection to the server at host:port. Currently  only  designed  to
	    work  with	HTTP/HTTPS, though it would be theoretically possible to
	    extend to other protocols such as ssh.

	    dir specifies an optional directory where a temporary file with name
	    N containing content C will be dynamically generated for each  proxy
	    connection,  where	C is the source IP:port of the client connection
	    and N is the source IP:port of the connection to the proxy receiver.
	    This directory can be used as a dictionary by the proxy receiver  to
	    determine  the origin of the connection. Each generated file will be
	    automatically deleted when the proxied connection is torn down.

	    Not implemented on Windows.

     --push option
	    Push a config file option back to the client for  remote  execution.
	    Note  that option must be enclosed in double quotes (""). The client
	    must specify --pull in its config file. The set of options which can
	    be pushed is limited by both feasibility and security. Some  options
	    such  as  those  which  would execute scripts are banned, since they
	    would effectively allow a compromised server  to  execute  arbitrary
	    code on the client. Other options such as TLS or MTU parameters can-
	    not  be pushed because the client needs to know them before the con-
	    nection to the server can be initiated.

	    This is a partial list of options which  can  currently  be  pushed:
	    --route,	--route-gateway,    --route-delay,   --redirect-gateway,
	    --ip-win32, --dhcp-option, --dns, --inactive,  --ping,  --ping-exit,
	    --ping-restart,   --setenv,   --auth-token,  --persist-tun,  --echo,
	    --comp-lzo, --socket-flags, --sndbuf, --rcvbuf, --session-timeout

	    Note: using --push requires OpenVPN to run in --mode server (or  us-
	    ing of one of --server, --server-bridge helper directives).

     --push-remove opt
	    Selectively remove all --push options matching "opt" from the option
	    list  for  a client. opt is matched as a substring against the whole
	    option string to-be-pushed to the  client,	so  --push-remove  route
	    would  remove all --push route ... and --push route-ipv6 ...  state-
	    ments, while --push-remove "route-ipv6 2001:" would only remove IPv6
	    routes for 2001:... networks.

	    --push-remove can only be used in a client-specific context, like in
	    a --client-config-dir file, or --client-connect script or plugin  --
	    similar to --push-reset, just more selective.

	    NOTE: to change an option, --push-remove can be used to first remove
	    the old value, and then add a new --push option with the new value.

	    NOTE  2:  due  to  implementation  details,  'ifconfig'  and 'ifcon-
	    fig-ipv6' can only be removed with an exact match on  the  option  (
	    push-remove  ifconfig), no substring matching and no matching on the
	    IPv4/IPv6 address argument is possible.

     --push-reset
	    Don't inherit the global push list for a specific  client  instance.
	    Specify  this  option  in  a  client-specific context such as with a
	    --client-config-dir configuration  file.  This  option  will  ignore
	    --push options at the global config file level.

	    NOTE:  --push-reset  is very thorough: it will remove almost all op-
	    tions from the list of to-be-pushed options.  In many cases, some of
	    these options will need to be re-configured  afterwards  -	specifi-
	    cally,  --topology subnet and --route-gateway will get lost and this
	    will break client configs in many cases.  Thus, for  most  purposes,
	    --push-remove  is  better  suited to selectively remove push options
	    for individual clients.

     --server args
	    A helper directive designed to simplify the configuration  of  Open-
	    VPN's  server  mode.  This	directive  will set up an OpenVPN server
	    which will allocate addresses to  clients  out  of	the  given  net-
	    work/netmask.  The	server	itself	will  take the .1 address of the
	    given network for use as  the  server-side	endpoint  of  the  local
	    TUN/TAP  interface. If the optional nopool flag is given, no dynamic
	    IP address pool will prepared for VPN clients.

	    Valid syntax:

	       server network netmask [nopool]

	    For example, --server 10.8.0.0 255.255.255.0 expands as follows:

	       mode server
	       tls-server
	       push "topology [topology]"

	       if dev tun AND (topology == net30 OR topology == p2p):
		 ifconfig 10.8.0.1 10.8.0.2
		 if !nopool:
		   ifconfig-pool 10.8.0.4 10.8.0.251
		 route 10.8.0.0 255.255.255.0
		 if client-to-client:
		   push "route 10.8.0.0 255.255.255.0"
		 else if topology == net30:
		   push "route 10.8.0.1"

	       if dev tap OR (dev tun AND topology == subnet):
		 ifconfig 10.8.0.1 255.255.255.0
		 if !nopool:
		   ifconfig-pool 10.8.0.2 10.8.0.253 255.255.255.0
		 push "route-gateway 10.8.0.1"
		 if route-gateway unset:
		   route-gateway 10.8.0.2

	    Don't use --server if you are ethernet bridging. Use --server-bridge
	    instead.

     --server-bridge args
	    A helper directive similar to --server which is designed to simplify
	    the configuration of OpenVPN's server mode in ethernet bridging con-
	    figurations.

	    Valid syntaxes:

	       server-bridge gateway netmask pool-start-IP pool-end-IP
	       server-bridge [nogw]

	    If --server-bridge is used without any parameters, it will enable  a
	    DHCP-proxy mode, where connecting OpenVPN clients will receive an IP
	    address  for  their  TAP adapter from the DHCP server running on the
	    OpenVPN server-side LAN. Note that only  clients  that  support  the
	    binding  of a DHCP client with the TAP adapter (such as Windows) can
	    support this mode. The optional nogw flag (advanced) indicates  that
	    gateway information should not be pushed to the client.

	    To	configure ethernet bridging, you must first use your OS's bridg-
	    ing capability to bridge the TAP interface with the ethernet NIC in-
	    terface.  For example, on Linux this is done with  the  brctl  tool,
	    and  with  Windows XP it is done in the Network Connections Panel by
	    selecting the  ethernet  and  TAP  adapters  and  right-clicking  on
	    "Bridge Connections".

	    Next  you  you must manually set the IP/netmask on the bridge inter-
	    face.  The gateway and netmask parameters to --server-bridge can  be
	    set to either the IP/netmask of the bridge interface, or the IP/net-
	    mask of the default gateway/router on the bridged subnet.

	    Finally,  set  aside  a  IP  range in the bridged subnet, denoted by
	    pool-start-IP and pool-end-IP, for OpenVPN to allocate to connecting
	    clients.

	    For  example,  server-bridge   10.8.0.4   255.255.255.0   10.8.0.128
	    10.8.0.254 expands as follows:

	       mode server
	       tls-server

	       ifconfig-pool 10.8.0.128 10.8.0.254 255.255.255.0
	       push "route-gateway 10.8.0.4"

	    In	another example, --server-bridge (without parameters) expands as
	    follows:

	       mode server
	       tls-server

	       push "route-gateway dhcp"

	    Or --server-bridge nogw expands as follows:

	       mode server
	       tls-server

     --server-ipv6 args
	    Convenience-function to enable a number of IPv6 related  options  at
	    once,   namely   --ifconfig-ipv6,  --ifconfig-ipv6-pool  and  --push
	    tun-ipv6.

	    Valid syntax:

	       server-ipv6 ipv6addr/bits

	    Pushing of the --tun-ipv6 directive is done for older clients  which
	    require an explicit --tun-ipv6 in their configuration.

     --stale-routes-check args
	    Remove  routes  which  haven't  had activity for n seconds (i.e. the
	    ageing time).  This check is run every t seconds (i.e. check  inter-
	    val).

	    Valid syntax:

	       stale-routes-check n [t]

	    If t is not present it defaults to n.

	    This  option helps to keep the dynamic routing table small. See also
	    --max-routes-per-client

     --username-as-common-name
	    Use the authenticated username as the common-name, rather  than  the
	    common-name  from the client certificate. Requires that some form of
	    --auth-user-pass verification is in effect. As the replacement  hap-
	    pens after --auth-user-pass verification, the verification script or
	    plugin will still receive the common-name from the certificate.

	    The  common_name  environment variable passed to scripts and plugins
	    invoked after authentication (e.g, client-connect script)  and  file
	    names parsed in client-config directory will match the username.

     --verify-client-cert mode
	    Specify  whether  the  client is required to supply a valid certifi-
	    cate.

	    Possible mode options are:

	    none   A client certificate is not required. the client needs to au-
		   thenticate using username/password only. Be aware that  using
		   this  directive  is	less  secure than requiring certificates
		   from all clients.

		   If you use this directive, the entire responsibility  of  au-
		   thentication   will	 rest  on  your  --auth-user-pass-verify
		   script, so keep in mind that bugs in your script could poten-
		   tially compromise the security of your VPN.

		   --verify-client-cert  none  is  functionally  equivalent   to
		   --client-cert-not-required.

	    optional
		   A  client may present a certificate but it is not required to
		   do so.  When using this directive,  you  should  also  use  a
		   --auth-user-pass-verify script to ensure that clients are au-
		   thenticated	using a certificate, a username and password, or
		   possibly even both.

		   Again, the entire responsibility of authentication will  rest
		   on  your --auth-user-pass-verify script, so keep in mind that
		   bugs in your script could potentially compromise the security
		   of your VPN.

	    require
		   This is the default option. A client is required to present a
		   certificate, otherwise VPN access is refused.

	    If you don't use this directive  (or  use  --verify-client-cert  re-
	    quire)  but you also specify an --auth-user-pass-verify script, then
	    OpenVPN will perform double authentication. The  client  certificate
	    verification  AND  the  --auth-user-pass-verify  script will need to
	    succeed in order for a client to be authenticated and accepted  onto
	    the VPN.

     --vlan-tagging
	    Server-only  option. Turns the OpenVPN server instance into a switch
	    that understands VLAN-tagging, based on IEEE 802.1Q.

	    The server TAP device and each of the connecting clients is seen  as
	    a  port of the switch. All client ports are in untagged mode and the
	    server TAP device is VLAN-tagged, untagged or accepts both,  depend-
	    ing on the --vlan-accept setting.

	    Ethernet  frames with a prepended 802.1Q tag are called "tagged". If
	    the VLAN Identifier (VID) field in such a tag is non-zero, the frame
	    is called "VLAN-tagged". If the VID is zero, but the  Priority  Con-
	    trol   Point   (PCP)   field   is  non-zero,  the  frame  is  called
	    "prio-tagged". If there is no 802.1Q tag, the frame is "untagged".

	    Using the --vlan-pvid v option once per  client  (see  --client-con-
	    fig-dir),  each  port can be associated with a certain VID.  Packets
	    can only be forwarded between ports having the same VID.  Therefore,
	    clients with differing VIDs are completely	separated  from  one-an-
	    other, even if --client-to-client is activated.

	    The  packet  filtering  takes  place  in the OpenVPN server. Clients
	    should not have any VLAN tagging configuration applied.

	    The --vlan-tagging option is off by default. While turned off, Open-
	    VPN accepts any Ethernet frame and does not perform any special pro-
	    cessing for VLAN-tagged packets.

	    This option can only be activated in --dev tap mode.

     --vlan-accept args
	    Configure the VLAN tagging policy for the server TAP device.

	    Valid syntax:

	       vlan-accept  all|tagged|untagged

	    The following modes are available:

	    tagged
		   Admit only VLAN-tagged frames. Only VLAN-tagged  packets  are
		   accepted,  while  untagged  or  priority-tagged  packets  are
		   dropped when entering the server TAP device.

	    untagged
		   Admit only  untagged  and  prio-tagged  frames.   VLAN-tagged
		   packets  are  not accepted, while untagged or priority-tagged
		   packets entering the server TAP device are  tagged  with  the
		   value configured for the global --vlan-pvid setting.

	    all (default)
		   Admit  all frames.  All packets are admitted and then treated
		   like untagged or tagged mode respectively.

	    Note:  Some vendors refer to switch ports running in tagged mode  as
		   "trunk  ports"  and	switch ports running in untagged mode as
		   "access ports".

	    Packets forwarded from clients to the server  are  VLAN-tagged  with
	    the  originating  client's	PVID,  unless the VID matches the global
	    --vlan-pvid, in which case the tag is removed.

	    If no PVID is configured for a given client (see --vlan-pvid)  pack-
	    ets are tagged with 1 by default.

     --vlan-pvid v
	    Specifies  which  VLAN  identifier a "port" is associated with. Only
	    valid when --vlan-tagging is specified.

	    In the client context, the setting specifies which VLAN ID a  client
	    is associated with. In the global context, the VLAN ID of the server
	    TAP device is set. The latter only makes sense for --vlan-accept un-
	    tagged and --vlan-accept all modes.

	    Valid  values  for v go from 1 through to 4094. The global value de-
	    faults to 1. If no --vlan-pvid is specified in the	client	context,
	    the global value is inherited.

	    In some switch implementations, the PVID is also referred to as "Na-
	    tive VLAN".

   Encryption Options
   SSL Library information
     --show-ciphers
	    (Standalone) Show all cipher algorithms to use with the --cipher op-
	    tion.

     --show-digests
	    (Standalone)  Show	all  message  digest  algorithms to use with the
	    --auth option.

     --show-tls
	    (Standalone) Show all TLS ciphers supported by the	crypto	library.
	    OpenVPN  uses TLS to secure the control channel, over which the keys
	    that are used to protect the actual VPN traffic are  exchanged.  The
	    TLS  ciphers will be sorted from highest preference (most secure) to
	    lowest.

	    Be aware that whether a cipher suite in this list can actually  work
	    depends  on  the  specific setup of both peers (e.g. both peers must
	    support the cipher, and an ECDSA cipher suite will not work  if  you
	    are using an RSA certificate, etc.).

     --show-engines
	    (Standalone) Show currently available hardware-based crypto acceler-
	    ation engines supported by the OpenSSL library.

     --show-groups
	    (Standalone)  Show	all available elliptic curves/groups to use with
	    the --ecdh-curve and tls-groups options.

   Generating key material
     --genkey args
	    (Standalone) Generate a key to be used of the type keytype. if  key-
	    file  is left out or empty the key will be output on stdout. See the
	    following sections for the different keytypes.

	    Valid syntax:

	       --genkey keytype keyfile

	    Valid keytype arguments are:

	    secret		  Standard OpenVPN shared secret keys

	    tls-crypt		  Alias for secret

	    tls-auth		  Alias for secret

	    auth-token		  Key used for --auth-gen-token-key

	    tls-crypt-v2-server   TLS Crypt v2 server key

	    tls-crypt-v2-client   TLS Crypt v2 client key

	    Examples:

	       $ openvpn --genkey secret shared.key
	       $ openvpn --genkey tls-crypt shared.key
	       $ openvpn --genkey tls-auth shared.key
	       $ openvpn --genkey tls-crypt-v2-server v2crypt-server.key
	       $ openvpn --tls-crypt-v2 v2crypt-server.key --genkey tls-crypt-v2-client v2crypt-client-1.key

	    * Generating Shared Secret Keys Generate a shared  secret,	for  use
	      with the --tls-auth or --tls-crypt options.

	      Syntax:

		 $ openvpn --genkey tls-crypt|tls-auth keyfile

	      The  key	is  saved  in  keyfile.  Both  variants  (tls-crypt  and
	      tls-auth) generate the same type of key. The aliases are added for
	      convenience.

	      This file must be shared with the peer over a pre-existing  secure
	      channel such as scp(1).

	    * Generating  TLS  Crypt v2 Server key Generate a --tls-crypt-v2 key
	      to be used by an OpenVPN server.	The key is stored in keyfile.

	      Syntax:

		 --genkey tls-crypt-v2-server keyfile

	    * Generating TLS Crypt v2 Client key Generate a  --tls-crypt-v2  key
	      to be used by OpenVPN clients.  The key is stored in keyfile.

	      Syntax

		 --genkey tls-crypt-v2-client keyfile [metadata]

	      If  supplied,  include the supplied metadata in the wrapped client
	      key. This metadata must be supplied in  base64-encoded  form.  The
	      metadata must be at most 733 bytes long (980 characters in base64,
	      though  note  that  980 base64 characters can encode more than 733
	      bytes).

	      If no metadata is supplied, OpenVPN will use a 64-bit  unix  time-
	      stamp representing the current time in UTC, encoded in network or-
	      der, as metadata for the generated key.

	      A tls-crypt-v2 client key is wrapped using a server key. To gener-
	      ate  a  client  key, the user must therefore supply the server key
	      using the --tls-crypt-v2 option.

	      Servers can use --tls-crypt-v2-verify to specify a metadata  veri-
	      fication command.

	    * Generate	Authentication	Token key Generate a new secret that can
	      be used with --auth-gen-token-secret

	      Syntax:

		 --genkey auth-token [keyfile]

	      Note:  This file should be kept secret to  the  server  as  anyone
		     that  has access to this file will be able to generate auth
		     tokens that the OpenVPN server will accept as valid.

   Data Channel Renegotiation
     When running OpenVPN in client/server mode, the data  channel  will  use  a
     separate ephemeral encryption key which is rotated at regular intervals.

     --reneg-bytes n
	    Renegotiate  data  channel	key after n bytes sent or received (dis-
	    abled by default with an exception, see below). OpenVPN  allows  the
	    lifetime of a key to be expressed as a number of bytes encrypted/de-
	    crypted,  a number of packets, or a number of seconds. A key renego-
	    tiation will be forced if any of these three criteria are met by ei-
	    ther peer.

	    If using  ciphers  with  cipher  block  sizes  less  than  128-bits,
	    --reneg-bytes  is  set  to	64MB by default, unless it is explicitly
	    disabled by setting the value to 0, but this is  HIGHLY  DISCOURAGED
	    as	this  is designed to add some protection against the SWEET32 at-
	    tack vector. For more information see the --cipher option.

	    When data channel offload (DCO) is enabled, this option is	ignored.
	    DCO  does  not  support configurable renegotiation thresholds; auto-
	    matic key renegotiation mechanisms are  sufficient	for  modern  ci-
	    phers.

     --reneg-pkts n
	    Renegotiate data channel key after n packets sent and received (dis-
	    abled by default).

	    When  data channel offload (DCO) is enabled, this option is ignored.
	    DCO does not support configurable  renegotiation  thresholds;  auto-
	    matic  key	renegotiation  mechanisms  are sufficient for modern ci-
	    phers.

     --reneg-sec args
	    Renegotiate data channel key after	at  most  max  seconds	(default
	    3600)  and	at least min seconds (default is 90% of max for servers,
	    and equal to max for clients).

	       reneg-sec max [min]

	    The effective --reneg-sec value  used  is  per  session  pseudo-uni-
	    form-randomized between min and max.

	    With the default value of 3600 this results in an effective per ses-
	    sion value in the range of 3240 .. 3600 seconds for servers, or just
	    3600 for clients.

	    When  using dual-factor authentication, note that this default value
	    may cause the end user to be  challenged  to  reauthorize  once  per
	    hour.

	    Also,  keep  in mind that this option can be used on both the client
	    and server, and whichever uses the lower value will be  the  one  to
	    trigger the renegotiation. A common mistake is to set --reneg-sec to
	    a  higher value on either the client or server, while the other side
	    of the connection is still using the default value of 3600	seconds,
	    meaning  that  the renegotiation will still occur once per 3600 sec-
	    onds. The solution is to increase --reneg-sec on both the client and
	    server, or set it to 0 on one side of the connection  (to  disable),
	    and to your chosen value on the other side.

   TLS Mode Options
     TLS  mode	is the most powerful crypto mode of OpenVPN in both security and
     flexibility. TLS mode works by establishing control and data channels which
     are multiplexed over a single TCP/UDP port. OpenVPN initiates a TLS session
     over the control channel and uses it to exchange cipher and  HMAC	keys  to
     protect the data channel. TLS mode uses a robust reliability layer over the
     UDP  connection for all control channel communication, while the data chan-
     nel, over which encrypted tunnel data passes, is forwarded without any  me-
     diation.  The  result  is the best of both worlds: a fast data channel that
     forwards over UDP with only the overhead  of  encrypt,  decrypt,  and  HMAC
     functions, and a control channel that provides all of the security features
     of  TLS, including certificate-based authentication and Diffie Hellman for-
     ward secrecy.

     To use TLS mode, each peer that runs OpenVPN should have its own local cer-
     tificate/key pair (--cert and --key), signed by the root certificate  which
     is specified in --ca.

     When  two OpenVPN peers connect, each presents its local certificate to the
     other. Each peer will then check that its partner peer presented a certifi-
     cate which was signed by the master root certificate as specified in --ca.

     If that check on both peers succeeds, then the TLS  negotiation  will  suc-
     ceed, both OpenVPN peers will exchange temporary session keys, and the tun-
     nel will begin passing data.

     The OpenVPN project provides a set of scripts for managing RSA certificates
     and keys:	<https://github.com/OpenVPN/easy-rsa>

     --askpass file
	    Get certificate password from console or file before we daemonize.

	    Valid syntaxes:

	       askpass
	       askpass file

	    For the extremely security conscious, it is possible to protect your
	    private  key  with	a password. Of course this means that every time
	    the OpenVPN daemon is started you must be there to	type  the  pass-
	    word. The --askpass option allows you to start OpenVPN from the com-
	    mand  line.   It will query you for a password before it daemonizes.
	    To protect a private key with a password you should omit the  -nodes
	    option when you use the openssl command line tool to manage certifi-
	    cates and private keys.

	    If file is specified, read the password from the first line of file.
	    Keep  in  mind that storing your password in a file to a certain ex-
	    tent invalidates the extra security provided by using  an  encrypted
	    key.

     --ca file
	    Certificate  authority (CA) file in .pem format, also referred to as
	    the root certificate. This file can have  multiple	certificates  in
	    .pem  format, concatenated together. You can construct your own cer-
	    tificate authority certificate and private key by  using  a  command
	    such as:

	       openssl req -nodes -new -x509 -keyout ca.key -out ca.crt

	    Then edit your openssl.cnf file and edit the certificate variable to
	    point to your new root certificate ca.crt.

	    For  testing purposes only, the OpenVPN distribution includes a sam-
	    ple CA certificate (ca.crt). Of course you should never use the test
	    certificates and test keys distributed with OpenVPN in a  production
	    environment,  since  by virtue of the fact that they are distributed
	    with OpenVPN, they are totally insecure.

     --capath dir
	    Directory containing trusted certificates (CAs and CRLs). Not avail-
	    able with mbed TLS.

	    CAs in the capath directory are expected  to  be  named  <hash>.<n>.
	    CRLs are expected to be named <hash>.r<n>. See the -CApath option of
	    openssl  verify,  and  the -hash option of openssl x509, openssl crl
	    and X509_LOOKUP_hash_dir()(3) for more information.

	    Similar to the --crl-verify option, CRLs are not mandatory - OpenVPN
	    will log the usual warning in the logs if the relevant CRL is  miss-
	    ing, but the connection will be allowed.

     --cert file|uri
	    Local  peer's  signed certificate in .pem format or as a URI -- must
	    be signed by a certificate authority whose certificate  is	in  --ca
	    file  in  the  peer  configuration. URI is supported only when built
	    with OpenSSL 3.0 or later and any  required  providers  are  loaded.
	    Types  of  URIs  supported	and  their  syntax depends on providers.
	    OpenSSL has internal support for " <file:/absolute/path>  "  URI  in
	    which  case the scheme "file:" is optional, and any file format rec-
	    ognized by OpenSSL (e.g., PEM, PKCS12)  is	supported.  PKCS#11  URI
	    (RFC 7512) is supported by pkcs11-provider.

	    Each peer in an OpenVPN link running in TLS mode should have its own
	    certificate  and  private  key  file.  In addition, each certificate
	    should have been signed by the key of a certificate authority  whose
	    public  key  resides in the --ca certificate authority file. You can
	    easily make your own certificate authority (see above) or pay  money
	    to	use  a	commercial service such as thawte.com (in which case you
	    will be helping to finance the world's second space tourist  :).  To
	    generate a certificate, you can use a command such as:

	       openssl req -nodes -new -keyout mycert.key -out mycert.csr

	    If	your certificate authority private key lives on another machine,
	    copy the certificate signing request (mycert.csr) to this other  ma-
	    chine (this can be done over an insecure channel such as email). Now
	    sign the certificate with a command such as:

	       openssl ca -out mycert.crt -in mycert.csr

	    Now  copy  the  certificate (mycert.crt) back to the peer which ini-
	    tially generated the .csr file (this can be over a	public	medium).
	    Note  that the openssl ca command reads the location of the certifi-
	    cate  authority  key   from   its	configuration	file   such   as
	    /usr/share/ssl/openssl.cnf -- note also that for certificate author-
	    ity  functions,  you  must set up the files index.txt (may be empty)
	    and serial (initialize to 01).

     --crl-verify args
	    Check peer certificate against a Certificate Revocation List.

	    Valid syntax:

	       crl-verify file/directory flag

	    Examples:

	       crl-verify crl-file.pem
	       crl-verify /etc/openvpn/crls dir

	    A CRL (certificate revocation list) is used when a particular key is
	    compromised but when the overall PKI is still intact.

	    Suppose you had a PKI consisting of a CA, root  certificate,  and  a
	    number  of client certificates. Suppose a laptop computer containing
	    a client key and certificate was stolen. By adding the  stolen  cer-
	    tificate  to the CRL file, you could reject any connection which at-
	    tempts to use it, while preserving the overall integrity of the PKI.

	    The only time when it would be necessary to rebuild the  entire  PKI
	    from scratch would be if the root certificate key itself was compro-
	    mised.

	    The  option is not mandatory - if the relevant CRL is missing, Open-
	    VPN will log a warning in the logs - e.g.

	       VERIFY WARNING: depth=0, unable to get certificate CRL

	    but the connection will be allowed.  If the  optional  dir	flag  is
	    specified,	enable	a different mode where the crl-verify is pointed
	    at a directory containing files named as revoked serial numbers (the
	    files may be empty, the contents are never read). If  a  client  re-
	    quests  a  connection,  where  the	client certificate serial number
	    (decimal string) is the name of a file present in the directory,  it
	    will be rejected.

	    Note:  As the crl file (or directory) is read every time a peer con-
		   nects,  if you are dropping root privileges with --user, make
		   sure that this user has sufficient  privileges  to  read  the
		   file.

     --dh file
	    File  containing finite field Diffie Hellman parameters in .pem for-
	    mat (used by --tls-server only).

	    Set file to none to disable fine field Diffie Hellman  key	exchange
	    (and  to only use ECDH or newer hybrid key agreement algorithms like
	    X25519MLKEM768 instead).  Note that this requires peers to be  using
	    an	SSL  library  that supports ECDH TLS cipher suites (e.g. OpenSSL
	    1.0.1+, or mbed TLS 2.0+). Starting with 2.7.0, this is the same  as
	    not specifying --dh at all.

	    Diffie  Hellman  parameters  can  be generated using openssl dhparam
	    -out dh2048.pem 2048 but it is recommended to  use	none  as  finite
	    field Diffie Hellman have been replaced by more modern variants like
	    ECDH.

	    Diffie Hellman parameters may be considered public.

     --ecdh-curve name
	    Specify  the  curve to use for elliptic curve Diffie Hellman. Avail-
	    able curves can be listed with --show-curves.  The	specified  curve
	    will only be used for ECDH TLS-ciphers.

	    This option is not supported in mbed TLS builds of OpenVPN.

     --extra-certs file
	    Specify  a	file  containing one or more PEM certs (concatenated to-
	    gether) that complete the local certificate chain.

	    This option is useful for "split" CAs, where the CA for server certs
	    is different than the CA for client certs.	Putting  certs	in  this
	    file  allows them to be used to complete the local certificate chain
	    without trusting them to verify the peer-submitted	certificate,  as
	    would be the case if the certs were placed in the ca file.

     --hand-window n
	    Handshake  Window -- the TLS-based key exchange must finalize within
	    n seconds of handshake initiation by any peer (default 60  seconds).
	    If	the handshake fails we will attempt to reset our connection with
	    our peer and try again. Even in the event of  handshake  failure  we
	    will  still  use our expiring key for up to --tran-window seconds to
	    maintain continuity of transmission of tunnel data.

	    The --hand-window parameter also controls the amount  of  time  that
	    the OpenVPN client repeats the pull request until it times out.

     --key file|uri
	    Local  peer's  private  key in .pem format or a URI. Use the private
	    key which was generated when you built your peer's certificate  (see
	    --cert  file  above).  URI is supported only when built with OpenSSL
	    3.0 or later and any required providers are loaded. (See --cert  for
	    more details).

     --ns-cert-type type
	    DEPRECATED The --remote-cert-tls option should be used instead.  The
	    option  is	still  available  since it can't be silently ignored and
	    needs updates to certificates and configs on both sides of the  con-
	    nection.   However it should not be used for new clients or servers.
	    It depends on the deprecated nsCertType certificate field.

	    Might not work depending on the TLS library used.

	    Will be removed in a future release.

     --pkcs12 file
	    Specify a PKCS #12 file containing local private key, local certifi-
	    cate, and root CA certificate. This option can be  used  instead  of
	    --ca, --cert, and --key.  Not available with mbed TLS.

     --remote-cert-eku oid
	    Require  that  peer certificate was signed with an explicit extended
	    key usage.

	    This is a useful security option for clients,  to  ensure  that  the
	    host they connect to is a designated server.

	    The extended key usage should be encoded in oid notation, or OpenSSL
	    symbolic representation.

     --remote-cert-ku key-usage
	    Require that peer certificate was signed with an explicit key-usage.

	    If	present  in  the certificate, the keyUsage value is validated by
	    the TLS library during the TLS  handshake.	Specifying  this  option
	    without  arguments requires this extension to be present (so the TLS
	    library will verify it).

	    If key-usage is a list of usage bits, the keyUsage field  must  have
	    at least the same bits set as the bits in one of the values supplied
	    in the key-usage list.

	    The key-usage values in the list must be encoded in hex, e.g.

	       remote-cert-ku a0

     --remote-cert-tls type
	    Require  that peer certificate was signed with an explicit key usage
	    and extended key usage based on RFC3280 TLS rules.

	    Valid syntaxes:

	       remote-cert-tls server
	       remote-cert-tls client

	    This is a useful security option for clients,  to  ensure  that  the
	    host  they	connect  to  is  a  designated	server. Or the other way
	    around; for a server to verify that only hosts with  a  client  cer-
	    tificate can connect.

	    The --remote-cert-tls client option is equivalent to

	       remote-cert-ku
	       remote-cert-eku "TLS Web Client Authentication"

	    The --remote-cert-tls server option is equivalent to

	       remote-cert-ku
	       remote-cert-eku "TLS Web Server Authentication"

	    This  is  an  important  security  precaution  to  protect against a
	    man-in-the-middle attack where an authorized client attempts to con-
	    nect to another client by impersonating the server.  The  attack  is
	    easily prevented by having clients verify the server certificate us-
	    ing any one of --remote-cert-tls, --verify-x509-name, --peer-finger-
	    print or --tls-verify.

     --tls-auth args
	    Add  an  additional  layer	of HMAC authentication on top of the TLS
	    control channel to mitigate DoS  attacks  and  attacks  on	the  TLS
	    stack.

	    Valid syntaxes:

	       tls-auth file
	       tls-auth file 0
	       tls-auth file 1

	    In a nutshell, --tls-auth enables a kind of "HMAC firewall" on Open-
	    VPN's TCP/UDP port, where TLS control channel packets bearing an in-
	    correct HMAC signature can be dropped immediately without response.

	    file  (required) is a file in OpenVPN static key format which can be
	    generated by --genkey.

	    Older versions (up to OpenVPN 2.3) supported a  freeform  passphrase
	    file.  This is no longer supported in newer versions (v2.4+).

	    The  optional direction parameter enables the use of 2 distinct keys
	    (HMAC-send, HMAC-receive), so that each data flow  direction  has  a
	    different  HMAC key. This has a number of desirable security proper-
	    ties including eliminating certain kinds of DoS and  message  replay
	    attacks.

	    When  the direction parameter is omitted, the same key is used bidi-
	    rectionally.

	    The direction parameter should always  be  complementary  on  either
	    side  of  the  connection,	i.e. one side should use 0 and the other
	    should use 1, or both sides should omit it altogether.

	    The direction parameter requires that file contains a 2048 bit  key.
	    While  pre-1.5  versions of OpenVPN generate 1024 bit key files, any
	    version of OpenVPN which supports the direction parameter, will also
	    support 2048 bit key file generation using the --genkey option.

	    --tls-auth is recommended when you are running  OpenVPN  in  a  mode
	    where  it is listening for packets from any IP address, such as when
	    --remote is not specified, or --remote is specified with --float.

	    The rationale for  this  feature  is  as  follows.	TLS  requires  a
	    multi-packet exchange before it is able to authenticate a peer. Dur-
	    ing this time before authentication, OpenVPN is allocating resources
	    (memory  and CPU) to this potential peer. The potential peer is also
	    exposing many parts of OpenVPN and the OpenSSL library to the  pack-
	    ets it is sending. Most successful network attacks today seek to ei-
	    ther  exploit  bugs in programs (such as buffer overflow attacks) or
	    force a program to consume so many resources that it  becomes  unus-
	    able.  Of  course  the  first  line  of defense is always to produce
	    clean, well-audited code. OpenVPN has been written with buffer over-
	    flow attack prevention as a top priority. But as history has  shown,
	    many of the most widely used network applications have, from time to
	    time, fallen to buffer overflow attacks.

	    So as a second line of defense, OpenVPN offers this special layer of
	    authentication  on	top  of  the  TLS  control channel so that every
	    packet on the control channel is authenticated by an HMAC  signature
	    and a unique ID for replay protection. This signature will also help
	    protect  against  DoS (Denial of Service) attacks. An important rule
	    of thumb in reducing vulnerability to DoS attacks is to minimize the
	    amount of resources a potential, but as yet unauthenticated,  client
	    is able to consume.

	    --tls-auth	does  this  by	signing every TLS control channel packet
	    with an HMAC signature, including packets which are sent before  the
	    TLS  level	has had a chance to authenticate the peer. The result is
	    that packets without the correct signature can  be	dropped  immedi-
	    ately  upon  reception,  before  they have a chance to consume addi-
	    tional system resources such  as  by  initiating  a  TLS  handshake.
	    --tls-auth can be strengthened by adding the --replay-persist option
	    which  will keep OpenVPN's replay protection state in a file so that
	    it is not lost across restarts.

	    It should be emphasized that this feature is optional and  that  the
	    key  file  used  with  --tls-auth gives a peer nothing more than the
	    power to initiate a TLS handshake. It is not used to encrypt or  au-
	    thenticate any tunnel data.

	    Use  --tls-crypt instead if you want to use the key file to not only
	    authenticate, but also encrypt the TLS control channel.

     --tls-groups list
	    A list of allowable groups/curves in order of preference.

	    Set the allowed elliptic curves/groups for the TLS	session.   These
	    groups are allowed to be used in signatures and key exchange.

	    mbedTLS currently allows all known curves per default.

	    OpenSSL 1.1+ restricts the list per default to

	       "X25519:secp256r1:X448:secp521r1:secp384r1".

	    If you use certificates that use non-standard curves, you might need
	    to	add  them  here.  If  you  do  not force the ecdh curve by using
	    --ecdh-curve, the groups for ecdh will  also  be  picked  from  this
	    list.

	    OpenVPN  maps the curve name secp256r1 to prime256v1 to allow speci-
	    fying the same tls-groups option for mbedTLS and OpenSSL.

	    Warning: this option not only affects  elliptic  curve  certificates
	    but  also  the key exchange in TLS 1.3 and using this option improp-
	    erly will disable TLS 1.3.

     --tls-cert-profile profile
	    Set the allowed cryptographic algorithms for certificates  according
	    to profile.

	    The following profiles are supported:

	    insecure
		   Identical for mbed TLS to legacy

	    legacy (default)
		   SHA1 and newer, RSA 2048-bit+, any elliptic curve.

	    preferred
		   SHA2 and newer, RSA 2048-bit+, any elliptic curve.

	    suiteb
		   SHA256/SHA384, ECDSA with P-256 or P-384.

	    This  option  is  only  fully supported for mbed TLS builds. OpenSSL
	    builds use the following approximation:

	    insecure
		   sets "security level 0"

	    legacy (default)
		   sets "security level 1"

	    preferred
		   sets "security level 2"

	    suiteb
		   sets "security level 3" and --tls-cipher "SUITEB128".

	    OpenVPN will migrate to 'preferred' as default in the future. Please
	    ensure that your keys already comply.

     WARNING: --tls-cipher, --tls-ciphersuites and tls-groups
	    These options are expert features, which - if used correctly  -  can
	    improve  the security of your VPN connection. But it is also easy to
	    unwittingly use them to carefully align a gun  with  your  foot,  or
	    just break your connection. Use with care!

     --tls-cipher l
	    A list l of allowable TLS ciphers delimited by a colon (":").

	    This  setting  can	be used to ensure that certain cipher suites are
	    used (or not used) for the TLS connection. OpenVPN uses TLS  to  se-
	    cure  the control channel, over which the keys that are used to pro-
	    tect the actual VPN traffic are exchanged.

	    The supplied list of ciphers is (after potential  OpenSSL/IANA  name
	    translation)  simply  supplied to the crypto library. Please see the
	    OpenSSL and/or mbed TLS documentation for details on the cipher list
	    interpretation.

	    For OpenSSL, the --tls-cipher option is used for TLS 1.2 and below.

	    Use --show-tls to see a list of TLS ciphers supported by your crypto
	    library.

	    The default for --tls-cipher is to use  mbed  TLS's  default  cipher
	    list	when	   using       mbed	  TLS	    or	     DE-
	    FAULT:!EXP:!LOW:!MEDIUM:!kDH:!kECDH:!DSS:!PSK:!SRP:!kRSA when  using
	    OpenSSL.

     --tls-ciphersuites l
	    Same as --tls-cipher but for TLS 1.3 and up. mbed TLS has no TLS 1.3
	    support yet and only the --tls-cipher setting is used.

	    The  default  for  --tls-ciphersuites is to use the crypto library's
	    default.

     --tls-client
	    Enable TLS and assume client role during TLS handshake.

     --tls-crypt keyfile
	    Encrypt and authenticate all control channel packets  with	the  key
	    from keyfile. (See --tls-auth for more background.)

	    Encrypting (and authenticating) control channel packets:

	    * provides	more  privacy by hiding the certificate used for the TLS
	      connection,

	    * makes it harder to identify OpenVPN traffic as such,

	    * provides "poor-man's" post-quantum security, against attackers who
	      will never know the pre-shared key (i.e. no forward secrecy).

	    In contrast to --tls-auth, --tls-crypt does not require the user  to
	    set --key-direction.

	    Security Considerations

	    All peers use the same --tls-crypt pre-shared group key to authenti-
	    cate  and encrypt control channel messages. To ensure that IV colli-
	    sions remain unlikely, this key should not be used to  encrypt  more
	    than  2^48 client-to-server or 2^48 server-to-client control channel
	    messages. A typical initial negotiation is about 10 packets in  each
	    direction.	Assuming both initial negotiation and renegotiations are
	    at most 2^16 (65536) packets (to be conservative), and  (re)negotia-
	    tions  happen  each  minute  for  each  user (24/7), this limits the
	    tls-crypt key lifetime to 8171 years divided by the number of users.
	    So a setup with 1000 users should rotate the key at least once  each
	    eight years. (And a setup with 8000 users each year.)

	    If IV collisions were to occur, this could result in the security of
	    --tls-crypt  degrading  to	the  same  security as using --tls-auth.
	    That is, the control channel still benefits from the  extra  protec-
	    tion  against  active man-in-the-middle-attacks and DoS attacks, but
	    may no longer offer extra privacy and post-quantum security  on  top
	    of what TLS itself offers.

	    For  large	setups or setups where clients are not trusted, consider
	    using --tls-crypt-v2 instead. That uses per-client unique keys,  and
	    thereby  improves  the  bounds to 'rotate a client key at least once
	    per 8000 years'.

     --tls-crypt-v2 keyfile
	    Valid syntax:

	       tls-crypt-v2 keyfile
	       tls-crypt-v2 keyfile force-cookie
	       tls-crypt-v2 keyfile allow-noncookie

	    Use client-specific tls-crypt keys.

	    For clients, keyfile is a client-specific tls-crypt key. Such a  key
	    can be generated using the --genkey tls-crypt-v2-client option.

	    For servers, keyfile is used to unwrap client-specific keys supplied
	    by	the client during connection setup. This key must be the same as
	    the key used to  generate  the  client-specific  key  (see	--genkey
	    tls-crypt-v2-client).

	    On	servers, this option can be used together with the --tls-auth or
	    --tls-crypt option. In that case, the server will detect whether the
	    client is using client-specific keys, and automatically  select  the
	    right mode.

	    The   optional  parameters	force-cookie  allows  only  tls-crypt-v2
	    clients that support a cookie based stateless  three  way  handshake
	    that  avoids  replay attacks and state exhaustion on the server side
	    (OpenVPN 2.6 and later). The option allow-noncookie  explicitly  al-
	    lows  older  tls-crypt-v2  clients.  The  default is (currently) al-
	    low-noncookie.

     --tls-crypt-v2-verify cmd
	    Run command cmd  to  verify  the  metadata	of  the  client-specific
	    tls-crypt-v2 key of a connecting client. This allows server adminis-
	    trators  to reject client connections, before exposing the TLS stack
	    (including the notoriously dangerous X.509 and ASN.1 stacks) to  the
	    connecting client.

	    OpenVPN  supplies the following environment variables to the command
	    (and only these variables. The normal environment  variables  avail-
	    able for other scripts are NOT present):

	    * script_type is set to tls-crypt-v2-verify

	    * metadata_type  is set to 0 if the metadata was user supplied, or 1
	      if it's a 64-bit unix  timestamp	representing  the  key	creation
	      time.

	    * metadata_file  contains the filename of a temporary file that con-
	      tains the client metadata.

	    The command can reject the connection by  exiting  with  a	non-zero
	    exit code.

     --tls-crypt-v2-max-age n
	    Reject  tls-crypt-v2  client keys that are older than n days or have
	    no timestamp.

     --tls-exit
	    Exit on TLS negotiation failure. This option can be useful when  you
	    only want to make one attempt at connecting, e.g. in a test or moni-
	    toring script.  (OpenVPN's own test suite uses it this way.)

     --tls-server
	    Enable  TLS  and  assume server role during TLS handshake. Note that
	    OpenVPN is designed as a peer-to-peer application.	The  designation
	    of	client	or server is only for the purpose of negotiating the TLS
	    control channel.

     --tls-timeout n
	    Packet retransmit timeout on TLS control channel if  no  acknowledg-
	    ment  from remote within n seconds (default 2). When OpenVPN sends a
	    control packet to its peer, it will expect to  receive  an	acknowl-
	    edgement  within n seconds or it will retransmit the packet, subject
	    to a TCP-like exponential backoff algorithm. This parameter only ap-
	    plies to control channel packets. Data channel packets (which  carry
	    encrypted  tunnel  data)  are  never acknowledged, sequenced, or re-
	    transmitted by OpenVPN because the higher  level  network  protocols
	    running on top of the tunnel such as TCP expect this role to be left
	    to them.

     --tls-version-min args
	    Sets  the  minimum TLS version we will accept from the peer (default
	    in 2.6.0 and later is "1.2").

	    Valid syntax:

	       tls-version-min version ['or-highest']

	    Examples for version include 1.0, 1.1,  or	1.2.  If  or-highest  is
	    specified  and  version  is  not recognized, we will only accept the
	    highest TLS version supported by the local SSL implementation.

     --tls-version-max version
	    Set the maximum TLS version we will use (default is the highest ver-
	    sion supported). Examples for version include 1.0, 1.1, or 1.2.

     --verify-hash args
	    DEPRECATED Specify SHA1 or SHA256 fingerprint for level-1 cert.

	    Valid syntax:

	       verify-hash hash [algo]

	    The level-1 cert is the CA (or intermediate  cert)	that  signs  the
	    leaf  certificate,	and  is one removed from the leaf certificate in
	    the direction of the root. When accepting a connection from a  peer,
	    the  level-1 cert fingerprint must match hash or certificate verifi-
	    cation will fail. Hash is specified as XX:XX:... For example:

	       AD:B0:95:D8:09:C8:36:45:12:A9:89:C8:90:09:CB:13:72:A6:AD:16

	    The algo flag can be either SHA1 or SHA256. If not provided, it  de-
	    faults to SHA1.

	    This option can also be inlined

	       <verify-hash>
	       00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff
	       11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00
	       </verify-hash>

     If the option is inlined, algo is always SHA256.

     --peer-fingerprint args
	       Specify	a  SHA256  fingerprint or list of SHA256 fingerprints to
	       verify the peer certificate against. The  peer  certificate  must
	       match  one  of  the  fingerprint or certificate verification will
	       fail. The option can also be inlined

	    Valid syntax:

	       peer-fingerprint AD:B0:95:D8:09:...

	    or inline:

	       <peer-fingerprint>
	       00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff
	       11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00
	       </peer-fingerprint>

	    When the --peer-fingerprint option is used,  specifying  a	CA  with
	    --ca  or --capath is optional. This allows the he --peer-fingerprint
	    to be used as alternative to a PKI with self-signed certificates for
	    small setups. See the examples section for such a setup.

     --verify-x509-name args
	    Accept connections only if a host's X.509 name is equal to name. The
	    remote host must also pass all other tests of verification.

	    Valid syntax:

	       verify-x509 name type

	    Which X.509 name is compared to name depends on the setting of type.
	    type can be subject to match the complete subject DN (default), name
	    to match a subject RDN or name-prefix to match a subject RDN prefix.
	    Which RDN is verified as name depends on  the  --x509-username-field
	    option.  But it defaults to the common name (CN), e.g. a certificate
	    with a subject DN

	       C=KG, ST=NA, L=Bishkek, CN=Server-1

	    would be matched by:

	       verify-x509-name 'C=KG, ST=NA, L=Bishkek, CN=Server-1'
	       verify-x509-name Server-1 name
	       verify-x509-name Server- name-prefix

	    The last example is useful if you want a client to only accept  con-
	    nections to Server-1, Server-2, etc.

	    --verify-x509-name	is a useful replacement for the --tls-verify op-
	    tion to verify the remote host, because --verify-x509-name works  in
	    a --chroot environment without any dependencies.

	    Using  a name prefix is a useful alternative to managing a CRL (Cer-
	    tificate Revocation List) on the client, since it allows the  client
	    to	refuse	all certificates except for those associated with desig-
	    nated servers.

	    NOTE:  Test against a name prefix only when you  are  using  OpenVPN
		   with  a  custom  CA	certificate  that is under your control.
		   Never use this option with type name-prefix when your  client
		   certificates  are  signed by a third party, such as a commer-
		   cial web CA.

     --x509-track attribute
	    Save peer X509 attribute value in environment for use by plugins and
	    management interface. Prepend a + to attribute to save  values  from
	    full  cert	chain. Otherwise the attribute will only be exported for
	    the leaf cert (i.e. depth 0 of the cert chain). Values will  be  en-
	    coded as X509_<depth>_<attribute>=<value>. Multiple --x509-track op-
	    tions can be defined to track multiple attributes.

	    attribute  can  be	any part of the X509 Subject field or any X509v3
	    extension (RFC 3280). X509v3 extensions might not be supported  when
	    not  using	the  default TLS backend library (OpenSSL). You can also
	    request the SHA1 and SHA256 fingerprints of the cert,  but	that  is
	    always exported as tls_digest_{n} and tls_digest_sha256_{n} anyway.

	    Note  that	by  default  all parts of the X509 Subject field are ex-
	    ported in the environment for the  whole  cert  chain.  If	you  use
	    --x509-track  at  least  once only the attributes specified by these
	    options are exported.

	    Examples:

	       x509-track CN		   # exports only X509_0_CN
	       x509-track +CN		   # exports X509_{n}_CN for chain
	       x509-track basicConstraints # exports value of "X509v3 Basic Constraints"
	       x509-track SHA256	   # exports SHA256 fingerprint

     --x509-username-field args
	    Fields in the X.509 certificate subject to be used as  the	username
	    (default  CN). If multiple fields are specified their values will be
	    concatenated into the one username using _ symbol as a separator.

	    Valid syntax:

	       x509-username-field [ext:]fieldname [[ext:]fieldname...]

	    Typically, this option is specified with fieldname arguments as  ei-
	    ther of the following:

	       x509-username-field emailAddress
	       x509-username-field 1.2.840.113549.1.9.1
	       x509-username-field ext:subjectAltName
	       x509-username-field CN serialNumber

	    The  first	two examples use the value of the emailAddress attribute
	    in the certificate's Subject field as the username, where the  first
	    example  uses  the	name  while the second example uses the oid. The
	    third example uses the ext: prefix to signify that the X.509  exten-
	    sion  fieldname subjectAltName be searched for an rfc822Name (email)
	    field to be used as the username. In cases where there are	multiple
	    email addresses in ext:fieldname, the last occurrence is chosen. The
	    last  example  uses  the  value  of  the CN attribute in the Subject
	    field, combined with the _ separator and the hexadecimal representa-
	    tion of the certificate's serialNumber.

	    When this option is used, the --verify-x509-name option  will  match
	    against the chosen fieldname instead of the Common Name.

	    Only the subjectAltName and issuerAltName X.509 extensions and seri-
	    alNumber X.509 attribute are supported.

	    Non-compliant  symbols are being replaced with the _ symbol, same as
	    the field separator, so concatenating multiple fields with such or _
	    symbols can potentially lead to username collisions.

   PKCS#11 / SmartCard options
     --pkcs11-cert-private args
	    Set if access to certificate object should be performed after login.
	    Every provider has its own setting.

	    Valid syntaxes:

	       pkcs11-cert-private 0
	       pkcs11-cert-private 1

     --pkcs11-id name
	    Specify the serialized certificate id to be used. The id can be got-
	    ten by the standalone --show-pkcs11-ids option.  See  also	the  de-
	    scription of --pkcs11-providers option.

     --pkcs11-id-management
	    Acquire  PKCS#11  id  from	management  interface.	In  this  case a
	    NEED-STR 'pkcs11-id-request' real-time message  will  be  triggered,
	    application  may  use  pkcs11-id-count command to retrieve available
	    number of certificates, and pkcs11-id-get command to  retrieve  cer-
	    tificate  id  and  certificate  body.   See  also the description of
	    --pkcs11-providers option.

     --pkcs11-pin-cache seconds
	    Specify how many seconds the PIN can be cached, the default is until
	    the token is removed.

     --pkcs11-private-mode mode
	    Specify which method to use in order to perform private  key  opera-
	    tions.  A different mode can be specified for each provider. Mode is
	    encoded as hex number, and can be a mask one of the following:

	    0 (default)   Try to determine automatically.

	    1		  Use sign.

	    2		  Use sign recover.

	    4		  Use decrypt.

	    8		  Use unwrap.

     --pkcs11-protected-authentication args
	    Use  PKCS#11 protected authentication path, useful for biometric and
	    external keypad devices. Every provider has its own setting.

	    Valid syntaxes:

	       pkcs11-protected-authentication 0
	       pkcs11-protected-authentication 1

     --pkcs11-providers providers
	    Specify an RSA Security Inc. PKCS #11 Cryptographic Token  Interface
	    (Cryptoki)	providers to load. A space-separated list of one or more
	    provider library names may be  specified.  This  option  along  with
	    --pkcs11-id  or  pkcs11-id-management  can be used instead of --cert
	    and --key or --pkcs12.

	    If p11-kit is present on the system and was  enabled  during  build,
	    its  p11-kit-proxy.so module will be loaded by default if either the
	    --pkcs11-id or --pkcs11-id-management  options  is	present  without
	    --pkcs11-providers.  If  default loading is not enabled in the build
	    and no providers are specified, the former options will be ignored.

     --show-pkcs11-ids args
	    (Standalone) Show PKCS#11 token object list.

	    Valid syntax:

	       show-pkcs11 [provider] [cert_private]

	    Specify cert_private as 1 if certificates are stored as private  ob-
	    jects.

	    If	p11-kit  is  present on the system, the provider argument is op-
	    tional; if omitted	the  default  p11-kit-proxy.so	module	will  be
	    queried.

	    --verb  option  can  be used BEFORE this option to produce debugging
	    information.

   Data channel cipher negotiation
     OpenVPN 2.4 and higher have the capability to  negotiate  the  data  cipher
     that  is used to encrypt data packets. This section describes the mechanism
     in more detail and the different  backwards  compatibility  mechanism  with
     older server and clients.

   OpenVPN 2.5 and later behaviour
     When  both client and server are at least running OpenVPN 2.5, that the or-
     der of the ciphers of the server's --data-ciphers is used to pick the  data
     cipher.   That means that the first cipher in that list that is also in the
     client's --data-ciphers list is chosen. If no common cipher  is  found  the
     client is rejected with a AUTH_FAILED message (as seen in client log):
	AUTH: Received control message: AUTH_FAILED,Data channel cipher negotia-
	tion failed (no shared cipher)

     OpenVPN  2.5  and later will only allow the ciphers specified in --data-ci-
     phers.	If    --data-ciphers	is    not    set    the    default    is
     AES-256-GCM:AES-128-GCM.	In  2.6  and  later  the  default  is changed to
     AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305 when Chacha20-Poly1305 is  avail-
     able.

     For  backwards compatibility OpenVPN 2.6 and later with --compat-mode 2.4.x
     (or lower) and OpenVPN 2.5 will automatically add a cipher specified  using
     the --cipher option to this list.

   OpenVPN 2.4 clients
     The  negotiation  support in OpenVPN 2.4 was the first iteration of the im-
     plementation and still had some quirks.  Its  main  goal  was  "upgrade  to
     AES-256-GCM  when possible".  An OpenVPN 2.4 client that is built against a
     crypto library that supports AES in GCM mode and does not	have  --ncp-dis-
     able  will  always  announce  support  for AES-256-GCM and AES-128-GCM to a
     server by sending IV_NCP=2.

     This only causes a problem if --ncp-ciphers option has  been  changed  from
     the  default  of  AES-256-GCM:AES-128-GCM	to a value that does not include
     these two ciphers. When an OpenVPN  server  tries	to  use  AES-256-GCM  or
     AES-128-GCM  the  connection will then fail. It is therefore recommended to
     always have the AES-256-GCM and AES-128-GCM ciphers  to  the  --ncp-ciphers
     options to avoid this behaviour.

   OpenVPN 3 clients
     Clients  based  on  the  OpenVPN  3.x  library  ( <https://github.com/open-
     vpn/openvpn3/> ) do not have a configurable --ncp-ciphers or --data-ciphers
     option. Newer versions by	default  disable  legacy  AES-CBC,  BF-CBC,  and
     DES-CBC  ciphers.	These clients will always announce support for all their
     supported AEAD ciphers (AES-256-GCM, AES-128-GCM and in newer versions also
     Chacha20-Poly1305).

     To support OpenVPN 3.x based clients at least one of these ciphers needs to
     be included in the server's --data-ciphers option.

   OpenVPN 2.3 and older clients (and clients with --ncp-disable)
     When a client without cipher negotiation support connects to a  server  the
     cipher  specified with the --cipher option in the client configuration must
     be included in the --data-ciphers option of the server to allow the  client
     to  connect. Otherwise the client will be sent the AUTH_FAILED message that
     indicates no shared cipher.

     If the client is 2.3 or older  and  has  been  configured	with  the  --en-
     able-small  ./configure argument, using data-ciphers-fallback cipher in the
     server  config  file  with the explicit cipher used by the client is neces-
     sary.

   OpenVPN 2.4 server
     When a client indicates  support  for  AES-128-GCM  and  AES-256-GCM  (with
     IV_NCP=2) an OpenVPN 2.4 server will send the first cipher of the --ncp-ci-
     phers  to	the  OpenVPN client regardless of what the cipher is. To emulate
     the behaviour of an OpenVPN 2.4 client as close as possible and  have  com-
     patibility  to  a	setup that depends on this quirk, adding AES-128-GCM and
     AES-256-GCM to the client's --data-ciphers option is required. OpenVPN 2.5+
     will only announce the IV_NCP=2 flag if those ciphers are present.

   OpenVPN 2.3 and older servers (and servers with --ncp-disable)
     The cipher used by the server must be included in --data-ciphers  to  allow
     the client connecting to a server without cipher negotiation support.  (For
     compatibility OpenVPN 2.5 will also accept the cipher set with --cipher)

     If  the  server  is  2.3  or  older and  has been configured with the --en-
     able-small ./configure argument, adding --data-ciphers-fallback  cipher  to
     the client config with the explicit cipher used by the server is necessary.

   Blowfish in CBC mode (BF-CBC) deprecation
     The  --cipher  option defaulted to BF-CBC in OpenVPN 2.4 and older version.
     The default was never changed to ensure backwards compatibility.  In  Open-
     VPN  2.5 this behaviour has now been changed so that if the --cipher is not
     explicitly set it does not allow the weak BF-CBC cipher any more and  needs
     to explicitly added as --cipher BFC-CBC or added to --data-ciphers.

     We strongly recommend to switching away from BF-CBC to a more secure cipher
     as soon as possible instead.

NETWORK CONFIGURATION
     OpenVPN  consists	of  two sides of network configuration.  One side is the
     link between the local and remote side, the other side is the virtual  net-
     work adapter (tun/tap device).

   Link Options
     This  link options section covers options related to the connection between
     the local and the remote host.

     --bind keywords
	    Bind to local address and port. This is the default  unless  any  of
	    --proto tcp-client , --http-proxy or --socks-proxy are used.

	    If	the  optional ipv6only keyword is present OpenVPN will bind only
	    to IPv6 (as opposed to IPv6 and IPv4) when a IPv6 socket is opened.

     --float
	    Allow remote peer to change its IP address and/or port number,  such
	    as	due  to  DHCP  (this  is  the  default if --remote is not used).
	    --float when specified with --remote allows an  OpenVPN  session  to
	    initially  connect	to a peer at a known address, however if packets
	    arrive from a new address and pass all authentication tests, the new
	    address will take control of the session. This is  useful  when  you
	    are  connecting  to  a  peer which holds a dynamic address such as a
	    dial-in user or DHCP client.

	    Essentially, --float tells OpenVPN to accept  authenticated  packets
	    from  any  address,  not only the address which was specified in the
	    --remote option.

     --fragment args
	    Valid syntax:

	       fragment max
	       fragment max mtu

	    Enable internal datagram fragmentation so that no UDP datagrams  are
	    sent which are larger than max bytes.

	    If	the mtu parameter is present the max parameter is interpreted to
	    include IP and UDP encapsulation overhead. The mtu parameter is  in-
	    troduced in OpenVPN version 2.6.0.

	    If	the mtu parameter is absent, the max parameter is interpreted in
	    the same way as the --link-mtu parameter, i.e.  the UDP packet  size
	    after  encapsulation  overhead  has been added in, but not including
	    the UDP header itself.

	    The --fragment option only makes sense when you are  using	the  UDP
	    protocol (--proto udp).

	    --fragment adds 4 bytes of overhead per datagram.

	    See  the  --mssfix	option	below for an important related option to
	    --fragment.

	    It should also be noted that this option is not meant to replace UDP
	    fragmentation at the IP stack level. It is only meant as a last  re-
	    sort  when	path  MTU discovery is broken. Using this option is less
	    efficient than fixing path MTU discovery for your IP link and  using
	    native IP fragmentation instead.

	    Having  said that, there are circumstances where using OpenVPN's in-
	    ternal fragmentation capability may be your  only  option,	such  as
	    tunneling a UDP multicast stream which requires fragmentation.

     --keepalive args
	    A helper directive designed to simplify the expression of --ping and
	    --ping-restart.

	    Valid syntax:

	       keepalive interval timeout

	    Send  ping	once  every interval seconds, restart if ping is not re-
	    ceived for timeout seconds.

	    This option can be used on both client and server side,  but  it  is
	    enough  to	add  this on the server side as it will push appropriate
	    --ping and --ping-restart options to the client.  If  used	on  both
	    server  and  client, the values pushed from server will override the
	    client local values.

	    The timeout argument will be twice as long on the server side.  This
	    ensures  that a timeout is detected on client side before the server
	    side drops the connection.

	    For example, --keepalive 10 60 expands as follows:

	       if mode server:
		   ping 10		      # Argument: interval
		   ping-restart 120	      # Argument: timeout*2
		   push "ping 10"	      # Argument: interval
		   push "ping-restart 60"     # Argument: timeout
	       else
		   ping 10		      # Argument: interval
		   ping-restart 60	      # Argument: timeout

     --link-mtu n
	    DEPRECATED Sets an upper bound on the size of UDP packets which  are
	    sent  between OpenVPN peers. It's best not to set this parameter un-
	    less you know what you're doing.

	    Due to variable header size of IP header (20 bytes for IPv4  and  40
	    bytes for IPv6) and dynamically negotiated data channel cipher, this
	    option is not reliable. It is recommended to set tun-mtu with enough
	    headroom instead.

     --local args
	    Valid syntax:

	       local host|* [port] [protocol]

	    Local host name or IP address and port for bind. If specified, Open-
	    VPN  will bind to this address. If unspecified, OpenVPN will bind to
	    all interfaces.  '*' can be used as hostname and  means  'any  host'
	    (OpenVPN  will  listen on what is returned by the OS).  On a client,
	    or in point-to-point mode,	this  can  only  be  specified	once  (1
	    socket).

	    On	an OpenVPN setup running as --server, this can be specified mul-
	    tiple times to open multiple  listening  sockets  on  different  ad-
	    dresses and/or different ports.  In order to specify multiple listen
	    ports without specifying an address, use '*' to signal "use what the
	    operating system gives you as default", for "all IPv4 addresses" use
	    "0.0.0.0",	for  "all  IPv6  addresses"  use  '::'.  --local implies
	    --bind.

     --lport port
	    Set default TCP/UDP  port  number.	Cannot	be  used  together  with
	    --nobind  option.	A  port  number of 0 is only honoured to achieve
	    "bind() to a random assigned port number" if a bind-to IP address is
	    specified with --local.

     --mark value
	    Mark encrypted packets being sent with value. The mark value can  be
	    matched  in  policy  routing  and packetfilter rules. This option is
	    only supported in Linux and does nothing on other operating systems.

     --mode m
	    Set OpenVPN major mode. By default, OpenVPN runs  in  point-to-point
	    mode  (p2p). OpenVPN 2.0 introduces a new mode (server) which imple-
	    ments a multi-client server capability.

     --mssfix args
	    Valid syntax:

	       mssfix max [mtu]

	       mssfix max [fixed]

	       mssfix

	    Announce to TCP sessions running over the tunnel  that  they  should
	    limit  their  send packet sizes such that after OpenVPN has encapsu-
	    lated them, the resulting UDP packet size that OpenVPN sends to  its
	    peer will not exceed max bytes. The default value is 1492 mtu. Use 0
	    as max to disable mssfix.

	    If	the  mtu  parameter is specified the max value is interpreted as
	    the resulting packet size of VPN packets including the  IP	and  UDP
	    header.   Support  for the mtu parameter was added with OpenVPN ver-
	    sion 2.6.0.

	    If the mtu parameter is not specified, the max parameter  is  inter-
	    preted  in	the  same way as the --link-mtu parameter, i.e.  the UDP
	    packet size after encapsulation overhead has been added in, but  not
	    including  the  UDP header itself. Resulting packet would be at most
	    28 bytes larger for IPv4 and 48 bytes for IPv6 (20/40 bytes  for  IP
	    header  and  8  bytes  for UDP header). Default value of 1450 allows
	    OpenVPN packets to be transmitted over IPv4 on a link with MTU  1478
	    or higher without IP level fragmentation (and 1498 for IPv6).

	    If the fixed parameter is specified, OpenVPN will make no attempt to
	    calculate  the  VPN  encapsulation overhead but instead will set the
	    MSS to limit the size of the payload IP  packets  to  the  specified
	    number.  IPv4 packets will have the MSS value lowered to mssfix - 40
	    and IPv6 packets to mssfix - 60.

	    if --mssfix is specified is specified without any parameter  it  in-
	    herits the parameters of --fragment if specified or uses the default
	    for --mssfix otherwise.

	    The --mssfix option only makes sense when you are using the UDP pro-
	    tocol for OpenVPN peer-to-peer communication, i.e. --proto udp.

	    --mssfix and --fragment can be ideally used together, where --mssfix
	    will  try to keep TCP from needing packet fragmentation in the first
	    place, and if big packets come through anyhow (from protocols  other
	    than TCP), --fragment will internally fragment them.

	    --max-packet-size,	--fragment,  and  --mssfix  are designed to work
	    around cases where Path MTU discovery is broken on the network  path
	    between OpenVPN peers.

	    The usual symptom of such a breakdown is an OpenVPN connection which
	    successfully starts, but then stalls during active usage.

	    If --fragment and --mssfix are used together, --mssfix will take its
	    default max parameter from the --fragment max option.

	    Therefore,	one  could  lower the maximum UDP packet size to 1300 (a
	    good first try for solving MTU-related connection problems) with the
	    following options:

	       --tun-mtu 1500 --fragment 1300 --mssfix

	    If the max-packet-size size option is used in the  configuration  it
	    will  also act as if mssfix size mtu was specified in the configura-
	    tion.

     --mtu-disc type
	    Should we do Path MTU discovery on TCP/UDP channel?  Only  supported
	    on	OSes  such  as	Linux that supports the necessary system call to
	    set.

	    Valid types:

	    no	    Never send DF (Don't Fragment) frames

	    maybe   Use per-route hints

	    yes     Always DF (Don't Fragment)

     --mtu-test
	    To empirically measure MTU on connection startup, add the --mtu-test
	    option to your configuration. OpenVPN will send ping packets of var-
	    ious sizes to the remote peer and measure the largest packets  which
	    were  successfully	received.  The --mtu-test process normally takes
	    about 3 minutes to complete.

     --nobind
	    Do not bind to local address and port. The IP stack will allocate  a
	    dynamic  port  for returning packets. Since the value of the dynamic
	    port could not be known in advance by a peer, this	option	is  only
	    suitable for peers which will be initiating connections by using the
	    --remote option.

     --passtos
	    Set the TOS field of the tunnel packet to what the payload's TOS is.

     --ping n
	    Ping remote over the TCP/UDP control channel if no packets have been
	    sent  for  at least n seconds (specify --ping on both peers to cause
	    ping packets to be sent in both directions since OpenVPN ping  pack-
	    ets are not echoed like IP ping packets).

	    This option has two intended uses:

	    1. Compatibility with stateful firewalls. The periodic ping will en-
	       sure that a stateful firewall rule which allows OpenVPN UDP pack-
	       ets to pass will not time out.

	    2. To  provide  a  basis for the remote to test the existence of its
	       peer using the --ping-exit option.

	    When using OpenVPN in server mode see also --keepalive.

     --ping-exit n
	    Causes OpenVPN to exit after n seconds pass without reception  of  a
	    ping  or  other packet from remote. This option can be combined with
	    --inactive, --ping and --ping-exit to create a two-tiered inactivity
	    disconnect.

	    For example,

	       openvpn [options...] --inactive 3600 --ping 10 --ping-exit 60

	    when used on both peers will cause OpenVPN to exit within 60 seconds
	    if its peer disconnects, but will exit after one hour if  no  actual
	    tunnel data is exchanged.

     --ping-restart n
	    Similar  to  --ping-exit, but trigger a SIGUSR1 restart after n sec-
	    onds pass without reception of a ping or other packet from remote.

	    This option is useful in cases where the remote peer has  a  dynamic
	    IP	address  and  a low-TTL DNS name is used to track the IP address
	    using a service such as  <https://www.nsupdate.info/>  +  a  dynamic
	    DNS client such as ddclient.

	    If	the peer cannot be reached, a restart will be triggered, causing
	    the hostname used with --remote to be re-resolved (if --resolv-retry
	    is also specified).

	    In server mode, --ping-restart, --inactive or any other type of  in-
	    ternally  generated  signal  will  always  be  applied to individual
	    client instance objects, never to whole server itself. Note also  in
	    server  mode  that	any internally generated signal which would nor-
	    mally cause a restart, will cause the deletion  of	the  client  in-
	    stance object instead.

	    In	client	mode, the --ping-restart parameter is set to 120 seconds
	    by default. This default will hold until the client pulls a replace-
	    ment value from the server, based on the --keepalive setting in  the
	    server  configuration.  To	disable  the  120  second  default,  set
	    --ping-restart 0 on the client.

	    See the signals section below for more information on SIGUSR1.

	    Note that the behavior of SIGUSR1 can  be  modified  by  the  --per-
	    sist-tun, --persist-local-ip and --persist-remote-ip options.

	    Also note that --ping-exit and --ping-restart are mutually exclusive
	    and cannot be used together.

     --ping-timer-rem
	    Run  the --ping-exit / --ping-restart timer only if we have a remote
	    address. Use this option if you are starting the  daemon  in  listen
	    mode (i.e. without an explicit --remote peer), and you don't want to
	    start clocking timeouts until a remote peer connects.

     --proto p
	    Use  protocol  p  for  communicating with remote host. p can be udp,
	    tcp-client, or tcp-server. You can also limit OpenVPN  to  use  only
	    IPv4  or only IPv6 by specifying p as udp4, tcp4-client, tcp4-server
	    or udp6, tcp6-client, tcp6-server, respectively.

	    The default protocol is udp when --proto is not specified.

	    For UDP operation, --proto udp should be specified on both peers.

	    For TCP operation, one peer must  use  --proto  tcp-server	and  the
	    other  must  use  --proto tcp-client. A peer started with tcp-server
	    will wait indefinitely for an incoming connection.	A  peer  started
	    with  tcp-client  will  attempt  to connect, and if that fails, will
	    sleep for 5 seconds (adjustable via the --connect-retry option)  and
	    try  again	infinite  or  up to N retries (adjustable via the --con-
	    nect-retry-max option). Both TCP client and server will  simulate  a
	    SIGUSR1 restart signal if either side resets the connection.

	    OpenVPN  is designed to operate optimally over UDP, but TCP capabil-
	    ity is provided for situations where UDP cannot be used. In compari-
	    son with UDP, TCP will usually be somewhat less efficient  and  less
	    robust when used over unreliable or congested networks.

	    This article outlines some of problems with tunneling IP over TCP:
	     <https://web.archive.org/web/20141025181658/http://sites.inka.de/sites/bi-
	    gred/devel/tcp-tcp.html>

	    There  are	certain  cases, however, where using TCP may be advanta-
	    geous from a security and robustness perspective, such as  tunneling
	    non-IP  or	application-level  UDP protocols, or tunneling protocols
	    which don't possess a built-in reliability layer.

     --port port
	    TCP/UDP port number or port name for both  local  and  remote  (sets
	    both --lport and --rport options to given port). The current default
	    of	1194  represents  the  official  IANA port number assignment for
	    OpenVPN and has been used since version  2.0-beta17.  Previous  ver-
	    sions used port 5000 as the default.

     --rport port
	    Set  TCP/UDP  port	number	or name used by the --remote option. The
	    port can also be set directly using the --remote option.

     --replay-window args
	    Modify the replay protection sliding-window size and time window.

	    Valid syntaxes:

	       replay-window n
	       replay-window n t

	    Use a replay protection sliding-window of size n and a  time  window
	    of t seconds.

	    By default n is 64 (the IPSec default) and t is 15 seconds.

	    This  option  is only relevant in UDP mode, i.e. when either --proto
	    udp is specified, or no --proto option is specified.

	    When OpenVPN tunnels IP packets over UDP, there is	the  possibility
	    that  packets  might  be  dropped or delivered out of order. Because
	    OpenVPN, like IPSec, is emulating the  physical  network  layer,  it
	    will  accept  an out-of-order packet sequence, and will deliver such
	    packets in the same order they were received to the TCP/IP	protocol
	    stack, provided they satisfy several constraints.

	    a. The packet cannot be a replay.

	    b. If a packet arrives out of order, it will only be accepted if the
	       difference  between  its sequence number and the highest sequence
	       number received so far is less than n.

	    c. If a packet arrives out of order, it will only be accepted if  it
	       arrives	no  later  than  t seconds after any packet containing a
	       higher sequence number.

	    If you are using a network link with a large pipeline (meaning  that
	    the product of bandwidth and latency is high), you may want to use a
	    larger  value  for	n.  Satellite  links in particular often require
	    this.

	    If you run OpenVPN at --verb 4, you will see  the  message	"PID_ERR
	    replay-window  backtrack  occurred	[x]"  every time the maximum se-
	    quence number backtrack seen thus far increases. This can be used to
	    calibrate n.

	    There is some controversy on  the  appropriate  method  of	handling
	    packet reordering at the security layer.

	    Namely,  to what extent should the security layer protect the encap-
	    sulated protocol from attacks which masquerade as the kinds of  nor-
	    mal packet loss and reordering that occur over IP networks?

	    The  IPSec and OpenVPN approach is to allow packet reordering within
	    a certain fixed sequence number window.

	    OpenVPN adds to the IPSec model by limiting the window size in  time
	    as well as sequence space.

	    OpenVPN  also adds TCP transport as an option (not offered by IPSec)
	    in which case OpenVPN can adopt a very strict attitude towards  mes-
	    sage  deletion  and reordering: Don't allow it. Since TCP guarantees
	    reliability, any packet loss or reordering event can be  assumed  to
	    be an attack.

	    In	this sense, it could be argued that TCP tunnel transport is pre-
	    ferred when tunneling non-IP  or  UDP  application	protocols  which
	    might be vulnerable to a message deletion or reordering attack which
	    falls within the normal operational parameters of IP networks.

	    So	I would make the statement that one should never tunnel a non-IP
	    protocol or UDP application protocol over UDP, if the protocol might
	    be vulnerable to a message deletion or reordering attack that  falls
	    within  the  normal  operating  parameters of what is to be expected
	    from the physical IP layer. The problem is easily  fixed  by  simply
	    using TCP as the VPN transport layer.

     --replay-persist file
	    Persist  replay-protection	state across sessions using file to save
	    and reload the state.

	    This option will keep a disk copy of the current  replay  protection
	    state (i.e. the most recent packet timestamp and sequence number re-
	    ceived  from  the  remote  peer),  so  that if an OpenVPN session is
	    stopped and restarted, it will reject any replays of  packets  which
	    were already received by the prior session.

	    This  option only makes sense when replay protection is enabled (the
	    default) and you are using TLS mode with --tls-auth.

     --session-timeout n
	    Raises SIGTERM for the client instance after n seconds since the be-
	    ginning of the session, forcing OpenVPN to	disconnect.   In  client
	    mode,  OpenVPN  will  disconnect  and exit, while in server mode all
	    client sessions are terminated.

	    This option can also be specified in a client instance  config  file
	    using   --client-config-dir   or   dynamically   generated	using  a
	    --client-connect script. In these cases,  only  the  related  client
	    session is terminated.

     --socket-flags flags
	    Apply  the	given  flags to the OpenVPN transport socket. Currently,
	    only TCP_NODELAY is supported.

	    The TCP_NODELAY socket flag is useful in TCP mode,	and  causes  the
	    kernel  to	send  tunnel packets immediately over the TCP connection
	    without trying to  group  several  smaller	packets  into  a  larger
	    packet.  This can result in a considerably improvement in latency.

	    This option is pushable from server to client, and should be used on
	    both client and server for maximum effect.

     --tcp-nodelay
	    This macro sets the TCP_NODELAY socket flag on the server as well as
	    pushes  it	to connecting clients. The TCP_NODELAY flag disables the
	    Nagle algorithm on TCP sockets causing packets to be transmitted im-
	    mediately with low latency, rather than waiting a  short  period  of
	    time  in order to aggregate several packets into a larger containing
	    packet.  In VPN applications over TCP, TCP_NODELAY	is  generally  a
	    good latency optimization.

	    The macro expands as follows:

	       if mode server:
		   socket-flags TCP_NODELAY
		   push "socket-flags TCP_NODELAY"

     --max-packet-size size
	    This  option  will	instruct  OpenVPN  to  try  to limit the maximum
	    on-write packet size by restricting the control channel packet  size
	    and setting --mssfix.

	    OpenVPN  will  try	to  keep its control channel messages below this
	    size but due to some constraints in the protocol this is not  always
	    possible.  If the option is not set, the control packet maximum size
	    defaults to 1250.  The control  channel  packet  size  will  be  re-
	    stricted to values between 154 and 2048. The maximum packet size in-
	    cludes encapsulation overhead like UDP and IP.

	    In terms of --mssfix it will expand to:

	       mssfix size mtu

	    If	you  need  to  set --mssfix for data channel and control channel
	    maximum packet size independently, use --max-packet-size first, fol-
	    lowed by a --mssfix in the configuration.

	    In general the default size of 1250 should work  almost  universally
	    apart  from  specific corner cases, especially since IPv6 requires a
	    MTU of 1280 or larger.

   Virtual Network Adapter (VPN interface)
     Options in this section relates to configuration  of  the	virtual  tun/tap
     network  interface,  including setting the VPN IP address and network rout-
     ing.

     --bind-dev device
	    (Linux only) Set device to bind the server socket to a Virtual Rout-
	    ing and Forwarding device

     --block-ipv6
	    On the client, instead of sending IPv6 packets over the VPN  tunnel,
	    all  IPv6 packets are answered with an ICMPv6 no route host message.
	    On the server, all IPv6 packets from clients are  answered	with  an
	    ICMPv6  no route to host message. This options is intended for cases
	    when IPv6 should be blocked and other  options  are  not  available.
	    --block-ipv6  will	use  the  remote  IPv6	as source address of the
	    ICMPv6 packets if set, otherwise will use fe80::7 as source address.

	    For this option to make sense you actually have to route traffic  to
	    the tun interface. The following example config block would send all
	    IPv6  traffic  to  OpenVPN	and answer all requests with no route to
	    host, effectively blocking IPv6  (to  avoid  IPv6  connections  from
	    dual-stacked clients leaking around IPv4-only VPN services).

	    Client config

		      --ifconfig-ipv6 fd15:53b6:dead::2/64 fd15:53b6:dead::1
		      --redirect-gateway ipv6
		      --block-ipv6

	    Server config
		   Push  a  "valid"  ipv6  config to the client and block on the
		   server

		      --push "ifconfig-ipv6 fd15:53b6:dead::2/64 fd15:53b6:dead::1"
		      --push "redirect-gateway ipv6"
		      --block-ipv6

	    Note: this option does not influence traffic sent  from  the  server
	    towards  the  client (neither on the server nor on the client side).
	    This is not seen as necessary, as such traffic can	be  most  easily
	    avoided  by  not configuring IPv6 on the server tun, or setting up a
	    server-side firewall rule.

     --dev device
	    TUN/TAP virtual network device which can be tunX, tapX, null  or  an
	    arbitrary name string (X can be omitted for a dynamic device.)

	    See  examples  section  below for an example on setting up a TUN de-
	    vice.

	    You must use either tun devices on both ends of  the  connection  or
	    tap  devices  on  both  ends. You cannot mix them, as they represent
	    different underlying network layers:

	    tun    devices encapsulate IPv4 or IPv6 (OSI Layer 3)

	    tap    devices encapsulate Ethernet 802.3 (OSI Layer 2).

	    Valid syntaxes:

	       dev tun2
	       dev tap4
	       dev ovpn

	    What happens if the device name is not tun or tap is platform depen-
	    dent.

	    On most platforms, tunN (e.g. tun2, tun30) and tapN (e.g. tap3) will
	    create a numbered tun/tap interface with the number specified - this
	    is useful if multiple OpenVPN instances  are  active,  and	the  in-
	    stance-to-device  mapping  needs to be known.  Some platforms do not
	    support "numbered tap", so trying --dev tap3 will fail.

	    Arbitrary device names (e.g.  --dev  tun-home)  will  only	work  on
	    FreeBSD  (with the DCO kernel driver for tun devices) and Linux (for
	    both tun and tap devices, DCO and tun/tap driver).

	    If such a device name starts with tun or tap (e.g. tun-home),  Open-
	    VPN  will choose the right device type automatically.  Otherwise the
	    desired device type needs to be specified  with  --dev-type  tun  or
	    --dev-type tap.

	    On	Windows,  only	the  names tun and tap are supported.  Selection
	    among multiple installed drivers or driver instances  is  done  with
	    --dev-node.

     --dev-node node
	    This is a highly system dependent option to influence tun/tap driver
	    selection.

	    On Linux, tun/tap devices are created by accessing /dev/net/tun, and
	    this device name can be changed using --dev-node ....

	    Under  Mac	OS  X this option can be used to specify the default tun
	    implementation. Using --dev-node utun forces  usage  of  the  native
	    Darwin tun kernel support. Use --dev-node utunN to select a specific
	    utun   instance.   To  force  using  the  tun.kext	(/dev/tunX)  use
	    --dev-node tun. When not specifying a --dev-node option openvpn will
	    first try to open utun, and fall back to tun.kext.

	    On Windows systems, select the TAP-Win32 adapter which is named node
	    in the Network Connections Control Panel or  the  raw  GUID  of  the
	    adapter enclosed by braces. The --show-adapters option under Windows
	    can  also  be used to enumerate all available TAP-Win32 adapters and
	    will show both the network connections control panel  name	and  the
	    GUID for each TAP-Win32 adapter.

	    On other platforms, --dev-node node will influence the naming of the
	    created  tun/tap  device, if supported on that platform.  If OpenVPN
	    cannot figure out whether node is a TUN or TAP device based  on  the
	    name, you should also specify --dev-type tun or --dev-type tap.

	    If	node starts with the string unix: openvpn will treat the rest of
	    the argument as a program.	OpenVPN will start the program and  cre-
	    ate  a  temporary unix domain socket that will be passed to the pro-
	    gram together with the tun configuration as  environment  variables.
	    The  temporary unix domain socket  will be be passed in the environ-
	    ment variable TUNTAP_SOCKET_FD.

	    This unix: mode is designed mainly to use with the lwipovpn  network
	    emulator ( <https://github.com/OpenVPN/lwipovpn> ).

     --dev-type device-type
	    Which device type are we using? device-type should be tun (OSI Layer
	    3)	or tap (OSI Layer 2). Use this option only if the TUN/TAP device
	    used with --dev does not begin with tun or tap.

     --dhcp-option args
	    Set additional network parameters on  supported  platforms.  May  be
	    specified  on the client or pushed from the server. On Windows these
	    options are handled by the tap-windows6 driver  by	default  or  di-
	    rectly  by	OpenVPN  if  dhcp  is  disabled. The OpenVPN for Android
	    client also handles them internally.

	    On all other platforms these options are only saved in the	client's
	    environment under the name foreign_option_{n} before the --up script
	    is	called.  A  plugin or an --up script must be used to pick up and
	    interpret these as required. Many Linux distributions  include  such
	    scripts  and  some	third-party  user interfaces such as tunnelblick
	    also come with scripts that process these options.

	    Valid syntax:

	       dhcp-option type [parm]

	    DOMAIN name
		   Set Connection-specific DNS Suffix to name.

	    ADAPTER_DOMAIN_SUFFIX name
		   Alias to DOMAIN. This is a compatibility  option,  it  should
		   not be used in new deployments.

	    DOMAIN-SEARCH name
		   Add	name  to  the domain search list.  Repeat this option to
		   add more entries. Up to 10 domains are supported.

	    DNS address
		   Set primary domain name server IPv4 or IPv6 address.   Repeat
		   this option to set secondary DNS server addresses.

		   Note: DNS IPv6 servers are currently set using netsh (the ex-
		   isting  DHCP  code  can  only do IPv4 DHCP, and that protocol
		   only permits IPv4 addresses anywhere). The option will be put
		   into the environment, so an --up script could act upon it  if
		   needed.

	    WINS address
		   Set	primary  WINS  server  address (NetBIOS over TCP/IP Name
		   Server).  Repeat this option to set secondary WINS server ad-
		   dresses.

	    NBDD address
		   Set primary NBDD server address (NetBIOS over TCP/IP Datagram
		   Distribution Server). Repeat this  option  to  set  secondary
		   NBDD server addresses.

	    NTP address
		   Set	primary NTP server address (Network Time Protocol).  Re-
		   peat this option to set secondary NTP server addresses.

	    NBT type
		   Set NetBIOS over TCP/IP Node type. Possible options:

		   1	  b-node (broadcasts)

		   2	  p-node (point-to-point name queries to a WINS server)

		   4	  m-node (broadcast then query name server)

		   8	  h-node (query name server, then broadcast).

	    NBS scope-id
		   Set NetBIOS over TCP/IP Scope. A NetBIOS Scope ID provides an
		   extended naming service for the NetBIOS over TCP/IP (Known as
		   NBT) module. The primary purpose of a NetBIOS scope ID is  to
		   isolate  NetBIOS  traffic  on  a single network to only those
		   nodes with the same NetBIOS scope ID. The NetBIOS scope ID is
		   a character string that is appended to the NetBIOS name.  The
		   NetBIOS  scope  ID  on two hosts must match, or the two hosts
		   will not be able to communicate.  The NetBIOS Scope	ID  also
		   allows  computers to use the same computer name, as they have
		   different scope IDs. The Scope ID becomes a part of the  Net-
		   BIOS  name, making the name unique. (This description of Net-
		   BIOS scopes courtesy of  <NeonSurge@abyss.com> )

	    DISABLE-NBT
		   Disable Netbios-over-TCP/IP.

	    code   PROXY_HTTP host port Sets a HTTP proxy that	should	be  used
		   when connected to the VPN.

		   This  option  currently only works on OpenVPN for Android and
		   requires Android 10 or later.

     --ifconfig args
	    Set TUN/TAP adapter parameters. It requires the IP	address  of  the
	    local VPN endpoint. For TUN devices in point-to-point mode, the next
	    argument  must be the VPN IP address of the remote VPN endpoint. For
	    TAP devices, or TUN devices used with --topology subnet, the  second
	    argument  is the subnet mask of the virtual network segment which is
	    being created or connected to.

	    For TUN devices, which facilitate virtual point-to-point IP  connec-
	    tions  (when used in --topology net30 or p2p mode), the proper usage
	    of --ifconfig is to use two private IP addresses  which  are  not  a
	    member  of any existing subnet which is in use. The IP addresses may
	    be consecutive and should have their order reversed  on  the  remote
	    peer.   After  the	VPN  is  established, by pinging rn, you will be
	    pinging across the VPN.

	    For TAP devices, which provide the ability to create virtual  ether-
	    net segments, or TUN devices in --topology subnet mode (which create
	    virtual  "multipoint networks"), --ifconfig is used to set an IP ad-
	    dress and subnet mask just as a physical ethernet adapter  would  be
	    similarly  configured.  If you are attempting to connect to a remote
	    ethernet bridge, the IP address and subnet should be set  to  values
	    which would be valid on the bridged ethernet segment (note also that
	    DHCP can be used for the same purpose).

	    This option, while primarily a proxy for the ifconfig(8) command, is
	    designed  to  simplify  TUN/TAP  tunnel configuration by providing a
	    standard interface to the different ifconfig implementations on dif-
	    ferent platforms.

	    --ifconfig parameters which are IP addresses can also  be  specified
	    as a DNS or /etc/hosts file resolvable name.

	    For  TAP devices, --ifconfig should not be used if the TAP interface
	    will be getting an IP address lease from a DHCP server.

	    Examples:

	       # tun device in net30/p2p mode
	       ifconfig 10.8.0.2 10.8.0.1

	       # tun/tap device in subnet mode
	       ifconfig 10.8.0.2 255.255.255.0

     --ifconfig-ipv6 args
	    Configure an IPv6 address on the tun device.

	    Valid syntax:

	       ifconfig-ipv6 ipv6addr/bits [ipv6remote]

	    The ipv6addr/bits argument is the IPv6 address to  use.  The  second
	    parameter  is used as route target for --route-ipv6 if no gateway is
	    specified.

	    The --topology option has no influence with --ifconfig-ipv6

     --ifconfig-noexec
	    Don't actually execute ifconfig/netsh commands, instead  pass  --if-
	    config parameters to scripts using environmental variables.

     --ifconfig-nowarn
	    Don't  output an options consistency check warning if the --ifconfig
	    option on this side of the connection doesn't match the remote side.
	    This is useful when you want to retain the overall benefits  of  the
	    options consistency check (also see --disable-occ option) while only
	    disabling the ifconfig component of the check.

	    For  example,  if you have a configuration where the local host uses
	    --ifconfig but the remote host does not,  use  --ifconfig-nowarn  on
	    the local host.

	    This  option will also silence warnings about potential address con-
	    flicts which occasionally annoy more experienced users by triggering
	    "false positive" warnings.

     --lladdr address
	    Specify the link layer address, more commonly known as the	MAC  ad-
	    dress.  Only applied to TAP devices.

     --persist-tun
	    Don't  close and reopen TUN/TAP device or run up/down scripts across
	    SIGUSR1 or --ping-restart restarts.

	    SIGUSR1 is a restart signal similar  to  SIGHUP,  but  which  offers
	    finer-grained control over reset options.

	    On	Linux, this option can be useful when OpenVPN is not executed as
	    root and the CAP_NET_ADMIN has not been granted, because the process
	    would otherwise not be allowed to bring the interface down and  back
	    up.

	    Alongside the above, using --persist-tun allows the tunnel interface
	    to retain all IP/route settings, thus allowing the user to implement
	    any  advanced  traffic leaking protection (please note that for full
	    protection, extra route/firewall rules must be in place).

     --redirect-gateway flags
	    Automatically execute routing commands  to	cause  all  outgoing  IP
	    traffic to be redirected over the VPN. This is a client-side option.

	    This option performs three steps:

	    1. Create  a static route for the --remote address which forwards to
	       the pre-existing default gateway. This is done so that  (3)  will
	       not create a routing loop.

	    2. Delete the default gateway route.

	    3. Set  the  new default gateway to be the VPN endpoint address (de-
	       rived either from --route-gateway  or  the  second  parameter  to
	       --ifconfig when --dev tun is specified).

	    When the tunnel is torn down, all of the above steps are reversed so
	    that the original default route is restored.

	    Option flags:

	    local  Add	the  local  flag if both OpenVPN peers are directly con-
		   nected via a common subnet, such as with wireless. The  local
		   flag will cause step (1) above to be omitted.

	    autolocal
		   Try	to  automatically determine whether to enable local flag
		   above.

	    def1   Use this flag  to  override	the  default  gateway  by  using
		   0.0.0.0/1 and 128.0.0.0/1 rather than 0.0.0.0/0. This has the
		   benefit of overriding but not wiping out the original default
		   gateway.

	    bypass-dhcp
		   Add	a  direct  route to the DHCP server (if it is non-local)
		   which bypasses the tunnel (Available on Windows clients,  may
		   not be available on non-Windows clients).

	    bypass-dns
		   Add	a direct route to the DNS server(s) (if they are non-lo-
		   cal) which bypasses the tunnel (Available on Windows clients,
		   may not be available on non-Windows clients).

	    block-local
		   Block access to local LAN when the tunnel is  active,  except
		   for	the  LAN gateway itself. This is accomplished by routing
		   the local LAN (except for the LAN gateway address)  into  the
		   tunnel.   On Windows WFP filters are added in addition to the
		   routes which block access to resources not routed through the
		   VPN adapter.  Push this flag to protect  against  TunnelCrack
		   type   of   attacks	 (see:	  <https://tunnelcrack.mathyvan-
		   hoef.com/> ).

	    ipv6   Redirect IPv6 routing into the tunnel. This works similar  to
		   the	def1  flag, that is, more specific IPv6 routes are added
		   (2000::/4, 3000::/4), covering the whole IPv6 unicast space.

	    !ipv4  Do not redirect IPv4 traffic - typically  used  in  the  flag
		   pair ipv6 !ipv4 to redirect IPv6-only.

     --redirect-private flags
	    Like  --redirect-gateway,  but  omit  actually  changing the default
	    gateway.  Useful when pushing private subnets.

     --route-table id
	    Specify a default table id for use with --route.  By default,  Open-
	    VPN  installs routes in the main routing table of the operating sys-
	    tem, but with this option, a user defined routing table can be  used
	    instead.

	    (Supported on Linux only, on other platforms this is a no-op).

     --route args
	    Add route to routing table after connection is established. Multiple
	    routes  can  be specified. Routes will be automatically torn down in
	    reverse order prior to TUN/TAP device close.

	    Valid syntaxes:

	       route network/IP
	       route network/IP netmask
	       route network/IP netmask gateway
	       route network/IP netmask gateway metric

	    This option is intended as a  convenience  proxy  for  the	route(8)
	    shell  command,  while at the same time providing portable semantics
	    across OpenVPN's platform space.

	    netmask
		   defaults to 255.255.255.255 when not given

	    gateway
		   default taken from --route-gateway or the second parameter to
		   --ifconfig when --dev tun is specified.

	    metric
		   default taken from --route-metric if set, otherwise 0.

	    The default can be specified by leaving an option blank  or  setting
	    it to default.

	    The network and gateway parameters can also be specified as a DNS or
	    /etc/hosts	file  resolvable  name,  or as one of three special key-
	    words:

	    vpn_gateway
		   The	remote	VPN  endpoint  address	(derived   either   from
		   --route-gateway  or	the  second parameter to --ifconfig when
		   --dev tun is specified).

	    net_gateway
		   The pre-existing IP default gateway, read  from  the  routing
		   table (not supported on all OSes).

	    remote_host
		   The	--remote address if OpenVPN is being run in client mode,
		   and is undefined in server mode.

     --route-delay args
	    Valid syntaxes:

	       route-delay
	       route-delay n
	       route-delay n w

	    Delay n seconds (default 0) after connection  establishment,  before
	    adding routes. If n is 0, routes will be added immediately upon con-
	    nection  establishment.  If --route-delay is omitted, routes will be
	    added immediately after TUN/TAP device open and --up  script  execu-
	    tion,  before any --user or --group privilege downgrade (or --chroot
	    execution.)

	    This option is designed to be useful in scenarios where DHCP is used
	    to set tap adapter addresses. The delay will give the DHCP handshake
	    time to complete before routes are added.

	    On Windows, --route-delay tries to be more intelligent by waiting  w
	    seconds  (default  30)  for  the TAP-Win32 adapter to come up before
	    adding routes.

     --route-ipv6 args
	    Setup IPv6 routing in the system to send the specified IPv6  network
	    into OpenVPN's tun.

	    Valid syntaxes:

	       route-ipv6 ipv6addr/bits
	       route-ipv6 ipv6addr/bits gateway
	       route-ipv6 ipv6addr/bits gateway metric

	    gateway
		   Only used for IPv6 routes across tap devices, and if missing,
		   the	   ipv6remote	  field    from    --ifconfig-ipv6    or
		   --route-ipv6-gateway is used.

	    metric
		   default taken from --route-metric if set, otherwise 0.

     --route-gateway arg
	    Specify a default gateway for use with --route.

	    If dhcp is specified as the parameter, the gateway address	will  be
	    extracted from a DHCP negotiation with the OpenVPN server-side LAN.

	    Valid syntaxes:

	       route-gateway gateway
	       route-gateway dhcp

     --route-ipv6-gateway gw
	    Specify a default gateway gw for use with --route-ipv6.

     --route-metric m
	    Specify a default metric m for use with --route.

     --route-noexec
	    Don't  add	or  remove  routes automatically. Instead pass routes to
	    --route-up script using environmental variables.

     --route-nopull
	    When used with --client or --pull, accept options pushed  by  server
	    EXCEPT  for  routes,  block-outside-dns  and  dhcp	options like DNS
	    servers.

	    When used on the client, this option  effectively  bars  the  server
	    from  adding routes to the client's routing table, however note that
	    this option still allows the server to set the TCP/IP properties  of
	    the client's TUN/TAP interface.

     --topology mode
	    Configure  virtual	addressing  topology  when  running in --dev tun
	    mode. This directive has no meaning in --dev tap mode, which  always
	    uses a subnet topology.

	    If	 you  set  this  directive  on	the  server,  the  --server  and
	    --server-bridge  directives  will  automatically  push  your  chosen
	    topology setting to clients as well. This directive can also be man-
	    ually  pushed  to  clients. Like the --dev directive, this directive
	    must always be compatible between client and server.

	    mode can be one of:

	    subnet
		   Use a subnet rather than a point-to-point topology by config-
		   uring the tun interface with a local IP  address  and  subnet
		   mask,  similar to the topology used in --dev tap and ethernet
		   bridging mode. This mode allocates a single	IP  address  per
		   connecting  client  and works on Windows as well. This is the
		   default.

	    net30  Use a point-to-point topology, by allocating one  /30  subnet
		   per	client.  This is designed to allow point-to-point seman-
		   tics when some or all of the connecting clients might be Win-
		   dows systems.

	    p2p    Use a point-to-point topology where the  remote  endpoint  of
		   the	client's  tun  interface always points to the local end-
		   point of the server's tun interface. This  mode  allocates  a
		   single  IP  address per connecting client. Only use when none
		   of the connecting clients are Windows systems.

	    Note: Using --topology subnet changes the interpretation of the  ar-
	    guments  of --ifconfig to mean "address netmask", and not "local re-
	    mote".

     --tun-mtu args
	    Valid syntaxes:

	       tun-mtu tun-mtu
	       tun-mtu tun-mtu occ-mtu

	    Take the TUN device MTU to be tun-mtu and derive the link  MTU  from
	    it.   In  most cases, you will probably want to leave this parameter
	    set to its default value.

	    The default for tun-mtu is 1500.

	    The OCC MTU can be used to avoid warnings about mismatched MTU  from
	    clients.  If  occ-mtu  is  not  specified, it will to default to the
	    tun-mtu.

	    The MTU (Maximum Transmission Units) is the maximum datagram size in
	    bytes that can be sent unfragmented over a particular network  path.
	    OpenVPN  requires  that  packets on the control and data channels be
	    sent unfragmented.

	    MTU problems often manifest themselves  as	connections  which  hang
	    during periods of active usage.

	    It's best to use the --fragment and/or --mssfix options to deal with
	    MTU sizing issues.

	    Note:  Depending on the platform, the operating system allows one to
	    receive packets larger than tun-mtu (e.g.  Linux  and  FreeBSD)  but
	    other platforms (like macOS) limit received packets to the same size
	    as the MTU.

     --tun-mtu-max maxmtu
	    This  configures  the  maximum  MTU  size  that a server can push to
	    maxmtu, by configuring the internal buffers to allow at  least  this
	    packet  size.   The  default for maxmtu is 1600. Currently, only in-
	    creasing beyond 1600 is possible, and attempting to  reduce  max-mtu
	    below 1600 will be ignored.

     --tun-mtu-extra n
	    Assume  that the TUN/TAP device might return as many as n bytes more
	    than the --tun-mtu size on read. This parameter defaults to 0, which
	    is sufficient for most TUN devices. TAP devices may introduce  addi-
	    tional  overhead  in  excess of the MTU size, and a setting of 32 is
	    the default when TAP devices are used. This parameter only	controls
	    internal OpenVPN buffer sizing, so there is no transmission overhead
	    associated with using a larger value.

   TUN/TAP standalone operations
     These  two  standalone  operations will require --dev and optionally --user
     and/or --group.

     --mktun
	    (Standalone) Create a persistent tunnel on platforms  which  support
	    them  such as Linux. Normally TUN/TAP tunnels exist only for the pe-
	    riod of time that an application has them open.  This  option  takes
	    advantage  of  the TUN/TAP driver's ability to build persistent tun-
	    nels that live through multiple instantiations of  OpenVPN	and  die
	    only when they are deleted or the machine is rebooted.

	    One  of  the advantages of persistent tunnels is that they eliminate
	    the need for separate --up and --down scripts to run the appropriate
	    ifconfig(8) and route(8) commands. These commands can be  placed  in
	    the same shell script which starts or terminates an OpenVPN session.

	    Another advantage is that open connections through the TUN/TAP-based
	    tunnel  will  not be reset if the OpenVPN peer restarts. This can be
	    useful to provide uninterrupted connectivity through the  tunnel  in
	    the  event	of a DHCP reset of the peer's public IP address (see the
	    --ipchange option above).

	    One disadvantage of persistent tunnels is that it is harder to auto-
	    matically configure their MTU value (see  --link-mtu  and  --tun-mtu
	    above).

	    On	some platforms such as Windows, TAP-Win32 tunnels are persistent
	    by default.

     --rmtun
	    (Standalone) Remove a persistent tunnel.

   Virtual Routing and Forwarding
     Options in this section relates to configuration  of  virtual  routing  and
     forwarding in combination with the underlying operating system.

     As  of  today  this  is  only supported on Linux, a kernel >= 4.9 is recom-
     mended.

     This could come in handy when for example the external  network  should  be
     only used as a means to connect to some VPN endpoints and all regular traf-
     fic should only be routed through any tunnel(s).  This could be achieved by
     setting  up  a  VRF and configuring the interface connected to the external
     network to be part of the VRF. The examples below will cover this setup.

     Another option would be to put the tun/tap interface into a VRF. This could
     be done by an up-script which uses the ip link set command shown below.

   VRF setup with iproute2
     Create VRF vrf_external and map it to routing table 1023

	ip link add vrf_external type vrf table 1023

     Move eth0 into vrf_external

	ip link set master vrf_external dev eth0

     Any prefixes configured on eth0 will be moved from the :code`main`  routing
     table into routing table 1023

   VRF setup with ifupdown
     For  Debian  based  Distributions	ifupdown2 provides an almost drop-in re-
     placement for ifupdown including VRFs and other features.	A  configuration
     for  an  interface eth0 being part of VRF code:vrf_external could look like
     this:

	auto eth0
	iface eth0
	    address 192.0.2.42/24
	    address 2001:db8:08:15::42/64
	    gateway 192.0.2.1
	    gateway 2001:db8:08:15::1
	    vrf vrf_external

	auto vrf_external
	iface vrf_external
	    vrf-table 1023

   OpenVPN configuration
     The OpenVPN configuration needs to contain this line:

	bind-dev vrf_external

   Further reading
     Wikipedia has  nice  page	one  VRFs:   <https://en.wikipedia.org/wiki/Vir-
     tual_routing_and_forwarding>

     This talk from the Network Track of FrOSCon 2018 provides an overview about
     advanced layer 2 and layer 3 features of Linux

	* Slides:	  <https://www.slideshare.net/BarbarossaTM/l2l3-fr-fort-
	  geschrittene-helle-und-dunkle-magie-im-linuxnetzwerkstack>

	* Video 		    (german):			    <https://me-
	  dia.ccc.de/v/froscon2018-2247-l2_l3_fur_fortgeschrit-
	  tene_-_helle_und_dunkle_magie_im_linux-netzwerkstack>

SCRIPTING INTEGRATION
     OpenVPN  can  execute external scripts in various phases of the lifetime of
     the OpenVPN process.

   Script Order of Execution
     1.  --dns-updown

	 Executed after TCP/UDP socket bind and TUN/TAP open, before --up.

     2.  --up

	 Executed after TCP/UDP socket bind and TUN/TAP  open,	after  --dns-up-
	 down.

     3.  --tls-verify

	 Executed when we have a still untrusted remote peer.

     4.  --ipchange

	 Executed after connection authentication, or remote IP address change.

     5.  --client-connect

	 Executed in --mode server mode immediately after client authentication.

     6.  --route-up

	 Executed  after connection authentication, either immediately after, or
	 some number of seconds after as defined by the --route-delay option.

     7.  --route-pre-down

	 Executed right before the routes are removed.

     8.  --client-disconnect

	 Executed in --mode server mode on client instance shutdown.

     9.  --dns-updown

	 Executed before TCP/UDP and TUN/TAP close, before --down.

     10. --down

	 Executed after TCP/UDP and TUN/TAP close, after --dns-updown.

     11. --learn-address

	 Executed in --mode server mode whenever an IPv4  address/route  or  MAC
	 address is added to OpenVPN's internal routing table.

     12. --auth-user-pass-verify

	 Executed  in  --mode  server  mode  on new client connections, when the
	 client is still untrusted.

     13. --client-crresponse
	    Execute in --mode server whenever a client sends a CR_RESPONSE  mes-
	    sage

   SCRIPT HOOKS
     --auth-user-pass-verify args
	    Require the client to provide a username/password (possibly in addi-
	    tion to a client certificate) for authentication.

	    Valid syntax:

	       auth-user-pass-verify cmd method

	    OpenVPN  will run command cmd to validate the username/password pro-
	    vided by the client.

	    cmd consists of a path to a script (or executable program),  option-
	    ally followed by arguments. The path and arguments may be single- or
	    double-quoted  and/or escaped using a backslash, and should be sepa-
	    rated by one or more spaces.

	    If method is set to via-env, OpenVPN will call cmd with the environ-
	    mental variables username and password set to the  username/password
	    strings  provided by the client. Beware that this method is insecure
	    on some platforms which make the environment of a  process	publicly
	    visible to other unprivileged processes.

	    If	method	is  set to via-file, OpenVPN will write the username and
	    password to the first two lines of a temporary  file.  The	filename
	    will be passed as an argument to cmd, and the file will be automati-
	    cally  deleted  by OpenVPN after the script returns. The location of
	    the temporary file is controlled by the --tmp-dir option. For  secu-
	    rity,  consider  setting  it  to  a  volatile storage medium such as
	    /dev/shm (if available) to prevent the username/password  file  from
	    touching the hard drive.

	    The  script  should  examine  the username and password, returning a
	    success exit code (0) if the client's authentication request  is  to
	    be	accepted, a failure code (1) to reject the client, or a that the
	    authentication is deferred (2). If the authentication  is  deferred,
	    the  script must fork/start a background or another non-blocking op-
	    eration to continue the authentication in the background. When  fin-
	    shing the authentication, a 1 or 0 must be written to the file spec-
	    ified by the auth_control_file.

	    If	the  file  specified  by  auth_failed_reason_file exists and has
	    non-empty content,	the  content  of  this	file  will  be	used  as
	    AUTH_FAILED  message.  To avoid race conditions, this file should be
	    written before auth_control_file.

	    This auth fail reason can be something simple like	"User  has  been
	    permanently  disabled"  but  there are also some special auth failed
	    messages.

	    The TEMP  message  indicates  that	the  authentication  temporarily
	    failed and that the client should continue to retry to connect.  The
	    server  can  optionally  give  a  user readable message and hint the
	    client  a  behavior  how   to   proceed.   The   keywords	of   the
	    AUTH_FAILED,TEMP message are comma separated keys/values and provide
	    a hint to the client how to proceed. Currently defined keywords are:

	    backoff s
		   instructs  the  client  to wait at least s seconds before the
		   next connection attempt. If the client already uses a  higher
		   delay  for reconnection attempt, the delay will not be short-
		   ened.

	    advance addr
		   Instructs the client to reconnect to the next (IP) address of
		   the current server.

	    advance remote
		   Instructs the client to skip the remaining  IP  addresses  of
		   the	current  server  and  instead connect to the next server
		   specified in the configuration file.

	    advance no
		   Instructs the client to retry connecting to the  same  server
		   again.

	    For example, the message TEMP[backoff 42,advance no]: No free IP ad-
	    dresses  indicates that the VPN connection can currently not succeed
	    and instructs the client to retry in 42 seconds again.

	    When deferred authentication is in use, the script can also  request
	    pending  authentication  by  writing  to  the  file specified by the
	    auth_pending_file. The first line must be the  timeout  in	seconds,
	    the  required method on the second line (e.g. crtext) and third line
	    must be the EXTRA as documented in the  client-pending-auth  section
	    of doc/management.txt.

	    This  directive  is  designed to enable a plugin-style interface for
	    extending OpenVPN's authentication capabilities.

	    To protect against a client passing a maliciously formed username or
	    password string, the username string  must	consist  only  of  these
	    characters:  alphanumeric, underbar ('_'), dash ('-'), dot ('.'), or
	    at ('@'). The password string can consist of any  printable  charac-
	    ters except for CR or LF. Any illegal characters in either the user-
	    name or password string will be converted to underbar ('_').

	    Care  must	be taken by any user-defined scripts to avoid creating a
	    security vulnerability in the way that these  strings  are	handled.
	    Never  use these strings in such a way that they might be escaped or
	    evaluated by a shell interpreter.

	    For a sample script  that  performs  PAM  authentication,  see  sam-
	    ple-scripts/auth-pam.pl in the OpenVPN source distribution.

     --client-crresponse
	       Executed when the client sends a text based challenge response.

	       Valid syntax:

		   client-crresponse cmd

	    OpenVPN will write the response of the client into a temporary file.
	    The filename will be passed as an argument to cmd, and the file will
	    automatically deleted by OpenVPN after the script returns.

	    The  response  is  passed as is from the client. The script needs to
	    check itself if the input is valid,  e.g.  if  the	input  is  valid
	    base64 encoding.

	    The  script can either directly write the result of the verification
	    to auth_control_file or further defer it. See `--auth-user-pass-ver-
	    ify`` for details.

	    For a sample script that implement TOTP (RFC 6238) based  two-factor
	    authentication, see sample-scripts/totpauth.py.

     --client-connect cmd
	    Run command cmd on client connection.

	    cmd  consists of a path to a script (or executable program), option-
	    ally followed by arguments. The path and arguments may be single- or
	    double-quoted and/or escaped using a backslash, and should be  sepa-
	    rated by one or more spaces.

	    The command is passed the common name and IP address of the just-au-
	    thenticated  client  as  environmental  variables (see environmental
	    variable section below). The command is also passed the pathname  of
	    a freshly created temporary file as the last argument (after any ar-
	    guments specified in cmd ), to be used by the command to pass dynam-
	    ically generated config file directives back to OpenVPN.

	    If	the script wants to generate a dynamic config file to be applied
	    on the server when the client connects, it should write  it  to  the
	    file named by the last argument.

	    See  the  --client-config-dir  option below for options which can be
	    legally used in a dynamically generated config file.

	    Note that the return value of script is significant. If  script  re-
	    turns  a  non-zero error status, it will cause the client to be dis-
	    connected.

	    If a --client-connect wants to defer the generating of the	configu-
	    ration then the script needs to use the client_connect_deferred_file
	    and client_connect_config_file environment variables, and write sta-
	    tus  accordingly  into these files.  See the Environmental Variables
	    section for more details.

     --client-disconnect cmd
	    Like --client-connect but called on client instance  shutdown.  Will
	    not be called unless the --client-connect script and plugins (if de-
	    fined)  were  previously called on this instance with successful (0)
	    status returns.

	    The exception to this rule is if the --client-disconnect command  or
	    plugins  are cascaded, and at least one client-connect function suc-
	    ceeded, then ALL of the client-disconnect functions for scripts  and
	    plugins  will  be called on client instance object deletion, even in
	    cases where some of the related client-connect functions returned an
	    error status.

	    The --client-disconnect command is not passed  any	extra  arguments
	    (only those arguments specified in cmd, if any).

     --dns-updown cmd
	    Run  command  cmd,	instead  of the default DNS up/down command that
	    comes with openvpn. If cmd is disable the  --dns-updown  command  is
	    not run.

	    If	you  write  your  own  command, please make sure to ignore --dns
	    server profiles that cannot be  applied.  Port,  DNSSEC  and  secure
	    transport settings need to be adhered to. If split DNS is not possi-
	    ble  a  full  redirect  can be used as a fallback. If not all of the
	    server addresses or search domains can be configured, apply them  in
	    the order they are listed in.

	    Note that --dns-updown is not supported on all platforms. On Windows
	    DNS will always be set by the service. On Android DNS will be passed
	    via management interface.

	    Note that DNS-related --dhcp-options might be converted so that they
	    are  available  to this hook if no --dns options exist. If any --dns
	    server option is present, DNS-related --dhcp-options will always  be
	    ignored.  If an --up script is defined, foreign_option env vars will
	    be	generated  from  --dns options and passed to the script. The de-
	    fault --dns-updown command is not run if an --up script is	defined.
	    Both is done for backward compatibility. In case you want to run the
	    --dns-updown  command  even if there is an --up defined, you can de-
	    fine a custom command or use force as cmd to run  the  default  com-
	    mand. No DNS env vars will be passed to --up in this case.

     --down cmd
	    Run  command  cmd after TUN/TAP device close (post --user UID change
	    and/or --chroot ). cmd consists of a path to script  (or  executable
	    program),  optionally  followed by arguments. The path and arguments
	    may be single- or double-quoted and/or escaped  using  a  backslash,
	    and should be separated by one or more spaces.

	    Called  with  the same parameters and environmental variables as the
	    --up option above.

	    Note that if you reduce privileges by using --user	and/or	--group,
	    your --down script will also run at reduced privilege.

     --down-pre
	    Call --down cmd/script before, rather than after, TUN/TAP close.

     --ipchange cmd
	    Run  command  cmd  when our remote ip-address is initially authenti-
	    cated or changes.

	    cmd consists of a path to a script (or executable program),  option-
	    ally followed by arguments. The path and arguments may be single- or
	    double-quoted  and/or escaped using a backslash, and should be sepa-
	    rated by one or more spaces.

	    When cmd is executed two arguments are appended after any  arguments
	    specified in cmd , as follows:

	       cmd ip address port number

	    Don't  use	--ipchange in --mode server mode. Use a --client-connect
	    script instead.

	    See the Environmental Variables section below for additional parame-
	    ters passed as environmental variables.

	    If you are running in a dynamic IP address environment where the  IP
	    addresses  of  either  peer could change without notice, you can use
	    this script, for example, to edit the /etc/hosts file with the  cur-
	    rent  address of the peer. The script will be run every time the re-
	    mote peer changes its IP address.

	    Similarly if our IP address changes due to DHCP, we should configure
	    our IP address change script (see man page for dhcpcd(8)) to deliver
	    a SIGHUP or SIGUSR1 signal to OpenVPN. OpenVPN will  then  re-estab-
	    lish  a  connection with its most recently authenticated peer on its
	    new IP address.

     --learn-address cmd
	    Run command cmd to validate client virtual addresses or routes.

	    cmd consists of a path to a script (or executable program),  option-
	    ally followed by arguments. The path and arguments may be single- or
	    double-quoted  and/or escaped using a backslash, and should be sepa-
	    rated by one or more spaces.

	    Three arguments will be appended to any arguments in cmd as follows:

	    $1 - [operation]
		   "add", "update", or "delete" based on whether or not the  ad-
		   dress  is being added to, modified, or deleted from OpenVPN's
		   internal routing table.

	    $2 - [address]
		   The address being learned or unlearned. This can be	an  IPv4
		   address  such  as  "198.162.10.14",	an  IPv4  subnet such as
		   "198.162.10.0/24", or an ethernet MAC address (when --dev tap
		   is being used) such as "00:FF:01:02:03:04".

	    $3 - [common name]
		   The common name on the certificate associated with the client
		   linked to this address. Only present for  "add"  or	"update"
		   operations, not "delete".

	    On	"add"  or "update" methods, if the script returns a failure code
	    (non-zero), OpenVPN will reject the address and will not modify  its
	    internal routing table.

	    Normally,  the cmd script will use the information provided above to
	    set appropriate firewall entries on the VPN TUN/TAP interface. Since
	    OpenVPN provides the association between virtual IP or  MAC  address
	    and the client's authenticated common name, it allows a user-defined
	    script  to	configure  firewall  access  policies with regard to the
	    client's high-level common name, rather than the  low  level  client
	    virtual addresses.

     --route-up cmd
	    Run command cmd after routes are added, subject to --route-delay.

	    cmd  consists of a path to a script (or executable program), option-
	    ally followed by arguments. The path and arguments may be single- or
	    double-quoted and/or escaped using a backslash, and should be  sepa-
	    rated by one or more spaces.

	    See the Environmental Variables section below for additional parame-
	    ters passed as environmental variables.

     --route-pre-down cmd
	    Run command cmd before routes are removed upon disconnection.

	    cmd  consists of a path to a script (or executable program), option-
	    ally followed by arguments. The path and arguments may be single- or
	    double-quoted and/or escaped using a backslash, and should be  sepa-
	    rated by one or more spaces.

	    See the Environmental Variables section below for additional parame-
	    ters passed as environmental variables.

     --setenv args
	    Set a custom environmental variable name=value to pass to script.

	    Valid syntaxes:

	       setenv name value
	       setenv FORWARD_COMPATIBLE 1
	       setenv opt config_option

	    By	setting FORWARD_COMPATIBLE to 1, the config file syntax checking
	    is relaxed so that unknown directives will trigger a warning but not
	    a fatal error, on the assumption  that  a  given  unknown  directive
	    might be valid in future OpenVPN versions.

	    This  option should be used with caution, as there are good security
	    reasons for having OpenVPN fail if it detects problems in  a  config
	    file.   Having  said  that,  there are valid reasons for wanting new
	    software features to gracefully degrade when  encountered  by  older
	    software versions.

	    It is also possible to tag a single directive so as not to trigger a
	    fatal  error  if the directive isn't recognized. To do this, prepend
	    the following before the directive: setenv opt

	    Versions prior to OpenVPN 2.3.3 will always ignore options set  with
	    the setenv opt directive.

	    See also --ignore-unknown-option

     --setenv-safe args
	    Set a custom environmental variable OPENVPN_name to value to pass to
	    scripts.

	    Valid syntaxes:

	       setenv-safe name value

	    This  directive  is  designed to be pushed by the server to clients,
	    and the prepending of OPENVPN_ to the environmental  variable  is  a
	    safety  precaution to prevent a LD_PRELOAD style attack from a mali-
	    cious or compromised server.

     --tls-verify cmd
	    Run command cmd to verify the X509 name of a pending TLS  connection
	    that  has  otherwise passed all other tests of certification (except
	    for revocation via --crl-verify directive; the revocation  test  oc-
	    curs after the --tls-verify test).

	    cmd  should  return 0 to allow the TLS handshake to proceed, or 1 to
	    fail.

	    cmd consists of a path to a script (or executable program),  option-
	    ally followed by arguments. The path and arguments may be single- or
	    double-quoted  and/or escaped using a backslash, and should be sepa-
	    rated by one or more spaces.

	    When cmd is executed two arguments are appended after any  arguments
	    specified in cmd, as follows:

	       cmd certificate_depth subject

	    These arguments are, respectively, the current certificate depth and
	    the X509 subject distinguished name (dn) of the peer.

	    This  feature is useful if the peer you want to trust has a certifi-
	    cate which was signed by a certificate  authority  who  also  signed
	    many  other  certificates, where you don't necessarily want to trust
	    all of them, but rather be selective about	which  peer  certificate
	    you  will  accept.	This  feature allows you to write a script which
	    will test the X509 name on a certificate and decide whether  or  not
	    it	should be accepted. For a simple perl script which will test the
	    common name field on the certificate, see the file verify-cn in  the
	    OpenVPN distribution.

	    See the Environmental Variables section below for additional parame-
	    ters passed as environmental variables.

     --tls-export-cert dir
	    Adds an environment variable peer_cert when calling the --tls-verify
	    script  or	executing  the	OPENVPN_PLUGIN_TLS_VERIFY plugin hook to
	    verify the certificate.

	    The environment variable contains the path to a PEM encoded certifi-
	    cate of the current peer certificate in the directory dir.

     --up cmd
	    Run command cmd after successful TUN/TAP device open (pre --user UID
	    change).

	    cmd consists of a path to a script (or executable program),  option-
	    ally followed by arguments. The path and arguments may be single- or
	    double-quoted  and/or escaped using a backslash, and should be sepa-
	    rated by one or more spaces.

	    The up command is useful for specifying route commands  which  route
	    IP traffic destined for private subnets which exist at the other end
	    of the VPN connection into the tunnel.

	    For --dev tun execute as:

	       cmd tun_dev tun_mtu 0 ifconfig_local_ip ifconfig_remote_ip [init | restart]

	    For --dev tap execute as:

	       cmd tap_dev tap_mtu 0 ifconfig_local_ip ifconfig_netmask [init | restart]

	    See the Environmental Variables section below for additional parame-
	    ters  passed  as environmental variables.  The 0 argument used to be
	    link_mtu which is no longer passed to scripts - to keep the argument
	    order, it was replaced with 0.

	    Note that if cmd includes arguments, all OpenVPN-generated arguments
	    will be appended to them to build an argument list	with  which  the
	    executable will be called.

	    Typically, cmd will run a script to add routes to the tunnel.

	    Normally the up script is called after the TUN/TAP device is opened.
	    In	this  context,	the  last  command  line parameter passed to the
	    script will be init. If the --up-restart option is also used, the up
	    script will be called for restarts as well. A restart is  considered
	    to	be  a  partial reinitialization of OpenVPN where the TUN/TAP in-
	    stance is preserved  (the  --persist-tun  option  will  enable  such
	    preservation).   A	restart  can be generated by a SIGUSR1 signal, a
	    --ping-restart timeout, or a connection reset when the TCP	protocol
	    is	enabled  with  the  --proto  option.  If  a  restart occurs, and
	    --up-restart has been specified, the up script will be  called  with
	    restart as the last parameter.

	    NOTE:  On restart, OpenVPN will not pass the full set of environment
		   variables  to the script. Namely, everything related to rout-
		   ing and gateways will not be passed, as nothing needs  to  be
		   done  anyway - all the routing setup is already in place. Ad-
		   ditionally, the up-restart script will  run	with  the  down-
		   graded UID/GID settings (if configured).

	    The  following  standalone	example shows how the --up script can be
	    called in both an initialization and restart context. (NOTE: for se-
	    curity reasons, don't run the following example unless UDP port 9999
	    is blocked by your firewall. Also,	the  example  will  run  indefi-
	    nitely, so you should abort with control-c).

	       openvpn --dev tun --port 9999 --verb 4 --ping-restart 10 \
		       --up 'echo up' --down 'echo down' --persist-tun	\
		       --up-restart

	    Note  that	OpenVPN also provides the --ifconfig option to automati-
	    cally ifconfig the TUN device, eliminating the  need  to  define  an
	    --up  script,  unless  you also want to configure routes in the --up
	    script.

	    If --ifconfig is also specified, OpenVPN will pass the ifconfig  lo-
	    cal  and  remote endpoints on the command line to the --up script so
	    that they can be used to configure routes such as:

	       route add -net 10.0.0.0 netmask 255.255.255.0 gw $5

     --up-delay
	    Delay TUN/TAP open and possible --up script  execution  until  after
	    TCP/UDP connection establishment with peer.

	    In --proto udp mode, this option normally requires the use of --ping
	    to allow connection initiation to be sensed in the absence of tunnel
	    data, since UDP is a "connectionless" protocol.

	    On Windows, this option will delay the TAP-Win32 media state transi-
	    tioning  to "connected" until connection establishment, i.e. the re-
	    ceipt of the first authenticated packet from the peer.

     --up-restart
	    Enable the --up and --down scripts to be called for restarts as well
	    as initial program start. This option is described more fully  above
	    in the --up option documentation.

   String Types and Remapping
     In  certain cases, OpenVPN will perform remapping of characters in strings.
     Essentially, any characters outside the set  of  permitted  characters  for
     each string type will be converted to underbar ('_').

     Q: Why is string remapping necessary?
	    It's  an  important security feature to prevent the malicious coding
	    of strings from untrusted sources to  be  passed  as  parameters  to
	    scripts, saved in the environment, used as a common name, translated
	    to a filename, etc.

     Q: Can string remapping be disabled?
	    No.   The  options	--no-name-remapping and --compat-names have been
	    removed in 2.5 because they were considered too insecure.

     Here is a brief rundown of OpenVPN's current string types and the permitted
     character class for each string:

     X509 Names
	    Alphanumeric, underbar ('_'), dash ('-'), dot ('.'), at ('@'), colon
	    (':'), slash ('/'), and equal ('='). Alphanumeric is  defined  as  a
	    character  which  will cause the C library isalnum() function to re-
	    turn true.

     Common Names
	    Alphanumeric, underbar ('_'), dash ('-'), dot ('.'), and at ('@').

     --auth-user-pass username
	    Same as Common Name, with one exception: The username is  passed  to
	    the  OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY  plugin  in  its raw form,
	    without string remapping.

     --auth-user-pass password
	    Any "printable" character except CR or LF. Printable is  defined  to
	    be	a character which will cause the C library isprint() function to
	    return true.

     --client-config-dir filename as derived from common name or username
	    Alphanumeric, underbar ('_'), dash ('-'), at ('@'),  and  dot  ('.')
	    except for "." or ".." as standalone strings.

     Environmental variable names
	    Alphanumeric or underbar ('_').

     Environmental variable values
	    Any printable character.

     For  all  cases,  characters in a string which are not members of the legal
     character class for that string type will be remapped to underbar ('_').

   Environmental Variables
     Once set, a variable is persisted indefinitely until it is reset by  a  new
     value or a restart,

     In server mode, environmental variables set by OpenVPN are scoped according
     to  the client objects they are associated with, so there should not be any
     issues with scripts having access to stale, previously set variables  which
     refer to different client instances.

     bytes_received
	    Total  number  of bytes received from client during VPN session. Set
	    prior to execution of the --client-disconnect script.

     bytes_sent
	    Total number of bytes sent to client during VPN session.  Set  prior
	    to execution of the --client-disconnect script.

     client_connect_config_file
	    The  path to the configuration file that should be written to by the
	    --client-connect script (optional, if per-session  configuration  is
	    desired).  This is the same file name as passed via command line ar-
	    gument on the call to the --client-connect script.

     client_connect_deferred_file
	    This  file can be optionally written to in order to to communicate a
	    status code of the --client-connect script or plgin.  Only the first
	    character in the file is relevant.	It must be either 1 to	indicate
	    normal  script execution, 0 indicates an error (in the same way that
	    a non zero exit status does) or 2 to indicate that	the  script  de-
	    ferred returning the config file.

	    For  deferred (background) handling, the script or plugin MUST write
	    2 to the file to indicate the deferral and	then  return  with  exit
	    code 0 to signal deferred handler started OK.

	    A  background  process or similar must then take care of writing the
	    configuration to  the  file  indicated  by	the  client_connect_con-
	    fig_file  environment  variable  and when finished, write the a 1 to
	    this file (or 0 in case of an error).

	    The absence of any character in the file when  the	script	finishes
	    executing is interpreted the same as 1. This allows scripts that are
	    not written to support the defer mechanism to be used unmodified.

     common_name
	    The X509 common name of an authenticated client. Set prior to execu-
	    tion      of      --client-connect,      --client-disconnect     and
	    --auth-user-pass-verify scripts.

     config
	    Name of first --config file. Set on program initiation and reset  on
	    SIGHUP.

     daemon
	    Set to "1" if the --daemon directive is specified, or "0" otherwise.
	    Set on program initiation and reset on SIGHUP.

     daemon_log_redirect
	    Set to "1" if the --log or --log-append directives are specified, or
	    "0" otherwise. Set on program initiation and reset on SIGHUP.

     dev    The actual name of the TUN/TAP device, including a unit number if it
	    exists. Set prior to --up or --down script execution.

     dev_idx
	    On	Windows,  the device index of the TUN/TAP adapter (to be used in
	    netsh.exe calls which sometimes just do not work right  with  inter-
	    face names). Set prior to --up or --down script execution.

     dns_*  The  --dns configuration options will be made available to --dns-up-
	    down execution through this set of environment variables.  Variables
	    appear  only  if  the corresponding option has a value assigned. For
	    the semantics of each individual variable, please refer to the docu-
	    mentation for --dns.

	       dns_search_domain_{n}
	       dns_server_{n}_address_{m}
	       dns_server_{n}_port_{m}
	       dns_server_{n}_resolve_domain_{m}
	       dns_server_{n}_dnssec
	       dns_server_{n}_transport
	       dns_server_{n}_sni

     foreign_option_{n}
	    An option pushed via --push to a client which does not natively sup-
	    port it, such as --dhcp-option on  a  non-Windows  system,	will  be
	    recorded  to  this	environmental  variable  sequence  prior to --up
	    script execution.

     ifconfig_ipv6_local
	    The local VPN endpoint IPv6 address specified in the --ifconfig-ipv6
	    option (first parameter). Set prior to OpenVPN calling the	ifconfig
	    or	code:netsh (windows version of ifconfig) commands which normally
	    occurs prior to --up script execution.

     ifconfig_ipv6_netbits
	    The prefix length of the IPv6 network on the VPN interface.  Derived
	    from  the  /nnn parameter of the IPv6 address in the --ifconfig-ipv6
	    option (first parameter). Set prior to OpenVPN calling the	ifconfig
	    or	netsh  (windows version of ifconfig) commands which normally oc-
	    curs prior to --up script execution.

     ifconfig_ipv6_remote
	    The remote VPN endpoint  IPv6  address  specified  in  the	--ifcon-
	    fig-ipv6 option (second parameter). Set prior to OpenVPN calling the
	    ifconfig  or netsh (windows version of ifconfig) commands which nor-
	    mally occurs prior to --up script execution.

     ifconfig_local
	    The local VPN endpoint IP address specified in the --ifconfig option
	    (first parameter). Set prior to  OpenVPN  calling  the  ifconfig  or
	    netsh  (windows  version of ifconfig) commands which normally occurs
	    prior to --up script execution.

     ifconfig_remote
	    The remote VPN endpoint IP address specified in the  --ifconfig  op-
	    tion (second parameter) when --dev tun is used. Set prior to OpenVPN
	    calling the ifconfig or netsh (windows version of ifconfig) commands
	    which normally occurs prior to --up script execution.

     ifconfig_netmask
	    The subnet mask of the virtual ethernet segment that is specified as
	    the second parameter to --ifconfig when --dev tap is being used. Set
	    prior  to  OpenVPN calling the ifconfig or netsh (windows version of
	    ifconfig) commands which normally occurs prior to --up script execu-
	    tion.

     ifconfig_pool_local_ip
	    The local virtual IPv4 address for the TUN/TAP tunnel taken from  an
	    --ifconfig-push directive if specified, or otherwise from the ifcon-
	    fig  pool (controlled by the --ifconfig-pool config file directive).
	    Only set for --dev tun tunnels. This option is  set  on  the  server
	    prior  to  execution of the --client-connect and --client-disconnect
	    scripts.

     ifconfig_pool_local_ip6
	    The local virtual IPv6 address for the TUN/TAP tunnel taken from  an
	    --ifconfig-ipv6-push  directive  if specified, or otherwise from the
	    ifconfig pool (controlled by the  --ifconfig-ipv6-pool  config  file
	    directive).  Only  set  for --dev tun tunnels. This option is set on
	    the  server  prior	to  execution  of   the   --client-connect   and
	    --client-disconnect scripts.

     ifconfig_pool_netmask
	    The  virtual IPv4 netmask for the TUN/TAP tunnel taken from an --if-
	    config-push directive if specified, or otherwise from  the	ifconfig
	    pool (controlled by the --ifconfig-pool config file directive). Only
	    set for --dev tap tunnels. This option is set on the server prior to
	    execution of the --client-connect and --client-disconnect scripts.

     ifconfig_pool_ip6_netbits
	    The  virtual IPv6 prefix length for the TUN/TAP tunnel taken from an
	    --ifconfig-ipv6-push directive if specified, or otherwise  from  the
	    ifconfig  pool  (controlled  by the --ifconfig-ipv6-pool config file
	    directive). Only set for --dev tap tunnels. This option  is  set  on
	    the   server   prior   to  execution  of  the  --client-connect  and
	    --client-disconnect scripts.

     ifconfig_pool_remote_ip
	    The remote virtual IPv4 address for the TUN/TAP tunnel taken from an
	    --ifconfig-push directive if specified, or otherwise from the ifcon-
	    fig pool (controlled by the --ifconfig-pool config file  directive).
	    This  option  is  set  on  the  server  prior  to  execution  of the
	    --client-connect and --client-disconnect scripts.

     ifconfig_pool_remote_ip6
	    The remote virtual IPv6 address for the TUN/TAP tunnel taken from an
	    --ifconfig-ipv6-push directive if specified, or otherwise  from  the
	    ifconfig  pool  (controlled  by the --ifconfig-ipv6-pool config file
	    directive). This option is set on the server prior to  execution  of
	    the --client-connect and --client-disconnect scripts.

     link_mtu
	    REMOVED No longer passed to scripts since OpenVPN 2.6.0.  Used to be
	    the maximum packet size (not including the IP header) of tunnel data
	    in UDP tunnel transport mode.

     local  The  --local  parameter.  Set  on  program	initiation  and reset on
	    SIGHUP.

     local_port
	    The local port number or name, specified by --port or --lport.   Set
	    on program initiation and reset on SIGHUP.

     password
	    The   password  provided  by  a  connecting  client.  Set  prior  to
	    --auth-user-pass-verify script execution only when the via-env modi-
	    fier is specified, and deleted from the environment after the script
	    returns.

     peer_cert
	    If the option --tls-export-cert is enabled, this option contains the
	    path to the current peer certificate to be verified in  PEM  format.
	    See also the argument certificate_depth to the --tls-verify command.

     proto  The  --proto  parameter.  Set  on  program	initiation  and reset on
	    SIGHUP.

     remote_{n}
	    The --remote parameter. Set  on  program  initiation  and  reset  on
	    SIGHUP.

     remote_port_{n}
	    The  remote port number, specified by --port or --rport. Set on pro-
	    gram initiation and reset on SIGHUP.

     route_net_gateway
	    The pre-existing default IP gateway in the system routing table. Set
	    prior to --up script execution.

     route_vpn_gateway
	    The default gateway used by --route options, as specified in  either
	    the  --route-gateway  option  or  the second parameter to --ifconfig
	    when --dev tun is specified. Set prior to --up script execution.

     route_{parm}_{n}
	    A set of variables which define each route to be added, and are  set
	    prior to --up script execution.

	    parm will be one of network, netmask", gateway, or metric.

	    n is the OpenVPN route number, starting from 1.

	    If the network or gateway are resolvable DNS names, their IP address
	    translations  will be recorded rather than their names as denoted on
	    the command line or configuration file.

     route_ipv6_{parm}_{n}
	    A set of variables which define each IPv6 route to be added, and are
	    set prior to --up script execution.

	    parm will be one of  network,  gateway  or	metric.  route_ipv6_net-
	    work_{n} contains netmask as /nnn, unlike IPv4 where it is passed in
	    a separate environment variable.

	    n is the OpenVPN route number, starting from 1.

	    If the network or gateway are resolvable DNS names, their IP address
	    translations  will be recorded rather than their names as denoted on
	    the command line or configuration file.

     route_redirect_gateway_ipv4

     route_redirect_gateway_ipv6
	    Set to 1 if the corresponding default gateway should  be  redirected
	    into  the  tunnel,	and to 2 if also the local LAN segment should be
	    blocked (block-local).  Not set otherwise.	Set prior to --up script
	    execution.

     script_context
	    Set to "init" or "restart" prior to up/down  script  execution.  For
	    more information, see documentation for --up.

     script_type
	    Prior  to  execution of any script, this variable is set to the type
	    of script being run. It can be  one  of  the  following:  up,  down,
	    ipchange,  route-up,  tls-verify, auth-user-pass-verify, client-con-
	    nect, client-disconnect or learn-address. Set prior to execution  of
	    any script.

     signal
	    The  reason  for  exit  or	restart.  Can be one of sigusr1, sighup,
	    sigterm,  sigint,  inactive  (controlled  by   --inactive	option),
	    ping-exit  (controlled  by	--ping-exit  option), ping-restart (con-
	    trolled by --ping-restart option),	connection-reset  (triggered  on
	    TCP  connection  reset),  error  or  unknown (unknown signal).  This
	    variable is set just prior to down script execution.

     time_ascii
	    Client connection timestamp,  formatted  as  a  human-readable  time
	    string.  Set prior to execution of the --client-connect script.

     time_duration
	    The duration (in seconds) of the client session which is now discon-
	    necting. Set prior to execution of the --client-disconnect script.

     time_unix
	    Client  connection	timestamp, formatted as a unix integer date/time
	    value. Set prior to execution of the --client-connect script.

     tls_digest_{n} / tls_digest_sha256_{n}
	    Contains the certificate SHA1 / SHA256 fingerprint, where n  is  the
	    verification  level. Only set for TLS connections. Set prior to exe-
	    cution of --tls-verify script.

     tls_id_{n}
	    A series of certificate fields from the remote peer, where n is  the
	    verification  level. Only set for TLS connections. Set prior to exe-
	    cution of --tls-verify script.

     tls_serial_{n}
	    The serial number of the certificate from the remote peer,	where  n
	    is	the  verification level. Only set for TLS connections. Set prior
	    to execution of --tls-verify script. This is in the form of a  deci-
	    mal  string  like  "933971680",  which  is	suitable  for doing ser-
	    ial-based OCSP queries (with OpenSSL, do not  prepend  "0x"  to  the
	    string)  If  something  goes  wrong while reading the value from the
	    certificate it will be an empty string, so your  code  should  check
	    that.  See	the contrib/OCSP_check/OCSP_check.sh script for an exam-
	    ple.

     tls_serial_hex_{n}
	    Like tls_serial_{n}, but in hex form (e.g.	12:34:56:78:9A).

     tun_mtu
	    The MTU of the TUN/TAP device. Set prior to --up  or  --down  script
	    execution.

     trusted_ip / trusted_ip6)
	    Actual  IP	address  of connecting client or peer which has been au-
	    thenticated. Set prior to execution of --ipchange,	--client-connect
	    and  --client-disconnect  scripts.	If  using  ipv6 endpoints (udp6,
	    tcp6), trusted_ip6 will be set instead.

     trusted_port
	    Actual port number of connecting client or peer which has  been  au-
	    thenticated.  Set prior to execution of --ipchange, --client-connect
	    and --client-disconnect scripts.

     untrusted_ip / untrusted_ip6
	    Actual IP address of connecting client or peer which  has  not  been
	    authenticated  yet.  Sometimes used to nmap the connecting host in a
	    --tls-verify script to ensure it is firewalled properly.  Set  prior
	    to execution of --tls-verify and --auth-user-pass-verify scripts. If
	    using  ipv6  endpoints  (udp6,  tcp6), untrusted_ip6 will be set in-
	    stead.

     untrusted_port
	    Actual port number of connecting client or peer which has  not  been
	    authenticated  yet.  Set  prior  to  execution  of	--tls-verify and
	    --auth-user-pass-verify scripts.

     username
	    The  username  provided  by  a  connecting	client.  Set  prior   to
	    --auth-user-pass-verify script execution only when the via-env modi-
	    fier is specified.

     X509_{n}_{subject_field}
	    An	X509  subject field from the remote peer certificate, where n is
	    the verification level. Only set for TLS connections. Set  prior  to
	    execution  of  --tls-verify  script.  This	variable  is  similar to
	    tls_id_{n} except the component X509 subject fields are broken  out,
	    and  no  string  remapping	occurs on these field values (except for
	    remapping of control characters to "_"). For example, the  following
	    variables would be set on the OpenVPN server using the sample client
	    certificate  in sample-keys (client.crt). Note that the verification
	    level is 0 for the client certificate and 1 for the CA certificate.

	    You can use the --x509-track option to export more or less	informa-
	    tion from the certificates.

	       X509_0_emailAddress=me@myhost.mydomain
	       X509_0_CN=Test-Client
	       X509_0_O=OpenVPN-TEST
	       X509_0_ST=NA
	       X509_0_C=KG
	       X509_1_emailAddress=me@myhost.mydomain
	       X509_1_O=OpenVPN-TEST
	       X509_1_L=BISHKEK
	       X509_1_ST=NA
	       X509_1_C=KG

   Management Interface Options
     OpenVPN  provides a feature rich socket based management interface for both
     server and client mode operations.

     --management args
	    Enable a management server on a socket-name  Unix  socket  on  those
	    platforms supporting it, or on a designated TCP port.

	    Valid syntaxes:

	       management socket-name unix	    #
	       management socket-name unix pw-file  # (recommended)
	       management IP port		    # (INSECURE)
	       management IP port pw-file	    #

	    pw-file, if specified, is a password file where the password must be
	    on	first  line.  Instead of a filename it can use the keyword stdin
	    which will prompt the user for a password to  use  when  OpenVPN  is
	    starting.

	    For  unix  sockets, the default behaviour is to create a unix domain
	    socket that may be connected to by any process.  Use  the  --manage-
	    ment-client-user  and  --management-client-group  directives  to re-
	    strict access.

	    The management interface provides a special mode where the TCP  man-
	    agement  link  can	operate  over  the tunnel itself. To enable this
	    mode, set IP to tunnel. Tunnel mode will cause the management inter-
	    face to listen for a TCP connection on the local VPN address of  the
	    TUN/TAP interface.

	    *BEWARE*  of  enabling  the  management interface over TCP. In these
	    cases you should ALWAYS make use of pw-file to password protect  the
	    management	interface.  Any user who can connect to this TCP IP:port
	    will be able to manage and control (and interfere with) the  OpenVPN
	    process. It is also strongly recommended to set IP to 127.0.0.1 (lo-
	    calhost) to restrict accessibility of the management server to local
	    clients.

	    While  the	management  port is designed for programmatic control of
	    OpenVPN by other applications, it is possible to telnet to the port,
	    using a telnet client in "raw" mode. Once connected, type help for a
	    list of commands.

	    For detailed documentation on the management interface, see the man-
	    agement-notes.txt file in  the  management	folder	of  the  OpenVPN
	    source distribution.

     --management-client
	    Management	interface  will  connect  as a TCP/unix domain client to
	    IP:port specified by --management rather than listen as a TCP server
	    or on a unix domain socket.

	    If the client connection fails to  connect	or  is	disconnected,  a
	    SIGTERM signal will be generated causing OpenVPN to quit.

     --management-client-auth
	    Gives management interface client the responsibility to authenticate
	    clients  after  their client certificate has been verified. See man-
	    agement-notes.txt in OpenVPN distribution for detailed notes.

     --management-client-group g
	    When the management interface is listening on a unix domain  socket,
	    only allow connections from group g.

     --management-client-user u
	    When  the management interface is listening on a unix domain socket,
	    only allow connections from user u.

     --management-external-cert certificate-hint
	    Allows usage for  external	certificate  instead  of  --cert  option
	    (client-only).  certificate-hint  is  an  arbitrary  string which is
	    passed to a management interface client as an argument of  NEED-CER-
	    TIFICATE notification. Requires --management-external-key.

     --management-external-key args
	    Allows  usage  for external private key file instead of --key option
	    (client-only).

	    Valid syntaxes:

	       management-external-key
	       management-external-key nopadding
	       management-external-key pkcs1
	       management-external-key pss

	    or any combination like:

	       management-external-key nopadding pkcs1
	       management-external-key pkcs1 pss

	    The optional parameters nopadding pkcs1 and pss signal  support  for
	    different padding algorithms. See doc/mangement-notes.txt for a com-
	    plete description of this feature.

     --management-forget-disconnect
	    Make OpenVPN forget passwords when management session disconnects.

	    This  directive  does not affect the --http-proxy username/password.
	    It is always cached.

     --management-hold
	    Start OpenVPN in a hibernating state, until a client of the  manage-
	    ment interface explicitly starts it with the hold release command.

     --management-log-cache n
	    Cache  the	most recent n lines of log file history for usage by the
	    management channel.

     --management-query-passwords
	    Query   management	 channel   for	 private   key	 password    and
	    --auth-user-pass  username/password. Only query the management chan-
	    nel for inputs which ordinarily would have	been  queried  from  the
	    console.

     --management-query-proxy
	    Query management channel for proxy server information for a specific
	    --remote (client-only).

     --management-query-remote
	    Allow   management	 interface   to   override  --remote  directives
	    (client-only).

     --management-signal
	    Send SIGUSR1 signal to OpenVPN if  management  session  disconnects.
	    This  is  useful  when  you wish to disconnect an OpenVPN session on
	    user logoff.  For --management-client  this  option  is  not  needed
	    since a disconnect will always generate a SIGTERM.

     --management-up-down
	    Report tunnel up/down events to management interface.

   Plug-in Interface Options
     OpenVPN  can  be  extended  by loading external plug-in modules at runtime.
     These plug-ins must be prebuilt and adhere to the OpenVPN Plug-In API.

     --plugin args
	    Loads an OpenVPN plug-in module.

	    Valid syntax:

	       plugin module-name
	       plugin module-name "arguments"

	    The module-name needs to  be  the  first  argument,  indicating  the
	    plug-in  to  load.	 The  second argument is an optional init string
	    which will be passed directly to the plug-in.  If the init	consists
	    of	multiple  arguments  it  must  be enclosed in double-quotes (").
	    Multiple plugin modules may be loaded into one OpenVPN process.

	    The module-name argument can be just a filename or a filename with a
	    relative or absolute path. The format of the filename and  path  de-
	    fines if the plug-in will be loaded from a default plug-in directory
	    or outside this directory.

	       --plugin path	     Effective directory used
	       ===================== =============================
		myplug.so	     DEFAULT_DIR/myplug.so
		subdir/myplug.so     DEFAULT_DIR/subdir/myplug.so
		./subdir/myplug.so   CWD/subdir/myplug.so
		/usr/lib/my/plug.so  /usr/lib/my/plug.so

	    DEFAULT_DIR  is  replaced by the default plug-in directory, which is
	    configured at the build time of OpenVPN. CWD is the  current  direc-
	    tory  where  OpenVPN  was  started	or  the  directory  OpenVPN have
	    switched into via the --cd option before the --plugin option.

	    For more information and examples on how to  build	OpenVPN  plug-in
	    modules,  see  the	README	file in the plugin folder of the OpenVPN
	    source distribution.

	    If you are using an RPM install  of  OpenVPN,  see	/usr/share/open-
	    vpn/plugin.  The  documentation is in doc and the actual plugin mod-
	    ules are in lib.

	    Multiple plugin modules can be cascaded, and modules can be used  in
	    tandem  with  scripts.  The modules will be called by OpenVPN in the
	    order that they are declared in the config file. If  both  a  plugin
	    and  script are configured for the same callback, the script will be
	    called last. If the return code of the module/script controls an au-
	    thentication function (such as tls-verify, auth-user-pass-verify, or
	    client-connect), then every module and script  must  return  success
	    (0) in order for the connection to be authenticated.

	    WARNING:
		   Plug-ins  may do deferred execution, meaning the plug-in will
		   return the control back to the main OpenVPN process and  pro-
		   vide  the  plug-in  result later on via a different thread or
		   process.  OpenVPN does NOT  support	multiple  authentication
		   plug-ins  where more than one plugin tries to do deferred au-
		   thentication.  If this behaviour is	detected,  OpenVPN  will
		   shut down upon first authentication.

   Windows-Specific Options
     --allow-nonadmin TAP-adapter
	    (Standalone) Set TAP-adapter to allow access from non-administrative
	    accounts.  If TAP-adapter is omitted, all TAP adapters on the system
	    will be configured to allow non-admin access. The  non-admin  access
	    setting  will only persist for the length of time that the TAP-Win32
	    device object and driver remain loaded, and will need to  be  re-en-
	    abled  after  a  reboot,  or if the driver is unloaded and reloaded.
	    This directive can only be used by an administrator.

     --block-outside-dns
	    Block DNS servers on other network adapters to  prevent  DNS  leaks.
	    This  option prevents any application from accessing TCP or UDP port
	    53 except one inside the tunnel. It uses Windows Filtering	Platform
	    (WFP) and works on Windows Vista or later.

	    This  option  is considered unknown on non-Windows platforms and un-
	    supported on Windows XP, resulting in fatal error. You may	want  to
	    use  --setenv  opt or --ignore-unknown-option (not suitable for Win-
	    dows XP) to ignore said error. Note  that  pushing	unknown  options
	    from server does not trigger fatal errors.

     --cryptoapicert select-string
	    (Windows/OpenSSL Only) Load the certificate and private key from the
	    Windows Certificate System Store.

	    Use this option instead of --cert and --key.

	    This  makes it possible to use any smart card, supported by Windows,
	    but also any kind of certificate, residing in the Cert Store,  where
	    you have access to the private key. This option has been tested with
	    a  couple of different smart cards (GemSAFE, Cryptoflex, and Swedish
	    Post Office eID) on the client side, and  also  an	imported  PKCS12
	    software certificate on the server side.

	    To select a certificate, based on a substring search in the certifi-
	    cate's subject:

	       cryptoapicert "SUBJ:Peter Runestig"

	    To	select	a  certificate,  based on certificate's thumbprint (SHA1
	    hash):

	       cryptoapicert "THUMB:f6 49 24 41 01 b4 ..."

	    The thumbprint hex string can easily  be  copy-and-pasted  from  the
	    Windows Certificate Store GUI. The embedded spaces in the hex string
	    are optional.

	    To select a certificate based on a substring in certificate's issuer
	    name:

	       cryptoapicert "ISSUER:Sample CA"

	    To	select	a  certificate based on a certificate's template name or
	    OID of the template:

	       cryptoapicert "TMPL:Name of Template"
	       cryptoapicert "TMPL:1.3.6.1.4..."

	    The first non-expired certificate found in the user's store  or  the
	    machine store that matches the select-string is used.

     --dhcp-release
	    Ask  Windows  to release the TAP adapter lease on shutdown. This op-
	    tion has no effect now, as it is enabled by  default  starting  with
	    OpenVPN 2.4.1.

     --dhcp-renew
	    Ask  Windows  to renew the TAP adapter lease on startup. This option
	    is normally unnecessary, as Windows automatically  triggers  a  DHCP
	    renegotiation  on  the  TAP adapter when it comes up, however if you
	    set the TAP-Win32 adapter Media  Status  property  to  "Always  Con-
	    nected", you may need this flag.

     --ip-win32 method
	    When  using  --ifconfig on Windows, set the TAP-Win32 adapter IP ad-
	    dress and netmask using method. Don't use this option unless you are
	    also using --ifconfig.

	    manual
		   Don't set the IP address or	netmask  automatically.  Instead
		   output a message to the console telling the user to configure
		   the	adapter  manually  and	indicating  the IP/netmask which
		   OpenVPN expects the adapter to be set to.

	    dynamic [offset] [lease-time]
		   Automatically set the IP address and netmask by  replying  to
		   DHCP  query	messages  generated by the kernel.  This mode is
		   probably the "cleanest" solution for setting the TCP/IP prop-
		   erties since it uses the well-known DHCP protocol. There are,
		   however, two prerequisites for using this mode:

		   1. The TCP/IP properties for the TAP-Win32  adapter	must  be
		      set to "Obtain an IP address automatically", and

		   2. OpenVPN needs to claim an IP address in the subnet for use
		      as the virtual DHCP server address.

		   By  default in --dev tap mode, OpenVPN will take the normally
		   unused first address in the subnet. For example, if your sub-
		   net is 192.168.4.0 netmask 255.255.255.0, then  OpenVPN  will
		   take  the  IP  address 192.168.4.0 to use as the virtual DHCP
		   server address.  In --dev tun mode, OpenVPN	will  cause  the
		   DHCP  server  to masquerade as if it were coming from the re-
		   mote endpoint.

		   The optional offset parameter is an integer which is  >  -256
		   and < 256 and which defaults to 0. If offset is positive, the
		   DHCP  server will masquerade as the IP address at network ad-
		   dress + offset. If offset is negative, the DHCP  server  will
		   masquerade as the IP address at broadcast address + offset.

		   The	Windows  ipconfig  /all command can be used to show what
		   Windows thinks the  DHCP  server  address  is.  OpenVPN  will
		   "claim"  this  address,  so	make sure to use a free address.
		   Having said that, different OpenVPN instantiations, including
		   different ends of the same connection,  can	share  the  same
		   virtual DHCP server address.

		   The	lease-time parameter controls the lease time of the DHCP
		   assignment given to the TAP-Win32 adapter, and is denoted  in
		   seconds. Normally a very long lease time is preferred because
		   it prevents routes involving the TAP-Win32 adapter from being
		   lost when the system goes to sleep. The default lease time is
		   one year.

	    netsh  Automatically  set  the IP address and netmask using the Win-
		   dows command-line "netsh" command.  This  method  appears  to
		   work correctly on Windows XP but not Windows 2000.

	    ipapi  Automatically  set  the IP address and netmask using the Win-
		   dows IP Helper API. This approach does not have ideal  seman-
		   tics,  though  testing  has	indicated  that it works okay in
		   practice. If you use this option, it is  best  to  leave  the
		   TCP/IP  properties for the TAP-Win32 adapter in their default
		   state, i.e. "Obtain an IP address automatically."

	    adaptive (Default)
		   Try dynamic method initially and fail over to  netsh  if  the
		   DHCP  negotiation with the TAP-Win32 adapter does not succeed
		   in 20 seconds. Such failures have been known  to  occur  when
		   certain third-party firewall packages installed on the client
		   machine  block  the	DHCP  negotiation  used by the TAP-Win32
		   adapter.  Note  that  if  the  netsh  failover  occurs,   the
		   TAP-Win32  adapter  TCP/IP properties will be reset from DHCP
		   to static, and this will cause future OpenVPN startups  using
		   the	adaptive mode to use netsh immediately, rather than try-
		   ing dynamic first.

		   To "unstick" the adaptive mode from using netsh, run  OpenVPN
		   at least once using the dynamic mode to restore the TAP-Win32
		   adapter TCP/IP properties to a DHCP configuration.

     --pause-exit
	    Put up a "press any key to continue" message on the console prior to
	    OpenVPN  program exit. This option is automatically used by the Win-
	    dows explorer when OpenVPN is run on a configuration file using  the
	    right-click explorer menu.

     --register-dns
	    Run  ipconfig /flushdns and ipconfig /registerdns on connection ini-
	    tiation. This is known to kick Windows into recognizing  pushed  DNS
	    servers.

     --route-method m
	    Which method m to use for adding routes on Windows?

	    adaptive (default)
		   Try	IP  helper  API  first.  If that fails, fall back to the
		   route.exe shell command.

	    ipapi  Use IP helper API.

	    exe    Call the route.exe shell command.

     --service args
	    Should be used when OpenVPN is being automatically executed  by  an-
	    other  program  in	such a context that no interaction with the user
	    via display or keyboard is possible.

	    Valid syntax:

	       service exit-event [0|1]

	    In general, end-users should never need to explicitly use  this  op-
	    tion,  as  it  is automatically added by the OpenVPN service wrapper
	    when a given OpenVPN configuration is being run as a service.

	    exit-event is the name of a Windows global event object, and OpenVPN
	    will continuously monitor the state of this event  object  and  exit
	    when it becomes signaled.

	    The  second  parameter indicates the initial state of exit-event and
	    normally defaults to 0.

	    Multiple OpenVPN processes can be simultaneously executed  with  the
	    same  exit-event parameter. In any case, the controlling process can
	    signal exit-event, causing all such OpenVPN processes to exit.

	    When executing an OpenVPN process  using  the  --service  directive,
	    OpenVPN will probably not have a console window to output status/er-
	    ror messages, therefore it is useful to use --log or --log-append to
	    write these messages to a file.

     --show-adapters
	    (Standalone) Show available TAP-Win32 adapters which can be selected
	    using the --dev-node option. On non-Windows systems, the ifconfig(8)
	    command provides similar functionality.

     --show-net
	    (Standalone)  Show	OpenVPN's  view  of the system routing table and
	    network adapter list.

     --show-net-up
	    Output OpenVPN's view  of  the  system  routing  table  and  network
	    adapter list to the syslog or log file after the TUN/TAP adapter has
	    been brought up and any routes have been added.

     --show-valid-subnets
	    (Standalone)  Show	valid subnets for --dev tun emulation. Since the
	    TAP-Win32 driver exports an ethernet interface to Windows, and since
	    TUN devices are point-to-point in nature, it is  necessary	for  the
	    TAP-Win32  driver  to impose certain constraints on TUN endpoint ad-
	    dress selection.

	    Namely, the point-to-point endpoints used in  TUN  device  emulation
	    must   be  the  middle  two  addresses  of	a  /30	subnet	(netmask
	    255.255.255.252).

     --tap-sleep n
	    Cause OpenVPN to sleep for n seconds immediately after the TAP-Win32
	    adapter state is set to "connected".

	    This option is intended to be used to troubleshoot problems with the
	    --ifconfig and --ip-win32 options, and is used to give the TAP-Win32
	    adapter time to come up before Windows IP Helper API operations  are
	    applied to it.

     --win-sys path
	    Set  the  Windows  system directory pathname to use when looking for
	    system executables such as route.exe and netsh.exe. By  default,  if
	    this directive is not specified, OpenVPN will use the SystemRoot en-
	    vironment variable.

	    This option has changed behaviour since OpenVPN 2.3. Earlier you had
	    to	define --win-sys env to use the SystemRoot environment variable,
	    otherwise it defaulted to C:\\WINDOWS. It is not needed to	use  the
	    env  keyword  any  more,  and  it will just be ignored. A warning is
	    logged when this is found in the configuration file.

   Standalone Debug Options
     --show-gateway args
	    (Standalone) Show current IPv4 and IPv6 default gateway  and  inter-
	    face towards the gateway (if the protocol in question is enabled).

	    Valid syntax:

	       --show-gateway
	       --show-gateway IPv4-target
	       --show-gateway IPv6-target

	    For  IPv4  it looks for a 0.0.0.0/0 route, or the specified IPv4 ad-
	    dress if the target can be parsed as an IPv4 address.  For IPv6 this
	    queries the route towards ::/128, or the specified IPv6  target  ad-
	    dress if the argument is an IPv6 address.

	    Adding a target is helpful for diagnostics to see if OpenVPN will do
	    the right thing if there are more specific IPv4/IPv6 routes to a VPN
	    server.

   Advanced Expert Options
     These are options only required when special tweaking is needed, often used
     when debugging or testing out special usage scenarios.

     --hash-size args
	    Set the size of the real address hash table to r and the virtual ad-
	    dress table to v.

	    Valid syntax:

	       hash-size r v

	    By default, both tables are sized at 256 buckets.

     --bcast-buffers n
	    Allocate n buffers for broadcast datagrams (default 256).

     --persist-local-ip
	    Preserve  initially resolved local IP address and port number across
	    SIGUSR1 or --ping-restart restarts.

     --persist-remote-ip
	    Preserve most recently authenticated remote IP address and port num-
	    ber across SIGUSR1 or --ping-restart restarts.

     --rcvbuf size
	    Set the TCP/UDP socket receive buffer size.  Defaults  to  operating
	    system default.

     --shaper n
	    Limit bandwidth of outgoing tunnel data to n bytes per second on the
	    TCP/UDP  port.  Note that this will only work if mode is set to p2p.
	    If you want to limit the bandwidth in both directions, use this  op-
	    tion on both peers.

	    OpenVPN  uses  the following algorithm to implement traffic shaping:
	    Given a shaper rate of n bytes per second, after a datagram write of
	    b bytes is queued on the TCP/UDP port, wait a minimum  of  (b  /  n)
	    seconds before queuing the next write.

	    It	should	be  noted that OpenVPN supports multiple tunnels between
	    the same two peers, allowing you to construct full-speed and reduced
	    bandwidth tunnels at the same time, routing low-priority  data  such
	    as	off-site  backups  over  the reduced bandwidth tunnel, and other
	    data over the full-speed tunnel.

	    Also note that for low bandwidth tunnels (under 1000 bytes per  sec-
	    ond),  you should probably use lower MTU values as well (see above),
	    otherwise the packet latency will grow so large as to trigger  time-
	    outs in the TLS layer and TCP connections running over the tunnel.

	    OpenVPN allows n to be between 100 bytes/sec and 100 Mbytes/sec.

     --sndbuf size
	    Set  the TCP/UDP socket send buffer size. Defaults to operating sys-
	    tem default.

     --tcp-queue-limit n
	    Maximum number of output packets queued before TCP (default 64).

	    When OpenVPN is tunneling data from a TUN/TAP  device  to  a  remote
	    client over a TCP connection, it is possible that the TUN/TAP device
	    might produce data at a faster rate than the TCP connection can sup-
	    port. When the number of output packets queued before sending to the
	    TCP socket reaches this limit for a given client connection, OpenVPN
	    will start to drop outgoing packets directed at this client.

     --txqueuelen n
	    (Linux only) Set the TX queue length on the TUN/TAP interface.  Cur-
	    rently defaults to operating system default.

     --disable-dco
	    Disables  the opportunistic use of data channel offloading if avail-
	    able.  Without this option, OpenVPN will opportunistically	use  DCO
	    mode  if  the  config  options and the running kernel supports using
	    DCO.

	    Data channel offload currently requires data-ciphers to only contain
	    AEAD ciphers (AES-GCM and  Chacha20-Poly1305)  and	Linux  with  the
	    ovpn-dco module.

	    Note  that	some  options  have no effect or cannot be used when DCO
	    mode is enabled.

	    On platforms that do not support DCO disable-dco has no effect.

UNSUPPORTED OPTIONS
     Options listed in this section have been removed from OpenVPN  and  are  no
     longer supported

     --client-cert-not-required
	    Removed  in  OpenVPN  2.5.	 This  should  be  replaced  with --ver-
	    ify-client-cert none.

     --fast-io
	    Ignored since OpenVPN 2.7. This option became broken due to  changes
	    to the event loop.

     --http-proxy-retry
	    Removed  in  OpenVPN  2.4.	All retries are controlled by --max-con-
	    nect-retry.

     --http-proxy-timeout
	    Removed in OpenVPN 2.4.  Connection timeout is controlled by  --con-
	    nect-timeout.

     --ifconfig-pool-linear
	    Removed  in  OpenVPN  2.5.	 This should be replaced with --topology
	    p2p.

     --key-method
	    Removed in OpenVPN 2.5.  This option should not be	used,  as  using
	    the  old  key-method  weakens  the	VPN  tunnel  security.	 The old
	    key-method was also only needed when the remote side was older  than
	    OpenVPN 2.0.

     --management-client-pf
	    Removed  in  OpenVPN  2.6.	The built-in packet filtering (pf) func-
	    tionality has been removed.

     --max-routes
	    Removed in OpenVPN 2.4.  The limit was removed.

     --ncp-disable
	    Removed in OpenVPN 2.6.  This option mainly served a role  as  debug
	    option when NCP was first introduced.  It should no longer be neces-
	    sary.

     --no-iv
	    Removed  in OpenVPN 2.5.  This option should not be used as it weak-
	    ens the VPN tunnel security.  This has  been  a  NOOP  option  since
	    OpenVPN 2.4.

     --no-replay
	    Removed  in OpenVPN 2.7.  This option should not be used as it weak-
	    ens the VPN tunnel security.  Previously we claimed to have  removed
	    this in OpenVPN 2.5, but this wasn't actually the case.

     --prng
	    Removed  in  OpenVPN 2.6.  We now always use the PRNG of the SSL li-
	    brary.

     --persist-key
	    Ignored since OpenVPN 2.7. Keys  are  now  always  persisted  across
	    restarts.

     --opt-verify
	    Removed  in OpenVPN 2.7.  This option does not make sense anymore as
	    option strings may not match due to the introduction  of  parameters
	    negotiation.

     --socks-proxy-retry
	    Removed  in  OpenVPN  2.4.	All retries are controlled by --max-con-
	    nect-retry.

     --windows-driver
	    Removed in OpenVPN 2.7. OpenVPN will always use ovpn-dco as the  de-
	    fault  driver  on  Windows. It will fall back to tap-windows6 if op-
	    tions are used that are incompatible with ovpn-dco.

CONNECTION PROFILES
     Client configuration files may contain multiple  remote  servers  which  it
     will  attempt to connect against.	But there are some configuration options
     which are related to specific --remote options.  For these use cases,  con-
     nection profiles are the solution.

     By  encapsulating	the  --remote option and related options within <connec-
     tion> and </connection>, these options are handled as a group.

     An OpenVPN client will try each connection profile  sequentially  until  it
     achieves a successful connection.

     --remote-random can be used to initially "scramble" the connection list.

     Here is an example of connection profile usage:

	client
	dev tun

	<connection>
	remote 198.19.34.56 1194 udp
	</connection>

	<connection>
	remote 198.19.34.56 443 tcp
	</connection>

	<connection>
	remote 198.19.34.56 443 tcp
	http-proxy 192.168.0.8 8080
	</connection>

	<connection>
	remote 198.19.36.99 443 tcp
	http-proxy 192.168.0.8 8080
	</connection>

	persist-tun
	pkcs12 client.p12
	remote-cert-tls server
	verb 3

     First we try to connect to a server at 198.19.34.56:1194 using UDP. If that
     fails,  we  then try to connect to 198.19.34.56:443 using TCP. If that also
     fails, then try connecting through an HTTP  proxy	at  192.168.0.8:8080  to
     198.19.34.56:443  using TCP. Finally, try to connect through the same proxy
     to a server at 198.19.36.99:443 using TCP.

     The following OpenVPN options may be used inside of a <connection> block:

     bind, connect-retry, connect-retry-max, connect-timeout,  explicit-exit-no-
     tify,   float,   fragment,  http-proxy,  http-proxy-option,  key-direction,
     link-mtu, local, lport, mssfix,  mtu-disc,  nobind,  port,  proto,  remote,
     rport,   socks-proxy,   tls-auth,	tls-crypt,  tls-crypt-v2,  tun-mtu  and,
     tun-mtu-extra.

     A defaulting mechanism exists for specifying options to apply to all  <con-
     nection>  profiles.  If any of the above options (with the exception of re-
     mote ) appear outside of a <connection> block, but in a configuration  file
     which  has one or more <connection> blocks, the option setting will be used
     as a default for <connection> blocks which follow it in  the  configuration
     file.

     For example, suppose the nobind option were placed in the sample configura-
     tion  file  above,  near the top of the file, before the first <connection>
     block. The effect would be as if nobind were declared in  all  <connection>
     blocks below it.

INLINE FILE SUPPORT
     OpenVPN  allows  including  files	in  the main configuration for the --ca,
     --cert,	--dh,	 --extra-certs,    --key,    --pkcs12,	   --crl-verify,
     --http-proxy-user-pass, --tls-auth, --auth-gen-token-secret, --peer-finger-
     print,  --tls-crypt, --tls-crypt-v2, --verify-hash and --auth-user-pass op-
     tions.

     Each inline file started by the line <option> and ended by the  line  </op-
     tion>

     Here is an example of an inline file usage

	<cert>
	-----BEGIN CERTIFICATE-----
	[...]
	-----END CERTIFICATE-----
	</cert>

     When  using the inline file feature with --pkcs12 the inline file has to be
     base64 encoded. Encoding of a .p12 file into base64 can be done for example
     with OpenSSL by running openssl base64 -in input.p12

SIGNALS
     SIGHUP
	    Cause OpenVPN to close all TUN/TAP and network connections, restart,
	    re-read the configuration file (if any), and reopen TUN/TAP and net-
	    work connections.

     SIGUSR1
	    Like SIGHUP, except don't re-read configuration file,  and	possibly
	    don't  close  and reopen TUN/TAP device, re-read key files, preserve
	    local IP address/port, or preserve most recently  authenticated  re-
	    mote  IP address/port based on --persist-tun, --persist-local-ip and
	    --persist-remote-ip options respectively (see above).

	    This signal may also be internally generated by a timeout condition,
	    governed by the --ping-restart option.

	    This signal, when combined with  --persist-remote-ip,  may	be  sent
	    when  the  underlying  parameters  of  the	host's network interface
	    change such as when the host is a DHCP client and is assigned a  new
	    IP address.  See --ipchange for more information.

     SIGUSR2
	    Causes OpenVPN to display its current statistics (to the syslog file
	    if --daemon is used, or stdout otherwise).

     SIGINT, SIGTERM
	    Causes OpenVPN to exit gracefully.

FAQ
      <https://community.openvpn.net/openvpn/wiki/FAQ>

HOWTO
     The  manual  openvpn-examples(5)  gives some examples, especially for small
     setups.

     For a more comprehensive guide to setting up OpenVPN in a	production  set-
     ting, see the OpenVPN HOWTO at
      <https://openvpn.net/community-resources/how-to/>

PROTOCOL
     An ongoing effort to document the OpenVPN protocol can be found under
      <https://github.com/openvpn/openvpn-rfc>

WEB
     OpenVPN's web site is at  <https://community.openvpn.net/>

     Go here to download the latest version of OpenVPN, subscribe to the mailing
     lists, read the mailing list archives, or browse the Git repository.

BUGS
     Report all bugs to the OpenVPN team  <info@openvpn.net>

SEE ALSO
     openvpn-examples(5),  dhcpcd(8),  ifconfig(8), openssl(1), route(8), scp(1)
     ssh(1)

NOTES
     This  product  includes  software	developed  by  the  OpenSSL  Project   (
     <https://www.openssl.org/> )

     For more information on the TLS protocol see:
      <https://tools.ietf.org/html/rfc2246>

     For more information on the LZO real-time compression library see:
      <https://www.oberhumer.com/opensource/lzo/>

COPYRIGHT
     Copyright	(C) 2002-2025 OpenVPN Inc This program is free software; you can
     redistribute it and/or modify it under the terms of the GNU General  Public
     License version 2 as published by the Free Software Foundation.

AUTHORS
     James Yonan  <james@openvpn.net>

								      OPENVPN(8)

home | help