Provided by: openvpn_2.6.5-0ubuntu1.1_amd64 bug

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 construct 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 double-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 virtual memory.

              If  specified,  this  directive  will   cause   OpenVPN   to   immediately   forget
              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.

              This directive does not affect the --http-proxy username/password.   It  is  always
              cached.

       --cd dir
              Change directory to dir prior to reading any files such as configuration 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 therefore 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-chroot context.

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

              Note:  The  SSL  library will probably need /dev/urandom to be available 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 OpenVPN to  be  more
              compatible  with  the  version  version  specified.  All of the changes this option
              applies can also be achieved using individual 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-ciphers.

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

              • 2.3.6 or  lower:  --tls-version-min  1.0  is  added  to  the  configuration  when
                --tls-version-min is not explicitly set.

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

       --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  escaping  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 pathnames:

                 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  initialization  are
              non-fatal.

              Note:  as  soon as OpenVPN has daemonized, it can not ask for usernames, passwords,
              or key pass phrases anymore. This has certain consequences,  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 consequence 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 configurations that do not
              use TLS.

              Don't output a warning message  if  option  inconsistencies  are  detected  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.

       --fast-io
              (Experimental)  Optimize  TUN/TAP/UDP  I/O   writes   by   avoiding   a   call   to
              poll/epoll/select  prior  to  the write operation. The purpose of such a call would
              normally be to block until the device or socket is ready to accept the write.  Such
              blocking is unnecessary on some platforms which don't support write blocking on UDP
              sockets or TUN/TAP devices. In such cases, one  can  optimize  the  event  loop  by
              avoiding the poll/epoll/select call, improving CPU efficiency by 5% to 10%.

              This option can only be used on non-Windows systems, when --proto udp is specified,
              and when --shaper is NOT specified.

       --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 configuration file the
              configuration file parsing does not fail if this OpenVPN version does  not  support
              the  option.  Multiple  --ignore-unknown-option  options  can be given to support a
              larger number of options 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 command.  May be used
              in order to execute OpenVPN in unprivileged environment.

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

              Valid syntax:

                 keying-material-exporter label len

              Note that exporter labels have the potential to collide with existing  PRF  labels.
              In order to prevent this, labels MUST begin with EXPORTER.

       --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 enforced are
              OS-dependent. On Linux the default limit that  an  unprivileged  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 depending 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 configured.  100 Mb is somewhat arbitrary - it is
              enough for a moderately-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).

       --persist-key
              Don't re-read key files across SIGUSR1 or --ping-restart.

              This option can be combined with --user to allow restarts triggered by the  SIGUSR1
              signal.  Normally  if  you  drop  root  privileges in OpenVPN, the daemon cannot be
              restarted since it will now be unable to re-read protected key files.

              This option solves the problem by persisting keys across SIGUSR1  resets,  so  they
              don't need to be re-read.

       --providers providers
              Load  the  list of (OpenSSL) providers. This is mainly useful for using 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 occurs.

       --script-security level
              This directive  offers  policy-level  control  over  OpenVPN's  usage  of  external
              programs  and  scripts.  Lower level values are more restrictive, 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  indicated  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 external 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 backslashes (\) 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 provides 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, unfortunately do not protect  against  privilege  escalation  by
              exploitation  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 allow 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 really consider using the
              --persist-key and --persist-tun options.

       --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 signal.

              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 capability  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  decrypting  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 --secret key

              or

                 openvpn --test-crypto --secret key --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.

       --tmp-dir dir
              Specify a directory dir for temporary files. This directory will be used by openvpn
              processes  and script to communicate temporary data with openvpn main process. Note
              that the directory must be writable by the OpenVPN process  after  it  has  dropped
              it's root privileges.

              This directory will be used by in the following cases:

              • --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  success/failure  via
                auth_control_file  when  using  deferred auth method and pending authentification
                via pending_auth_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 entropy 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  initialization,  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 features make this unlikely, it is provided as a second line of
              defense.

              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 reset 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  --persist
              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 unpriviledged 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 redirected 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 appends 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 warnings 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  additional
                     information on debug levels).

   Protocol options
       Options in this section affect features available in the OpenVPN wire protocol.   Many  of
       these  options  also define the encryption options of the data channel in the OpenVPN wire
       protocol.  These options must be configured 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.

              Valid syntaxes:

                 allow-compression
                 allow-compression mode

              The mode argument can be one of the following values:

              asym   OpenVPN  will  only  decompress  downlink  packets  but  not compress uplink
                     packets.  This also allows migrating to disable  compression  when  changing
                     both server and client configurations to remove compression at the same time
                     is not a feasible option.

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

              yes    OpenVPN will send and receive compressed packets.

       --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 authentication 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
              http://www.cs.ucsd.edu/users/mihir/papers/hmac.html

       --cipher alg
              This option should not be used any longer in TLS mode  and  still  exists  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 configured 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  and  will  only  control  the  cipher  for
              --secret  pre-shared-key  mode  (note:  this  mode  is  deprecated and strictly not
              recommended).

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

              To see ciphers that are available with OpenVPN, use the --show-ciphers 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, migrate or empty.
              LZO and LZ4 are different compression algorithms, with LZ4 generally  offering  the
              best performance with least CPU usage.

              The  lz4-v2  and  stub-v2  variants  implement  a  better framing that does not add
              overhead when packets cannot be compressed. All other variants 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  options  to  no  compression.   This
              option sets the server to no compression 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 compression 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 secret if compression is enabled. See e.g.  the  CRIME
              and  BREACH  attacks  on  TLS  and  VORACLE  on  VPNs  which also leverage to break
              encryption. If you are not entirely sure that the above  does  not  apply  to  your
              traffic, you are advised to not enable compression.

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

              Use  LZO  compression  --  may add up to 1 byte per packet for incompressible data.
              mode may be yes, no, or adaptive (default).

              In a server mode setup, it is possible to selectively turn compression  on  or  off
              for individual clients.

              First,  make  sure  the  client-side  config  file enables selective compression by
              having at least one --comp-lzo directive, such as --comp-lzo no. This will turn off
              compression  by  default,  but  allow  a  future  directive push from the server to
              dynamically change the on/off/adaptive setting.

              Next in a --client-config-dir file, specify the compression setting for the client,
              for example:

                 comp-lzo yes
                 push "comp-lzo yes"

              The  first  line  sets  the  comp-lzo  setting for the server side of the link, the
              second sets the client side.

       --comp-noadapt
              DEPRECATED When used in conjunction  with  --comp-lzo,  this  option  will  disable
              OpenVPN's adaptive compression algorithm. Normally, adaptive compression is enabled
              with --comp-lzo.

              Adaptive compression tries to optimize the case where you have compression enabled,
              but  you  are sending predominantly incompressible (or pre-compressed) packets over
              the tunnel, such as an FTP or rsync transfer of  a  large,  compressed  file.  With
              adaptive  compression,  OpenVPN will periodically sample the compression process to
              measure its efficiency.  If  the  data  being  sent  over  the  tunnel  is  already
              compressed,  the  compression  efficiency  will  be very low, triggering openvpn to
              disable compression for a period of time until the next re-sample test.

       --key-direction
              Alternative way of specifying the optional direction parameter for  the  --tls-auth
              and --secret options. 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 cipher-list.
              cipher-list   is   a   colon-separated   list   of   ciphers,   and   defaults   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 supported 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 configuration) supports
              it.

              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  connection  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 already 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 renamed 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  determine  which
              cipher the peer is willing to use.

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

       --secret args
              DEPRECATED  Enable Static Key encryption mode (non-TLS). Use pre-shared secret file
              which was generated with --genkey.

              Valid syntaxes:

                 secret file
                 secret file direction

              The optional direction parameter enables the use of  4  distinct  keys  (HMAC-send,
              cipher-encrypt, HMAC-receive, cipher-decrypt), so that each data flow direction has
              a different set of HMAC and cipher keys. This has a number  of  desirable  security
              properties including eliminating certain kinds of DoS and message replay attacks.

              When  the  direction parameter is omitted, 2 keys are used bidirectionally, one for
              HMAC and the other for encryption/decryption.

              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.

              Static  key  encryption  mode  has  certain  advantages,  the primary being ease of
              configuration.

              There are no certificates or certificate  authorities  or  complicated  negotiation
              handshakes  and  protocols.  The  only  requirement is that you have a pre-existing
              secure channel with your peer (such  as  ssh)  to  initially  copy  the  key.  This
              requirement,  along  with  the fact that your key never changes unless you manually
              generate a new one, makes it somewhat less secure than TLS mode (see below). If  an
              attacker  manages  to steal your key, everything that was ever encrypted with it is
              compromised. Contrast that to the perfect forward  secrecy  features  of  TLS  mode
              (using  Diffie  Hellman  key exchange), where even if an attacker was able to steal
              your private key, he would gain no information to help him decrypt past sessions.

              Another advantageous aspect  of  Static  Key  encryption  mode  is  that  it  is  a
              handshake-free  protocol without any distinguishing signature or feature (such as a
              header or protocol handshake sequence) that would mark the  ciphertext  packets  as
              being  generated by OpenVPN. Anyone eavesdropping on the wire would see nothing but
              random-looking data.

       --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.

   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  limited  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   possibility   to  replace  the  clients  password  with  an
              authentication token 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 OPENVPN_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 reconnect 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 authentication token then the client will receive  an  AUTH_FAILED  and
              disconnect.

              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 replaces 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 to override the username used
              by the client when reauthenticating with the auth-token.  It  also  allows  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 console.

              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 errors 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 unattended 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 OpenVPN'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 numbering 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|exclude-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 addresses need to be enclosed in brackets if a port is
              appended.

              The  resolve-domains and exclude-domains options take one or more DNS domains which
              are explicitly resolved or explicitly not resolved by a server.  Only  one  of  the
              options  can  be  configured  for  a  server.   resolve-domains is used to define a
              split-dns setup, where only given domains are resolved by a server. exclude-domains
              is  used  to  define domains which will never be resolved by a server (e.g. domains
              which can only be resolved locally). Systems which do not support fine grained  DNS
              domain configuration, will ignore these settings.

              The  dnssec  option  is  used to configure validation of DNSSEC records.  While the
              exact semantics may differ for resolvers on different  systems,  yes  likely  makes
              validation mandatory, no disables it, and optional 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 configuration 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 directive.  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 message. 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 number of  attempts
              that  the  client  will try to resend the exit notification message if messages are
              sent in data-channel mode.

              In UDP server mode, send RESTART control channel command to connected 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 incoming  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.

       --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 protocol, 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).  However, 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 filters 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  include,  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 reconnect, unless
              multiple remotes are specified and connection  to  the  next  remote  succeeds.  To
              silently ignore an option pushed by the server, use ignore.

       --push-peer-info
              Push  additional  information  about  the  client  to server. The following 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_LZO_STUB=1
                     If client was built with LZO stub capability

              IV_LZ4=1
                     If the client supports LZ4 compressions.

              IV_PROTO
                     Details about protocol extensions that the peer supports. The variable is  a
                     bitfield and the bits are defined as follows (starting a bit 0 for the first
                     (unused) bit:

                     • 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  arguments  to  the
                       AUTH_PENDING message.

              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_CIPHERS=<ncp-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 maximum 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.

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

              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 session and preferably
                     re-installations and upgrades.

              IV_SSL=<version string>
                     The ssl 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.

              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 indicates 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 redundancy, each
              referring to a different OpenVPN server, in the order  specified  by  the  list  of
              --remote  options.  Specifying  multiple  --remote  options  for  this purpose is a
              special case of the more general connection-profile feature. See  the  <connection>
              documentation below.

              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  dropping  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
                     interface. This could cause the client to exit with a fatal error.

              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 connections from
              any host which does not match host.

              If host is a DNS name which resolves to multiple IP  addresses,  OpenVPN  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  specification  (4/6  suffix),  OpenVPN  will  try both IPv4 and IPv6
              addresses, 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  connections.  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 create 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  seconds  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

              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.

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

       --show-proxy-settings
              Show  sensed  HTTP or SOCKS proxy settings. Currently, only Windows clients support
              this option.

       --http-proxy args
              Connect to remote host through an HTTP proxy.  This requires at  least  an  address
              server  and  port argument.  If HTTP Proxy-Authenticate is required, a file name to
              an authfile file containing a username 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 section on inline files)

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

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

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

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

              Examples:

                 http-proxy proxy.example.net 3128
                 http-proxy proxy.example.net 3128 authfile.txt
                 http-proxy proxy.example.net 3128 stdin
                 http-proxy proxy.example.net 3128 auto basic
                 http-proxy proxy.example.net 3128 auto-nct ntlm

       --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 options.

              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 OpenVPN client will pass this  token  instead  of
              the  users password. On the server side the server will do the token authentication
              internally and it will NOT do any  additional  authentications  against  configured
              external user/password authentication mechanisms.

              The  tokens  implemented by this mechanism include an initial timestamp 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 * renewal-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
              reneweal-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  authentications  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 variable 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 username 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 authentication is called it  needs  to  also
              indicate  a success or failure of the authentication. It is strongly recommended to
              return an authentication 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  success   will   lead   to
              authentication  bypass  (as  does  returning  success  on  a  wrong password from a
              script).

       --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 random 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/password.  Normally,
              when --auth-user-pass-verify  or  --management-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
              username/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 certificate 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  connecting  client
              has  been  authenticated, OpenVPN will look in this directory 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.

       --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 connecting.  Don't use
              this option to disable a client due to  key  or  password  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  scenario,  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 OpenVPN daemon can be abused in
              reflection attacks.  This option is designed 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 common name.

       --ifconfig-pool args
              Set  aside  a  pool  of  subnets to be dynamically allocated to connecting 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,  individual  addresses  will be
              allocated, and the optional netmask parameter 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 address 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 between clients
              (denoted by their common name) and the virtual IP address 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 <Common-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 suggestions only,
              based on past associations between a common name  and  IP  address.   They  do  not
              guarantee  that  the given common name will always receive the given IP address. If
              you want guaranteed assignment, use --ifconfig-push

       --ifconfig-push args
              Push virtual IP endpoints for client tunnel, overriding the --ifconfig-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
              connection.

              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).

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

              Valid syntax:

                 ifconfig-ipv6-push ipv6addr/bits ipv6remote

       --multihome
              Configure a multi-homed UDP server. This option needs to be used when a server  has
              more than one IP address (e.g. multiple interfaces, or secondary IP addresses), and
              is not using --local to force binding to one specific  address  only.  This  option
              will add some extra 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.

                     • If you do an IPv6+IPv4 dual-stack bind on a Linux  machine  with  multiple
                       IPv4 address, connections to IPv4 addresses will not work right on kernels
                       before 3.15, due to missing kernel support for the IPv4-mapped case  (some
                       distributions have ported this to earlier kernel versions, though).

       --iroute args
              Generate an internal route to a specific client. The netmask parameter, 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 routing table  as  well  (such  as  by  using  the
              --route  directive).  The  reason  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 directive 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 order 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.

       --opt-verify
              DEPRECATED Clients that connect with options that are incompatible  with  those  of
              the server will be disconnected.

              Options  that  will  be  compared  for  compatibility  include  dev-type, link-mtu,
              tun-mtu, proto,  ifconfig,  comp-lzo,  fragment,  keydir,  cipher,  auth,  keysize,
              secret, no-replay, tls-auth, key-method, tls-server and tls-client.

              This option requires that --disable-occ NOT be used.

       --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 application, 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 N  is  the
              source  IP:port  of  the  client  connection  and  C  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 cannot be pushed because
              the client needs to know them before the connection 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-key,   --persist-tun,   --echo,   --comp-lzo,  --socket-flags,  --sndbuf,
              --rcvbuf, --session-timeout

       --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  ...   statements,  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 'ifconfig-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  options  from  the
              list of to-be-pushed options.  In many cases, some of these options will need to be
              re-configured afterwards - specifically, --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 OpenVPN's server mode.
              This directive will set up an OpenVPN  server  which  will  allocate  addresses  to
              clients  out  of  the  given  network/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 configurations.

              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 bridging capability to
              bridge  the  TAP  interface with the ethernet NIC interface.  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 interface.  The gateway
              and  netmask  parameters  to --server-bridge can be set to either the IP/netmask of
              the bridge interface, or the  IP/netmask  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 interval).

              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  happens 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 certificate.

              Possible mode options are:

              none   A client certificate is not required. the client needs to authenticate 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 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.

                     --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 authenticated 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 require) 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, depending 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 Control 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-config-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-another, 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, OpenVPN accepts any
              Ethernet frame and does not perform any special processing 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) packets are tagged
              with 1 by default.

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

              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 untagged and --vlan-accept all modes.

              Valid values for v go from 1 through to 4094. The global value defaults 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 "Native VLAN".

ENCRYPTION OPTIONS

   SSL Library information
       --show-ciphers
              (Standalone) Show all cipher algorithms to use with the --cipher option.

       --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 acceleration 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 keyfile 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
                --secret, --tls-auth or --tls-crypt options.

                Syntax:

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

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

                If  using  this  for  --secret,  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 timestamp representing
                the current time in UTC, encoded in network order, as metadata for the  generated
                key.

                A  tls-crypt-v2  client  key  is wrapped using a server key. To generate 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 verification 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 (disabled by default
              with an exception, see below). OpenVPN allows the lifetime of a key to be expressed
              as  a  number  of  bytes  encrypted/decrypted,  a number of packets, or a number of
              seconds. A key renegotiation will be forced if any of these three criteria are  met
              by either 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 attack vector. For more information see the --cipher option.

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

       --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-uniform-randomized
              between min and max.

              With  the  default  value of 3600 this results in an effective per session 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
              seconds. 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 channel, over which encrypted tunnel data passes, is forwarded without any mediation.
       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 forward secrecy.

       To  use  TLS  mode,  each peer that runs OpenVPN should have its own local certificate/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 certificate which was signed by the
       master root certificate as specified in --ca.

       If that check on both peers succeeds, then the TLS negotiation will succeed, both  OpenVPN
       peers will exchange temporary session keys, and the tunnel 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 password. The --askpass option allows  you  to  start
              OpenVPN  from  the  command  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 certificates 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 extent 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 certificate 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  sample   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 available 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 missing, but the  connection  will
              be allowed.

       --cert file
              Local  peer's  signed certificate in .pem format -- must be signed by a certificate
              authority whose certificate is in --ca file. 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 machine (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 initially generated
              the .csr file (this can be over a public medium). Note that the openssl ca  command
              reads  the  location  of  the certificate authority key from its configuration file
              such as /usr/share/ssl/openssl.cnf -- note  also  that  for  certificate  authority
              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  certificate to the CRL file, you could reject any
              connection which attempts 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 compromised.

              The option is not mandatory - if the relevant CRL is missing, OpenVPN  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 requests 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  connects,  if  you
                     are  dropping  root  privileges  with  --user,  make sure that this user has
                     sufficient privileges to read the file.

       --dh file
              File containing Diffie Hellman parameters in .pem format (required for --tls-server
              only).

              Set  file  to none to disable Diffie Hellman key exchange (and use ECDH only). 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+).

              Use openssl dhparam -out dh2048.pem 2048 to generate 2048-bit DH parameters. Diffie
              Hellman parameters may be considered public.

       --ecdh-curve name
              Specify the curve to use for elliptic curve Diffie Hellman. Available 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  together)  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
              Local peer's private key in .pem format. Use the private key  which  was  generated
              when you built your peer's certificate (see --cert file above).

       --pkcs12 file
              Specify  a  PKCS #12 file containing local private key, local certificate, 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 certificate 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  connect  to  another  client  by
              impersonating  the  server. The attack is easily prevented by having clients verify
              the server certificate using  any  one  of  --remote-cert-tls,  --verify-x509-name,
              --peer-fingerprint 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  OpenVPN's  TCP/UDP
              port,  where TLS control channel packets bearing an incorrect 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+).

              See the --secret option for more information on the optional direction parameter.

              --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. During 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 packets it is sending. Most successful network attacks  today  seek  to  either
              exploit  bugs  in  programs (such as buffer overflow attacks) or force a program to
              consume so many resources that it becomes unusable. Of course  the  first  line  of
              defense  is  always  to  produce clean, well-audited code. OpenVPN has been written
              with buffer overflow 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  immediately  upon reception, before they have a chance to consume
              additional 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 authenticate 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  specifying  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 improperly 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-ciphers, --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 (":").

              These setting can be used to ensure that certain cipher suites  are  used  (or  not
              used)  for the TLS connection. OpenVPN uses TLS to secure the control channel, over
              which the keys that are used to protect 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 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 DEFAULT:!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 authenticate and encrypt
              control  channel  messages.  To ensure that IV collisions 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)negotiations 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 protection 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  allows  older  tls-crypt-v2  clients.  The   default   is   (currently)
              allow-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 administrators 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:

              • script_type is set to tls-crypt-v2-verifymetadata_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 contains the client
                metadata.

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

       --tls-exit
              Exit on TLS negotiation failure.

       --tls-export-cert directory
              Store the certificates the clients use upon connection to this directory. This will
              be  done  before --tls-verify is called. The certificates will use a temporary name
              and will be deleted when the tls-verify script returns. The file name used for  the
              certificate is available via the peer_cert environment variable.

       --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 acknowledgment from remote
              within n seconds (default 2). When OpenVPN sends a control packet to its  peer,  it
              will  expect  to  receive an acknowledgement within n seconds or it will retransmit
              the packet, subject to a TCP-like exponential  backoff  algorithm.  This  parameter
              only  applies  to  control  channel  packets.  Data  channel  packets  (which carry
              encrypted tunnel data) are  never  acknowledged,  sequenced,  or  retransmitted  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 version 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 verification 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 defaults 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 connections to
              Server-1, Server-2, etc.

              --verify-x509-name is a useful replacement for the --tls-verify  option  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  (Certificate
              Revocation  List)  on  the  client,  since  it  allows  the  client  to  refuse all
              certificates except for those associated with designated 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 commercial 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.  Values
              will  be encoded as X509_<depth>_<attribute>=<value>. Multiple --x509-track options
              can be defined to track multiple attributes.

       --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  either  of  the
              following:

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

              The first example uses the value of the emailAddress attribute in the certificate's
              Subject field as the username. The second example uses the ext: prefix  to  signify
              that  the  X.509  extension  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 representation 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  serialNumber  X.509
              attribute are supported.

              Please  note:  This  option  has  a  feature  which  will  convert an all-lowercase
              fieldname to uppercase characters, e.g., ou -> OU. A mixed-case  fieldname  or  one
              having  the  ext:  prefix  will  be  left as-is. This automatic upcasing feature is
              deprecated and will be removed in a future release.

              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 gotten by the
              standalone --show-pkcs11-ids option. See also the description 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 certificate 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  operations.   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 objects.

              If p11-kit is present on the system, the provider argument is optional; 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 order of the
       ciphers of the server's --data-ciphers is used to pick the 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 negotiation failed (no
          shared cipher)

       OpenVPN 2.5 and later will  only  allow  the  ciphers  specified  in  --data-ciphers.   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
       available.

       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 implementation 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-disable  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/openvpn/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 --enable-small  ./configure
       argument, using data-ciphers-fallback cipher in the server config file with  the  explicit
       cipher used by the client is necessary.

   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-ciphers  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 compatibility 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 --enable-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 OpenVPN 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 network 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  introduced  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 resort 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  internal
              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 received 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  unless  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 host
              Local  host  name  or  IP address for bind. If specified, OpenVPN will bind to this
              address only. If unspecified, OpenVPN will bind to all interfaces.

       --lport port
              Set local TCP/UDP port number or  name.  Cannot  be  used  together  with  --nobind
              option.

       --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 implements 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  encapsulated  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 version 2.6.0.

              If the mtu parameter is not specified, 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.  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 inherits 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  protocol  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 configuration.

       --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 various 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 packets are not echoed like  IP  ping  packets).
              When  used  in  one  of  OpenVPN's  secure  modes  (where --secret, --tls-server or
              --tls-client is specified), the ping packet will be cryptographically secure.

              This option has two intended uses:

              1. Compatibility with stateful firewalls. The periodic  ping  will  ensure  that  a
                 stateful  firewall  rule  which allows OpenVPN UDP packets 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 seconds 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  internally
              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 normally cause a restart, will cause the deletion of
              the client instance 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 replacement 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  --persist-tun,
              --persist-key, --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 --connect-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 capability is provided
              for situations where UDP cannot be used. In comparison 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:
              http://sites.inka.de/sites/bigred/devel/tcp-tcp.html

              There  are  certain  cases,  however,  where  using  TCP may be advantageous 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 versions 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 (unless --no-replay is specified, which disables
                 replay protection altogether).

              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 sequence 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 encapsulated  protocol
              from  attacks  which  masquerade  as the kinds of normal 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 message 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 preferred 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 received 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 either --secret (shared-secret key mode) or TLS mode with --tls-auth.

       --session-timeout n
              Raises  SIGTERM  for the client instance after n seconds since the beginning 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 immediately 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  restricted  to values between 154 and 2048. The maximum packet size
              includes 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,  followed 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 routing.

       --bind-dev device
              (Linux only) Set device to  bind  the  server  socket  to  a  Virtual  Routing  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 device.

              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 dependent.

              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 instance-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), OpenVPN 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 and --windows-driver.

       --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.

       --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 directly by OpenVPN if dhcp is  disabled  or  the
              wintun  driver  is  in  use.  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-options 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 existing 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 addresses.

              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).  Repeat 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  NetBIOS  name,  making  the name unique. (This description of
                     NetBIOS 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 connections (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 ethernet segments, or
              TUN devices in --topology subnet mode (which create virtual "multipoint networks"),
              --ifconfig is used to set an IP address 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 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 different 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 --ifconfig  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 conflicts which
              occasionally annoy more experienced users by triggering "false positive" warnings.

       --lladdr address
              Specify the link layer address, more commonly  known  as  the  MAC  address.   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.

       --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 (derived 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 connected 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-local) 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.

              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 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 keywords:

              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 m

              Delay n seconds (default 0) after connection establishment, before  adding  routes.
              If  n  is  0,  routes  will  be added immediately upon connection establishment. If
              --route-delay is omitted, routes will be added  immediately  after  TUN/TAP  device
              open  and  --up  script execution, 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 by default) 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 syntax:

                 route-ipv6 ipv6addr/bits [gateway] [metric]

              The gateway parameter is only used for IPv6  routes  across  tap  devices,  and  if
              missing, the ipv6remote field from --ifconfig-ipv6 or --route-ipv6-gateway is used.

       --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 manually pushed to clients. Like the --dev directive,
              this directive must always be compatible between client and server.

              mode can be one of:

              net30  Use a point-to-point topology, by allocating one /30 subnet per client. This
                     is  designed  to  allow  point-to-point  semantics  when  some or all of the
                     connecting clients might be Windows systems. This is the default.

              p2p    Use a point-to-point topology where the remote endpoint of the client's  tun
                     interface always points to the local endpoint of the server's tun interface.
                     This mode allocates a single IP address per connecting client. Only use when
                     none of the connecting clients are Windows systems.

              subnet Use  a  subnet  rather than a point-to-point topology by configuring 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.

              Note: Using --topology subnet  changes  the  interpretation  of  the  arguments  of
              --ifconfig to mean "address netmask", no longer "local remote".

       --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 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-max-mtu 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  increasing  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 additional 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  period  of  time  that  an
              application  has  them  open.  This  option takes advantage of the TUN/TAP driver's
              ability to build persistent tunnels 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 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 automatically
              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 recommended.

       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  traffic  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 replacement 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/Virtual_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-fortgeschrittene-helle-und-dunkle-magie-im-linuxnetzwerkstack

          • Video                                                                       (german):
            https://media.ccc.de/v/froscon2018-2247-l2_l3_fur_fortgeschrittene_-_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.  --up

           Executed after TCP/UDP socket bind and TUN/TAP open.

       2.  --tls-verify

           Executed when we have a still untrusted remote peer.

       3.  --ipchange

           Executed after connection authentication, or remote IP address change.

       4.  --client-connect

           Executed in --mode server mode immediately after client authentication.

       5.  --route-up

           Executed after connection authentication, either immediately after, or some number  of
           seconds after as defined by the --route-delay option.

       6.  --route-pre-down

           Executed right before the routes are removed.

       7.  --client-disconnect

           Executed in --mode server mode on client instance shutdown.

       8.  --down

           Executed after TCP/UDP and TUN/TAP close.

       9.  --learn-address

           Executed  in --mode server mode whenever an IPv4 address/route or MAC address is added
           to OpenVPN's internal routing table.

       10. --auth-user-pass-verify

           Executed in --mode server mode on new client connections, when  the  client  is  still
           untrusted.

       11. --client-crresponse
              Execute in --mode server whenever a client sends a CR_RESPONSE message

   SCRIPT HOOKS
       --auth-user-pass-verify args
              Require the client to provide a username/password (possibly in addition to a client
              certificate) for authentication.

              Valid syntax:

                 auth-user-pass-verify cmd method

              OpenVPN will run command cmd to validate  the  username/password  provided  by  the
              client.

              cmd  consists of a path to a 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.

              If method is set to via-env, OpenVPN will call cmd with the environmental 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  automatically  deleted  by  OpenVPN  after  the  script
              returns.  The location of the temporary file is controlled by the --tmp-dir option,
              and will default to the current directory if unspecified.  For  security,  consider
              setting  --tmp-dir  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 operation to continue  the  authentication  in  the  background.  When
              finshing  the authentication, a 1 or 0 must be written to the file specified 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 shortened.

              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  addresses
              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 characters except for CR or LF. Any illegal characters  in  either
              the username 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
              sample-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 be 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-verify`` 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), 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.

              The  command  is  passed  the  common name and IP address of the just-authenticated
              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 arguments specified in cmd ), to be used by the command to pass
              dynamically 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 returns  a  non-zero
              error status, it will cause the client to be disconnected.

              If  a  --client-connect wants to defer the generating of the configuration then the
              script needs to use the client_connect_deferred_file and client_connect_config_file
              environment  variables,  and  write  status  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 defined) 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 succeeded, 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).

       --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 authenticated or changes.

              cmd consists of a path to a 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.

              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 parameters 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 current address of the peer. The script  will  be
              run every time the remote 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-establish  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), 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.

              Three arguments will be appended to any arguments in cmd as follows:

              $1 - [operation]
                     "add", "update", or "delete" based on whether or not the  address  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), 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.

              See the Environmental Variables section below for additional parameters  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), 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.

              See  the  Environmental Variables section below for additional parameters 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 malicious 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 occurs 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), 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.

              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 certificate 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 parameters passed as
              environmental variables.

       --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), 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.

              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 parameters  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  instance  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 routing and gateways will not be
                     passed, as nothing needs to be done  anyway  -  all  the  routing  setup  is
                     already  in  place.  Additionally,  the  up-restart script will run with the
                     downgraded 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 security reasons, don't run the
              following example unless UDP port 9999 is  blocked  by  your  firewall.  Also,  the
              example will run indefinitely, 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 automatically 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 local 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  transitioning  to
              "connected"   until  connection  establishment,  i.e.  the  receipt  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?
              Yes, by using the --no-name-remapping option, however this should be considered  an
              advanced option.

       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 return true.

       Common Names
              Alphanumeric, underbar ('_'), dash ('-'), dot ('.'), and at ('@').

       --auth-user-pass username
              Same as Common Name, with one exception: starting with OpenVPN 2.0.1, 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 ('-'), and dot ('.') except for "."  or ".." as
              standalone strings. As of v2.0.1-rc6, the at ('@') character has been added as well
              for compatibility with the common name character class.

       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,

       As  of  OpenVPN  2.0-beta12,  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  argument  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 deferred 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_config_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 execution 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 interface names). Set prior to --up  or
              --down script execution.

       dns_*  The  --dns configuration options will be made available to script 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 documentation 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}_exclude_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 support it, such as
              --dhcp-option  on  a  non-Windows  system,  will  be recorded to this environmental
              variable sequence prior to --up script execution.

       ifconfig_broadcast
              The broadcast address for the virtual ethernet segment which is  derived  from  the
              --ifconfig option when --dev tap 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_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 occurs prior to --up script execution.

       ifconfig_ipv6_remote
              The remote VPN endpoint  IPv6  address  specified  in  the  --ifconfig-ipv6  option
              (second  parameter).  Set  prior  to OpenVPN calling the ifconfig or netsh (windows
              version of ifconfig) commands which normally 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  option  (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 execution.

       ifconfig_pool_local_ip
              The local virtual IP address for the TUN/TAP tunnel taken from  an  --ifconfig-push
              directive  if  specified,  or  otherwise  from the ifconfig 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_netmask
              The virtual IP netmask  for  the  TUN/TAP  tunnel  taken  from  an  --ifconfig-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_remote_ip
              The remote virtual IP address for the TUN/TAP tunnel taken from an  --ifconfig-push
              directive  if  specified,  or  otherwise  from the ifconfig 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.

       link_mtu
              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 modifier is specified, and deleted from  the
              environment after the script returns.

       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 program 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_network_{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.

       peer_cert
              Temporary file name containing the client certificate upon connection.   Useful  in
              conjunction with --tls-verify.

       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-connect,  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  (controlled  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  disconnecting.  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 execution 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 execution 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  decimal  string  like  "933971680",
              which is suitable for doing serial-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 example.

       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  authenticated.  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  authenticated.  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 instead.

       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 modifier 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.

                 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  --management-client-user  and
              --management-client-group directives to restrict access.

              The management interface provides a special mode where the TCP management link  can
              operate  over the tunnel itself. To enable this mode, set IP to tunnel. Tunnel mode
              will cause the management interface 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  (localhost)  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
              management-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 management-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-CERTIFICATE    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 complete 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  management  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 channel 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 defines 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 directory 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/openvpn/plugin.  The
              documentation is in doc and the actual plugin modules 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 authentication 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  provide  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  authentication.   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-enabled 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  unsupported  on
              Windows  XP,  resulting  in  fatal  error.  You  may  want  to  use --setenv opt or
              --ignore-unknown-option (not suitable for Windows 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 certificate'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"

              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 option 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 Connected", you may need this flag.

       --ip-win32 method
              When using --ifconfig on Windows, set the TAP-Win32 adapter IP address 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 properties 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 subnet 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 remote 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 address + 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 Windows 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 Windows IP Helper
                     API. This approach  does  not  have  ideal  semantics,  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 trying 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 Windows 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 initiation. 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 another  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  option,  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/error 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 address 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 environment 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.

       --windows-driver drv
              Specifies which tun driver to use. Values are ovpn-dco (default), tap-windows6  and
              wintun. ovpn-dco and wintun require --dev tun. wintun also requires OpenVPN process
              to run elevated, or be invoked using the Interactive Service.

   Standalone Debug Options
       --show-gateway args
              (Standalone) Show current IPv4 and IPv6 default gateway and interface  towards  the
              gateway (if the protocol in question is enabled).

              Valid syntax:

                 --show-gateway
                 --show-gateway IPv6-target

              For  IPv6  this  queries  the  route  towards  ::/128, or the specified IPv6 target
              address if passed as argument.  For IPv4 on Linux, Windows, MacOS and BSD it  looks
              for  a  0.0.0.0/0  route.   If  there are more specific routes, the result will not
              always be matching the route of the IPv4 packets to the VPN gateway.

   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 address 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 number 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 option 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 second), you should
              probably use lower MTU values as well (see above),  otherwise  the  packet  latency
              will  grow  so  large  as  to trigger timeouts 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 system 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 support. 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.  Currently  defaults
              to operating system default.

       --disable-dco
              Disables  the  opportunistic  use of data channel offloading if available.  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 replaxed with --verify-client-cert none.

       --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) functionality has  been
              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 necessary.

       --no-iv
              Removed in OpenVPN 2.5.  This option should not be  used  as  it  weakens  the  VPN
              tunnel security.  This has been a NOOP option since OpenVPN 2.4.

       --no-replay
              Removed  in  OpenVPN  2.5.   This  option  should not be used as it weakens the VPN
              tunnel security.

       --ns-cert-type
              Removed in OpenVPN 2.5.  The nsCertType field is  no  longer  supported  in  recent
              SSL/TLS  libraries.   If  your certificates does not include key usage and extended
              key usage fields, they must be upgraded and the --remote-cert-tls option should  be
              used instead.

       --prng Removed in OpenVPN 2.6.  We now always use the PRNG of the SSL library.

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, connection profiles are the solution.

       By   enacpulating  the  --remote  option  and  related  options  within  <connection>  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-key
          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-notify,  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,  tun-mtu
       and, tun-mtu-extra.

       A  defaulting  mechanism  exists  for  specifying  options  to  apply  to all <connection>
       profiles. If any of the above options (with the exception of remote ) 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 configuration 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,   --secret,   --crl-verify,    --http-proxy-user-pass,
       --tls-auth,  --auth-gen-token-secret,  --peer-fingerprint, --tls-crypt, --tls-crypt-v2 and
       --verify-hash options.

       Each inline file started by the line <option> and ended by the line </option>

       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 network 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 remote IP address/port based on --persist-tun,
              --persist-key, --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  setting,  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 http://www.ietf.org/rfc/rfc2246.txt

       For    more    information    on    the    LZO    real-time    compression   library   see
       https://www.oberhumer.com/opensource/lzo/

COPYRIGHT

       Copyright (C) 2002-2020 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)