Go to the documentation of this file.
33 #ifdef HAVE_CONFIG_VERSION_H
34 #include "config-version.h"
69 #ifdef CONFIGURE_GIT_REVISION
70 " [git:" CONFIGURE_GIT_REVISION CONFIGURE_GIT_FLAGS
"]"
73 #if defined(ENABLE_CRYPTO_MBEDTLS)
75 #elif defined(ENABLE_CRYPTO_OPENSSL)
87 #ifdef ENABLE_COMP_STUB
94 #ifdef PRODUCT_TAP_DEBUG
100 #if ENABLE_IP_PKTINFO
101 #if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST)
103 #elif defined(IP_RECVDSTADDR)
111 #ifdef CONFIGURE_GIT_REVISION
112 " built on " __DATE__
122 "--config file : Read configuration options from file.\n"
123 "--help : Show options.\n"
124 "--version : Show copyright and version information.\n"
127 "--local host : Local host name or ip address. Implies --bind.\n"
128 "--remote host [port] : Remote host name or ip address.\n"
129 "--remote-random : If multiple --remote options specified, choose one randomly.\n"
130 "--remote-random-hostname : Add a random string to remote DNS name.\n"
131 "--mode m : Major mode, m = 'p2p' (default, point-to-point) or 'server'.\n"
132 "--proto p : Use protocol p for communicating with peer.\n"
133 " p = udp (default), tcp-server, tcp-client\n"
134 " udp4, tcp4-server, tcp4-client\n"
135 " udp6, tcp6-server, tcp6-client\n"
136 "--proto-force p : only consider protocol p in list of connection profiles.\n"
138 "--connect-retry n [m] : For client, number of seconds to wait between\n"
139 " connection retries (default=%d). On repeated retries\n"
140 " the wait time is exponentially increased to a maximum of m\n"
142 "--connect-retry-max n : Maximum connection attempt retries, default infinite.\n"
143 "--http-proxy s p [up] [auth] : Connect to remote host\n"
144 " through an HTTP proxy at address s and port p.\n"
145 " If proxy authentication is required,\n"
146 " up is a file containing username/password on 2 lines, or\n"
147 " 'stdin' to prompt from console. Add auth='ntlm2' if\n"
148 " the proxy requires NTLM authentication.\n"
149 "--http-proxy s p 'auto[-nct]' : Like the above directive, but automatically\n"
150 " determine auth method and query for username/password\n"
151 " if needed. auto-nct disables weak proxy auth methods.\n"
152 "--http-proxy-option type [parm] : Set extended HTTP proxy options.\n"
153 " Repeat to set multiple options.\n"
154 " VERSION version (default=1.0)\n"
155 " AGENT user-agent\n"
156 "--socks-proxy s [p] [up] : Connect to remote host through a Socks5 proxy at\n"
157 " address s and port p (default port = 1080).\n"
158 " If proxy authentication is required,\n"
159 " up is a file containing username/password on 2 lines, or\n"
160 " 'stdin' to prompt for console.\n"
161 "--socks-proxy-retry : Retry indefinitely on Socks proxy errors.\n"
162 "--resolv-retry n: If hostname resolve fails for --remote, retry\n"
163 " resolve for n seconds before failing (disabled by default).\n"
164 " Set n=\"infinite\" to retry indefinitely.\n"
165 "--float : Allow remote to change its IP address/port, such as through\n"
166 " DHCP (this is the default if --remote is not used).\n"
167 "--ipchange cmd : Run command cmd on remote ip address initial\n"
168 " setting or change -- execute as: cmd ip-address port#\n"
169 "--port port : TCP/UDP port # for both local and remote.\n"
170 "--lport port : TCP/UDP port # for local (default=%s). Implies --bind.\n"
171 "--rport port : TCP/UDP port # for remote (default=%s).\n"
172 "--bind : Bind to local address and port. (This is the default unless\n"
173 " --proto tcp-client"
177 "--nobind : Do not bind to local address and port.\n"
178 "--dev tunX|tapX : tun/tap device (X can be omitted for dynamic device.\n"
179 "--dev-type dt : Which device type are we using? (dt = tun or tap) Use\n"
180 " this option only if the tun/tap device used with --dev\n"
181 " does not begin with \"tun\" or \"tap\".\n"
182 "--dev-node node : Explicitly set the device node rather than using\n"
183 " /dev/net/tun, /dev/tun, /dev/tap, etc.\n"
184 #if defined(ENABLE_DCO)
185 "--disable-dco : Do not attempt using Data Channel Offload.\n"
187 "--lladdr hw : Set the link layer address of the tap device.\n"
188 "--topology t : Set --dev tun topology: 'net30', 'p2p', or 'subnet'.\n"
189 #ifdef ENABLE_IPROUTE
190 "--iproute cmd : Use this command instead of default " IPROUTE_PATH ".\n"
192 "--ifconfig l rn : TUN: configure device to use IP address l as a local\n"
193 " endpoint and rn as a remote endpoint. l & rn should be\n"
194 " swapped on the other peer. l & rn must be private\n"
195 " addresses outside of the subnets used by either peer.\n"
196 " TAP: configure device to use IP address l as a local\n"
197 " endpoint and rn as a subnet mask.\n"
198 "--ifconfig-ipv6 l r : configure device to use IPv6 address l as local\n"
199 " endpoint (as a /64) and r as remote endpoint\n"
200 "--ifconfig-noexec : Don't actually execute ifconfig/netsh command, instead\n"
201 " pass --ifconfig parms by environment to scripts.\n"
202 "--ifconfig-nowarn : Don't warn if the --ifconfig option on this side of the\n"
203 " connection doesn't match the remote side.\n"
204 "--route network [netmask] [gateway] [metric] :\n"
205 " Add route to routing table after connection\n"
206 " is established. Multiple routes can be specified.\n"
207 " netmask default: 255.255.255.255\n"
208 " gateway default: taken from --route-gateway or --ifconfig\n"
209 " Specify default by leaving blank or setting to \"default\".\n"
210 "--route-ipv6 network/bits [gateway] [metric] :\n"
211 " Add IPv6 route to routing table after connection\n"
212 " is established. Multiple routes can be specified.\n"
213 " gateway default: taken from --route-ipv6-gateway or 'remote'\n"
214 " in --ifconfig-ipv6\n"
215 "--route-gateway gw|'dhcp' : Specify a default gateway for use with --route.\n"
216 "--route-ipv6-gateway gw : Specify a default gateway for use with --route-ipv6.\n"
217 "--route-metric m : Specify a default metric for use with --route.\n"
218 "--route-delay n [w] : Delay n seconds after connection initiation before\n"
219 " adding routes (may be 0). If not specified, routes will\n"
220 " be added immediately after tun/tap open. On Windows, wait\n"
221 " up to w seconds for TUN/TAP adapter to come up.\n"
222 "--route-up cmd : Run command cmd after routes are added.\n"
223 "--route-pre-down cmd : Run command cmd before routes are removed.\n"
224 "--route-noexec : Don't add routes automatically. Instead pass routes to\n"
225 " --route-up script using environmental variables.\n"
226 "--route-nopull : When used with --client or --pull, accept options pushed\n"
227 " by server EXCEPT for routes, dns, and dhcp options.\n"
228 "--allow-pull-fqdn : Allow client to pull DNS names from server for\n"
229 " --ifconfig, --route, and --route-gateway.\n"
230 "--redirect-gateway [flags]: Automatically execute routing\n"
231 " commands to redirect all outgoing IP traffic through the\n"
232 " VPN. Add 'local' flag if both " PACKAGE_NAME " servers are directly\n"
233 " connected via a common subnet, such as with WiFi.\n"
234 " Add 'def1' flag to set default route using using 0.0.0.0/1\n"
235 " and 128.0.0.0/1 rather than 0.0.0.0/0. Add 'bypass-dhcp'\n"
236 " flag to add a direct route to DHCP server, bypassing tunnel.\n"
237 " Add 'bypass-dns' flag to similarly bypass tunnel for DNS.\n"
238 "--redirect-private [flags]: Like --redirect-gateway, but omit actually changing\n"
239 " the default gateway. Useful when pushing private subnets.\n"
240 "--block-ipv6 : (Client) Instead sending IPv6 to the server generate\n"
241 " ICMPv6 host unreachable messages on the client.\n"
242 " (Server) Instead of forwarding IPv6 packets send\n"
243 " ICMPv6 host unreachable packets to the client.\n"
244 "--client-nat snat|dnat network netmask alias : on client add 1-to-1 NAT rule.\n"
245 "--push-peer-info : (client only) push client info to server.\n"
246 "--setenv name value : Set a custom environmental variable to pass to script.\n"
247 "--setenv FORWARD_COMPATIBLE 1 : Relax config file syntax checking to allow\n"
248 " directives for future OpenVPN versions to be ignored.\n"
249 "--ignore-unknown-option opt1 opt2 ...: Relax config file syntax. Allow\n"
250 " these options to be ignored when unknown\n"
251 "--script-security level: Where level can be:\n"
252 " 0 -- strictly no calling of external programs\n"
253 " 1 -- (default) only call built-ins such as ifconfig\n"
254 " 2 -- allow calling of built-ins and scripts\n"
255 " 3 -- allow password to be passed to scripts via env\n"
256 "--shaper n : Restrict output to peer to n bytes per second.\n"
257 "--keepalive n m : Helper option for setting timeouts in server mode. Send\n"
258 " ping once every n seconds, restart if ping not received\n"
260 "--inactive n [bytes] : Exit after n seconds of activity on tun/tap device\n"
261 " produces a combined in/out byte count < bytes.\n"
262 "--session-timeout n: Limit connection time to n seconds.\n"
263 "--ping-exit n : Exit if n seconds pass without reception of remote ping.\n"
264 "--ping-restart n: Restart if n seconds pass without reception of remote ping.\n"
265 "--ping-timer-rem: Run the --ping-exit/--ping-restart timer only if we have a\n"
267 "--ping n : Ping remote once every n seconds over TCP/UDP port.\n"
268 #if ENABLE_IP_PKTINFO
269 "--multihome : Configure a multi-homed UDP server.\n"
271 "--fast-io : Optimize TUN/TAP/UDP writes.\n"
272 "--remap-usr1 s : On SIGUSR1 signals, remap signal (s='SIGHUP' or 'SIGTERM').\n"
273 "--persist-tun : Keep tun/tap device open across SIGUSR1 or --ping-restart.\n"
274 "--persist-remote-ip : Keep remote IP address across SIGUSR1 or --ping-restart.\n"
275 "--persist-local-ip : Keep local IP address across SIGUSR1 or --ping-restart.\n"
276 #if PASSTOS_CAPABILITY
277 "--passtos : TOS passthrough (applies to IPv4 only).\n"
279 "--tun-mtu n : Take the tun/tap device MTU to be n and derive the\n"
280 " TCP/UDP MTU from it (default=%d).\n"
281 "--tun-mtu-extra n : Assume that tun/tap device might return as many\n"
282 " as n bytes more than the tun-mtu size on read\n"
283 " (default TUN=0 TAP=%d).\n"
284 "--link-mtu n : Take the TCP/UDP device MTU to be n and derive the tun MTU\n"
286 "--mtu-disc type : Should we do Path MTU discovery on TCP/UDP channel?\n"
287 " 'no' -- Never send DF (Don't Fragment) frames\n"
288 " 'maybe' -- Use per-route hints\n"
289 " 'yes' -- Always DF (Don't Fragment)\n"
290 "--mtu-test : Empirically measure and report MTU.\n"
291 #ifdef ENABLE_FRAGMENT
292 "--fragment max : Enable internal datagram fragmentation so that no UDP\n"
293 " datagrams are sent which are larger than max bytes.\n"
294 " Adds 4 bytes of overhead per datagram.\n"
296 "--mssfix [n] : Set upper bound on TCP MSS, default = tun-mtu size\n"
297 " or --fragment max value, whichever is lower.\n"
298 "--sndbuf size : Set the TCP/UDP send buffer size.\n"
299 "--rcvbuf size : Set the TCP/UDP receive buffer size.\n"
300 #if defined(TARGET_LINUX) && HAVE_DECL_SO_MARK
301 "--mark value : Mark encrypted packets being sent with value. The mark value\n"
302 " can be matched in policy routing and packetfilter rules.\n"
303 "--bind-dev dev : Bind to the given device when making connection to a peer or\n"
304 " listening for connections. This allows sending encrypted packets\n"
305 " via a VRF present on the system.\n"
307 "--txqueuelen n : Set the tun/tap TX queue length to n (Linux only).\n"
308 #ifdef ENABLE_MEMSTATS
309 "--memstats file : Write live usage stats to memory mapped binary file.\n"
311 "--mlock : Disable Paging -- ensures key material and tunnel\n"
312 " data will never be written to disk.\n"
313 "--up cmd : Run command cmd after successful tun device open.\n"
314 " Execute as: cmd tun/tap-dev tun-mtu link-mtu \\\n"
315 " ifconfig-local-ip ifconfig-remote-ip\n"
316 " (pre --user or --group UID/GID change)\n"
317 "--up-delay : Delay tun/tap open and possible --up script execution\n"
318 " until after TCP/UDP connection establishment with peer.\n"
319 "--down cmd : Run command cmd after tun device close.\n"
320 " (post --user/--group UID/GID change and/or --chroot)\n"
321 " (command parameters are same as --up option)\n"
322 "--down-pre : Run --down command before TUN/TAP close.\n"
323 "--up-restart : Run up/down commands for all restarts including those\n"
324 " caused by --ping-restart or SIGUSR1\n"
325 "--user user : Set UID to user after initialization.\n"
326 "--group group : Set GID to group after initialization.\n"
327 "--chroot dir : Chroot to this directory after initialization.\n"
328 #ifdef ENABLE_SELINUX
329 "--setcon context: Apply this SELinux context after initialization.\n"
331 "--cd dir : Change to this directory before initialization.\n"
332 "--daemon [name] : Become a daemon after initialization.\n"
333 " The optional 'name' parameter will be passed\n"
334 " as the program name to the system logger.\n"
335 "--syslog [name] : Output to syslog, but do not become a daemon.\n"
336 " See --daemon above for a description of the 'name' parm.\n"
337 "--log file : Output log to file which is created/truncated on open.\n"
338 "--log-append file : Append log to file, or create file if nonexistent.\n"
339 "--suppress-timestamps : Don't log timestamps to stdout/stderr.\n"
340 "--machine-readable-output : Always log timestamp, message flags to stdout/stderr.\n"
341 "--writepid file : Write main process ID to file.\n"
342 "--nice n : Change process priority (>0 = lower, <0 = higher).\n"
343 "--echo [parms ...] : Echo parameters to log output.\n"
344 "--verb n : Set output verbosity to n (default=%d):\n"
345 " (Level 3 is recommended if you want a good summary\n"
346 " of what's happening without being swamped by output).\n"
347 " : 0 -- no output except fatal errors\n"
348 " : 1 -- startup info + connection initiated messages +\n"
349 " non-fatal encryption & net errors\n"
350 " : 2,3 -- show TLS negotiations & route info\n"
351 " : 4 -- show parameters\n"
352 " : 5 -- show 'RrWw' chars on console for each packet sent\n"
353 " and received from TCP/UDP (caps) or tun/tap (lc)\n"
354 " : 6 to 11 -- debug messages of increasing verbosity\n"
355 "--mute n : Log at most n consecutive messages in the same category.\n"
356 "--status file [n] : Write operational status to file every n seconds.\n"
357 "--status-version [n] : Choose the status file format version number.\n"
358 " Currently, n can be 1, 2, or 3 (default=1).\n"
359 "--disable-occ : (DEPRECATED) Disable options consistency check between peers.\n"
361 "--gremlin mask : Special stress testing mode (for debugging only).\n"
363 #if defined(USE_COMP)
364 "--compress alg : Use compression algorithm alg\n"
365 "--allow-compression: Specify whether compression should be allowed\n"
366 #if defined(ENABLE_LZO)
367 "--comp-lzo : Use LZO compression -- may add up to 1 byte per\n"
368 " packet for incompressible data.\n"
369 "--comp-noadapt : Don't use adaptive compression when --comp-lzo\n"
373 #ifdef ENABLE_MANAGEMENT
374 "--management ip port [pass] : Enable a TCP server on ip:port to handle\n"
375 " management functions. pass is a password file\n"
376 " or 'stdin' to prompt from console.\n"
377 #if UNIX_SOCK_SUPPORT
378 " To listen on a unix domain socket, specific the pathname\n"
379 " in place of ip and use 'unix' as the port number.\n"
381 "--management-client : Management interface will connect as a TCP client to\n"
382 " ip/port rather than listen as a TCP server.\n"
383 "--management-query-passwords : Query management channel for private key\n"
384 " and auth-user-pass passwords.\n"
385 "--management-query-proxy : Query management channel for proxy information.\n"
386 "--management-query-remote : Query management channel for --remote directive.\n"
387 "--management-hold : Start " PACKAGE_NAME " in a hibernating state, until a client\n"
388 " of the management interface explicitly starts it.\n"
389 "--management-signal : Issue SIGUSR1 when management disconnect event occurs.\n"
390 "--management-forget-disconnect : Forget passwords when management disconnect\n"
392 "--management-up-down : Report tunnel up/down events to management interface.\n"
393 "--management-log-cache n : Cache n lines of log file history for usage\n"
394 " by the management channel.\n"
395 #if UNIX_SOCK_SUPPORT
396 "--management-client-user u : When management interface is a unix socket, only\n"
397 " allow connections from user u.\n"
398 "--management-client-group g : When management interface is a unix socket, only\n"
399 " allow connections from group g.\n"
401 "--management-client-auth : gives management interface client the responsibility\n"
402 " to authenticate clients after their client certificate\n"
403 " has been verified.\n"
406 "--plugin m [str]: Load plug-in module m passing str as an argument\n"
407 " to its initialization function.\n"
409 "--vlan-tagging : Enable 802.1Q-based VLAN tagging.\n"
410 "--vlan-accept tagged|untagged|all : Set VLAN tagging mode. Default is 'all'.\n"
411 "--vlan-pvid v : Sets the Port VLAN Identifier. Defaults to 1.\n"
413 "Multi-Client Server options (when --mode server is used):\n"
414 "--server network netmask : Helper option to easily configure server mode.\n"
415 "--server-ipv6 network/bits : Configure IPv6 server mode.\n"
416 "--server-bridge [IP netmask pool-start-IP pool-end-IP] : Helper option to\n"
417 " easily configure ethernet bridging server mode.\n"
418 "--push \"option\" : Push a config file option back to the peer for remote\n"
419 " execution. Peer must specify --pull in its config file.\n"
420 "--push-reset : Don't inherit global push list for specific\n"
421 " client instance.\n"
422 "--push-remove opt : Remove options matching 'opt' from the push list for\n"
423 " a specific client instance.\n"
424 "--ifconfig-pool start-IP end-IP [netmask] : Set aside a pool of subnets\n"
425 " to be dynamically allocated to connecting clients.\n"
426 "--ifconfig-pool-persist file [seconds] : Persist/unpersist ifconfig-pool\n"
427 " data to file, at seconds intervals (default=600).\n"
428 " If seconds=0, file will be treated as read-only.\n"
429 "--ifconfig-ipv6-pool base-IP/bits : set aside an IPv6 network block\n"
430 " to be dynamically allocated to connecting clients.\n"
431 "--ifconfig-push local remote-netmask : Push an ifconfig option to remote,\n"
432 " overrides --ifconfig-pool dynamic allocation.\n"
433 " Only valid in a client-specific config file.\n"
434 "--ifconfig-ipv6-push local/bits remote : Push an ifconfig-ipv6 option to\n"
435 " remote, overrides --ifconfig-ipv6-pool allocation.\n"
436 " Only valid in a client-specific config file.\n"
437 "--iroute network [netmask] : Route subnet to client.\n"
438 "--iroute-ipv6 network/bits : Route IPv6 subnet to client.\n"
439 " Sets up internal routes only.\n"
440 " Only valid in a client-specific config file.\n"
441 "--disable : Client is disabled.\n"
442 " Only valid in a client-specific config file.\n"
443 "--verify-client-cert [none|optional|require] : perform no, optional or\n"
444 " mandatory client certificate verification.\n"
445 " Default is to require the client to supply a certificate.\n"
446 "--username-as-common-name : For auth-user-pass authentication, use\n"
447 " the authenticated username as the common name,\n"
448 " rather than the common name from the client cert.\n"
449 "--auth-user-pass-verify cmd method: Query client for username/password and\n"
450 " run command cmd to verify. If method='via-env', pass\n"
451 " user/pass via environment, if method='via-file', pass\n"
452 " user/pass via temporary file.\n"
453 "--auth-gen-token [lifetime] Generate a random authentication token which is pushed\n"
454 " to each client, replacing the password. Useful when\n"
455 " OTP based two-factor auth mechanisms are in use and\n"
456 " --reneg-* options are enabled. Optionally a lifetime in seconds\n"
457 " for generated tokens can be set.\n"
458 "--opt-verify : (DEPRECATED) Clients that connect with options that are incompatible\n"
459 " with those of the server will be disconnected.\n"
460 "--auth-user-pass-optional : Allow connections by clients that don't\n"
461 " specify a username/password.\n"
462 "--no-name-remapping : (DEPRECATED) Allow Common Name and X509 Subject to include\n"
463 " any printable character.\n"
464 "--client-to-client : Internally route client-to-client traffic.\n"
465 "--duplicate-cn : Allow multiple clients with the same common name to\n"
466 " concurrently connect.\n"
467 "--client-connect cmd : Run command cmd on client connection.\n"
468 "--client-disconnect cmd : Run command cmd on client disconnection.\n"
469 "--client-config-dir dir : Directory for custom client config files.\n"
470 "--ccd-exclusive : Refuse connection unless custom client config is found.\n"
471 "--tmp-dir dir : Temporary directory, used for --client-connect return file and plugin communication.\n"
472 "--hash-size r v : Set the size of the real address hash table to r and the\n"
473 " virtual address table to v.\n"
474 "--bcast-buffers n : Allocate n broadcast buffers.\n"
475 "--tcp-queue-limit n : Maximum number of queued TCP output packets.\n"
476 "--tcp-nodelay : Macro that sets TCP_NODELAY socket flag on the server\n"
477 " as well as pushes it to connecting clients.\n"
478 "--learn-address cmd : Run command cmd to validate client virtual addresses.\n"
479 "--connect-freq n s : Allow a maximum of n new connections per s seconds.\n"
480 "--connect-freq-initial n s : Allow a maximum of n replies for initial connections attempts per s seconds.\n"
481 "--max-clients n : Allow a maximum of n simultaneously connected clients.\n"
482 "--max-routes-per-client n : Allow a maximum of n internal routes per client.\n"
483 "--stale-routes-check n [t] : Remove routes with a last activity timestamp\n"
484 " older than n seconds. Run this check every t\n"
485 " seconds (defaults to n).\n"
486 "--explicit-exit-notify [n] : In UDP server mode send [RESTART] command on exit/restart to connected\n"
487 " clients. n = 1 - reconnect to same server,\n"
488 " 2 - advance to next server, default=1.\n"
490 "--port-share host port [dir] : When run in TCP mode, proxy incoming HTTPS\n"
491 " sessions to a web server at host:port. dir specifies an\n"
492 " optional directory to write origin IP:port data.\n"
495 "Client options (when connecting to a multi-client server):\n"
496 "--client : Helper option to easily configure client mode.\n"
497 "--auth-user-pass [up] : Authenticate with server using username/password.\n"
498 " up is a file containing the username on the first line,\n"
499 " and a password on the second. If either the password or both\n"
500 " the username and the password are omitted OpenVPN will prompt\n"
501 " for them from console.\n"
502 "--pull : Accept certain config file options from the peer as if they\n"
503 " were part of the local config file. Must be specified\n"
504 " when connecting to a '--mode server' remote host.\n"
505 "--pull-filter accept|ignore|reject t : Filter each option received from the\n"
506 " server if it starts with the text t. The action flag accept,\n"
507 " ignore or reject causes the option to be allowed, removed or\n"
508 " rejected with error. May be specified multiple times, and\n"
509 " each filter is applied in the order of appearance.\n"
510 "--dns server <n> <option> <value> [value ...] : Configure option for DNS server #n\n"
511 " Valid options are :\n"
512 " address <addr[:port]> [addr[:port] ...] : server addresses 4/6\n"
513 " resolve-domains <domain> [domain ...] : split domains\n"
514 " dnssec <yes|no|optional> : option to use DNSSEC\n"
515 " type <DoH|DoT> : query server over HTTPS / TLS\n"
516 " sni <domain> : DNS server name indication\n"
517 "--dns search-domains <domain> [domain ...]:\n"
518 " Add domains to DNS domain search list\n"
519 "--auth-retry t : How to handle auth failures. Set t to\n"
520 " none (default), interact, or nointeract.\n"
521 "--static-challenge t e : Enable static challenge/response protocol using\n"
522 " challenge text t, with e indicating echo flag (0|1)\n"
523 "--connect-timeout n : when polling possible remote servers to connect to\n"
524 " in a round-robin fashion, spend no more than n seconds\n"
525 " waiting for a response before trying the next server.\n"
526 "--allow-recursive-routing : When this option is set, OpenVPN will not drop\n"
527 " incoming tun packets with same destination as host.\n"
528 "--explicit-exit-notify [n] : On exit/restart, send exit signal to\n"
529 " server/remote. n = # of retries, default=1.\n"
531 "Data Channel Encryption Options (must be compatible between peers):\n"
532 "(These options are meaningful for both Static Key & TLS-mode)\n"
533 "--auth alg : Authenticate packets with HMAC using message\n"
534 " digest algorithm alg (default=%s).\n"
535 " (usually adds 16 or 20 bytes per packet)\n"
536 " Set alg=none to disable authentication.\n"
537 "--cipher alg : Encrypt packets with cipher algorithm alg.\n"
538 " You should usually use --data-ciphers instead.\n"
539 " Set alg=none to disable encryption.\n"
540 "--data-ciphers list : List of ciphers that are allowed to be negotiated.\n"
541 #ifndef ENABLE_CRYPTO_MBEDTLS
542 "--engine [name] : Enable OpenSSL hardware crypto engine functionality.\n"
544 "--mute-replay-warnings : Silence the output of replay warnings to log file.\n"
545 "--replay-window n [t] : Use a replay protection sliding window of size n\n"
546 " and a time window of t seconds.\n"
547 " Default n=%d t=%d\n"
548 "--replay-persist file : Persist replay-protection state across sessions\n"
550 "--test-crypto : Run a self-test of crypto features enabled.\n"
551 " For debugging only.\n"
552 #ifdef ENABLE_PREDICTION_RESISTANCE
553 "--use-prediction-resistance: Enable prediction resistance on the random\n"
554 " number generator.\n"
557 "TLS Key Negotiation Options:\n"
558 "(These options are meaningful only for TLS-mode)\n"
559 "--tls-server : Enable TLS and assume server role during TLS handshake.\n"
560 "--tls-client : Enable TLS and assume client role during TLS handshake.\n"
561 "--ca file : Certificate authority file in .pem format containing\n"
562 " root certificate.\n"
563 #ifndef ENABLE_CRYPTO_MBEDTLS
564 "--capath dir : A directory of trusted certificates (CAs"
567 "--dh file : File containing Diffie Hellman parameters\n"
568 " in .pem format (for --tls-server only).\n"
569 " Use \"openssl dhparam -out dh1024.pem 1024\" to generate.\n"
570 "--cert file : Local certificate in .pem format -- must be signed\n"
571 " by a Certificate Authority in --ca file.\n"
572 "--extra-certs file : one or more PEM certs that complete the cert chain.\n"
573 "--key file : Local private key in .pem format.\n"
574 "--tls-version-min <version> ['or-highest'] : sets the minimum TLS version we\n"
575 " will accept from the peer. If version is unrecognized and 'or-highest'\n"
576 " is specified, require max TLS version supported by SSL implementation.\n"
577 "--tls-version-max <version> : sets the maximum TLS version we will use.\n"
578 #ifndef ENABLE_CRYPTO_MBEDTLS
579 "--pkcs12 file : PKCS#12 file containing local private key, local certificate\n"
580 " and optionally the root CA certificate.\n"
582 #ifdef ENABLE_X509ALTUSERNAME
583 "--x509-username-field : Field in x509 certificate containing the username.\n"
584 " Default is CN in the Subject field.\n"
586 "--verify-hash hash [algo] : Specify fingerprint for level-1 certificate.\n"
587 " Valid algo flags are SHA1 and SHA256. \n"
589 "--cryptoapicert select-string : Load the certificate and private key from the\n"
590 " Windows Certificate System Store.\n"
592 "--tls-cipher l : A list l of allowable TLS ciphers separated by : (optional).\n"
593 "--tls-ciphersuites l: A list of allowed TLS 1.3 cipher suites separated by : (optional)\n"
594 " : Use --show-tls to see a list of supported TLS ciphers (suites).\n"
595 "--tls-cert-profile p : Set the allowed certificate crypto algorithm profile\n"
596 " (default=legacy).\n"
597 "--providers l : A list l of OpenSSL providers to load.\n"
598 "--tls-timeout n : Packet retransmit timeout on TLS control channel\n"
599 " if no ACK from remote within n seconds (default=%d).\n"
600 "--reneg-bytes n : Renegotiate data chan. key after n bytes sent and recvd.\n"
601 "--reneg-pkts n : Renegotiate data chan. key after n packets sent and recvd.\n"
602 "--reneg-sec max [min] : Renegotiate data chan. key after at most max (default=%d)\n"
603 " and at least min (defaults to 90%% of max on servers and equal\n"
604 " to max on clients).\n"
605 "--hand-window n : Data channel key exchange must finalize within n seconds\n"
606 " of handshake initiation by any peer (default=%d).\n"
607 "--tran-window n : Transition window -- old key can live this many seconds\n"
608 " after new key renegotiation begins (default=%d).\n"
609 "--single-session: Allow only one session (reset state on restart).\n"
610 "--tls-exit : Exit on TLS negotiation failure.\n"
611 "--tls-auth f [d]: Add an additional layer of authentication on top of the TLS\n"
612 " control channel to protect against attacks on the TLS stack\n"
613 " and DoS attacks.\n"
614 " f (required) is a shared-secret key file.\n"
615 " The optional d parameter controls key directionality.\n"
616 "--tls-crypt key : Add an additional layer of authenticated encryption on top\n"
617 " of the TLS control channel to hide the TLS certificate,\n"
618 " provide basic post-quantum security and protect against\n"
619 " attacks on the TLS stack and DoS attacks.\n"
620 " key (required) provides the pre-shared key file.\n"
621 "--tls-crypt-v2 key : For clients: use key as a client-specific tls-crypt key.\n"
622 " For servers: use key to decrypt client-specific keys. For\n"
623 " key generation (--genkey tls-crypt-v2-client): use key to\n"
624 " encrypt generated client-specific key. (See --tls-crypt.)\n"
625 "--genkey tls-crypt-v2-client [keyfile] [base64 metadata]: Generate a\n"
626 " fresh tls-crypt-v2 client key, and store to\n"
627 " keyfile. If supplied, include metadata in wrapped key.\n"
628 "--genkey tls-crypt-v2-server [keyfile] [base64 metadata]: Generate a\n"
629 " fresh tls-crypt-v2 server key, and store to keyfile\n"
630 "--tls-crypt-v2-verify cmd : Run command cmd to verify the metadata of the\n"
631 " client-supplied tls-crypt-v2 client key\n"
632 "--askpass [file]: Get PEM password from controlling tty before we daemonize.\n"
633 "--auth-nocache : Don't cache --askpass or --auth-user-pass passwords.\n"
634 "--crl-verify crl ['dir']: Check peer certificate against a CRL.\n"
635 "--tls-verify cmd: Run command cmd to verify the X509 name of a\n"
636 " pending TLS connection that has otherwise passed all other\n"
637 " tests of certification. cmd should return 0 to allow\n"
638 " TLS handshake to proceed, or 1 to fail. (cmd is\n"
639 " executed as 'cmd certificate_depth subject')\n"
640 "--verify-x509-name name: Accept connections only from a host with X509 subject\n"
641 " DN name. The remote host must also pass all other tests\n"
642 " of verification.\n"
643 #ifndef ENABLE_CRYPTO_MBEDTLS
644 "--ns-cert-type t: (DEPRECATED) Require that peer certificate was signed with \n"
645 " an explicit nsCertType designation t = 'client' | 'server'.\n"
647 "--x509-track x : Save peer X509 attribute x in environment for use by\n"
648 " plugins and management interface.\n"
649 #ifdef HAVE_EXPORT_KEYING_MATERIAL
650 "--keying-material-exporter label len : Save Exported Keying Material (RFC5705)\n"
651 " of len bytes (min. 16 bytes) using label in environment for use by plugins.\n"
653 "--remote-cert-ku v ... : Require that the peer certificate was signed with\n"
654 " explicit key usage, you can specify more than one value.\n"
655 " value should be given in hex format.\n"
656 "--remote-cert-eku oid : Require that the peer certificate was signed with\n"
657 " explicit extended key usage. Extended key usage can be encoded\n"
658 " as an object identifier or OpenSSL string representation.\n"
659 "--remote-cert-tls t: Require that peer certificate was signed with explicit\n"
660 " key usage and extended key usage based on RFC3280 TLS rules.\n"
661 " t = 'client' | 'server'.\n"
665 "--pkcs11-providers provider ... : PKCS#11 provider to load.\n"
666 "--pkcs11-protected-authentication [0|1] ... : Use PKCS#11 protected authentication\n"
667 " path. Set for each provider.\n"
668 "--pkcs11-private-mode hex ... : PKCS#11 private key mode mask.\n"
669 " 0 : Try to determine automatically (default).\n"
671 " 2 : Use SignRecover.\n"
672 " 4 : Use Decrypt.\n"
674 "--pkcs11-cert-private [0|1] ... : Set if login should be performed before\n"
675 " certificate can be accessed. Set for each provider.\n"
676 "--pkcs11-pin-cache seconds : Number of seconds to cache PIN. The default is -1\n"
677 " cache until token is removed.\n"
678 "--pkcs11-id-management : Acquire identity from management interface.\n"
679 "--pkcs11-id serialized-id 'id' : Identity to use, get using standalone --show-pkcs11-ids\n"
682 "SSL Library information:\n"
683 "--show-ciphers : Show cipher algorithms to use with --cipher option.\n"
684 "--show-digests : Show message digest algorithms to use with --auth option.\n"
685 "--show-engines : Show hardware crypto accelerator engines (if available).\n"
686 "--show-tls : Show all TLS ciphers (TLS used only as a control channel).\n"
689 "Windows Specific:\n"
690 "--win-sys path : Pathname of Windows system directory. Default is the pathname\n"
691 " from SystemRoot environment variable.\n"
692 "--ip-win32 method : When using --ifconfig on Windows, set TAP-Windows adapter\n"
693 " IP address using method = manual, netsh, ipapi,\n"
694 " dynamic, or adaptive (default = adaptive).\n"
695 " Dynamic method allows two optional parameters:\n"
696 " offset: DHCP server address offset (> -256 and < 256).\n"
697 " If 0, use network address, if >0, take nth\n"
698 " address forward from network address, if <0,\n"
699 " take nth address backward from broadcast\n"
702 " lease-time: Lease time in seconds.\n"
703 " Default is one year.\n"
704 "--route-method : Which method to use for adding routes on Windows?\n"
705 " adaptive (default) -- Try ipapi then fall back to exe.\n"
706 " ipapi -- Use IP helper API.\n"
707 " exe -- Call the route.exe shell command.\n"
708 "--dhcp-option type [parm] : Set extended TAP-Windows properties, must\n"
709 " be used with --ip-win32 dynamic. For options\n"
710 " which allow multiple addresses,\n"
711 " --dhcp-option must be repeated.\n"
712 " DOMAIN name : Set DNS suffix\n"
713 " DOMAIN-SEARCH entry : Add entry to DNS domain search list\n"
714 " DNS addr : Set domain name server address(es) (IPv4 and IPv6)\n"
715 " NTP : Set NTP server address(es)\n"
716 " NBDD : Set NBDD server address(es)\n"
717 " WINS addr : Set WINS server address(es)\n"
718 " NBT type : Set NetBIOS over TCP/IP Node type\n"
719 " 1: B, 2: P, 4: M, 8: H\n"
720 " NBS id : Set NetBIOS scope ID\n"
721 " DISABLE-NBT : Disable Netbios-over-TCP/IP.\n"
722 "--dhcp-renew : Ask Windows to renew the TAP adapter lease on startup.\n"
723 "--dhcp-pre-release : Ask Windows to release the previous TAP adapter lease on\n"
725 "--register-dns : Run ipconfig /flushdns and ipconfig /registerdns\n"
726 " on connection initiation.\n"
727 "--tap-sleep n : Sleep for n seconds after TAP adapter open before\n"
728 " attempting to set adapter properties.\n"
729 "--pause-exit : When run from a console window, pause before exiting.\n"
730 "--service ex [0|1] : For use when " PACKAGE_NAME " is being instantiated by a\n"
731 " service, and should not be used directly by end-users.\n"
732 " ex is the name of an event object which, when\n"
733 " signaled, will cause " PACKAGE_NAME " to exit. A second\n"
734 " optional parameter controls the initial state of ex.\n"
735 "--show-net-up : Show " PACKAGE_NAME "'s view of routing table and net adapter list\n"
736 " after TAP adapter is up and routes have been added.\n"
737 "--windows-driver : Which tun driver to use?\n"
738 " ovpn-dco (default)\n"
741 "--block-outside-dns : Block DNS on other network adapters to prevent DNS leaks\n"
742 "Windows Standalone Options:\n"
744 "--show-adapters : Show all TAP-Windows adapters.\n"
745 "--show-net : Show " PACKAGE_NAME "'s view of routing table and net adapter list.\n"
746 "--show-valid-subnets : Show valid subnets for --dev tun emulation.\n"
747 "--allow-nonadmin [TAP-adapter] : Allow " PACKAGE_NAME " running without admin privileges\n"
748 " to access TAP adapter.\n"
751 "Generate a new key :\n"
752 "--genkey tls-auth file : Generate a new random key of type and write to file\n"
753 " (for use with --tls-auth or --tls-crypt)."
754 #ifdef ENABLE_FEATURE_TUN_PERSIST
756 "Tun/tap config mode (available with linux 2.4+):\n"
757 "--mktun : Create a persistent tunnel.\n"
758 "--rmtun : Remove a persistent tunnel.\n"
759 "--dev tunX|tapX : tun/tap device\n"
760 "--dev-type dt : Device type. See tunnel options above for details.\n"
761 "--user user : User to set privilege to.\n"
762 "--group group : Group to set privilege to.\n"
766 "PKCS#11 standalone options:\n"
767 #ifdef DEFAULT_PKCS11_MODULE
768 "--show-pkcs11-ids [provider] [cert_private] : Show PKCS#11 available ids.\n"
770 "--show-pkcs11-ids provider [cert_private] : Show PKCS#11 available ids.\n"
772 " --verb option can be added *BEFORE* this.\n"
775 "General Standalone Options:\n"
777 "--show-gateway : Show info about default gateway.\n"
801 o->
ce.
af = AF_UNSPEC;
825 #ifdef ENABLE_MANAGEMENT
830 #ifdef ENABLE_FEATURE_TUN_PERSIST
862 #ifdef ENABLE_PREDICTION_RESISTANCE
863 o->use_prediction_resistance =
false;
873 #ifdef ENABLE_X509ALTUSERNAME
877 o->pkcs11_pin_cache_period = -1;
892 msg(
M_USAGE,
"Could not find a suitable temporary directory."
893 " (GetTempPath() failed). Consider using --tmp-dir");
930 #define PUF_TYPE_UNDEF 0
931 #define PUF_TYPE_ACCEPT 1
932 #define PUF_TYPE_IGNORE 2
933 #define PUF_TYPE_REJECT 3
969 #define SHOW_PARM(name, value, format) msg(D_SHOW_PARMS, " " #name " = " format, (value))
970 #define SHOW_STR(var) SHOW_PARM(var, (o->var ? o->var : "[UNDEF]"), "'%s'")
971 #define SHOW_STR_INLINE(var) SHOW_PARM(var, \
972 o->var ## _inline ? "[INLINE]" : \
973 (o->var ? o->var : "[UNDEF]"), \
975 #define SHOW_INT(var) SHOW_PARM(var, o->var, "%d")
976 #define SHOW_UINT(var) SHOW_PARM(var, o->var, "%u")
977 #define SHOW_INT64(var) SHOW_PARM(var, o->var, "%" PRIi64)
978 #define SHOW_UNSIGNED(var) SHOW_PARM(var, o->var, "0x%08x")
979 #define SHOW_BOOL(var) SHOW_PARM(var, (o->var ? "ENABLED" : "DISABLED"), "%s");
1050 for (i = 0; i <
len; ++i)
1068 msg(
M_WARN,
"foreign_option: name/value overflow");
1079 bool succeeded =
false;
1087 ret =
getaddr(flags, ip_string, 0, &succeeded, NULL);
1088 if (!succeeded && error)
1103 const char *end = strchr(addr,
'/');
1111 size_t len = end - addr;
1113 memcpy(ret, addr,
len);
1121 struct in6_addr t_addr;
1122 unsigned int t_bits;
1130 char *ret = (
char *)
gc_malloc(strlen(src) + 1,
true, gc);
1160 const char *cp = str;
1168 while (*cp && i < nbytes)
1171 if (!isxdigit(cp[0])
1173 || (cp[2] !=
':' && cp[2] !=
'\0')
1174 || sscanf(cp,
"%x", &
byte) != 1)
1176 msg(msglevel,
"format error in hash fingerprint: %s", str);
1180 ret->
hash[i++] = (uint8_t)
byte;
1191 msg(msglevel,
"hash fingerprint is wrong length - expected %d bytes, got %d: %s", nbytes, i, str);
1193 else if (term !=
'\0')
1195 msg(msglevel,
"hash fingerprint too long - expected only %d bytes: %s", nbytes, str);
1220 while ((line =
strsep(&lines,
"\n")))
1223 while (isspace(*line))
1228 if (strlen(line) == 0 || *line ==
'#' || *line ==
';')
1251 #ifndef ENABLE_SMALL
1257 for (i = 0; i < len; ++i)
1268 for (i = 0; i < len; ++i)
1304 #if defined(_WIN32) || defined(TARGET_ANDROID)
1308 struct in6_addr addr;
1311 msg(msglevel,
"--dhcp-option DNS: maximum of %d IPv6 dns servers can be specified",
1316 dns6_list[(*len)++] = addr;
1324 msg(msglevel,
"--dhcp-option %s: maximum of %d %s servers can be specified",
1334 const in_addr_t addr =
get_ip_addr(parm, msglevel, &error);
1337 array[(*len)++] = addr;
1342 msg(msglevel,
"dhcp-option parameter %s '%s' must be an IP address", name, parm);
1365 domain = domain->
next;
1369 msg(
M_WARN,
"WARNING: couldn't copy all --dns search-domains to --dhcp-option");
1378 bool overflow =
false;
1403 server = server->
next;
1407 msg(
M_WARN,
"WARNING: couldn't copy all --dns server addresses to --dhcp-option");
1418 if (!domain && !server)
1427 for (
int i = 1; i <= opt_max; ++i)
1430 snprintf(name,
sizeof(name),
"foreign_option_%d", i);
1433 const char *value = strchr(env_str,
'=') + 1;
1434 if ((domain && strstr(value,
"dhcp-option DOMAIN-SEARCH") == value)
1435 || (server && strstr(value,
"dhcp-option DNS") == value))
1441 setenv_foreign_option(o, &value, 1,
es);
1453 const char *
argv[] = {
1458 setenv_foreign_option(o,
argv, 3,
es);
1462 const char *
argv[] = {
1467 setenv_foreign_option(o,
argv, 3,
es);
1470 server = server->
next;
1474 const char *
argv[] = {
"dhcp-option",
"DOMAIN-SEARCH", domain->
name };
1475 setenv_foreign_option(o,
argv, 3,
es);
1476 domain = domain->
next;
1485 snprintf(name,
sizeof(name),
"foreign_option_%d", opt_max--);
1491 #ifndef ENABLE_SMALL
1538 SHOW_STR(ifconfig_pool_persist_filename);
1539 SHOW_INT(ifconfig_pool_persist_refresh_freq);
1542 SHOW_INT(ifconfig_ipv6_pool_netbits);
1549 SHOW_STR(client_disconnect_script);
1550 SHOW_STR(client_crresponse_script);
1568 SHOW_STR(auth_user_pass_verify_script);
1569 SHOW_BOOL(auth_user_pass_verify_script_via_file);
1593 const char *network_str,
1594 const char *netmask_str,
1610 msg(msglevel,
"in --iroute %s %s : Bad network/subnet specification",
1623 const char *prefix_str,
1632 msg(msglevel,
"in --iroute-ipv6 %s: Bad IPv6 prefix specification",
1641 #ifndef ENABLE_SMALL
1709 #ifndef ENABLE_SMALL
1741 #ifdef ENABLE_FRAGMENT
1748 SHOW_INT(explicit_exit_notification);
1765 for (i = 0; i < l->
len; ++i)
1800 #ifndef ENABLE_SMALL
1807 #ifdef ENABLE_FEATURE_TUN_PERSIST
1829 #if defined(ENABLE_DCO)
1861 #if PASSTOS_CAPABILITY
1872 #ifdef ENABLE_SELINUX
1898 #if defined(TARGET_LINUX) && HAVE_DECL_SO_MARK
1932 #ifdef ENABLE_MANAGEMENT
1936 SHOW_INT(management_log_history_cache);
1937 SHOW_INT(management_echo_buffer_size);
1942 #ifdef ENABLE_PLUGIN
1954 #ifndef ENABLE_CRYPTO_MBEDTLS
1962 #ifdef ENABLE_PREDICTION_RESISTANCE
1973 SHOW_PARM(
"cert_file",
"EXTERNAL_CERT",
"%s");
1983 SHOW_PARM(
"priv_key_file",
"EXTERNAL_PRIVATE_KEY",
"%s");
1989 #ifndef ENABLE_CRYPTO_MBEDTLS
1992 #ifdef ENABLE_CRYPTOAPI
1999 SHOW_STR(tls_export_peer_cert_dir);
2046 #ifdef ENABLE_PKCS11
2049 for (i = 0; i<
MAX_PARMS && o->pkcs11_providers[i] != NULL; i++)
2051 SHOW_PARM(pkcs11_providers, o->pkcs11_providers[i],
"%s");
2058 SHOW_PARM(pkcs11_protected_authentication, o->pkcs11_protected_authentication[i] ?
"ENABLED" :
"DISABLED",
"%s");
2065 SHOW_PARM(pkcs11_private_mode, o->pkcs11_private_mode[i],
"%08x");
2072 SHOW_PARM(pkcs11_cert_private, o->pkcs11_cert_private[i] ?
"ENABLED" :
"DISABLED",
"%s");
2096 #ifdef ENABLE_MANAGEMENT
2111 if (flags && !strcmp(flags,
"nct"))
2134 bool succeed =
false;
2135 for (i = 0; i < l->
len; ++i)
2146 for (i = 0; i < l->
len; ++i)
2157 msg(
M_WARN,
"Note: option http-proxy-override ignored because no TCP-based connection profiles are defined");
2185 msg(msglevel,
"Unable to process more connection options: out of memory. Number of entries = %d", l->
len);
2218 msg(msglevel,
"Unable to process more remote options: out of memory. Number of entries = %d", l->
len);
2285 if (key_file && *key_file && !(*key_inline))
2290 msg(
M_FATAL,
"Cannot pre-load keyfile (%s)", *key_file);
2293 *key_file = (
const char *) in.
data;
2304 #ifndef ENABLE_CRYPTO_MBEDTLS
2312 const char *
const str =
"You must define CA file (--ca)"
2313 #ifndef ENABLE_CRYPTO_MBEDTLS
2314 " or CA path (--capath)"
2316 " and/or peer fingerprint verification (--peer-fingerprint)";
2351 "--proto tcp is ambiguous in this context. Please specify "
2352 "--proto tcp-server or --proto tcp-client");
2357 msg(
M_USAGE,
"--lladdr can only be used in --dev tap mode");
2365 msg(
M_USAGE,
"only one of --tun-mtu or --link-mtu may be defined");
2370 msg(
M_USAGE,
"--mtu-test only makes sense with --proto udp");
2384 msg(
M_USAGE,
"--remote and --local addresses are the same");
2391 "--local and --remote addresses must be distinct from --ifconfig "
2399 "--local addresses must be distinct from --ifconfig addresses");
2406 "local and remote/netmask --ifconfig addresses must be different");
2411 msg(
M_USAGE,
"--bind and --nobind can't be used together");
2417 "--local and --nobind don't make sense when used together");
2423 "--lport and --nobind don't make sense when used together");
2428 msg(
M_USAGE,
"--nobind doesn't make sense unless used with --remote");
2434 #ifdef ENABLE_MANAGEMENT
2439 msg(
M_USAGE,
"--management is not specified, however one or more options which modify the behavior of --management were specified");
2445 msg(
M_USAGE,
"--management-client-(user|group) can only be used on unix domain sockets");
2452 msg(
M_WARN,
"WARNING: Using --management on a TCP port WITHOUT "
2453 "passwords is STRONGLY discouraged and considered insecure");
2458 #if !defined(HAVE_XKEY_PROVIDER)
2464 msg(
M_FATAL,
"management-external-key with TLS 1.3 or later requires "
2465 "nopadding argument/support");
2475 msg(
M_USAGE,
"On Windows, --ifconfig is required when --dev tun is used");
2481 msg(
M_USAGE,
"On Windows, --ip-win32 doesn't make sense unless --ifconfig is also used");
2486 const char *prefix =
"Some --dhcp-option or --dns options require DHCP server";
2489 msg(
M_USAGE,
"%s, which is not supported by the selected %s driver",
2495 msg(
M_USAGE,
"%s, which requires --ip-win32 dynamic or adaptive",
2502 msg(
M_USAGE,
"--windows-driver wintun requires --dev tun");
2510 #ifdef ENABLE_FRAGMENT
2513 msg(
M_USAGE,
"--fragment can only be used with --proto udp");
2519 msg(
M_USAGE,
"--remote MUST be used in TCP Client mode");
2525 "--http-proxy MUST be used in TCP Client mode (i.e. --proto "
2532 "--http-proxy not specified but other http proxy options present");
2538 "--http-proxy can not be used together with --socks-proxy");
2543 msg(
M_USAGE,
"--socks-proxy can not be used in TCP Server mode");
2548 msg(
M_USAGE,
"TCP server mode allows at most one --remote address");
2556 #define USAGE_VALID_SERVER_PROTOS "--mode server currently only supports " \
2557 "--proto values of udp, tcp-server, tcp4-server, or tcp6-server"
2558 #ifdef TARGET_ANDROID
2559 msg(
M_FATAL,
"--mode server not supported on Android");
2563 msg(
M_USAGE,
"--mode server only works with --dev tun or --dev tap");
2567 msg(
M_USAGE,
"--pull cannot be used with --mode server");
2571 msg(
M_WARN,
"--pull-filter ignored for --mode server");
2581 msg(
M_USAGE,
"--port-share only works in TCP server mode "
2582 "(--proto values of tcp-server, tcp4-server, or tcp6-server)");
2587 msg(
M_USAGE,
"--mode server requires --tls-server");
2591 msg(
M_USAGE,
"--remote cannot be used with --mode server");
2595 msg(
M_USAGE,
"--nobind cannot be used with --mode server");
2599 msg(
M_USAGE,
"--http-proxy cannot be used with --mode server");
2603 msg(
M_USAGE,
"--socks-proxy cannot be used with --mode server");
2611 msg(
M_USAGE,
"<connection> cannot be used with --mode server");
2616 msg(
M_USAGE,
"--shaper cannot be used with --mode server");
2621 "--ipchange cannot be used with --mode server (use "
2622 "--client-connect instead)");
2630 msg(
M_USAGE,
"--connect-freq only works with --mode server --proto udp. Try --max-clients instead.");
2634 msg(
M_USAGE,
"The third parameter to --ifconfig-pool (netmask) is only valid in --dev tap mode");
2638 msg(
M_USAGE,
"--redirect-gateway cannot be used with --mode server (however --push \"redirect-gateway\" is fine)");
2642 msg(
M_USAGE,
"--route-delay cannot be used with --mode server");
2646 msg(
M_USAGE,
"--up-delay cannot be used with --mode server");
2653 "--ifconfig-pool-persist must be used with --ifconfig-pool or --ifconfig-ipv6-pool");
2657 msg(
M_USAGE,
"--ifconfig-ipv6-pool needs --ifconfig-ipv6");
2661 msg(
M_USAGE,
"--allow-recursive-routing cannot be used with --mode server");
2665 msg(
M_USAGE,
"--auth-user-pass cannot be used with --mode server (it should be used on the client side only)");
2669 msg(
M_USAGE,
"--ccd-exclusive must be used with --client-config-dir");
2673 msg(
M_USAGE,
"--auth-gen-token needs a non-infinite "
2674 "--renegotiate_seconds setting");
2679 msg(
M_USAGE,
"--auth-gen-token renewal time needs to be at least "
2680 " two times --hand-window (%d).",
2688 const char *postfix =
"must be used with --management-client-auth, an --auth-user-pass-verify script, or plugin";
2691 msg(
M_USAGE,
"--verify-client-cert none|optional %s", postfix);
2695 msg(
M_USAGE,
"--username-as-common-name %s", postfix);
2699 msg(
M_USAGE,
"--auth-user-pass-optional %s", postfix);
2705 msg(
M_USAGE,
"--vlan-tagging must be used with --dev tap");
2711 msg(
M_USAGE,
"--vlan-accept requires --vlan-tagging");
2715 msg(
M_USAGE,
"--vlan-pvid requires --vlan-tagging");
2727 msg(
M_USAGE,
"--ifconfig-pool/--ifconfig-pool-persist requires --mode server");
2731 msg(
M_USAGE,
"--ifconfig-ipv6-pool requires --mode server");
2736 msg(
M_USAGE,
"--hash-size requires --mode server");
2740 msg(
M_USAGE,
"--learn-address requires --mode server");
2744 msg(
M_USAGE,
"--client-connect requires --mode server");
2748 msg(
M_USAGE,
"--client-crresponse requires --mode server");
2752 msg(
M_USAGE,
"--client-disconnect requires --mode server");
2756 msg(
M_USAGE,
"--client-config-dir/--ccd-exclusive requires --mode server");
2760 msg(
M_USAGE,
"--client-to-client requires --mode server");
2764 msg(
M_USAGE,
"--duplicate-cn requires --mode server");
2768 msg(
M_USAGE,
"--connect-freq requires --mode server");
2772 msg(
M_USAGE,
"--verify-client-cert requires --mode server");
2776 msg(
M_USAGE,
"--username-as-common-name requires --mode server");
2780 msg(
M_USAGE,
"--auth-user-pass-optional requires --mode server");
2784 msg(
M_USAGE,
"--opt-verify requires --mode server");
2788 msg(
M_WARN,
"WARNING: setting tcp-nodelay on the client side will not "
2789 "affect the server. To have TCP_NODELAY in both direction use "
2790 "tcp-nodelay in the server configuration instead.");
2794 msg(
M_USAGE,
"--auth-user-pass-verify requires --mode server");
2798 msg(
M_USAGE,
"--auth-gen-token requires --mode server");
2803 msg(
M_USAGE,
"--port-share requires TCP server mode (--mode server --proto tcp-server)");
2809 msg(
M_USAGE,
"--stale-routes-check requires --mode server");
2814 msg(
M_USAGE,
"--vlan-tagging requires --mode server");
2819 msg(
M_USAGE,
"--force-tls-key-material-export requires --mode server");
2829 msg(
M_USAGE,
"specify only one of --tls-server, --tls-client, or --secret");
2840 msg(msglevel,
"DEPRECATION: No tls-client or tls-server option in "
2841 "configuration detected. OpenVPN 2.8 will remove the "
2842 "functionality to run a VPN without TLS. "
2843 "See the examples section in the manual page for "
2844 "examples of a similar quick setup with peer-fingerprint."
2845 "OpenVPN 2.7 allows using this configuration when using "
2846 "--allow-deprecated-insecure-static-crypto but you should move"
2847 "to a proper configuration using TLS as soon as possible."
2853 msg(
M_WARN,
"WARNING: POTENTIALLY DANGEROUS OPTION "
2854 "--verify-client-cert none|optional "
2855 "may accept clients which do not present a certificate");
2861 const int tls_version_min =
2867 msg(
M_USAGE,
"--tls-version-min bigger than --tls-version-max");
2873 #ifdef ENABLE_PKCS11
2876 msg(
M_WARN,
"Option pkcs11-id is ignored as no pkcs11-providers are specified");
2878 else if (!
options->pkcs11_providers[0] &&
options->pkcs11_id_management)
2880 msg(
M_WARN,
"Option pkcs11-id-management is ignored as no pkcs11-providers are specified");
2883 if (
options->pkcs11_providers[0])
2887 msg(
M_USAGE,
"Parameter --pkcs11-id cannot be used when --pkcs11-id-management is also specified.");
2889 if (!
options->pkcs11_id_management &&
options->pkcs11_id == NULL)
2891 msg(
M_USAGE,
"Parameter --pkcs11-id or --pkcs11-id-management should be specified.");
2895 msg(
M_USAGE,
"Parameter --cert cannot be used when --pkcs11-provider is also specified.");
2899 msg(
M_USAGE,
"Parameter --key cannot be used when --pkcs11-provider is also specified.");
2903 msg(
M_USAGE,
"Parameter --management-external-key cannot be used when --pkcs11-provider is also specified.");
2907 msg(
M_USAGE,
"Parameter --management-external-cert cannot be used when --pkcs11-provider is also specified.");
2911 msg(
M_USAGE,
"Parameter --pkcs12 cannot be used when --pkcs11-provider is also specified.");
2913 #ifdef ENABLE_CRYPTOAPI
2916 msg(
M_USAGE,
"Parameter --cryptoapicert cannot be used when --pkcs11-provider is also specified.");
2924 msg(
M_USAGE,
"--key and --management-external-key are mutually exclusive");
2930 msg(
M_USAGE,
"--cert and --management-external-cert are mutually exclusive");
2934 msg(
M_USAGE,
"--management-external-cert must be used with --management-external-key");
2938 #ifdef ENABLE_CRYPTOAPI
2943 msg(
M_USAGE,
"Parameter --cert cannot be used when --cryptoapicert is also specified.");
2947 msg(
M_USAGE,
"Parameter --key cannot be used when --cryptoapicert is also specified.");
2951 msg(
M_USAGE,
"Parameter --pkcs12 cannot be used when --cryptoapicert is also specified.");
2955 msg(
M_USAGE,
"Parameter --management-external-key cannot be used when --cryptoapicert is also specified.");
2959 msg(
M_USAGE,
"Parameter --management-external-cert cannot be used when --cryptoapicert is also specified.");
2966 #ifdef ENABLE_CRYPTO_MBEDTLS
2967 msg(
M_USAGE,
"Parameter --pkcs12 cannot be used with the mbed TLS version version of OpenVPN.");
2971 msg(
M_USAGE,
"Parameter --capath cannot be used when --pkcs12 is also specified.");
2975 msg(
M_USAGE,
"Parameter --cert cannot be used when --pkcs12 is also specified.");
2979 msg(
M_USAGE,
"Parameter --key cannot be used when --pkcs12 is also specified.");
2983 msg(
M_USAGE,
"Parameter --management-external-key cannot be used when --pkcs12 is also specified.");
2987 msg(
M_USAGE,
"Parameter --management-external-cert cannot be used when --pkcs12 is also specified.");
2993 #ifdef ENABLE_CRYPTO_MBEDTLS
2996 msg(
M_USAGE,
"Parameter --capath cannot be used with the mbed TLS version version of OpenVPN.");
3010 msg(
M_USAGE,
"No client-side authentication method is "
3011 "specified. You must use either "
3012 "--cert/--key, --pkcs12, or "
3013 "--auth-user-pass");
3018 msg(
M_USAGE,
"If you use one of --cert or --key, you must use them both");
3035 msg(
M_USAGE,
"--tls-auth and --tls-crypt are mutually exclusive");
3040 msg(
M_USAGE,
"--tls-crypt-v2, --tls-auth and --tls-crypt are mutually exclusive in client mode");
3050 #define MUST_BE_UNDEF(parm) if (options->parm != defaults.parm) {msg(M_USAGE, err, #parm); \
3053 const char err[] =
"Parameter %s can only be specified in TLS-mode, i.e. where --tls-server or --tls-client is also specified.";
3060 #ifndef ENABLE_CRYPTO_MBEDTLS
3085 #ifdef ENABLE_PKCS11
3097 #undef MUST_BE_UNDEF
3101 msg(
M_USAGE,
"--auth-user-pass requires --pull");
3165 if (
ce->
af == AF_INET6)
3167 msg(
M_INFO,
"WARNING: '--proto udp6' is not compatible with "
3168 "'--socks-proxy' today. Forcing IPv4 mode." );
3172 msg(
M_INFO,
"NOTICE: dual-stack mode for '--proto udp' does not "
3173 "work correctly with '--socks-proxy' today. Forcing IPv4." );
3200 #ifdef ENABLE_FRAGMENT
3260 msg(
M_WARN,
"NOTICE: --explicit-exit-notify ignored for --proto tcp");
3275 msg(
M_INFO,
"Flag 'def1' added to --redirect-gateway (iservice is in use)");
3449 #ifdef DEFAULT_PKCS11_MODULE
3453 if (!
options->pkcs11_providers[0]
3456 options->pkcs11_providers[0] = DEFAULT_PKCS11_MODULE;
3481 msg(
M_WARN,
"Note: --client-to-client has no effect when using data "
3482 "channel offload: packets are always sent to the VPN "
3483 "interface and then routed based on the system routing table");
3503 bool can_do_chacha =
cipher_valid(
"CHACHA20-POLY1305");
3513 o->
ncp_ciphers =
"AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305";
3547 msg(
M_INFO,
"Note: --cipher is not set. OpenVPN versions before 2.5 "
3548 "defaulted to BF-CBC as fallback when cipher negotiation "
3549 "failed in this case. If you need this fallback please add "
3550 "'--data-ciphers-fallback BF-CBC' to your configuration "
3551 "and/or add BF-CBC to --data-ciphers.");
3556 msg(
M_WARN,
"DEPRECATED OPTION: --cipher set to '%s' but missing in "
3557 "--data-ciphers (%s). OpenVPN ignores --cipher for cipher "
3593 if (tls_ver_min == 0)
3602 else if (tls_ver_max == 0 || tls_ver_max >=
TLS_VER_1_2)
3663 "supported by the TLS library. Your system does not support this "
3664 "calculation anymore or your security policy (e.g. FIPS 140-2) "
3665 "forbids it. Connections will only work with peers running "
3666 "OpenVPN 2.6.0 or higher)");
3667 #ifndef HAVE_EXPORT_KEYING_MATERIAL
3668 msg(
M_FATAL,
"Keying Material Exporters (RFC 5705) not available either. "
3669 "No way to generate data channel keys left.");
3673 msg(
M_WARN,
"Automatically enabling option "
3674 "--force-tls-key-material-export");
3703 msg(
M_USAGE,
"--data-ciphers list contains unsupported ciphers or is too long.");
3712 for (i = 0; i < rl->
len; ++i)
3751 msg(
M_WARN,
"WARNING: Ignoring option 'dh' in tls-client mode, please only "
3752 "include this in your server configuration");
3755 #if ENABLE_MANAGEMENT
3764 msg(
M_INFO,
"Using certificate fingerprint to verify peer (no CA "
3771 msg(
M_USAGE,
"Options 'config stdin' and 'remap-usr1 SIGHUP' are "
3772 "incompatible with each other.");
3797 msg(
M_WARN,
"Option --windows-driver ovpn-dco is ignored because Data Channel Offload is disabled");
3808 msg(
M_WARN,
"Note: ignoring --dev-node as it has no effect when using "
3809 "data channel offload");
3830 #if defined(_WIN32) || defined(TARGET_ANDROID)
3833 foreign_options_copy_dns(o,
es);
3847 #ifndef ENABLE_SMALL
3849 #define CHKACC_FILE (1<<0)
3850 #define CHKACC_DIRPATH (1<<1)
3851 #define CHKACC_FILEXSTWR (1<<2)
3852 #define CHKACC_ACPTSTDIN (1<<3)
3853 #define CHKACC_PRIVATE (1<<4)
3878 char *dirpath =
dirname(fullpath);
3913 if (st.st_mode & (S_IRWXG|S_IRWXO))
3915 msg(
M_WARN,
"WARNING: file '%s' is group or others accessible", file);
3928 return (errcode != 0 ?
true :
false);
3950 struct buffer chroot_file;
3970 const int type,
const char *file,
3971 const int mode,
const char *opt)
3987 const int mode,
const char *opt)
4094 "--crl-verify directory");
4101 R_OK,
"--crl-verify");
4108 W_OK,
"--tls-export-cert");
4141 #ifdef ENABLE_MANAGEMENT
4144 "--management user/password file");
4149 "--auth-user-pass");
4152 R_OK|X_OK,
"--chroot directory");
4154 R_OK|W_OK,
"--writepid");
4158 R_OK|W_OK,
"--status");
4162 R_OK|X_OK,
"--client-config-dir");
4164 R_OK|W_OK|X_OK,
"Temporary directory (--tmp-dir)");
4168 msg(
M_USAGE,
"Please correct these errors.");
4183 #ifndef ENABLE_SMALL
4200 #if defined(_WIN32) || defined(TARGET_ANDROID)
4203 foreign_options_copy_dns(o,
es);
4259 bool tt_local =
false;
4321 if (tt && p2p_nopull)
4324 if (ios && strlen(ios))
4342 #ifdef ENABLE_FRAGMENT
4349 #define TLS_CLIENT (o->tls_client)
4350 #define TLS_SERVER (o->tls_server)
4407 #ifdef ENABLE_PREDICTION_RESISTANCE
4408 if (o->use_prediction_resistance)
4410 buf_printf(&out,
",use-prediction-resistance");
4499 const bool report_inconsistent,
4501 const struct buffer *b2_src,
4502 const char *b1_name,
4503 const char *b2_name)
4512 ||
streq(p1,
"tls-auth")
4522 struct buffer b2 = *b2_src;
4532 if (!strcmp(p1, p2))
4536 if (!strcmp(p1_prefix, p2_prefix))
4538 if (report_inconsistent)
4540 msg(msglevel,
"WARNING: '%s' is used inconsistently, %s='%s', %s='%s'",
4552 msg(msglevel,
"WARNING: '%s' is present in %s config but missing in %s config, %s='%s'",
4567 const bool report_inconsistent,
4568 const struct buffer *b1_src,
4569 const struct buffer *b2_src,
4570 const char *b1_name,
4571 const char *b2_name)
4574 struct buffer b = *b1_src;
4594 actual[actual_n - 1] = 0;
4619 actual[actual_n - 1] = 0;
4620 if (strncmp(actual, expected, 2))
4622 msg(
D_SHOW_OCC,
"NOTE: Options consistency check may be skewed by version differences");
4627 ret = !strcmp(actual, expected);
4653 const size_t opt_name_len = strlen(opt_name);
4658 if (0 == strncmp(p, opt_name, opt_name_len)
4659 && strlen(p) > (opt_name_len+1) && p[opt_name_len] ==
' ')
4662 const char *start = &p[opt_name_len+1];
4663 const char *end = strchr(p,
',');
4664 size_t val_len = end ? end - start : strlen(start);
4666 memcpy(ret, start, val_len);
4689 if (
streq(str,
"tap-windows6"))
4693 else if (
streq(str,
"wintun"))
4698 else if (
streq(str,
"ovpn-dco"))
4704 msg(msglevel,
"--windows-driver must be tap-windows6, wintun "
4718 if (
streq(str,
"net30"))
4722 else if (
streq(str,
"p2p"))
4726 else if (
streq(str,
"subnet"))
4732 msg(msglevel,
"--topology must be net30, p2p, or subnet");
4774 if (
streq(option,
"interact"))
4778 else if (
streq(option,
"nointeract"))
4782 else if (
streq(option,
"none"))
4788 msg(msglevel,
"--auth-retry method must be 'interact', 'nointeract', or 'none'");
4803 return "nointeract";
4823 fprintf(fp,
"Usage message not available\n");
4879 #define LZO_LIB_VER_STR ", LZO ", lzo_version_string()
4881 #define LZO_LIB_VER_STR "", ""
4887 #undef LZO_LIB_VER_STR
4901 #ifndef ENABLE_SMALL
4902 #ifdef CONFIGURE_DEFINES
4905 #ifdef CONFIGURE_SPECIAL_BUILD
4917 msg(
M_USAGE,
"You must define %s", description);
4926 return !strcmp(s1, s2);
4936 ping_rec_err(
int msglevel)
4938 msg(msglevel,
"only one of --ping-exit or --ping-restart options may be specified");
4945 const int i = atoi(str);
4946 return i < 0 ? 0 : i;
4953 unsigned int val = 0;
4954 sscanf(str,
"%u", &val);
4962 return c ==
'\0' || isspace(c);
4974 const int STATE_INITIAL = 0;
4975 const int STATE_READING_QUOTED_PARM = 1;
4976 const int STATE_READING_UNQUOTED_PARM = 2;
4977 const int STATE_DONE = 3;
4978 const int STATE_READING_SQUOTED_PARM = 4;
4980 const char *error_prefix =
"";
4983 const char *c = line;
4984 int state = STATE_INITIAL;
4985 bool backslash =
false;
4989 unsigned int parm_len = 0;
4995 error_prefix =
"ERROR: ";
5003 if (!backslash && in ==
'\\' && state != STATE_READING_SQUOTED_PARM)
5009 if (state == STATE_INITIAL)
5013 if (in ==
';' || in ==
'#')
5017 if (!backslash && in ==
'\"')
5019 state = STATE_READING_QUOTED_PARM;
5021 else if (!backslash && in ==
'\'')
5023 state = STATE_READING_SQUOTED_PARM;
5028 state = STATE_READING_UNQUOTED_PARM;
5032 else if (state == STATE_READING_UNQUOTED_PARM)
5034 if (!backslash &&
space(in))
5043 else if (state == STATE_READING_QUOTED_PARM)
5045 if (!backslash && in ==
'\"')
5054 else if (state == STATE_READING_SQUOTED_PARM)
5065 if (state == STATE_DONE)
5068 p[ret] =
gc_malloc(parm_len + 1,
true, gc);
5069 memcpy(p[ret], parm, parm_len);
5070 p[ret][parm_len] =
'\0';
5071 state = STATE_INITIAL;
5076 if (backslash && out)
5078 if (!(out ==
'\\' || out ==
'\"' ||
space(out)))
5081 msg(msglevel,
"%sOptions warning: Bad backslash ('\\') usage in %s:%d", error_prefix, file, line_num);
5083 msg(msglevel,
"%sOptions warning: Bad backslash ('\\') usage in %s:%d: remember that backslashes are treated as shell-escapes and if you need to pass backslash characters as part of a Windows filename, you should use double backslashes such as \"c:\\\\" PACKAGE "\\\\static.key\"", error_prefix, file, line_num);
5094 if (parm_len >=
SIZE(parm))
5096 parm[
SIZE(parm) - 1] = 0;
5097 msg(msglevel,
"%sOptions error: Parameter at %s:%d is too long (%d chars max): %s",
5098 error_prefix, file, line_num, (
int)
SIZE(parm), parm);
5101 parm[parm_len++] = out;
5110 }
while (*c++ !=
'\0');
5112 if (state == STATE_READING_QUOTED_PARM)
5114 msg(msglevel,
"%sOptions error: No closing quotation (\") in %s:%d", error_prefix, file, line_num);
5117 if (state == STATE_READING_SQUOTED_PARM)
5119 msg(msglevel,
"%sOptions error: No closing single quotation (\') in %s:%d", error_prefix, file, line_num);
5122 if (state != STATE_INITIAL)
5124 msg(msglevel,
"%sOptions error: Residual parse state (%d) in %s:%d", error_prefix, state, file, line_num);
5130 for (i = 0; i < ret; ++i)
5142 if (strlen(*p) >= 3 && !strncmp(*p,
"--", 2))
5149 #define IS_TYPE_FP 1
5150 #define IS_TYPE_BUF 2
5168 if ((
int) strlen(line) + 1 < size)
5183 int *num_lines,
struct gc_arena *gc)
5188 bool endtagfound =
false;
5193 char *line_ptr = line;
5195 while (isspace(*line_ptr))
5199 if (!strncmp(line_ptr, close_tag, strlen(close_tag)))
5204 if (!
buf_safe(&buf, strlen(line)+1))
5217 msg(
M_FATAL,
"ERROR: Endtag %s missing", close_tag);
5229 int num_inline_lines = 0;
5234 if (arg[0] ==
'<' && arg[strlen(arg)-1] ==
'>')
5238 arg[strlen(arg) - 1] =
'\0';
5240 close_tag =
alloc_buf(strlen(p[0]) + 4);
5247 return num_inline_lines;
5277 const unsigned int permission_mask,
5278 unsigned int *option_types_found,
5285 const char *top_file,
5288 const unsigned int permission_mask,
5289 unsigned int *option_types_found,
5292 const int max_recursive_levels = 10;
5299 if (level <= max_recursive_levels)
5301 if (
streq(file,
"stdin"))
5312 while (fgets(line,
sizeof(line),
fp))
5319 msg(msglevel,
"In %s:%d: Maximum option line length (%d) exceeded, line starts with %s",
5324 if (line_num == 1 && strncmp(line,
"\xEF\xBB\xBF", 3) == 0)
5333 msglevel, permission_mask, option_types_found,
5335 line_num += lines_inline;
5345 msg(msglevel,
"In %s:%d: Error opening configuration file: %s", top_file, top_line, file);
5350 msg(msglevel,
"In %s:%d: Maximum recursive include levels exceeded in include attempt of file %s -- probably you have a configuration file that tries to include itself.", top_file, top_line, file);
5361 const unsigned int permission_mask,
5362 unsigned int *option_types_found,
5369 buf_set_read(&multiline, (uint8_t *)config, strlen(config));
5371 while (
buf_parse(&multiline,
'\n', line,
sizeof(line)))
5381 permission_mask, option_types_found,
es);
5382 line_num += lines_inline;
5394 const unsigned int permission_mask,
5395 unsigned int *option_types_found,
5405 if (argc == 2 && strncmp(
argv[1],
"--", 2))
5412 option_types_found,
es);
5417 for (
int i = 1; i < argc; ++i)
5422 if (strncmp(p[0],
"--", 2))
5424 msg(msglevel,
"I'm trying to parse \"%s\" as an --option parameter but I don't see a leading '--'", p[0]);
5436 char *arg =
argv[i + j];
5437 if (strncmp(arg,
"--", 2))
5448 option_types_found,
es);
5473 while (isspace(*line))
5482 msg(
D_LOW,
"Pushed option accepted by filter: '%s'", line);
5487 msg(
D_PUSH,
"Pushed option removed by filter: '%s'", line);
5493 msg(
M_WARN,
"Pushed option rejected by filter: '%s'. Restarting.", line);
5505 unsigned int permission_mask,
5506 unsigned int *option_types_found,
5511 const char *file =
"[PUSH-OPTIONS]";
5514 while (
buf_parse(buf,
',', line,
sizeof(line)))
5526 permission_mask, option_types_found,
es);
5534 const char *filename,
5536 unsigned int permission_mask,
5537 unsigned int *option_types_found,
5540 msg(
D_PUSH,
"OPTIONS IMPORT: reading client specific options from: %s", filename);
5556 const unsigned int permission_mask,
5557 unsigned int *option_types_found,
5563 #define VERIFY_PERMISSION(mask) { \
5564 if (!verify_permission(p[0], file, line, (mask), permission_mask, \
5565 option_types_found, msglevel, options, is_inline)) \
5575 const unsigned int type,
5576 const unsigned int allowed,
5577 unsigned int *found,
5582 if (!(
type & allowed))
5584 msg(msglevel,
"option '%s' cannot be used in this context (%s)", name, file);
5590 msg(msglevel,
"option '%s' is not expected to be inline (%s:%d)", name,
5600 #ifndef ENABLE_SMALL
5613 msg(
M_WARN,
"Option '%s' in %s:%d is ignored by previous <connection> blocks ", name, file, line);
5617 msg(
M_WARN,
"Option '%s' is ignored by previous <connection> blocks", name);
5629 #define NM_QUOTE_HINT (1<<0)
5635 const unsigned int flags)
5646 msg(msglevel,
"the --%s directive should have at most %d parameter%s.%s",
5649 max >= 3 ?
"s" :
"",
5650 (flags &
NM_QUOTE_HINT) ?
" To pass a list of arguments as one of the parameters, try enclosing them in double quotes (\"\")." :
"");
5667 const char **script,
5668 const char *new_script,
5674 msg(
M_WARN,
"Multiple --%s scripts defined. "
5675 "The previously configured script is overridden.",
type);
5677 *script = new_script;
5680 #ifndef ENABLE_SMALL
5682 char script_name[100];
5683 snprintf(script_name,
sizeof(script_name),
5684 "--%s script",
type);
5706 msg(
M_WARN,
"WARNING: Compression for receiving enabled. "
5707 "Compression has been used in the past to break encryption. "
5708 "Sent packets are not compressed unless \"allow-compression yes\" "
5719 #ifdef ENABLE_PKCS11
5720 ret = ret || (
options->pkcs11_providers[0] != NULL);
5722 #ifdef ENABLE_CRYPTOAPI
5737 const unsigned int permission_mask,
5738 unsigned int *option_types_found,
5755 p[2] =
"setenv opt";
5763 file =
"[CMD-LINE]";
5766 if (
streq(p[0],
"help"))
5772 msg(msglevel,
"--help does not accept any parameters");
5776 if (
streq(p[0],
"version") && !p[1])
5781 else if (
streq(p[0],
"config") && p[1] && !p[2])
5793 #if defined(ENABLE_DEBUG) && !defined(ENABLE_SMALL)
5794 else if (
streq(p[0],
"show-gateway") && !p[2])
5798 struct in6_addr remote = IN6ADDR_ANY_INIT;
5812 else if (
streq(p[0],
"echo") ||
streq(p[0],
"parameter"))
5836 if (p[1] && strncmp(p[1],
"msg", 3) == 0)
5839 pull_mode ?
"ECHO-PULL" :
"ECHO",
5842 #ifdef ENABLE_MANAGEMENT
5851 msg(
M_WARN,
"echo/parameter option overflow");
5854 #ifdef ENABLE_MANAGEMENT
5855 else if (
streq(p[0],
"management") && p[1] && p[2] && !p[4])
5858 if (
streq(p[2],
"unix"))
5860 #if UNIX_SOCK_SUPPORT
5863 msg(msglevel,
"MANAGEMENT: this platform does not support unix domain sockets");
5875 else if (
streq(p[0],
"management-client-user") && p[1] && !p[2])
5880 else if (
streq(p[0],
"management-client-group") && p[1] && !p[2])
5885 else if (
streq(p[0],
"management-query-passwords") && !p[1])
5890 else if (
streq(p[0],
"management-query-remote") && !p[1])
5895 else if (
streq(p[0],
"management-query-proxy") && !p[1])
5900 else if (
streq(p[0],
"management-hold") && !p[1])
5905 else if (
streq(p[0],
"management-signal") && !p[1])
5910 else if (
streq(p[0],
"management-forget-disconnect") && !p[1])
5915 else if (
streq(p[0],
"management-up-down") && !p[1])
5920 else if (
streq(p[0],
"management-client") && !p[1])
5925 else if (
streq(p[0],
"management-external-key"))
5928 for (
int j = 1; j <
MAX_PARMS && p[j] != NULL; ++j)
5930 if (
streq(p[j],
"nopadding"))
5934 else if (
streq(p[j],
"pkcs1"))
5938 else if (
streq(p[j],
"pss"))
5942 else if (
streq(p[j],
"digest"))
5948 msg(msglevel,
"Unknown management-external-key flag: %s", p[j]);
5962 else if (
streq(p[0],
"management-external-cert") && p[1] && !p[2])
5968 else if (
streq(p[0],
"management-client-auth") && !p[1])
5973 else if (
streq(p[0],
"management-log-cache") && p[1] && !p[2])
5981 msg(msglevel,
"--management-log-cache parameter is out of range");
5987 #ifdef ENABLE_PLUGIN
5988 else if (
streq(p[0],
"plugin") && p[1])
5997 msg(msglevel,
"plugin add failed: %s", p[1]);
6002 else if (
streq(p[0],
"mode") && p[1] && !p[2])
6005 if (
streq(p[1],
"p2p"))
6009 else if (
streq(p[1],
"server"))
6015 msg(msglevel,
"Bad --mode parameter: %s", p[1]);
6019 else if (
streq(p[0],
"dev") && p[1] && !p[2])
6024 else if (
streq(p[0],
"dev-type") && p[1] && !p[2])
6030 else if (
streq(p[0],
"windows-driver") && p[1] && !p[2])
6036 else if (
streq(p[0],
"disable-dco"))
6040 else if (
streq(p[0],
"dev-node") && p[1] && !p[2])
6045 else if (
streq(p[0],
"lladdr") && p[1] && !p[2])
6054 msg(msglevel,
"lladdr parm '%s' must be a MAC address", p[1]);
6058 else if (
streq(p[0],
"topology") && p[1] && !p[2])
6063 else if (
streq(p[0],
"tun-ipv6") && !p[1])
6067 msg(
M_WARN,
"Note: option tun-ipv6 is ignored because modern operating systems do not need special IPv6 tun handling anymore.");
6070 #ifdef ENABLE_IPROUTE
6071 else if (
streq(p[0],
"iproute") && p[1] && !p[2])
6074 iproute_path = p[1];
6077 else if (
streq(p[0],
"ifconfig") && p[1] && p[2] && !p[3])
6087 msg(msglevel,
"ifconfig parms '%s' and '%s' must be valid addresses", p[1], p[2]);
6091 else if (
streq(p[0],
"ifconfig-ipv6") && p[1] && p[2] && !p[3])
6093 unsigned int netbits;
6099 if (netbits < 64 || netbits > 124)
6101 msg( msglevel,
"ifconfig-ipv6: /netbits must be between 64 and 124, not '/%d'", netbits );
6111 msg(msglevel,
"ifconfig-ipv6 parms '%s' and '%s' must be valid addresses", p[1], p[2]);
6115 else if (
streq(p[0],
"ifconfig-noexec") && !p[1])
6120 else if (
streq(p[0],
"ifconfig-nowarn") && !p[1])
6125 else if (
streq(p[0],
"local") && p[1] && !p[2])
6130 else if (
streq(p[0],
"remote-random") && !p[1])
6135 else if (
streq(p[0],
"connection") && p[1] && !p[3])
6149 msg(msglevel,
"Each 'connection' block must contain exactly one 'remote' directive");
6165 else if (
streq(p[0],
"ignore-unknown-option") && p[1])
6170 const char **ignore;
6174 for (i = 1; p[i]; i++)
6196 for (j = 1; p[j]; j++)
6199 if (p[j][0]==
'-' && p[j][1]==
'-')
6212 #if ENABLE_MANAGEMENT
6213 else if (
streq(p[0],
"http-proxy-override") && p[1] && p[2] && !p[4])
6223 else if (
streq(p[0],
"remote") && p[1] && !p[4])
6242 "remote: bad protocol associated with host %s: '%s'",
6264 else if (
streq(p[0],
"resolv-retry") && p[1] && !p[2])
6267 if (
streq(p[1],
"infinite"))
6276 else if ((
streq(p[0],
"preresolve") ||
streq(p[0],
"ip-remote-hint")) && !p[2])
6287 else if (
streq(p[0],
"connect-retry") && p[1] && !p[3])
6298 msg(
M_WARN,
"connect retry wait interval truncated to %d",
6308 else if ((
streq(p[0],
"connect-timeout") ||
streq(p[0],
"server-poll-timeout"))
6314 else if (
streq(p[0],
"connect-retry-max") && p[1] && !p[2])
6319 else if (
streq(p[0],
"ipchange") && p[1])
6331 else if (
streq(p[0],
"float") && !p[1])
6337 else if (
streq(p[0],
"gremlin") && p[1] && !p[2])
6343 else if (
streq(p[0],
"chroot") && p[1] && !p[2])
6348 else if (
streq(p[0],
"cd") && p[1] && !p[2])
6353 msg(
M_ERR,
"cd to '%s' failed", p[1]);
6358 #ifdef ENABLE_SELINUX
6359 else if (
streq(p[0],
"setcon") && p[1] && !p[2])
6362 options->selinux_context = p[1];
6365 else if (
streq(p[0],
"writepid") && p[1] && !p[2])
6370 else if (
streq(p[0],
"up") && p[1])
6379 else if (
streq(p[0],
"down") && p[1])
6388 else if (
streq(p[0],
"down-pre") && !p[1])
6393 else if (
streq(p[0],
"up-delay") && !p[1])
6398 else if (
streq(p[0],
"up-restart") && !p[1])
6403 else if (
streq(p[0],
"syslog") && !p[2])
6408 else if (
streq(p[0],
"daemon") && !p[2])
6421 msg(
M_WARN,
"WARNING: Multiple --daemon directives specified, ignoring --daemon %s. (Note that initscripts sometimes add their own --daemon directive.)", p[1]);
6426 else if (
streq(p[0],
"log") && p[1] && !p[2])
6432 else if (
streq(p[0],
"suppress-timestamps") && !p[1])
6438 else if (
streq(p[0],
"machine-readable-output") && !p[1])
6444 else if (
streq(p[0],
"log-append") && p[1] && !p[2])
6450 #ifdef ENABLE_MEMSTATS
6451 else if (
streq(p[0],
"memstats") && p[1] && !p[2])
6457 else if (
streq(p[0],
"mlock") && !p[1])
6462 #if ENABLE_IP_PKTINFO
6463 else if (
streq(p[0],
"multihome") && !p[1])
6469 else if (
streq(p[0],
"verb") && p[1] && !p[2])
6479 #if !defined(ENABLE_DEBUG) && !defined(ENABLE_SMALL)
6483 msg(
M_WARN,
"NOTE: debug verbosity (--verb %d) is enabled but this build lacks debug support.",
6488 else if (
streq(p[0],
"mute") && p[1] && !p[2])
6493 else if (
streq(p[0],
"errors-to-stderr") && !p[1])
6498 else if (
streq(p[0],
"status") && p[1] && !p[3])
6507 else if (
streq(p[0],
"status-version") && p[1] && !p[2])
6512 version = atoi(p[1]);
6513 if (version < 1 || version > 3)
6515 msg(msglevel,
"--status-version must be 1 to 3");
6520 else if (
streq(p[0],
"remap-usr1") && p[1] && !p[2])
6523 if (
streq(p[1],
"SIGHUP"))
6527 else if (
streq(p[1],
"SIGTERM"))
6533 msg(msglevel,
"--remap-usr1 parm must be 'SIGHUP' or 'SIGTERM'");
6537 else if ((
streq(p[0],
"link-mtu") ||
streq(p[0],
"udp-mtu")) && p[1] && !p[2])
6543 else if (
streq(p[0],
"tun-mtu") && p[1] && !p[3])
6557 else if (
streq(p[0],
"tun-mtu-max") && p[1] && !p[3])
6561 if (max_mtu < 68 || max_mtu > 65536)
6563 msg(msglevel,
"--tun-mtu-max value '%s' is invalid", p[1]);
6570 else if (
streq(p[0],
"tun-mtu-extra") && p[1] && !p[2])
6576 else if (
streq(p[0],
"max-packet-size") && p[1] && !p[2])
6584 msg(
M_WARN,
"Note: max-packet-size value outside of allowed "
6585 "control channel packet size (%d to %d), will use %d "
6595 #ifdef ENABLE_FRAGMENT
6596 else if (
streq(p[0],
"mtu-dynamic"))
6599 msg(msglevel,
"--mtu-dynamic has been replaced by --fragment");
6602 else if (
streq(p[0],
"fragment") && p[1] && !p[3])
6609 msg(msglevel,
"--fragment needs to be at least 68");
6613 if (p[2] &&
streq(p[2],
"mtu"))
6619 msg(msglevel,
"Unknown parameter to --fragment: %s", p[2]);
6623 else if (
streq(p[0],
"mtu-disc") && p[1] && !p[2])
6628 else if (
streq(p[0],
"mtu-test") && !p[1])
6633 else if (
streq(p[0],
"nice") && p[1] && !p[2])
6638 else if (
streq(p[0],
"rcvbuf") && p[1] && !p[2])
6643 else if (
streq(p[0],
"sndbuf") && p[1] && !p[2])
6648 else if (
streq(p[0],
"mark") && p[1] && !p[2])
6650 #if defined(TARGET_LINUX) && HAVE_DECL_SO_MARK
6655 else if (
streq(p[0],
"socket-flags"))
6661 if (
streq(p[j],
"TCP_NODELAY"))
6667 msg(msglevel,
"unknown socket flag: %s", p[j]);
6672 else if (
streq(p[0],
"bind-dev") && p[1])
6678 else if (
streq(p[0],
"txqueuelen") && p[1] && !p[2])
6684 msg(msglevel,
"--txqueuelen not supported on this OS");
6688 else if (
streq(p[0],
"shaper") && p[1] && !p[2])
6696 msg(msglevel,
"Bad shaper value, must be between %d and %d",
6702 else if (
streq(p[0],
"port") && p[1] && !p[2])
6707 else if (
streq(p[0],
"lport") && p[1] && !p[2])
6713 else if (
streq(p[0],
"rport") && p[1] && !p[2])
6718 else if (
streq(p[0],
"bind") && !p[2])
6722 if (p[1] &&
streq(p[1],
"ipv6only"))
6728 else if (
streq(p[0],
"nobind") && !p[1])
6733 else if (
streq(p[0],
"fast-io") && !p[1])
6738 else if (
streq(p[0],
"inactive") && p[1] && !p[3])
6744 int64_t val = atoll(p[2]);
6748 msg(
M_WARN,
"WARNING: '--inactive' with a 'bytes' value"
6749 " >2 Gbyte was silently ignored in older versions. If "
6750 " your VPN exits unexpectedly with 'Inactivity timeout'"
6751 " in %d seconds, revisit this value.",
6756 else if (
streq(p[0],
"session-timeout") && p[1] && !p[2])
6761 else if (
streq(p[0],
"proto") && p[1] && !p[2])
6771 "Bad protocol: '%s'. Allowed protocols with --proto option: %s",
6779 else if (
streq(p[0],
"proto-force") && p[1] && !p[2])
6784 if (proto_force < 0)
6786 msg(msglevel,
"Bad --proto-force protocol: '%s'", p[1]);
6791 else if (
streq(p[0],
"http-proxy") && p[1] && !p[5])
6800 msg(msglevel,
"http-proxy port number not defined");
6814 if (
streq(p[3],
"auto"))
6818 else if (
streq(p[3],
"auto-nct"))
6838 else if (
streq(p[0],
"http-proxy-user-pass") && p[1])
6846 else if (
streq(p[0],
"http-proxy-retry") ||
streq(p[0],
"socks-proxy-retry"))
6849 msg(
M_WARN,
"DEPRECATED OPTION: http-proxy-retry and socks-proxy-retry: "
6850 "In OpenVPN 2.4 proxy connection retries are handled like regular connections. "
6851 "Use connect-retry-max 1 to get a similar behavior as before.");
6853 else if (
streq(p[0],
"http-proxy-timeout") && p[1] && !p[2])
6856 msg(
M_WARN,
"DEPRECATED OPTION: http-proxy-timeout: In OpenVPN 2.4 the timeout until a connection to a "
6857 "server is established is managed with a single timeout set by connect-timeout");
6859 else if (
streq(p[0],
"http-proxy-option") && p[1] && !p[4])
6866 if (
streq(p[1],
"VERSION") && p[2] && !p[3])
6870 else if (
streq(p[1],
"AGENT") && p[2] && !p[3])
6874 else if ((
streq(p[1],
"EXT1") ||
streq(p[1],
"EXT2") ||
streq(p[1],
"CUSTOM-HEADER"))
6899 custom_header->
name = p[2];
6900 custom_header->
content = p[3];
6905 msg(msglevel,
"Bad http-proxy-option or missing or extra parameter: '%s'", p[1]);
6908 else if (
streq(p[0],
"socks-proxy") && p[1] && !p[4])
6923 else if (
streq(p[0],
"keepalive") && p[1] && p[2] && !p[3])
6929 else if (
streq(p[0],
"ping") && p[1] && !p[2])
6934 else if (
streq(p[0],
"ping-exit") && p[1] && !p[2])
6940 else if (
streq(p[0],
"ping-restart") && p[1] && !p[2])
6946 else if (
streq(p[0],
"ping-timer-rem") && !p[1])
6951 else if (
streq(p[0],
"explicit-exit-notify") && !p[2])
6963 else if (
streq(p[0],
"persist-tun") && !p[1])
6968 else if (
streq(p[0],
"persist-key") && !p[1])
6971 msg(
M_WARN,
"DEPRECATED: --persist-key option ignored. "
6972 "Keys are now always persisted across restarts. ");
6974 else if (
streq(p[0],
"persist-local-ip") && !p[1])
6979 else if (
streq(p[0],
"persist-remote-ip") && !p[1])
6984 else if (
streq(p[0],
"client-nat") && p[1] && p[2] && p[3] && p[4] && !p[5])
6990 else if (
streq(p[0],
"route") && p[1] && !p[5])
6998 msg(msglevel,
"route parameter network/IP '%s' must be a valid address", p[1]);
7003 msg(msglevel,
"route parameter netmask '%s' must be an IP address", p[2]);
7008 msg(msglevel,
"route parameter gateway '%s' must be a valid address", p[3]);
7014 else if (
streq(p[0],
"route-ipv6") && p[1] && !p[4])
7022 msg(msglevel,
"route-ipv6 parameter network/IP '%s' must be a valid address", p[1]);
7027 msg(msglevel,
"route-ipv6 parameter gateway '%s' must be a valid address", p[2]);
7034 else if (
streq(p[0],
"max-routes") && !p[2])
7036 msg(
M_WARN,
"DEPRECATED OPTION: --max-routes option ignored."
7037 "The number of routes is unlimited as of OpenVPN 2.4. "
7038 "This option will be removed in a future version, "
7039 "please remove it from your configuration.");
7041 else if (
streq(p[0],
"route-gateway") && p[1] && !p[2])
7044 if (
streq(p[1],
"dhcp"))
7056 msg(msglevel,
"route-gateway parm '%s' must be a valid address", p[1]);
7061 else if (
streq(p[0],
"route-ipv6-gateway") && p[1] && !p[2])
7069 msg(msglevel,
"route-ipv6-gateway parm '%s' must be a valid address", p[1]);
7073 else if (
streq(p[0],
"route-metric") && p[1] && !p[2])
7078 else if (
streq(p[0],
"route-delay") && !p[3])
7095 else if (
streq(p[0],
"route-up") && p[1])
7104 else if (
streq(p[0],
"route-pre-down") && p[1])
7114 "route-pre-down",
true);
7116 else if (
streq(p[0],
"route-noexec") && !p[1])
7121 else if (
streq(p[0],
"route-nopull") && !p[1])
7126 else if (
streq(p[0],
"pull-filter") && p[1] && p[2] && !p[3])
7132 if (strcmp(
"accept", p[1]) == 0)
7136 else if (strcmp(
"ignore", p[1]) == 0)
7140 else if (strcmp(
"reject", p[1]) == 0)
7146 msg(msglevel,
"Unknown --pull-filter type: %s", p[1]);
7150 f->size = strlen(p[2]);
7152 else if (
streq(p[0],
"allow-pull-fqdn") && !p[1])
7157 else if (
streq(p[0],
"redirect-gateway") ||
streq(p[0],
"redirect-private"))
7166 "WARNING: You have specified redirect-gateway and "
7167 "redirect-private at the same time (or the same option "
7168 "multiple times). This is not well supported and may lead to "
7169 "unexpected results");
7174 if (
streq(p[0],
"redirect-gateway"))
7178 for (j = 1; j <
MAX_PARMS && p[j] != NULL; ++j)
7180 if (
streq(p[j],
"local"))
7184 else if (
streq(p[j],
"autolocal"))
7188 else if (
streq(p[j],
"def1"))
7192 else if (
streq(p[j],
"bypass-dhcp"))
7196 else if (
streq(p[j],
"bypass-dns"))
7200 else if (
streq(p[j],
"block-local"))
7204 else if (
streq(p[j],
"ipv6"))
7209 else if (
streq(p[j],
"!ipv4"))
7215 msg(msglevel,
"unknown --%s flag: %s", p[0], p[j]);
7224 else if (
streq(p[0],
"block-ipv6") && !p[1])
7229 else if (
streq(p[0],
"remote-random-hostname") && !p[1])
7234 else if (
streq(p[0],
"setenv") && p[1] && !p[3])
7237 if (
streq(p[1],
"REMOTE_RANDOM_HOSTNAME") && !p[2])
7241 else if (
streq(p[1],
"GENERIC_CONFIG"))
7243 msg(msglevel,
"this is a generic configuration and cannot directly be used");
7246 else if (
streq(p[1],
"PUSH_PEER_INFO") && !p[2])
7250 else if (
streq(p[1],
"SERVER_POLL_TIMEOUT") && p[2])
7256 if (
streq(p[1],
"FORWARD_COMPATIBLE") && p[2] &&
streq(p[2],
"1"))
7264 else if (
streq(p[0],
"compat-mode") && p[1] && !p[3])
7266 unsigned int major, minor, patch;
7267 if (!(sscanf(p[1],
"%u.%u.%u", &major, &minor, &patch) == 3))
7269 msg(msglevel,
"cannot parse version number for --compat-mode: %s",
7276 else if (
streq(p[0],
"setenv-safe") && p[1] && !p[3])
7281 else if (
streq(p[0],
"script-security") && p[1] && !p[2])
7286 else if (
streq(p[0],
"mssfix") && !p[3])
7295 && (mssfix < TLS_CHANNEL_MTU_MIN || mssfix > UINT16_MAX))
7297 msg(msglevel,
"--mssfix value '%s' is invalid", p[1]);
7315 if (p[2] &&
streq(p[2],
"mtu"))
7319 else if (p[2] &&
streq(p[2],
"fixed"))
7325 msg(msglevel,
"Unknown parameter to --mssfix: %s", p[2]);
7328 else if (
streq(p[0],
"disable-occ") && !p[1])
7333 else if (
streq(p[0],
"server") && p[1] && p[2] && !p[4])
7337 in_addr_t network, netmask;
7342 if (error || !network || !netmask)
7344 msg(msglevel,
"error parsing --server parameters");
7353 if (
streq(p[3],
"nopool"))
7359 msg(msglevel,
"error parsing --server: %s is not a recognized flag", p[3]);
7364 else if (
streq(p[0],
"server-ipv6") && p[1] && !p[2])
7367 struct in6_addr network;
7368 unsigned int netbits = 0;
7373 msg(msglevel,
"error parsing --server-ipv6 parameter");
7376 if (netbits < 64 || netbits > 124)
7379 "--server-ipv6 settings: network must be between /64 and /124 (not /%d)",
7388 else if (
streq(p[0],
"server-bridge") && p[1] && p[2] && p[3] && p[4] && !p[5])
7392 in_addr_t ip, netmask, pool_start, pool_end;
7399 if (error || !ip || !netmask || !pool_start || !pool_end)
7401 msg(msglevel,
"error parsing --server-bridge parameters");
7410 else if (
streq(p[0],
"server-bridge") && p[1] &&
streq(p[1],
"nogw") && !p[2])
7416 else if (
streq(p[0],
"server-bridge") && !p[1])
7421 else if (
streq(p[0],
"push") && p[1] && !p[2])
7426 else if (
streq(p[0],
"push-reset") && !p[1])
7431 else if (
streq(p[0],
"push-remove") && p[1] && !p[2])
7437 else if (
streq(p[0],
"ifconfig-pool") && p[1] && p[2] && !p[4])
7441 in_addr_t start, end, netmask = 0;
7452 msg(msglevel,
"error parsing --ifconfig-pool parameters");
7468 else if (
streq(p[0],
"ifconfig-pool-persist") && p[1] && !p[3])
7477 else if (
streq(p[0],
"ifconfig-ipv6-pool") && p[1] && !p[2])
7480 struct in6_addr network;
7481 unsigned int netbits = 0;
7486 msg(msglevel,
"error parsing --ifconfig-ipv6-pool parameters");
7489 if (netbits < 64 || netbits > 124)
7492 "--ifconfig-ipv6-pool settings: network must be between /64 and /124 (not /%d)",
7501 else if (
streq(p[0],
"hash-size") && p[1] && p[2] && !p[3])
7507 virtual = atoi(p[2]);
7508 if (real < 1 ||
virtual < 1)
7510 msg(msglevel,
"--hash-size sizes must be >= 1 (preferably a power of 2)");
7516 else if (
streq(p[0],
"connect-freq") && p[1] && p[2] && !p[3])
7521 cf_max = atoi(p[1]);
7522 cf_per = atoi(p[2]);
7523 if (cf_max < 0 || cf_per < 0)
7525 msg(msglevel,
"--connect-freq parms must be > 0");
7531 else if (
streq(p[0],
"connect-freq-initial") && p[1] && p[2] && !p[3])
7533 long cf_max, cf_per;
7537 cf_max = strtol(p[1], &e1, 10);
7538 cf_per = strtol(p[2], &e2, 10);
7539 if (cf_max < 0 || cf_per < 0 || *e1 !=
'\0' || *e2 !=
'\0')
7541 msg(msglevel,
"--connect-freq-initial parameters must be integers and >= 0");
7547 else if (
streq(p[0],
"max-clients") && p[1] && !p[2])
7552 max_clients = atoi(p[1]);
7553 if (max_clients < 0)
7555 msg(msglevel,
"--max-clients must be at least 1");
7560 msg(msglevel,
"--max-clients must be less than %d",
MAX_PEER_ID);
7565 else if (
streq(p[0],
"max-routes-per-client") && p[1] && !p[2])
7570 else if (
streq(p[0],
"client-cert-not-required") && !p[1])
7573 msg(
M_FATAL,
"REMOVED OPTION: --client-cert-not-required, use '--verify-client-cert none' instead");
7575 else if (
streq(p[0],
"verify-client-cert") && !p[2])
7584 if (
streq(p[1],
"none"))
7588 else if (
streq(p[1],
"optional"))
7592 else if (!
streq(p[1],
"require"))
7594 msg(msglevel,
"parameter to --verify-client-cert must be 'none', 'optional' or 'require'");
7599 else if (
streq(p[0],
"username-as-common-name") && !p[1])
7604 else if (
streq(p[0],
"auth-user-pass-optional") && !p[1])
7609 else if (
streq(p[0],
"opt-verify") && !p[1])
7612 msg(
M_INFO,
"DEPRECATION: opt-verify is deprecated and will be removed "
7616 else if (
streq(p[0],
"auth-user-pass-verify") && p[1])
7625 if (
streq(p[2],
"via-env"))
7629 else if (
streq(p[2],
"via-file"))
7635 msg(msglevel,
"second parm to --auth-user-pass-verify must be 'via-env' or 'via-file'");
7641 msg(msglevel,
"--auth-user-pass-verify requires a second parameter ('via-env' or 'via-file')");
7646 p[1],
"auth-user-pass-verify",
true);
7648 else if (
streq(p[0],
"auth-gen-token"))
7654 for (
int i = 2; i <
MAX_PARMS && p[i] != NULL; i++)
7661 else if (
streq(p[i],
"external-auth"))
7667 msg(msglevel,
"Invalid argument to auth-gen-token: %s (%d)", p[i], i);
7672 else if (
streq(p[0],
"auth-gen-token-secret") && p[1] && !p[2])
7679 else if (
streq(p[0],
"client-connect") && p[1])
7687 p[1],
"client-connect",
true);
7689 else if (
streq(p[0],
"client-crresponse") && p[1])
7697 p[1],
"client-crresponse",
true);
7699 else if (
streq(p[0],
"client-disconnect") && p[1])
7707 p[1],
"client-disconnect",
true);
7709 else if (
streq(p[0],
"learn-address") && p[1])
7717 p[1],
"learn-address",
true);
7719 else if (
streq(p[0],
"tmp-dir") && p[1] && !p[2])
7724 else if (
streq(p[0],
"client-config-dir") && p[1] && !p[2])
7729 else if (
streq(p[0],
"ccd-exclusive") && !p[1])
7734 else if (
streq(p[0],
"bcast-buffers") && p[1] && !p[2])
7739 n_bcast_buf = atoi(p[1]);
7740 if (n_bcast_buf < 1)
7742 msg(msglevel,
"--bcast-buffers parameter must be > 0");
7746 else if (
streq(p[0],
"tcp-queue-limit") && p[1] && !p[2])
7748 int tcp_queue_limit;
7751 tcp_queue_limit = atoi(p[1]);
7752 if (tcp_queue_limit < 1)
7754 msg(msglevel,
"--tcp-queue-limit parameter must be > 0");
7759 else if (
streq(p[0],
"port-share") && p[1] && p[2] && !p[4])
7762 options->port_share_host = p[1];
7763 options->port_share_port = p[2];
7764 options->port_share_journal_dir = p[3];
7767 else if (
streq(p[0],
"client-to-client") && !p[1])
7772 else if (
streq(p[0],
"duplicate-cn") && !p[1])
7777 else if (
streq(p[0],
"iroute") && p[1] && !p[3])
7782 else if (
streq(p[0],
"iroute-ipv6") && p[1] && !p[2])
7787 else if (
streq(p[0],
"ifconfig-push") && p[1] && p[2] && !p[4])
7789 in_addr_t local, remote_netmask;
7794 if (local && remote_netmask)
7806 msg(msglevel,
"cannot parse --ifconfig-push addresses");
7810 else if (
streq(p[0],
"ifconfig-push-constraint") && p[1] && p[2] && !p[3])
7812 in_addr_t network, netmask;
7817 if (network && netmask)
7825 msg(msglevel,
"cannot parse --ifconfig-push-constraint addresses");
7829 else if (
streq(p[0],
"ifconfig-ipv6-push") && p[1] && !p[3])
7831 struct in6_addr local, remote;
7832 unsigned int netbits;
7838 msg(msglevel,
"cannot parse --ifconfig-ipv6-push addresses");
7846 msg( msglevel,
"cannot parse --ifconfig-ipv6-push addresses");
7856 msg( msglevel,
"second argument to --ifconfig-ipv6-push missing and no global --ifconfig-ipv6 address set");
7867 else if (
streq(p[0],
"disable") && !p[1])
7872 else if (
streq(p[0],
"tcp-nodelay") && !p[1])
7877 else if (
streq(p[0],
"stale-routes-check") && p[1] && !p[3])
7879 int ageing_time, check_interval;
7882 ageing_time = atoi(p[1]);
7885 check_interval = atoi(p[2]);
7889 check_interval = ageing_time;
7892 if (ageing_time < 1 || check_interval < 1)
7894 msg(msglevel,
"--stale-routes-check aging time and check interval must be >= 1");
7901 else if (
streq(p[0],
"client") && !p[1])
7906 else if (
streq(p[0],
"pull") && !p[1])
7911 else if (
streq(p[0],
"push-continuation") && p[1] && !p[2])
7916 else if (
streq(p[0],
"auth-user-pass") && !p[2])
7929 else if (
streq(p[0],
"auth-retry") && p[1] && !p[2])
7934 #ifdef ENABLE_MANAGEMENT
7935 else if (
streq(p[0],
"static-challenge") && p[1] && p[2] && !p[3])
7945 else if (
streq(p[0],
"msg-channel") && p[1])
7949 HANDLE process = GetCurrentProcess();
7950 HANDLE handle = (HANDLE) ((intptr_t) atoll(p[1]));
7952 FALSE, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS))
7954 msg(msglevel,
"could not duplicate service pipe handle");
7959 msg(msglevel,
"--msg-channel is only supported on Windows");
7964 else if (
streq(p[0],
"win-sys") && p[1] && !p[2])
7967 if (
streq(p[1],
"env"))
7969 msg(
M_INFO,
"NOTE: --win-sys env is default from OpenVPN 2.3. "
7970 "This entry will now be ignored. "
7971 "Please remove this entry from your configuration file.");
7978 else if (
streq(p[0],
"route-method") && p[1] && !p[2])
7981 if (
streq(p[1],
"adaptive"))
7985 else if (
streq(p[1],
"ipapi"))
7989 else if (
streq(p[1],
"exe"))
7995 msg(msglevel,
"--route method must be 'adaptive', 'ipapi', or 'exe'");
7999 else if (
streq(p[0],
"ip-win32") && p[1] && !p[4])
8009 "Bad --ip-win32 method: '%s'. Allowed methods: %s",
8024 if (!
streq(p[2],
"default"))
8026 int offset = atoi(p[2]);
8028 if (!(offset > -256 && offset < 256))
8030 msg(msglevel,
"--ip-win32 dynamic [offset] [lease-time]: offset (%d) must be > -256 and < 256", offset);
8040 const int min_lease = 30;
8042 lease_time = atoi(p[3]);
8043 if (lease_time < min_lease)
8045 msg(msglevel,
"--ip-win32 dynamic [offset] [lease-time]: lease time parameter (%d) must be at least %d seconds", lease_time, min_lease);
8056 else if (
streq(p[0],
"dns") && p[1])
8060 if (
streq(p[1],
"search-domains") && p[2])
8064 else if (
streq(p[1],
"server") && p[2] && p[3] && p[4])
8069 msg(msglevel,
"--dns server: invalid priority value '%s'", p[2]);
8075 if (
streq(p[3],
"address") && p[4])
8077 for (
int i = 4; p[i]; ++i)
8081 msg(msglevel,
"--dns server %ld: malformed address or maximum exceeded '%s'",
priority, p[i]);
8086 else if (
streq(p[3],
"resolve-domains"))
8090 else if (
streq(p[3],
"dnssec") && !p[5])
8092 if (
streq(p[4],
"yes"))
8096 else if (
streq(p[4],
"no"))
8100 else if (
streq(p[4],
"optional"))
8106 msg(msglevel,
"--dns server %ld: malformed dnssec value '%s'",
priority, p[4]);
8110 else if (
streq(p[3],
"transport") && !p[5])
8112 if (
streq(p[4],
"plain"))
8116 else if (
streq(p[4],
"DoH"))
8120 else if (
streq(p[4],
"DoT"))
8126 msg(msglevel,
"--dns server %ld: malformed transport value '%s'",
priority, p[4]);
8130 else if (
streq(p[3],
"sni") && !p[5])
8136 msg(msglevel,
"--dns server %ld: unknown option type '%s' or missing or unknown parameter",
priority, p[3]);
8142 msg(msglevel,
"--dns: unknown option type '%s' or missing or unknown parameter", p[1]);
8146 #if defined(_WIN32) || defined(TARGET_ANDROID)
8147 else if (
streq(p[0],
"dhcp-option") && p[1])
8152 if ((
streq(p[1],
"DOMAIN") ||
streq(p[1],
"ADAPTER_DOMAIN_SUFFIX"))
8158 else if (
streq(p[1],
"NBS") && p[2] && !p[3])
8163 else if (
streq(p[1],
"NBT") && p[2] && !p[3])
8167 if (!(t == 1 || t == 2 || t == 4 || t == 8))
8169 msg(msglevel,
"--dhcp-option NBT: parameter (%d) must be 1, 2, 4, or 8", t);
8175 else if ((
streq(p[1],
"DNS") ||
streq(p[1],
"DNS6")) && p[2] && !p[3]
8178 if (strstr(p[2],
":"))
8188 else if (
streq(p[1],
"WINS") && p[2] && !p[3])
8193 else if (
streq(p[1],
"NTP") && p[2] && !p[3])
8198 else if (
streq(p[1],
"NBDD") && p[2] && !p[3])
8203 else if (
streq(p[1],
"DOMAIN-SEARCH") && p[2] && !p[3])
8211 msg(msglevel,
"--dhcp-option %s: maximum of %d search entries can be specified",
8216 else if (
streq(p[1],
"DISABLE-NBT") && !p[2])
8221 #if defined(TARGET_ANDROID)
8222 else if (
streq(p[1],
"PROXY_HTTP") && p[3] && !p[4])
8224 o->http_proxy_port = atoi(p[3]);
8225 o->http_proxy = p[2];
8230 msg(msglevel,
"--dhcp-option: unknown option type '%s' or missing or unknown parameter", p[1]);
8236 else if (
streq(p[0],
"show-adapters") && !p[1])
8242 else if (
streq(p[0],
"show-net") && !p[1])
8249 else if (
streq(p[0],
"show-net-up") && !p[1])
8254 else if (
streq(p[0],
"tap-sleep") && p[1] && !p[2])
8259 if (s < 0 || s >= 256)
8261 msg(msglevel,
"--tap-sleep parameter must be between 0 and 255");
8266 else if (
streq(p[0],
"dhcp-renew") && !p[1])
8271 else if (
streq(p[0],
"dhcp-pre-release") && !p[1])
8277 else if (
streq(p[0],
"dhcp-release") && !p[1])
8279 msg(
M_WARN,
"Obsolete option --dhcp-release detected. This is now on by default");
8281 else if (
streq(p[0],
"dhcp-internal") && p[1] && !p[2])
8283 unsigned int adapter_index;
8286 adapter_index =
atou(p[1]);
8298 else if (
streq(p[0],
"register-dns") && !p[1])
8303 else if (
streq(p[0],
"block-outside-dns") && !p[1])
8308 else if (
streq(p[0],
"rdns-internal") && !p[1])
8324 else if (
streq(p[0],
"show-valid-subnets") && !p[1])
8330 else if (
streq(p[0],
"pause-exit") && !p[1])
8335 else if (
streq(p[0],
"service") && p[1] && !p[3])
8344 else if (
streq(p[0],
"allow-nonadmin") && !p[2])
8350 else if (
streq(p[0],
"user") && p[1] && !p[2])
8353 msg(
M_WARN,
"NOTE: --user option is not implemented on Windows");
8355 else if (
streq(p[0],
"group") && p[1] && !p[2])
8358 msg(
M_WARN,
"NOTE: --group option is not implemented on Windows");
8361 else if (
streq(p[0],
"user") && p[1] && !p[2])
8366 else if (
streq(p[0],
"group") && p[1] && !p[2])
8371 else if (
streq(p[0],
"dhcp-option") && p[1] && !p[3])
8374 setenv_foreign_option(
options, (
const char **)p, 3,
es);
8376 else if (
streq(p[0],
"route-method") && p[1] && !p[2])
8381 #if PASSTOS_CAPABILITY
8382 else if (
streq(p[0],
"passtos") && !p[1])
8388 else if (
streq(p[0],
"allow-compression") && p[1] && !p[2])
8392 if (
streq(p[1],
"no"))
8398 msg(msglevel,
"'--allow-compression no' conflicts with "
8399 " enabling compression");
8405 msg(msglevel,
"Cannot set allow-compression to '%s' "
8406 "after set to 'no'", p[1]);
8409 else if (
streq(p[1],
"asym"))
8414 else if (
streq(p[1],
"yes"))
8416 msg(
M_WARN,
"WARNING: Compression for sending and receiving enabled. Compression has "
8417 "been used in the past to break encryption. Allowing compression allows "
8418 "attacks that break encryption. Using \"--allow-compression yes\" is "
8419 "strongly discouraged for common usage. See --compress in the manual "
8420 "page for more information ");
8426 msg(msglevel,
"bad allow-compression option: %s -- "
8427 "must be 'yes', 'no', or 'asym'", p[1]);
8431 else if (
streq(p[0],
"comp-lzo") && !p[2])
8438 if (p[1] &&
streq(p[1],
"no"))
8445 if (
streq(p[1],
"yes"))
8450 else if (
streq(p[1],
"adaptive"))
8457 msg(msglevel,
"bad comp-lzo option: %s -- must be 'yes', 'no', or 'adaptive'", p[1]);
8468 else if (
streq(p[0],
"comp-noadapt") && !p[1])
8477 else if (
streq(p[0],
"compress") && !p[2])
8480 const char *alg =
"stub";
8486 if (
streq(alg,
"stub"))
8491 else if (
streq(alg,
"stub-v2"))
8496 else if (
streq(alg,
"migrate"))
8501 else if (
streq(alg,
"lzo"))
8506 else if (
streq(alg,
"lz4"))
8511 else if (
streq(alg,
"lz4-v2"))
8517 msg(msglevel,
"bad comp option: %s", alg);
8523 else if (
streq(p[0],
"show-ciphers") && !p[1])
8528 else if (
streq(p[0],
"show-digests") && !p[1])
8533 else if (
streq(p[0],
"show-engines") && !p[1])
8538 else if (
streq(p[0],
"key-direction") && p[1] && !p[2])
8545 if (key_direction >= 0)
8561 else if (
streq(p[0],
"secret") && p[1] && !p[3])
8563 msg(
M_WARN,
"DEPRECATED OPTION: The option --secret is deprecated.");
8567 if (!is_inline && p[2])
8572 if (key_direction >= 0)
8582 else if (
streq(p[0],
"allow-deprecated-insecure-static-crypto"))
8588 else if (
streq(p[0],
"genkey") && !p[4])
8598 if (
streq(p[1],
"secret") ||
streq(p[1],
"tls-auth")
8599 ||
streq(p[1],
"tls-crypt"))
8603 else if (
streq(p[1],
"tls-crypt-v2-server"))
8607 else if (
streq(p[1],
"tls-crypt-v2-client"))
8615 else if (
streq(p[1],
"auth-token"))
8621 msg(msglevel,
"unknown --genkey type: %s", p[1]);
8630 else if (
streq(p[0],
"auth") && p[1] && !p[2])
8635 else if (
streq(p[0],
"cipher") && p[1] && !p[2])
8640 else if (
streq(p[0],
"data-ciphers-fallback") && p[1] && !p[2])
8646 else if ((
streq(p[0],
"data-ciphers") ||
streq(p[0],
"ncp-ciphers"))
8650 if (
streq(p[0],
"ncp-ciphers"))
8652 msg(
M_INFO,
"Note: Treating option '--ncp-ciphers' as "
8653 " '--data-ciphers' (renamed in OpenVPN 2.5).");
8657 else if (
streq(p[0],
"key-derivation") && p[1])
8662 #ifdef HAVE_EXPORT_KEYING_MATERIAL
8663 if (
streq(p[1],
"tls-ekm"))
8670 msg(msglevel,
"Unknown key-derivation method %s", p[1]);
8673 else if (
streq(p[0],
"protocol-flags") && p[1])
8679 for (
size_t j = 1; j <
MAX_PARMS && p[j] != NULL; j++)
8681 if (
streq(p[j],
"cc-exit"))
8685 #ifdef HAVE_EXPORT_KEYING_MATERIAL
8686 else if (
streq(p[j],
"tls-ekm"))
8690 else if (
streq(p[j],
"dyn-tls-crypt"))
8697 msg(msglevel,
"Unknown protocol-flags flag: %s", p[j]);
8701 else if (
streq(p[0],
"force-tls-key-material-export"))
8706 else if (
streq(p[0],
"prng") && p[1] && !p[3])
8708 msg(
M_WARN,
"NOTICE: --prng option ignored (SSL library PRNG is used)");
8710 else if (
streq(p[0],
"no-replay") && !p[1])
8714 msg(
M_FATAL,
"--no-replay was removed in OpenVPN 2.7. "
8715 "Update your configuration.");
8717 else if (
streq(p[0],
"replay-window") && !p[3])
8724 replay_window = atoi(p[1]);
8727 msg(msglevel,
"replay-window window size parameter (%d) must be between %d and %d",
8739 replay_time = atoi(p[2]);
8742 msg(msglevel,
"replay-window time window parameter (%d) must be between %d and %d",
8753 msg(msglevel,
"replay-window option is missing window size parameter");
8757 else if (
streq(p[0],
"mute-replay-warnings") && !p[1])
8762 else if (
streq(p[0],
"replay-persist") && p[1] && !p[2])
8767 else if (
streq(p[0],
"test-crypto") && !p[1])
8772 #ifndef ENABLE_CRYPTO_MBEDTLS
8773 else if (
streq(p[0],
"engine") && !p[2])
8786 else if (
streq(p[0],
"providers") && p[1])
8788 for (
size_t j = 1; j <
MAX_PARMS && p[j] != NULL; j++)
8793 #ifdef ENABLE_PREDICTION_RESISTANCE
8794 else if (
streq(p[0],
"use-prediction-resistance") && !p[1])
8797 options->use_prediction_resistance =
true;
8800 else if (
streq(p[0],
"show-tls") && !p[1])
8805 else if ((
streq(p[0],
"show-curves") ||
streq(p[0],
"show-groups")) && !p[1])
8810 else if (
streq(p[0],
"ecdh-curve") && p[1] && !p[2])
8813 msg(
M_WARN,
"Consider setting groups/curves preference with "
8814 "tls-groups instead of forcing a specific curve with "
8818 else if (
streq(p[0],
"tls-server") && !p[1])
8823 else if (
streq(p[0],
"tls-client") && !p[1])
8828 else if (
streq(p[0],
"ca") && p[1] && !p[2])
8834 #ifndef ENABLE_CRYPTO_MBEDTLS
8835 else if (
streq(p[0],
"capath") && p[1] && !p[2])
8841 else if (
streq(p[0],
"dh") && p[1] && !p[2])
8847 else if (
streq(p[0],
"cert") && p[1] && !p[2])
8853 else if (
streq(p[0],
"extra-certs") && p[1] && !p[2])
8859 else if ((
streq(p[0],
"verify-hash") && p[1] && !p[3])
8860 || (
streq(p[0],
"peer-fingerprint") && p[1] && !p[2]))
8864 int verify_hash_depth = 0;
8865 if (
streq(p[0],
"verify-hash"))
8867 msg(
M_WARN,
"DEPRECATED OPTION: The option --verify-hash is deprecated. "
8868 "You should switch to the either use the level 1 certificate as "
8869 "--ca option, use --tls-verify or use --peer-fingerprint");
8871 verify_hash_depth = 1;
8880 msg(msglevel,
"ERROR: Setting %s not allowed. --verify-hash and"
8881 " --peer-fingerprint are mutually exclusive", p[0]);
8885 if (
streq(p[0],
"verify-hash"))
8887 if ((!p[2] && !is_inline) || (p[2] &&
streq(p[2],
"SHA1")))
8892 else if (p[2] && !
streq(p[2],
"SHA256"))
8894 msg(msglevel,
"invalid or unsupported hashing algorithm: %s "
8895 "(only SHA1 and SHA256 are supported)", p[2]);
8915 while (listend->
next)
8917 listend = listend->
next;
8919 listend->
next = newlist;
8922 #if defined(ENABLE_CRYPTOAPI) && defined(HAVE_XKEY_PROVIDER)
8923 else if (
streq(p[0],
"cryptoapicert") && p[1] && !p[2])
8929 else if (
streq(p[0],
"key") && p[1] && !p[2])
8935 else if (
streq(p[0],
"tls-version-min") && p[1] && !p[3])
8942 msg(msglevel,
"unknown tls-version-min parameter: %s", p[1]);
8949 else if (
streq(p[0],
"tls-version-max") && p[1] && !p[2])
8956 msg(msglevel,
"unknown tls-version-max parameter: %s", p[1]);
8963 #ifndef ENABLE_CRYPTO_MBEDTLS
8964 else if (
streq(p[0],
"pkcs12") && p[1] && !p[2])
8971 else if (
streq(p[0],
"askpass") && !p[2])
8983 else if (
streq(p[0],
"auth-nocache") && !p[1])
8988 else if (
streq(p[0],
"auth-token") && p[1] && !p[2])
8992 #ifdef ENABLE_MANAGEMENT
8999 else if (
streq(p[0],
"auth-token-user") && p[1] && !p[2])
9004 else if (
streq(p[0],
"single-session") && !p[1])
9009 else if (
streq(p[0],
"push-peer-info") && !p[1])
9014 else if (
streq(p[0],
"tls-exit") && !p[1])
9019 else if (
streq(p[0],
"tls-cipher") && p[1] && !p[2])
9024 else if (
streq(p[0],
"tls-cert-profile") && p[1] && !p[2])
9029 else if (
streq(p[0],
"tls-ciphersuites") && p[1] && !p[2])
9034 else if (
streq(p[0],
"tls-groups") && p[1] && !p[2])
9039 else if (
streq(p[0],
"crl-verify") && p[1] && ((p[2] &&
streq(p[2],
"dir"))
9043 if (p[2] &&
streq(p[2],
"dir"))
9050 else if (
streq(p[0],
"tls-verify") && p[1])
9059 "tls-verify",
true);
9061 else if (
streq(p[0],
"tls-export-cert") && p[1] && !p[2])
9066 else if (
streq(p[0],
"compat-names"))
9069 msg(msglevel,
"--compat-names was removed in OpenVPN 2.5. "
9070 "Update your configuration.");
9073 else if (
streq(p[0],
"no-name-remapping") && !p[1])
9076 msg(msglevel,
"--no-name-remapping was removed in OpenVPN 2.5. "
9077 "Update your configuration.");
9080 else if (
streq(p[0],
"verify-x509-name") && p[1] && strlen(p[1]) && !p[3])
9086 if (
streq(p[2],
"subject"))
9090 else if (
streq(p[2],
"name"))
9094 else if (
streq(p[2],
"name-prefix"))
9100 msg(msglevel,
"unknown X.509 name type: %s", p[2]);
9107 else if (
streq(p[0],
"ns-cert-type") && p[1] && !p[2])
9109 #ifdef ENABLE_CRYPTO_MBEDTLS
9110 msg(msglevel,
"--ns-cert-type is not available with mbedtls.");
9114 if (
streq(p[1],
"server"))
9118 else if (
streq(p[1],
"client"))
9124 msg(msglevel,
"--ns-cert-type must be 'client' or 'server'");
9129 else if (
streq(p[0],
"remote-cert-ku"))
9134 for (j = 1; j <
MAX_PARMS && p[j] != NULL; ++j)
9144 else if (
streq(p[0],
"remote-cert-eku") && p[1] && !p[2])
9149 else if (
streq(p[0],
"remote-cert-tls") && p[1] && !p[2])
9153 if (
streq(p[1],
"server"))
9158 else if (
streq(p[1],
"client"))
9165 msg(msglevel,
"--remote-cert-tls must be 'client' or 'server'");
9169 else if (
streq(p[0],
"tls-timeout") && p[1] && !p[2])
9174 else if (
streq(p[0],
"reneg-bytes") && p[1] && !p[2])
9179 else if (
streq(p[0],
"reneg-pkts") && p[1] && !p[2])
9184 else if (
streq(p[0],
"reneg-sec") && p[1] && !p[3])
9193 else if (
streq(p[0],
"hand-window") && p[1] && !p[2])
9198 else if (
streq(p[0],
"tran-window") && p[1] && !p[2])
9203 else if (
streq(p[0],
"tls-auth") && p[1] && !p[3])
9205 int key_direction = -1;
9214 if (!is_inline && p[2])
9217 if (key_direction < 0)
9231 if (!is_inline && p[2])
9234 if (key_direction < 0)
9242 else if (
streq(p[0],
"tls-crypt") && p[1] && !p[3])
9256 else if (
streq(p[0],
"tls-crypt-v2") && p[1] && !p[3])
9270 if (p[2] &&
streq(p[2],
"force-cookie"))
9274 else if (p[2] &&
streq(p[2],
"allow-noncookie"))
9280 msg(msglevel,
"Unsupported tls-crypt-v2 argument: %s", p[2]);
9283 else if (
streq(p[0],
"tls-crypt-v2-verify") && p[1] && !p[2])
9288 else if (
streq(p[0],
"x509-track") && p[1] && !p[2])
9293 #ifdef ENABLE_X509ALTUSERNAME
9294 else if (
streq(p[0],
"x509-username-field") && p[1])
9304 for (
size_t j = 1; j <
MAX_PARMS && p[j] != NULL; ++j)
9308 if (strncmp(
"ext:", s, 4) != 0)
9311 while (s[i] && !isupper(s[i]))
9317 while ((*s = toupper(*s)) !=
'\0')
9321 msg(
M_WARN,
"DEPRECATED FEATURE: automatically upcased the "
9322 "--x509-username-field parameter to '%s'; please update your"
9323 "configuration", p[j]);
9326 else if (!x509_username_field_ext_supported(s+4))
9328 msg(msglevel,
"Unsupported x509-username-field extension: %s", s);
9330 options->x509_username_field[j-1] = p[j];
9334 #ifdef ENABLE_PKCS11
9335 else if (
streq(p[0],
"show-pkcs11-ids") && !p[3])
9337 char *provider = p[1];
9338 bool cert_private = (p[2] == NULL ? false : ( atoi(p[2]) != 0 ));
9340 #ifdef DEFAULT_PKCS11_MODULE
9343 provider = DEFAULT_PKCS11_MODULE;
9348 int i = strtol(provider, &endp, 10);
9354 provider = DEFAULT_PKCS11_MODULE;
9361 msg(msglevel,
"--show-pkcs11-ids requires a provider parameter");
9368 show_pkcs11_ids(provider, cert_private);
9371 else if (
streq(p[0],
"pkcs11-providers") && p[1])
9377 for (j = 1; j <
MAX_PARMS && p[j] != NULL; ++j)
9379 options->pkcs11_providers[j-1] = p[j];
9382 else if (
streq(p[0],
"pkcs11-protected-authentication"))
9388 for (j = 1; j <
MAX_PARMS && p[j] != NULL; ++j)
9390 options->pkcs11_protected_authentication[j-1] = atoi(p[j]) != 0 ? 1 : 0;
9393 else if (
streq(p[0],
"pkcs11-private-mode") && p[1])
9399 for (j = 1; j <
MAX_PARMS && p[j] != NULL; ++j)
9401 sscanf(p[j],
"%x", &(
options->pkcs11_private_mode[j-1]));
9404 else if (
streq(p[0],
"pkcs11-cert-private"))
9410 for (j = 1; j <
MAX_PARMS && p[j] != NULL; ++j)
9412 options->pkcs11_cert_private[j-1] = atoi(p[j]) != 0 ? 1 : 0;
9415 else if (
streq(p[0],
"pkcs11-pin-cache") && p[1] && !p[2])
9418 options->pkcs11_pin_cache_period = atoi(p[1]);
9420 else if (
streq(p[0],
"pkcs11-id") && p[1] && !p[2])
9425 else if (
streq(p[0],
"pkcs11-id-management") && !p[1])
9428 options->pkcs11_id_management =
true;
9431 else if (
streq(p[0],
"rmtun") && !p[1])
9437 else if (
streq(p[0],
"mktun") && !p[1])
9443 else if (
streq(p[0],
"peer-id") && p[1] && !p[2])
9449 #ifdef HAVE_EXPORT_KEYING_MATERIAL
9450 else if (
streq(p[0],
"keying-material-exporter") && p[1] && p[2])
9456 if (strncmp(p[1],
"EXPORTER", 8))
9458 msg(msglevel,
"Keying material exporter label must begin with "
9464 msg(msglevel,
"Keying material exporter label must not be '"
9467 if (ekm_length < 16 || ekm_length > 4095)
9469 msg(msglevel,
"Invalid keying material exporter length");
9473 options->keying_material_exporter_label = p[1];
9474 options->keying_material_exporter_length = ekm_length;
9477 else if (
streq(p[0],
"allow-recursive-routing") && !p[1])
9482 else if (
streq(p[0],
"vlan-tagging") && !p[1])
9487 else if (
streq(p[0],
"vlan-accept") && p[1] && !p[2])
9490 if (
streq(p[1],
"tagged"))
9494 else if (
streq(p[1],
"untagged"))
9498 else if (
streq(p[1],
"all"))
9504 msg(msglevel,
"--vlan-accept must be 'tagged', 'untagged' or 'all'");
9508 else if (
streq(p[0],
"vlan-pvid") && p[1] && !p[2])
9516 "the parameter of --vlan-pvid parameters must be >= %u and <= %u",
9524 int msglevel_unknown = msglevel_fc;
9531 msglevel_unknown =
M_WARN;
9537 msg(msglevel_unknown,
"Unrecognized option or missing or extra parameter(s) in %s:%d: %s (%s)", file, line, p[0],
PACKAGE_VERSION);
9541 msg(msglevel_unknown,
"Unrecognized option or missing or extra parameter(s): --%s (%s)", p[0],
PACKAGE_VERSION);
const char * tls_crypt_file
#define SSLF_TLS_VERSION_MIN_SHIFT
struct in6_addr server_network_ipv6
void set_win_sys_path(const char *newpath, struct env_set *es)
struct tuntap * init_tun(const char *dev, const char *dev_type, int topology, const char *ifconfig_local_parm, const char *ifconfig_remote_netmask_parm, const char *ifconfig_ipv6_local_parm, int ifconfig_ipv6_netbits_parm, const char *ifconfig_ipv6_remote_parm, struct addrinfo *local_public, struct addrinfo *remote_public, const bool strict_warn, struct env_set *es, openvpn_net_ctx_t *ctx, struct tuntap *tt)
static struct connection_list * alloc_connection_list_if_undef(struct options *options)
static bool buf_safe(const struct buffer *buf, size_t len)
static void option_iroute(struct options *o, const char *network_str, const char *netmask_str, int msglevel)
void copy_route_option_list(struct route_option_list *dest, const struct route_option_list *src, struct gc_arena *a)
struct buffer buffer_read_from_file(const char *filename, struct gc_arena *gc)
buffer_read_from_file - copy the content of a file into a buffer
struct dns_options dns_options
static const char * print_vlan_accept(enum vlan_acceptable_frames mode)
enum genkey_type genkey_type
bool dhcp_renew_by_adapter_index(const DWORD adapter_index)
bool dhcp_masq_custom_offset
static bool push_peer_info(struct buffer *buf, struct tls_session *session)
Prepares the IV_ and UV_ variables that are part of the exchange to signal the peer's capabilities.
in_addr_t dns[N_DHCP_ADDR]
#define MF_EXTERNAL_KEY_PSSPAD
static bool dco_check_option(int msglevel, const struct options *o)
static bool comp_non_stub_enabled(const struct compress_options *info)
bool string_defined_equal(const char *s1, const char *s2)
static bool cipher_valid(const char *ciphername)
Returns if the cipher is valid, based on the given cipher name.
void helper_setdefault_topology(struct options *o)
Set –topology default depending on –mode.
static void options_warning_safe_scan1(const int msglevel, const int delim, const bool report_inconsistent, const struct buffer *b1_src, const struct buffer *b2_src, const char *b1_name, const char *b2_name)
const char * domain_search_list[N_SEARCH_LIST_LEN]
bool options_cmp_equal(char *actual, const char *expected)
struct verify_hash_list * verify_hash
void get_default_gateway_ipv6(struct route_ipv6_gateway_info *rgi6, const struct in6_addr *dest, openvpn_net_ctx_t *ctx)
void management_auth_token(struct management *man, const char *token)
void helper_client_server(struct options *o)
#define MF_EXTERNAL_KEY_PKCS1PAD
@ WINDOWS_DRIVER_UNSPECIFIED
void notnull(const char *arg, const char *description)
bool is_special_addr(const char *addr_str)
struct static_challenge_info sc_info
const char * client_connect_script
#define MF_EXTERNAL_KEY_NOPADDING
static void dhcp_option_address_parse(const char *name, const char *parm, in_addr_t *array, int *len, int msglevel)
bool enable_ncp_fallback
If defined fall back to ciphername if NCP fails.
void add_route_ipv6_to_option_list(struct route_ipv6_option_list *l, const char *prefix, const char *gateway, const char *metric)
#define KEY_DIRECTION_BIDIRECTIONAL
#define SF_NO_PUSH_ROUTE_GATEWAY
static struct gc_arena gc_new(void)
struct route_ipv6_option_list * clone_route_ipv6_option_list(const struct route_ipv6_option_list *src, struct gc_arena *a)
@ VLAN_ONLY_UNTAGGED_OR_PRIORITY
int string_array_len(const char **array)
#define SF_TCP_NODELAY_HELPER
const char * dco_get_supported_ciphers()
void push_remove_option(struct options *o, const char *p)
#define VERIFY_X509_SUBJECT_RDN_PREFIX
#define SSLF_TLS_VERSION_MAX_MASK
int connect_retry_seconds
int explicit_exit_notification
#define VERIFY_X509_SUBJECT_DN
bool route_gateway_via_dhcp
bool ipv6_addr_safe(const char *ipv6_text_addr)
const char * http_version
void ssl_set_auth_token_user(const char *username)
static void read_config_file(struct options *options, const char *file, int level, const char *top_file, const int top_line, const int msglevel, const unsigned int permission_mask, unsigned int *option_types_found, struct env_set *es)
void options_server_import(struct options *o, const char *filename, int msglevel, unsigned int permission_mask, unsigned int *option_types_found, struct env_set *es)
int len
Length in bytes of the actual content within the allocated memory.
const char * proto2ascii_all(struct gc_arena *gc)
in_addr_t nbdd[N_DHCP_ADDR]
struct push_list push_list
const char * socks_proxy_server
void dns_options_postprocess_pull(struct dns_options *o)
Merges pulled DNS servers with static ones into an ordered list.
struct buffer prepend_dir(const char *dir, const char *path, struct gc_arena *gc)
Prepend a directory to a path.
const char * route_ipv6_default_gateway
bool tls_item_in_cipher_list(const char *item, const char *list)
Return true iff item is present in the colon-separated zero-terminated cipher list.
#define SHA_DIGEST_LENGTH
static bool cipher_defined(const char *ciphername)
Checks if the cipher is defined and is not the null (none) cipher.
#define MAX_SEQ_BACKTRACK
unsigned int server_flags
const char * auth_token_secret_file
void setenv_str_i(struct env_set *es, const char *name, const char *value, const int i)
char * options_string(const struct options *o, const struct frame *frame, struct tuntap *tt, openvpn_net_ctx_t *ctx, bool remote, struct gc_arena *gc)
static const char * pull_filter_type_name(int type)
const char * dco_version_string(struct gc_arena *gc)
int domain_search_list_len
bool options_cmp_equal_safe(char *actual, const char *expected, size_t actual_n)
bool tls_crypt_file_inline
#define DHCP_OPTIONS_DHCP_REQUIRED
const char * proto2ascii(int proto, sa_family_t af, bool display_form)
int ascii2ipset(const char *name)
int64_t inactivity_minimum_bytes
#define ROUTE_METHOD_SERVICE
static void show_pull_filter_list(const struct pull_filter_list *l)
void script_security_set(int level)
#define VERIFY_X509_SUBJECT_RDN
static struct verify_hash_list * parse_hash_fingerprint(const char *str, int nbytes, int msglevel, struct gc_arena *gc)
Parses a hexstring and checks if the string has the correct length.
static bool dhcp_renew(const struct tuntap *tt)
static void show_dhcp_option_addrs(const char *name, const in_addr_t *array, int len)
struct route_option_list * clone_route_option_list(const struct route_option_list *src, struct gc_arena *a)
in_addr_t server_bridge_ip
const char * auth_file_up
static void options_set_backwards_compatible_options(struct options *o)
Changes default values so that OpenVPN can be compatible with the user specified version.
struct verify_hash_list * next
#define SSLF_USERNAME_AS_COMMON_NAME
struct dns_server * dns_server_get(struct dns_server **entry, long priority, struct gc_arena *gc)
Find or create DNS server with priority in a linked list.
#define MAX_TIME_BACKTRACK
const char * get_ssl_library_version(void)
return a pointer to a static memory area containing the name and version number of the SSL library in...
const char * proto_remote(int proto, bool remote)
int status_file_update_freq
#define COMP_F_ALLOW_COMPRESS
void push_options(struct options *o, char **p, int msglevel, struct gc_arena *gc)
const char * auth_method_string
#define OPENVPN_EXIT_STATUS_GOOD
const char * shared_secret_file
const char * keydirection2ascii(int kd, bool remote, bool humanreadable)
void dns_domain_list_append(struct dns_domain **entry, char **domains, struct gc_arena *gc)
Appends DNS domain parameters to a linked list.
int capacity
Size in bytes of memory allocated by malloc().
bool extra_certs_file_inline
bool tls_crypt_v2_force_cookie
bool ip_addr_dotted_quad_safe(const char *dotted_quad)
struct buffer alloc_buf_gc(size_t size, struct gc_arena *gc)
void argv_free(struct argv *a)
Frees all memory allocations allocated by the struct argv related functions.
#define X509_USERNAME_FIELD_DEFAULT
bool set_debug_level(const int level, const unsigned int flags)
bool dns_options_verify(int msglevel, const struct dns_options *o)
Checks validity of DNS options.
@ GENKEY_TLS_CRYPTV2_CLIENT
static char * get_ipv6_addr_no_netbits(const char *addr, struct gc_arena *gc)
Returns newly allocated string containing address part without "/nn".
#define TLS_CHANNEL_MTU_MIN
struct pull_filter * head
const char * dev_type_string(const char *dev, const char *dev_type)
#define TAP_MTU_EXTRA_DEFAULT
static void read_config_string(const char *prefix, struct options *options, const char *config, const int msglevel, const unsigned int permission_mask, unsigned int *option_types_found, struct env_set *es)
void tap_allow_nonadmin_access(const char *dev_node)
static void options_postprocess_mutate(struct options *o, struct env_set *es)
char * mutate_ncp_cipher_list(const char *list, struct gc_arena *gc)
Check whether the ciphers in the supplied list are supported.
static void bind_local(struct link_socket *sock, const sa_family_t ai_family)
const char * safe_print(const char *str, struct gc_arena *gc)
int parse_line(const char *line, char *p[], const int n, const char *file, const int line_num, int msglevel, struct gc_arena *gc)
void buf_clear(struct buffer *buf)
Structure for reassembling one incoming fragmented packet.
static int tls_verify(struct openvpn_plugin_args_func_in const *args)
struct in6_addr push_ifconfig_ipv6_local
static bool learn_address_script(const struct multi_context *m, const struct multi_instance *mi, const char *op, const struct mroute_addr *addr)
void options_warning_safe(char *actual, const char *expected, size_t actual_n)
const char * netbios_scope
struct connection_entry ce
struct route_option_list * new_route_option_list(struct gc_arena *a)
bool ip_or_dns_addr_safe(const char *addr, const bool allow_fqdn)
static char * read_inline_file(struct in_src *is, const char *close_tag, int *num_lines, struct gc_arena *gc)
static bool buf_copy(struct buffer *dest, const struct buffer *src)
char * format_hex_ex(const uint8_t *data, int size, int maxoutput, unsigned int space_break_flags, const char *separator, struct gc_arena *gc)
#define SSLF_AUTH_USER_PASS_OPTIONAL
#define ROUTE_METHOD_IPAPI
int ascii2keydirection(int msglevel, const char *str)
bool ifconfig_ipv6_pool_defined
hash_algo_type verify_hash_algo
enum dns_server_transport transport
const char * genkey_extra_data
void argv_parse_cmd(struct argv *argres, const char *cmdstr)
Parses a command string, tokenizes it and puts each element into a separate struct argv argument slot...
static bool proto_is_dgram(int proto)
Return if the protocol is datagram (UDP)
static unsigned int atou(const char *str)
int ping_rec_timeout_action
static void options_postprocess_mutate_ce(struct options *o, struct connection_entry *ce)
struct pull_filter * tail
static void cnol_check_alloc(struct options *options)
const char * cipher_kt_name(const char *ciphername)
Retrieve a normalised string describing the cipher (e.g.
struct client_nat_option_list * clone_client_nat_option_list(const struct client_nat_option_list *src, struct gc_arena *gc)
const char * tls_export_peer_cert_dir
int netmask_to_netbits2(in_addr_t netmask)
void print_client_nat_list(const struct client_nat_option_list *list, int msglevel)
Packet geometry parameters.
static void options_postprocess_filechecks(struct options *options)
void plugin_option_list_print(const struct plugin_option_list *list, int msglevel)
bool allow_deprecated_insecure_static_crypto
void setenv_int(struct env_set *es, const char *name, int value)
static struct verify_hash_list * parse_hash_fingerprint_multiline(const char *str, int nbytes, int msglevel, struct gc_arena *gc)
Parses a string consisting of multiple lines of hexstrings and checks if each string has the correct ...
struct route_ipv6_option_list * routes_ipv6
const char * names[MAX_PARMS]
void throw_signal_soft(const int signum, const char *signal_text)
Throw a soft global signal.
struct dns_server * servers
#define N_SEARCH_LIST_LEN
void push_reset(struct options *o)
static const char usage_message[]
bool allow_recursive_routing
static int net_ctx_init(struct context *c, openvpn_net_ctx_t *ctx)
int translate_mtu_discover_type_name(const char *name)
struct route_ipv6_option_list * routes_ipv6
void add_route_to_option_list(struct route_option_list *l, const char *network, const char *netmask, const char *gateway, const char *metric)
#define SHOW_UNSIGNED(var)
const char * tls_cert_profile
void management_echo(struct management *man, const char *string, const bool pull)
unsigned short sa_family_t
int tls_version_parse(const char *vstr, const char *extra)
static void connection_entry_load_re(struct connection_entry *ce, const struct remote_entry *re)
void test_crypto(struct crypto_options *co, struct frame *frame)
const char ** ignore_unknown_option
void ipconfig_register_dns(const struct env_set *es)
struct http_proxy_options * http_proxy_override
const char * cipher_list_tls13
bool options_postprocess_pull(struct options *o, struct env_set *es)
in_addr_t getaddr(unsigned int flags, const char *hostname, int resolve_retry_seconds, bool *succeeded, struct signal_info *sig_info)
Translate an IPv4 addr or hostname from string form to in_addr_t.
bool tuntap_options_defined
static void show_connection_entries(const struct options *o)
char * string_alloc(const char *str, struct gc_arena *gc)
static void secure_memzero(void *data, size_t len)
Securely zeroise memory.
const char * socks_proxy_port
const char * management_port
void helper_tcp_nodelay(struct options *o)
const char * print_in6_addr(struct in6_addr a6, unsigned int flags, struct gc_arena *gc)
int connect_retry_seconds_max
const char * print_topology(const int topology)
static void show_tuntap_options(const struct tuntap_options *o)
const char * ip_remote_hint
bool mac_addr_safe(const char *mac_addr)
struct dns_options dns_options
const char * auth_user_pass_file
static void show_dhcp_option_list(const char *name, const char *const *array, int len)
#define PULL_DEFINED(opt)
struct client_nat_option_list * client_nat
bool ssl_get_auth_nocache(void)
void set_machine_readable_output(bool parsable)
struct route_option_list * routes
static void bypass_doubledash(char **p)
static void option_iroute_ipv6(struct options *o, const char *prefix_str, int msglevel)
void set_suppress_timestamps(bool suppressed)
#define SSLF_TLS_VERSION_MIN_MASK
const char * md_kt_name(const char *mdname)
Retrieve a string describing the digest digest (e.g.
bool dns_server_addr_parse(struct dns_server *server, const char *addr)
Parses a string IPv4 or IPv6 address and optional colon separated port, into a in_addr or in6_addr re...
#define MAX_CUSTOM_HTTP_HEADER
#define ROUTE_METHOD_ADAPTIVE
static bool ipv6_addr_safe_hexplusbits(const char *ipv6_prefix_spec)
const struct x509_track * x509_track
enum windows_driver_type windows_driver
static bool need_compatibility_before(const struct options *o, unsigned int version)
The option –compat-mode is used to set up default settings to values used on the specified openvpn ve...
#define MF_EXTERNAL_KEY_DIGEST
bool shared_secret_file_inline
struct options_pre_connect * pre_connect
const char * management_client_group
static bool verify_permission(const char *name, const char *file, int line, const unsigned int type, const unsigned int allowed, unsigned int *found, const int msglevel, struct options *options, bool is_inline)
static int msglevel_forward_compatible(struct options *options, const int msglevel)
const char * route_default_gateway
static void remap_redirect_gateway_flags(struct options *opt)
int ifconfig_ipv6_netbits
bool push_ifconfig_ipv6_defined
const char * tls_crypt_file
#define SSLF_TLS_DEBUG_ENABLED
const char * digest
Message digest static parameters.
#define RESOLV_RETRY_INFINITE
struct compress_options comp
void clone_push_list(struct options *o)
unsigned int imported_protocol_flags
union dns_server_addr::@0 in
static void options_postprocess_cipher(struct options *o)
#define OPT_P_NCP
Negotiable crypto parameters.
int ascii2proto(const char *proto_name)
void print_route_options(const struct route_option_list *rol, int level)
static void show_compression_warning(struct compress_options *info)
size_t calc_options_string_link_mtu(const struct options *o, const struct frame *frame)
Calculate the link-mtu to advertise to our peer.
#define SSLF_CRL_VERIFY_DIR
char * options_string_extract_option(const char *options_string, const char *opt_name, struct gc_arena *gc)
Given an OpenVPN options string, extract the value of an option.
static char * string_substitute(const char *src, int from, int to, struct gc_arena *gc)
#define OPENVPN_8021Q_MAX_VID
#define MF_QUERY_PASSWORDS
const char * tls_crypt_v2_file
#define COMP_F_ADVERTISE_STUBS_ONLY
bool push_ifconfig_ipv6_blocked
void ssl_set_auth_token(const char *token)
int management_state_buffer_size
void dns_options_preprocess_pull(struct dns_options *o)
Saves and resets the server options, so that pulled ones don't mix in.
bool push_ifconfig_defined
const char * tls_auth_file
unsigned int backwards_compatible
What version we should try to be compatible with as major * 10000 + minor * 100 + patch,...
#define CONFIGURE_DEFINES
bool tls_crypt_v2_file_inline
#define ALLOC_OBJ_CLEAR_GC(dptr, type, gc)
static int check_inline_file_via_buf(struct buffer *multiline, char *p[], struct gc_arena *gc)
#define VERIFY_PERMISSION(mask)
FILE * msg_fp(const unsigned int flags)
const char * tls_auth_file
struct buffer * multiline
bool tls_crypt_v2_file_inline
const char * route_predown_script
int tls_version_max(void)
Return the maximum TLS version (as a TLS_VER_x constant) supported by current SSL implementation.
#define COMP_ALGV2_UNCOMPRESSED
bool push_ifconfig_constraint_defined
#define OPT_P_INSTANCE
allowed in ccd, client-connect etc
bool tls_auth_file_inline
struct plugin_option_list * plugin_option_list_new(struct gc_arena *gc)
bool auth_token_secret_file_inline
static void options_postprocess_setdefault_ncpciphers(struct options *o)
Checks for availibility of Chacha20-Poly1305 and sets the ncp_cipher to either AES-256-GCM:AES-128-GC...
unsigned int server_netbits_ipv6
#define CHKACC_FILE
Expect people using the stripped down version to know what they do.
const char * tls_crypt_v2_file
static bool space(unsigned char c)
bool auth_user_pass_file_inline
struct provider_list providers
struct dns_domain * domains
static struct remote_entry * alloc_remote_entry(struct options *options, const int msglevel)
void show_valid_win32_tun_subnets(void)
void options_string_import(struct options *options, const char *config, const int msglevel, const unsigned int permission_mask, unsigned int *option_types_found, struct env_set *es)
const char * management_addr
#define SSLF_CLIENT_CERT_NOT_REQUIRED
#define OPENVPN_EXIT_STATUS_USAGE
static void check_ca_required(const struct options *options)
void gc_transfer(struct gc_arena *dest, struct gc_arena *src)
static void options_warning_safe_scan2(const int msglevel, const int delim, const bool report_inconsistent, const char *p1, const struct buffer *b2_src, const char *b1_name, const char *b2_name)
static bool buf_valid(const struct buffer *buf)
void helper_keepalive(struct options *o)
static void gc_detach(struct gc_arena *a)
#define MF_FORGET_DISCONNECT
const char * ipset2ascii_all(struct gc_arena *gc)
static void add_option(struct options *options, char *p[], bool is_inline, const char *file, int line, const int level, const int msglevel, const unsigned int permission_mask, unsigned int *option_types_found, struct env_set *es)
void options_postprocess(struct options *options, struct env_set *es)
in_addr_t ifconfig_pool_netmask
struct dns_domain * search_domains
void copy_client_nat_option_list(struct client_nat_option_list *dest, const struct client_nat_option_list *src)
const char * ifconfig_options_string(const struct tuntap *tt, bool remote, bool disable, struct gc_arena *gc)
void set_pause_exit_win32(void)
int parse_topology(const char *str, const int msglevel)
static bool check_file_access_chroot(const char *chroot, const int type, const char *file, const int mode, const char *opt)
int push_ifconfig_ipv6_netbits
static void tuntap_options_copy_dns(struct options *o)
bool tls_crypt_file_inline
int renegotiate_seconds_min
const char * challenge_text
struct dns_server_addr addr[8]
void open_syslog(const char *pgmname, bool stdio_to_null)
static struct remote_list * alloc_remote_list_if_undef(struct options *options)
int stale_routes_check_interval
int scheduled_exit_interval
struct client_nat_option_list * client_nat
const char * client_crresponse_script
#define IPW32_SET_ADAPTIVE
Wrapper structure for dynamically allocated memory.
@ GENKEY_TLS_CRYPTV2_SERVER
void errors_to_stderr(void)
static bool proto_is_udp(int proto)
Returns if the protocol being used is UDP.
const char * verify_x509_name
const char * route_ipv6_default_gateway
static int global_auth_retry
const char * exit_event_name
void openvpn_exit(const int status)
static void connection_entry_preload_key(const char **key_file, bool *key_inline, struct gc_arena *gc)
struct in6_addr push_ifconfig_ipv6_remote
const char * management_certificate
void show_windows_version(const unsigned int flags)
struct compress_options comp
#define CO_USE_DYNAMIC_TLS_CRYPT
Bit-flag indicating that renegotiations are using tls-crypt with a TLS-EKM derived key.
static void set_user_script(struct options *options, const char **script, const char *new_script, const char *type, bool in_chroot)
struct route_ipv6_option_list * new_route_ipv6_option_list(struct gc_arena *a)
const char * print_in_addr_t(in_addr_t addr, unsigned int flags, struct gc_arena *gc)
unsigned remote_cert_ku[MAX_PARMS]
static bool suppress_timestamps
static void options_postprocess_http_proxy_override(struct options *o)
#define MAN_CLIENT_AUTH_ENABLED(opt)
uint8_t hash[SHA256_DIGEST_LENGTH]
void show_tap_win_adapters(int msglev, int warnlev)
struct http_proxy_options * init_http_proxy_options_once(struct http_proxy_options **hpo, struct gc_arena *gc)
void show_adapters(int msglev)
static int check_inline_file_via_fp(FILE *fp, char *p[], struct gc_arena *gc)
bool force_key_material_export
bool server_bridge_proxy_dhcp
unsigned int management_flags
static bool no_more_than_n_args(const int msglevel, char *p[], const int max, const unsigned int flags)
const char * auth_retry_print(void)
in_addr_t server_bridge_pool_start
int management_echo_buffer_size
static bool proto_is_net(int proto)
struct connection_entry ** array
void show_routes(int msglev)
const char * client_config_dir
static bool in_src_get(const struct in_src *is, char *line, const int size)
static bool dco_check_startup_option(int msglevel, const struct options *o)
#define SSLF_TLS_VERSION_MAX_SHIFT
Garbage collection arena used to keep track of dynamically allocated memory.
void add_client_nat_to_option_list(struct client_nat_option_list *dest, const char *type, const char *network, const char *netmask, const char *foreign_network, int msglevel)
const char * genkey_filename
#define COMP_F_ALLOW_NOCOMP_ONLY
struct iroute_ipv6 * next
bool key_is_external(const struct options *options)
void setenv_str(struct env_set *es, const char *name, const char *value)
#define MODE_POINT_TO_POINT
static struct pull_filter * alloc_pull_filter(struct options *o, const int msglevel)
static bool check_file_access_inline(bool is_inline, const int type, const char *file, const int mode, const char *opt)
A wrapper for check_file_access() that returns false immediately if the file is inline (and therefore...
const char * cipher
const name of the cipher
int daemon(int nochdir, int noclose)
bool auth_token_call_auth
struct remote_entry ** array
int resolve_retry_seconds
bool check_compression_settings_valid(struct compress_options *info, int msglevel)
Checks if the compression settings are valid.
struct http_proxy_options * http_proxy_options
#define EXPORT_KEY_DATA_LABEL
static bool check_file_access_chroot_inline(bool is_inline, const char *chroot, const int type, const char *file, const int mode, const char *opt)
A wrapper for check_file_access_chroot() that returns false immediately if the file is inline (and th...
void show_library_versions(const unsigned int flags)
static void strncpynt(char *dest, const char *src, size_t maxlen)
#define MUST_BE_UNDEF(parm)
const char * win32_version_string(struct gc_arena *gc, bool add_name)
void get_default_gateway(struct route_gateway_info *rgi, openvpn_net_ctx_t *ctx)
bool plugin_option_list_add(struct plugin_option_list *list, char **p, struct gc_arena *gc)
static void options_process_mutate_prf(struct options *o)
in_addr_t server_bridge_netmask
void copy_route_ipv6_option_list(struct route_ipv6_option_list *dest, const struct route_ipv6_option_list *src, struct gc_arena *a)
#define MIN_TIME_BACKTRACK
struct client_nat_option_list * new_client_nat_list(struct gc_arena *gc)
int cipher_kt_key_size(const char *ciphername)
Returns the size of keys used by the cipher, in bytes.
struct plugin_option_list * plugin_list
struct argv argv_new(void)
Allocates a new struct argv and ensures it is initialised.
bool priv_key_file_inline
struct dns_options clone_dns_options(const struct dns_options o, struct gc_arena *gc)
Makes a deep copy of the passed DNS options.
static bool dco_enabled(const struct options *o)
Returns whether the current configuration has dco enabled.
void free_buf(struct buffer *buf)
void uninit_options(struct options *o)
void ssl_set_auth_nocache(void)
bool tls_auth_file_inline
static bool strprefix(const char *str, const char *prefix)
Return true iff str starts with prefix.
static bool machine_readable_output
int management_log_history_cache
void show_dco_version(const unsigned int flags)
void options_detach(struct options *o)
void rol_check_alloc(struct options *options)
void redirect_stdout_stderr(const char *file, bool append)
static struct http_proxy_options * parse_http_proxy_override(const char *server, const char *port, const char *flags, const int msglevel, struct gc_arena *gc)
bool get_ipv6_addr(const char *hostname, struct in6_addr *network, unsigned int *netbits, int msglevel)
Translate an IPv6 addr or hostname from string form to in6_addr.
const char * socks_proxy_authfile
in_addr_t ifconfig_pool_end
static struct connection_entry * alloc_connection_entry(struct options *options, const int msglevel)
static bool check_cmd_access(const char *command, const char *opt, const char *chroot)
#define GETADDR_HOST_ORDER
bool exit_event_initial_state
#define PLUGIN_OPTION_LIST(opt)
static void rol6_check_alloc(struct options *options)
in_addr_t wins[N_DHCP_ADDR]
void setenv_dns_options(const struct dns_options *o, struct env_set *es)
Puts the DNS options into an environment set.
#define SHA256_DIGEST_LENGTH
bool ifconfig_pool_defined
#define MF_CONNECT_AS_CLIENT
sa_family_t ascii2af(const char *proto_name)
static in_addr_t get_ip_addr(const char *ip_string, int msglevel, bool *error)
#define IPW32_SET_DHCP_MASQ
void * gc_malloc(size_t size, bool clear, struct gc_arena *a)
static int max_int(int x, int y)
void init_options(struct options *o, const bool init_gc)
bool machine_readable_output
const char * tls_crypt_v2_verify_script
const char * key_pass_file
#define IPW32_SET_ADAPTIVE_DELAY_WINDOW
#define DHCP_OPTIONS_DHCP_OPTIONAL
static void show_http_proxy_options(const struct http_proxy_options *o)
static void usage_version(void)
static SERVICE_STATUS status
static void show_connection_entry(const struct connection_entry *o)
bool tun_mtu_extra_defined
const char * packet_id_file
in_addr_t push_ifconfig_remote_netmask
void show_settings(const struct options *o)
static void gc_free(struct gc_arena *a)
struct in6_addr dns6[N_DHCP_ADDR]
void show_dns_options(const struct dns_options *o)
Prints configured DNS options.
char * dirname(char *path)
static struct pull_filter_list * alloc_pull_filter_list(struct options *o)
struct connection_list * connection_list
const char * win_get_tempdir(void)
const char * ifconfig_remote_netmask
struct buffer string_alloc_buf(const char *str, struct gc_arena *gc)
struct route_option_list * routes
int ifconfig_ipv6_pool_netbits
int max_routes_per_client
const char * cryptoapi_cert
static void show_p2mp_parms(const struct options *o)
in_addr_t server_bridge_pool_end
@ WINDOWS_DRIVER_TAP_WINDOWS6
void append_cipher_to_ncp_list(struct options *o, const char *ciphername)
Appends the cipher specified by the ciphernamer parameter to to the o->ncp_ciphers list.
char * strsep(char **stringp, const char *delim)
static const char * options_warning_extract_parm1(const char *option_string, struct gc_arena *gc_ret)
in_addr_t ifconfig_pool_start
void setenv_settings(struct env_set *es, const struct options *o)
#define USAGE_VALID_SERVER_PROTOS
#define DEFAULT_SEQ_BACKTRACK
const char * extra_certs_file
static int check_inline_file(struct in_src *is, char *p[], struct gc_arena *gc)
static void setenv_connection_entry(struct env_set *es, const struct connection_entry *e, const int i)
static int positive_atoi(const char *str)
static bool check_file_access(const int type, const char *file, const int mode, const char *opt)
static void gc_init(struct gc_arena *a)
const char * ifconfig_pool_persist_filename
static void options_postprocess_verify_ce(const struct options *options, const struct connection_entry *ce)
#define OPENVPN_8021Q_MIN_VID
bool auth_user_pass_verify_script_via_file
#define SHOW_STR_INLINE(var)
void parse_argv(struct options *options, const int argc, char *argv[], const int msglevel, const unsigned int permission_mask, unsigned int *option_types_found, struct env_set *es)
const char * options_string_version(const char *s, struct gc_arena *gc)
#define SHOW_PARM(name, value, format)
static enum windows_driver_type parse_windows_driver(const char *str, const int msglevel)
Parses –windows-driver config option.
bool mute_replay_warnings
struct in6_addr ifconfig_ipv6_pool_base
const char * ifconfig_ipv6_local
const char * priv_key_file
const char * client_disconnect_script
void init_key_type(struct key_type *kt, const char *ciphername, const char *authname, bool tls_mode, bool warn)
Initialize a key_type structure with.
unsigned int push_option_types_found
void pre_connect_restore(struct options *o, struct gc_arena *gc)
int stale_routes_ageing_time
bool apply_push_options(struct options *options, struct buffer *buf, unsigned int permission_mask, unsigned int *option_types_found, struct env_set *es)
struct iroute_ipv6 * iroutes_ipv6
static int constrain_int(int x, int min, int max)
#define SF_HOST_RANDOMIZE
#define COMP_F_ALLOW_ASYM
static bool apply_pull_filter(const struct options *o, char *line)
Filter an option line by all pull filters.
bool dhcp_release_by_adapter_index(const DWORD adapter_index)
#define OPT_P_ROUTE_EXTRAS
#define SF_USE_IP_PKTINFO
static void options_postprocess_verify(const struct options *o)
struct remote_list * remote_list
#define OPENVPN_KU_REQUIRED
Require keyUsage to be present in cert (0xFFFF is an invalid KU value)
struct tuntap_options tuntap_options
struct pull_filter_list * pull_filter_list
in_addr_t push_ifconfig_local_alias
in_addr_t push_ifconfig_constraint_network
#define MIN_SEQ_BACKTRACK
const char * route_script
void x509_track_add(const struct x509_track **ll_head, const char *name, int msglevel, struct gc_arena *gc)
#define CO_USE_TLS_KEY_MATERIAL_EXPORT
Bit-flag indicating that data channel key derivation is done using TLS keying material export [RFC570...
bool ifconfig_pool_verify_range(const int msglevel, const in_addr_t start, const in_addr_t end)
struct tuntap_options tuntap_options
static void options_postprocess_mutate_invariant(struct options *options)
enum vlan_acceptable_frames vlan_accept
struct buffer alloc_buf(size_t size)
#define TLS_VER_BAD
Parse a TLS version specifier.
void setenv_del(struct env_set *es, const char *name)
const char * ifconfig_local
in_addr_t push_ifconfig_local
bool dns_server_priority_parse(long *priority, const char *str, bool pulled)
Parses a string DNS server priority and validates it.
const char * learn_address_script
const char * print_windows_driver(enum windows_driver_type windows_driver)
#define DEFAULT_TIME_BACKTRACK
int ping_rec_timeout_action
bool auth_retry_set(const int msglevel, const char *option)
const char * management_client_user
#define OPT_P_EXPLICIT_NOTIFY
const char title_string[]
void setenv_str_safe(struct env_set *es, const char *name, const char *value)
#define CO_USE_CC_EXIT_NOTIFY
Bit-flag indicating that explicit exit notifies should be sent via the control channel instead of usi...
const char * env_set_get(const struct env_set *es, const char *name)
static bool pkcs11_id_management
struct http_custom_header custom_headers[MAX_CUSTOM_HTTP_HEADER]
const char * auth_user_pass_verify_script
void * gc_realloc(void *ptr, size_t size, struct gc_arena *a)
allows to realloc a pointer previously allocated by gc_malloc or gc_realloc
struct pull_filter * next
int tun_mtu
the (user) configured tun-mtu.
int ifconfig_pool_persist_refresh_freq
void setenv_long_long(struct env_set *es, const char *name, long long value)
#define SSLF_CLIENT_CERT_OPTIONAL
const char * ifconfig_ipv6_remote
#define TLS_CHANNEL_BUF_SIZE
bool buf_printf(struct buffer *buf, const char *format,...)
bool server_bridge_defined
#define ALLOC_ARRAY_GC(dptr, type, n, gc)
static void pre_connect_save(struct options *o)
#define CONNECTION_LIST_SIZE
static void buf_set_read(struct buffer *buf, const uint8_t *data, size_t size)
void options_warning(char *actual, const char *expected)
#define ALLOC_OBJ_GC(dptr, type, gc)
const char * management_user_pass
#define NS_CERT_CHECK_SERVER
Do not perform Netscape certificate type verification.
in_addr_t push_ifconfig_constraint_netmask
const char * remote_cert_eku
void print_default_gateway(const int msglevel, const struct route_gateway_info *rgi, const struct route_ipv6_gateway_info *rgi6)
#define NS_CERT_CHECK_CLIENT
Do not perform Netscape certificate type verification.
in_addr_t ntp[N_DHCP_ADDR]
#define COMP_F_ALLOW_STUB_ONLY
static void options_warning_safe_ml(const int msglevel, char *actual, const char *expected, size_t actual_n)
int dev_type_enum(const char *dev, const char *dev_type)
static void dhcp_option_dns6_parse(const char *parm, struct in6_addr *dns6_list, int *len, int msglevel)
uint8_t * data
Pointer to the allocated memory.
bool buf_parse(struct buffer *buf, const int delim, char *line, const int size)
const char * route_default_gateway
bool check_tls_prf_working(void)
Checks if the current TLS library supports the TLS 1.0 PRF with MD5+SHA1 that OpenVPN uses when TLS K...