1FWKNOP(8)                        Fwknop Client                       FWKNOP(8)
2
3
4

NAME

6       fwknop - Firewall Knock Operator
7

SYNOPSIS

9       fwknop -A <'proto/ports'> -R|-a|-s -D <'host'> [options]
10

DESCRIPTION

12       fwknop implements an authorization scheme known as Single Packet
13       Authorization (SPA) for strong service concealment. SPA requires only a
14       single packet which is encrypted, non-replayable, and authenticated via
15       an HMAC in order to communicate desired access to a service that is
16       hidden behind a firewall in a default-drop filtering stance. The main
17       application of SPA is to use a firewall to drop all attempts to connect
18       to services such as SSH in order to make the exploitation of
19       vulnerabilities (both 0-day and unpatched code) more difficult. Any
20       service that is concealed by SPA naturally cannot be scanned for with
21       Nmap. The fwknop project natively supports four different firewalls:
22       iptables, firewalld, PF, and ipfw across Linux, OpenBSD, FreeBSD, and
23       Mac OS X. There is also support for custom scripts so that fwknop can
24       be made to support other infrastructure such as ipset or nftables.
25
26       SPA is essentially next generation Port Knocking (PK), but solves many
27       of the limitations exhibited by PK while retaining its core benefits.
28       PK limitations include a general difficulty in protecting against
29       replay attacks, asymmetric ciphers and HMAC schemes are not usually
30       possible to reliably support, and it is trivially easy to mount a DoS
31       attack against a PK server just by spoofing an additional packet into a
32       PK sequence as it traverses the network (thereby convincing the PK
33       server that the client doesn’t know the proper sequence). All of these
34       limitation are solved by SPA. At the same time, SPA hides services
35       behind a default-drop firewall policy, acquires SPA data passively
36       (usually via libpcap or other means), and implements standard
37       cryptographic operations for SPA packet authentication and
38       encryption/decryption.
39
40       This is the manual page for the fwknop client which is responsible for
41       constructing SPA packets and sending them over the network. The server
42       side is implemented by the fwknopd daemon which sniffs the network for
43       SPA packets and interacts with the local firewall to allow SPA
44       authenticated connections. It is recommended to read the fwknopd(8)
45       manual page as well. Further detailed information may be found in the
46       tutorial “Single Packet Authorization: A Comprehensive Guide to Strong
47       Service Concealment with fwknop” available online (see:
48       http://www.cipherdyne.org/fwknop/docs/fwknop-tutorial.html).
49
50       SPA packets generated by fwknop leverage HMAC for authenticated
51       encryption in the encrypt-then-authenticate model. Although the usage
52       of an HMAC is currently optional (enabled via the --use-hmac command
53       line switch), it is highly recommended for three reasons: 1) without an
54       HMAC, cryptographically strong authentication is not possible with
55       fwknop unless GnuPG is used, but even then an HMAC should still be
56       applied, 2) an HMAC applied after encryption protects against
57       cryptanalytic CBC-mode padding oracle attacks such as the Vaudenay
58       attack and related trickery (like the more recent "Lucky 13" attack
59       against SSL), and 3) the code required by the fwknopd daemon to verify
60       an HMAC is much more simplistic than the code required to decrypt an
61       SPA packet, so an SPA packet without a proper HMAC isn’t even sent
62       through the decryption routines. Reason 3) is why an HMAC should still
63       be used even when SPA packets are encrypted with GnuPG due to the fact
64       that SPA data is not sent through libgpgme functions unless the HMAC
65       checks out first. GnuPG and libgpgme are relatively complex bodies of
66       code, and therefore limiting the ability of a potential attacker to
67       interact with this code through an HMAC operation helps to maintain a
68       stronger security stance. Generating an HMAC for SPA communications
69       requires a dedicated key in addition to the normal encryption key, and
70       both can be generated with the --key-gen option.
71
72       fwknop encrypts SPA packets either with the Rijndael block cipher or
73       via GnuPG and associated asymmetric cipher. If the symmetric encryption
74       method is chosen, then as usual the encryption key is shared between
75       the client and server (see the fwknopd /etc/fwknop/access.conf file for
76       details). The actual encryption key used for Rijndael encryption is
77       generated via the standard PBKDF1 key derivation algorithm, and CBC
78       mode is set. If the GnuPG method is chosen, then the encryption keys
79       are derived from GnuPG key rings. SPA packets generated by fwknop
80       running as a client adhere to the following format (before encryption
81       and the HMAC is applied):
82
83               random data (16 digits)
84               username
85               timestamp
86               software version
87               mode (command mode (0) or access mode (1))
88               if command mode => command to execute
89               else access mode  => IP,proto,port
90               message digest (SHA512 / SHA384 / SHA256 / SHA1 / MD5 / SHA3_256 / SHA3_512)
91
92       Each of the above fields are separated by a ":" character due to the
93       variable length of several of the fields, and those that might contain
94       ":" characters are base64 encoded. The message digest (SHA256 by
95       default) is part of the data to be encrypted and is independent of the
96       HMAC which is appended to the SPA packet data after encryption. The 16
97       digits of random data (about 53 bits) ensures that no two SPA packets
98       are identical, and this is in addition to and independent of using
99       PBKDF1 for key derivation for Rijndael in CBC mode (which uses an
100       8-byte random "salt" value). Because fwknopd tracks the SHA256 digest
101       of all incoming valid SPA packets and throws out duplicates, replay
102       attacks are not feasible against fwknop. Syslog alerts are generated if
103       a replay is detected.
104
105       By default, the fwknop client sends authorization packets over UDP port
106       62201, but this can be altered with the --server-port argument (this
107       requires fwknopd to be configured to acquire SPA data over the selected
108       port). Also, fwknop can send the SPA packet over a random port via the
109       --rand-port argument. See fwknopd(8) for further details. See the
110       EXAMPLES section for example invocations of the fwknop client.
111
112       The fwknop client is quite portable, and is known to run on various
113       Linux distributions (all major distros and embedded ones such as
114       OpenWRT as well), FreeBSD, OpenBSD, Mac OS X, and Cygwin on Windows.
115       There is also a library libfko that both fwknop and fwknopd use for SPA
116       packet encryption/decryption and HMAC authentication operations. This
117       library can be used to allow third party applications to use SPA
118       subject to the terms of the GNU General Public License (GPL v2+).
119

REQUIRED ARGUMENTS

121       These required arguments can be specified via command-line or from
122       within the ~/.fwknoprc file (see -n, --named-config option and the
123       FWKNOPRC FILE section below).
124
125       -A, --access=<port list>
126           Provide a list of ports and protocols to access on a remote
127           computer running fwknopd. The format of this list is
128           “+<proto>/<port>...<proto>/<port>+”, e.g. “tcp/22,udp/53”.  NOTE:
129           The vast majority of usages for fwknop require the -A argument, but
130           sending full commands with the --server-cmd argument via an SPA
131           packet to be executed by fwknopd does not require this argument.
132
133       -D, --destination=<hostname/IP-address>
134           Direct the fwknop client to authenticate with the fwknopd
135           daemon/service at the specified destination hostname or IP address.
136           The connection mode is discovered by the fwknopd daemon/service
137           when it decrypts and parses the authentication packet.
138
139       -R|-a|-s
140           One of these options (see below) is required to tell the remote
141           fwknopd daemon what IP should be allowed through the firewall. It
142           is recommend to use the -R or -a options instead of -s in order to
143           harden SPA communications against possible Man-In-The-Middle (MITM)
144           attacks, and on the server side set REQUIRE_SOURCE_ADDRESS variable
145           in the /etc/fwknop/access.conf file. Note that the most secure
146           option is -a so that fwknop does not have to issue any HTTPS
147           request to https://www.cipherdyne.org/cgi-bin/myip in order to
148           resolve the externally routable IP address. Using -a requires that
149           the user already knows what the external IP is for the network
150           where fwknop is running.
151

GENERAL OPTIONS

153       -h, --help
154           Print a usage summary message and exit.
155
156       -G, --get-key=<file>
157           Load an encryption key/password from the specified file. The key
158           file contains a line for each destination hostname or IP address, a
159           colon (":"), optional space and the password, followed by a
160           newline. Note that the last line has to have a terminating newline
161           character. Also note: though this is a convenience, having a file
162           on your system with clear text passwords is not a good idea and is
163           not recommended. Having the fwknop client prompt you for the key is
164           generally more secure. Note also that if a key is stored on disk,
165           the fwknop rc file is a more powerful mechanism for specifying not
166           only the key but other options as well.
167
168       --stdin
169           Read the encryption key/password from stdin. This can be used to
170           send the data via a pipe for example. This command is similar to
171           --fd 0.
172
173       --fd=<number>
174           Specify the file descriptor number to read the key/password from.
175           This command avoids the user being prompted for a password if none
176           has been found in the user specific stanza, or none has been
177           supplied on the command line. A file descriptor set to 0 is similar
178           to the stdin command.
179
180       --get-hmac-key=<file>
181           Load an HMAC key/password from the specified file. Similarly to the
182           format for the --get-key option, the HMAC key file contains a line
183           for each destination hostname or IP address, a colon (":"),
184           optional space and the password, followed by a newline. Note that
185           the last line has to have a terminating newline character. Also
186           note: though this is a convenience, having a file on your system
187           with clear text passwords is not a good idea and is not
188           recommended. Having the fwknop client prompt you for the HMAC key
189           is generally more secure. Note also that if a key is stored on
190           disk, the fwknop rc file is a more powerful mechanism for
191           specifying not only the HMAC key but other options as well.
192
193       --key-gen
194           Have fwknop generate both Rijndael and HMAC keys that can be used
195           for SPA packet encryption and authentication. These keys are
196           derived from /dev/urandom and then base64 encoded before being
197           printed to stdout, and are meant to be included within the
198           “$HOME/.fwknoprc” file (or the file referenced by --get-key). Such
199           keys are generally more secure than passphrases that are typed in
200           from the command line.
201
202       --key-gen-file=<file>
203           Write generated keys to the specified file. Note that the file is
204           overwritten if it already exists. If this option is not given, then
205           --key-gen writes the keys to stdout.
206
207       --key-len=<length>
208           Specify the number of bytes for a generated Rijndael key. The
209           maximum size is currently 128 bytes.
210
211       --hmac-key-len=<length>
212           Specify the number of bytes for a generated HMAC key. The maximum
213           size is currently 128 bytes.
214
215       -l, --last-cmd
216           Execute fwknop with the command-line arguments from the previous
217           invocation (if any). The previous arguments are parsed out of the
218           ~/.fwknop.run file.
219
220       -n, --named-config=<stanza name>
221           Specify the name of the configuration stanza in the
222           “$HOME/.fwknoprc” file to pull configuration and command
223           directives. These named stanzas alleviate the need for remembering
224           the various command-line arguments for frequently used invocations
225           of fwknop. See the section labeled, FWKNOPRC FILE below for a list
226           of the valid configuration directives in the .fwknoprc file.
227
228       --key-rijndael=<key>
229           Specify the Rijndael key on the command line. Since the key may be
230           visible to utilities such as ps under Unix, this form should only
231           be used where security is not critical. Having the fwknop client
232           either prompt you for the key or acquire via the “$HOME/.fwknoprc”
233           file is generally more secure.
234
235       --key-base64-rijndael=<key>
236           Specify the base64 encoded Rijndael key. Since the key may be
237           visible to utilities such as ps under Unix, this form should only
238           be used where security is not critical. Having the fwknop client
239           either prompt you for the key or acquire via the “$HOME/.fwknoprc”
240           file is generally more secure.
241
242       --key-base64-hmac=<key>
243           Specify the base64 encoded HMAC key. Since the key may be visible
244           to utilities such as ps under Unix, this form should only be used
245           where security is not critical. Having the fwknop client either
246           prompt you for the key or acquire via the “$HOME/.fwknoprc” file is
247           generally more secure.
248
249       --key-hmac=<key>
250           Specify the raw HMAC key (not base64 encoded). Since the key may be
251           visible to utilities such as ps under Unix, this form should only
252           be used where security is not critical. Having the fwknop client
253           either prompt you for the key or acquire via the “$HOME/.fwknoprc”
254           file is generally more secure.
255
256       --rc-file=<file>
257           Specify path to the fwknop rc file (default is “$HOME/.fwknoprc”).
258
259       --no-rc-file
260           Perform fwknop client operations without referencing the
261           “$HOME/.fwknoprc” file.
262
263       --no-home-dir
264           Do not allow the fwknop client to look for the home directory
265           associated with the user.
266
267       --save-rc-stanza=<stanza name>
268           Save command line arguments to the “$HOME/.fwknoprc” stanza
269           specified with the -n option. If the -n option is omitted, then the
270           stanza name will default to the destination server value (hostname
271           or IP) given with the -D argument.
272
273       --force-stanza
274           Used with --save-rc-stanza to overwrite all of the variables for
275           the specified stanza
276
277       --stanza-list
278           Dump a list of the stanzas found in “$HOME/.fwknoprc”.
279
280       --show-last
281           Display the last command-line arguments used by fwknop.
282
283       -E, --save-args-file=<file>
284           Save command line arguments to a specified file path. Without this
285           option, and when --no-save-args is not also specified, then the
286           default save args path is ~/.fwknop.run.
287
288       --no-save-args
289           Do not save the command line arguments given when fwknop is
290           executed.
291
292       -T, --test
293           Test mode. Generate the SPA packet data, but do not send it.
294           Instead, print a break-down of the SPA data fields, then run the
295           data through the decryption and decoding process and print the
296           break-down again. This is primarily a debugging feature.
297
298       -B, --save-packet=<file>
299           Instruct the fwknop client to write a newly created SPA packet out
300           to the specified file so that it can be examined off-line.
301
302       -b, --save-packet-append
303           Append the generated packet data to the file specified with the -B
304           option.
305
306       --fault-injection-tag=<tag>
307           This option is only used for fault injection testing when fwknop is
308           compiled to support the libfiu library (see:
309           http://blitiri.com.ar/p/libfiu/). Under normal circumstances this
310           option is not used, and any packaged version of fwknop will not
311           have code compiled in so this capability is not enabled at run
312           time. It is documented here for completeness.
313
314       -v, --verbose
315           Run the fwknop client in verbose mode. This causes fwknop to print
316           some extra information about the current command and the resulting
317           SPA data.
318
319       -V, --version
320           Display version information and exit.
321

SPA OPTIONS

323       --use-hmac
324           Set HMAC mode for authenticated encryption of SPA communications.
325           As of fwknop 2.5, this is an optional feature, but this will become
326           the default in a future release.
327
328       -a, --allow-ip=<IP-address>
329           Specify IP address that should be permitted through the destination
330           fwknopd server firewall (this IP is encrypted within the SPA packet
331           itself). This is useful to prevent a MITM attack where a SPA packet
332           can be intercepted en-route and sent from a different IP than the
333           original. Hence, if the fwknopd server trusts the source address on
334           the SPA packet IP header then the attacker gains access. The -a
335           option puts the source address within the encrypted SPA packet, and
336           so thwarts this attack. The -a option is also useful to specify the
337           IP that will be granted access when the SPA packet itself is
338           spoofed with the --spoof-src option. Another related option is -R
339           (see below) which instructs the fwknop client to automatically
340           resolve the externally routable IP address the local system is
341           connected to by querying https://www.cipherdyne.org/cgi-bin/myip.
342           This returns the actual IP address it sees from the calling system.
343
344       -g, --gpg-encryption
345           Use GPG encryption on the SPA packet (default if not specified is
346           Rijndael).  Note: Use of this option will also require a GPG
347           recipient (see --gpg-recipient along with other GPG-related options
348           below).
349
350       --hmac-digest-type=<digest>
351           Set the HMAC digest algorithm for authenticated encryption of SPA
352           packets. Choices are: MD5, SHA1, SHA256 (the default), SHA384,
353           SHA512, SHA3_256, and SHA3_512.
354
355       -N, --nat-access=<internalIP:forwardPort>
356           The fwknopd server offers the ability to provide SPA access through
357           an iptables firewall to an internal service by interfacing with the
358           iptables NAT capabilities. So, if the fwknopd server is protecting
359           an internal network on an RFC-1918 address space, an external
360           fwknop client can request that the server port forward an external
361           port to an internal IP, i.e. “+--NAT-access 192.168.10.2,55000+”.
362           In this case, access will be granted to 192.168.10.2 via port 55000
363           to whatever service is requested via the --access argument (usually
364           tcp/22). Hence, after sending such an SPA packet, one would then do
365           “ssh -p 55000 user@host” and the connection would be forwarded on
366           through to the internal 192.168.10.2 system automatically. Note
367           that the port “55000” can be randomly generated via the
368           --nat-rand-port argument (described later).
369
370       --nat-local
371           On the fwknopd server, a NAT operation can apply to the local
372           system instead of being forwarded through the system. That is, for
373           iptables firewalls, a connection to, say, port 55,000 can be
374           translated to port 22 on the local system. By making use of the
375           --nat-local argument, the fwknop client can be made to request such
376           access. This means that any external attacker would only see a
377           connection over port 55,000 instead of the expected port 22 after
378           the SPA packet is sent.
379
380       --nat-port
381           Usually fwknop is used to request access to a specific port such as
382           tcp/22 on a system running fwknopd. However, by using the
383           --nat-port argument, it is possible to request access to a (again,
384           such as tcp/22), but have this access granted via the specified
385           port (so, the -p argument would then be used on the SSH client
386           command line). See the --nat-local and --nat-access command line
387           arguments to fwknop for additional details on gaining access to
388           services via a NAT operation.
389
390       --nat-rand-port
391           Usually fwknop is used to request access to a specific port such as
392           tcp/22 on a system running fwknopd. However, by using the
393           --nat-rand-port argument, it is possible to request access to a
394           particular service (again, such as tcp/22), but have this access
395           granted via a random translated port. That is, once the fwknop
396           client has been executed in this mode and the random port selected
397           by fwknop is displayed, the destination port used by the follow-on
398           client must be changed to match this random port. For SSH, this is
399           accomplished via the -p argument. See the --nat-local and
400           --nat-access command line arguments to fwknop for additional
401           details on gaining access to services via a NAT operation.
402
403       -p, --server-port=<port>
404           Specify the port number where fwknopd accepts packets via libpcap
405           or ulogd pcap writer. By default fwknopd looks for authorization
406           packets over UDP port 62201.
407
408       -P, --server-proto=<protocol>
409           Set the protocol (udp, tcp, http, udpraw, tcpraw, or icmp) for the
410           outgoing SPA packet. Note: The udpraw, tcpraw, and icmp modes use
411           raw sockets and thus require root access to run. Also note: The tcp
412           mode expects to establish a TCP connection to the server before
413           sending the SPA packet. This is not normally done, but is useful
414           for compatibility with the Tor for strong anonymity; see
415           http://tor.eff.org/. In this case, the fwknopd server will need to
416           be configured to listen on the target TCP port (which is 62201 by
417           default).
418
419       -Q, --spoof-src=<IP>
420           Spoof the source address from which the fwknop client sends SPA
421           packets. This requires root on the client side access since a raw
422           socket is required to accomplish this. Note that the --spoof-user
423           argument can be given in this mode in order to pass any
424           REQUIRE_USERNAME keyword that might be specified in
425           /etc/fwknop/access.conf.
426
427       -r, --rand-port
428           Instruct the fwknop client to send an SPA packet over a random
429           destination port between 10,000 and 65535. The fwknopd server must
430           use a PCAP_FILTER variable that is configured to accept such
431           packets. For example, the PCAP_FILTER variable could be set to:
432           “+udp dst portrange 10000-65535+”.
433
434       -R, --resolve-ip-https
435           This is an important option, and instructs the fwknop client to
436           issue an HTTPS request to a script running on cipherdyne.org that
437           returns the client’s IP address (as seen by the web server). In
438           some cases, this is needed to determine the IP address that should
439           be allowed through the firewall policy at the remote fwknopd server
440           side. This option is useful if the fwknop client is being used on a
441           system that is behind an obscure NAT address, and the external
442           Internet facing IP is not known to the user. The full resolution
443           URL is: https://www.cipherdyne.org/cgi-bin/myip, and is accessed by
444           fwknop via wget in --secure-protocol mode. Note that it is
445           generally more secure to use the -a option if the externally
446           routable IP address for the client is already known to the user
447           since this eliminates the need for fwknop to issue any sort of
448           HTTPS request.
449
450       --resolve-url <url>
451           Override the default URL used for resolving the source IP address.
452           For best results, the URL specified here should point to a web
453           service that provides just an IP address in the body of the HTTP
454           response.
455
456       --resolve-http-only
457           This option forces the fwknop client to resolve the external IP via
458           HTTP instead of HTTPS. There are some circumstances where this
459           might be necessary such as when wget is not available (or hasn’t
460           been compiled with SSL support), but generally this is not
461           recommended since it opens the possibility of a MITM attack through
462           manipulation of the IP resolution HTTP response. Either specify the
463           IP manually with -a, or use -R and omit this option.
464
465       -w, --wget-cmd=<wget full path>
466           Manually set the full path to the wget command. Normally the
467           configure script finds the wget command, but this option can be
468           used to specify the path if it is located in a non-standard place.
469
470       -s, --source-ip
471           Instruct the fwknop client to form an SPA packet that contains the
472           special-case IP address “+0.0.0.0+” which will inform the
473           destination fwknopd SPA server to use the source IP address from
474           which the SPA packet originates as the IP that will be allowed
475           through upon modification of the firewall ruleset. This option is
476           useful if the fwknop client is deployed on a machine that is behind
477           a NAT device and the external IP is not known. However, usage of
478           this option is not recommended, and either the -a or -R options
479           should be used instead. The permit-address options -s, -R and -a
480           are mutually exclusive.
481
482       -S, --source-port=<port>
483           Set the source port for outgoing SPA packet.
484
485       --server-resolve-ipv4
486           This option forces the fwknop client to only accept an IPv4 address
487           from DNS when a hostname is used for the SPA server. This is
488           necessary in some cases where DNS may return both IPv6 and IPv4
489           addresses.
490
491       -f, --fw-timeout=<seconds>
492           Specify the length of time (seconds) that the remote firewall rule
493           that grants access to a service is to remain active. The default
494           maintained by fwknopd is 30 seconds, but any established connection
495           can be kept open after the initial accept rule is deleted through
496           the use of a connection tracking mechanism that may be offered by
497           the firewall.
498
499       -C, --server-cmd=<command to execute>
500           Instead of requesting access to a service with an SPA packet, the
501           --server-cmd argument specifies a command that will be executed by
502           the fwknopd server. The command is encrypted within the SPA packet
503           and sniffed off the wire (as usual) by the fwknopd server.
504
505       -H, --http-proxy=<proxy-host>[:port]
506           Specify an HTTP proxy that the fwknop client will use to send the
507           SPA packet through. Using this option will automatically set the
508           SPA packet transmission mode (usually set via the --server-proto
509           argument) to "http". You can also specify the proxy port by adding
510           ":<port>" to the proxy host name or ip.
511
512       -m, --digest-type=<digest>
513           Specify the message digest algorithm to use in the SPA data.
514           Choices are: MD5, SHA1, SHA256 (the default), SHA384, and SHA512,
515           SHA3_256, and SHA3_512.
516
517       -M, --encryption-mode=<mode>
518           Specify the encryption mode when AES is used for encrypting SPA
519           packets. The default is CBC mode, but others can be chosen such as
520           CFB or OFB as long as this is also specified in the
521           /etc/fwknop/access.conf file on the server side via the
522           ENCRYPTION_MODE variable. In general, it is recommended to not
523           include this argument and let the default (CBC) apply. Note that
524           the string “legacy” can be specified in order to generate SPA
525           packets with the old initialization vector strategy used by
526           versions of fwknop prior to 2.5. With the 2.5 release, fwknop
527           generates initialization vectors in a manner that is compatible
528           with OpenSSL via the PBKDF1 algorithm.
529
530       --time-offset-plus=<time>
531           By default, the fwknopd daemon on the server side enforces time
532           synchronization between the clocks running on client and server
533           systems. The fwknop client places the local time within each SPA
534           packet as a time stamp to be validated by the fwknopd server after
535           decryption. However, in some circumstances, if the clocks are out
536           of sync and the user on the client system does not have the
537           required access to change the local clock setting, it can be
538           difficult to construct and SPA packet with a time stamp the server
539           will accept. In this situation, the --time-offset-plus option can
540           allow the user to specify an offset (e.g. “60sec” “60min” “2days”
541           etc.) that is added to the local time.
542
543       --time-offset-minus=<time>
544           This is similar to the --time-offset-plus option (see above), but
545           subtracts the specified time offset instead of adding it to the
546           local time stamp.
547
548       -u, --user-agent=<user-agent-string>
549           Set the HTTP User-Agent for resolving the external IP via -R, or
550           for sending SPA packets over HTTP.
551
552       --use-wget-user-agent
553           By default when the fwknop client resolves the external IP with
554           wget via SSL, it sets the User-Agent to “Fwknop/<version>” unless
555           it was already manually specified with the --user-agent option
556           mentioned above. However, the --user-wget-user-agent option lets
557           the default wget User-Agent string apply without influence from
558           fwknop.
559
560       -U, --spoof-user=<user>
561           Specify the username that is included within SPA packet. This
562           allows the fwknop client to satisfy any non-root REQUIRE_USERNAME
563           keyword on the fwknopd server (--spoof-src mode requires that the
564           fwknop client is executed as root).
565
566       --icmp-type=<type>
567           In -P icmp mode, specify the ICMP type value that will be set in
568           the SPA packet ICMP header. The default is echo reply.
569
570       --icmp-code=<code>
571           In -P icmp mode, specify the ICMP code value that will be set in
572           the SPA packet ICMP header. The default is zero.
573

GPG OPTIONS

575       Note that the usage of GPG for SPA encryption/decryption can and should
576       involve GPG keys that are signed by each side (client and server). The
577       basic procedure for this involves the following steps after the client
578       key has been transferred to the server and vice-versa:
579
580               [spaserver]# gpg --import client.asc
581               [spaserver]# gpg --edit-key 1234ABCD
582               Command> sign
583
584               [spaclient]$ gpg --import server.asc
585               [spaclient]$ gpg --edit-key ABCD1234
586               Command> sign
587
588       More comprehensive information on this can be found here:
589       http://www.cipherdyne.org/fwknop/docs/gpghowto.html.
590
591       --gpg-agent
592           Instruct fwknop to acquire GnuPG key password from a running
593           gpg-agent instance (if available).
594
595       --gpg-home-dir=<dir>
596           Specify the path to the GnuPG directory; normally this path is
597           derived from the home directory of the user that is running the
598           fwknop client (so the default is ~/.gnupg). This is useful when a
599           “root” user wishes to log into a remote machine whose sshd
600           daemon/service does not permit root login.
601
602       --gpg-recipient=<key ID or Name>
603           Specify the GnuPG key ID, e.g. “+1234ABCD+” (see the output of
604           "gpg—list-keys") or the key name (associated email address) of the
605           recipient of the Single Packet Authorization message. This key is
606           imported by the fwknopd server and the associated private key is
607           used to decrypt the SPA packet. The recipient’s key must first be
608           imported into the client GnuPG key ring.
609
610       --gpg-signer-key=<key ID or Name>
611           Specify the GnuPG key ID, e.g. “+ABCD1234+” (see the output of "gpg
612           --list-keys") or the key name to use when signing the SPA message.
613           The user is prompted for the associated GnuPG password to create
614           the signature. This adds a cryptographically strong mechanism to
615           allow the fwknopd daemon on the remote server to authenticate who
616           created the SPA message.
617
618       --gpg-no-signing-pw
619           Instruct fwknop to not acquire a passphrase for usage of GnuPG
620           signing key. This option is provided to make SPA packet
621           construction easier for client-side operations in automated
622           environments where the passphrase for the signing key has been
623           removed from the GnuPG key ring. However, it is usually better to
624           leverage gpg-agent instead of using this option.
625

FWKNOPRC FILE

627       The .fwknoprc file is used to set various parameters to override
628       default program parameters at runtime. It also allows for additional
629       named configuration stanzas for setting program parameters for a
630       particular invocation.
631
632       The fwknop client will create this file if it does not exist in the
633       user’s home directory. This initial version has some sample directives
634       that are commented out. It is up to the user to edit this file to meet
635       their needs.
636
637       The .fwknoprc file contains a default configuration area or stanza
638       which holds global configuration directives that override the program
639       defaults. You can edit this file and create additional named stanzas
640       that can be specified with the -n or --named-config option. Parameters
641       defined in the named stanzas will override any matching default stanza
642       directives. Note that command-line options will still override any
643       corresponding .fwknoprc directives.
644
645       There are directives to match most of the command-line parameters
646       fwknop supports. Here is the current list of each directive along with
647       a brief description and its matching command-line option(s):
648
649       SPA_SERVER <hostname/IP-address>
650           Specify the hostname or IP of the destination (fwknopd) server (-D,
651           --destination).
652
653       ALLOW_IP <IP-address>
654           Specify the address to allow within the SPA data. Note: This
655           parameter covers the -a, -s, and -R command-line options. You can
656           specify a hostname or IP address (the -a option), specify the word
657           "source" to tell the fwknopd server to accept the source IP of the
658           packet as the IP to allow (the -s option), or use the word
659           "resolve" to have fwknop resolve the external network IP via HTTP
660           request (the -R option).
661
662       ACCESS <port list>
663           Set the one or more protocol/ports to open on the firewall (-A,
664           --access). The format of this list is
665           “+<proto>/<port>...<proto>/<port>+”, e.g. “tcp/22,udp/53”.
666
667       SPA_SERVER_PORT <port>
668           Set the server port to use for sending the SPA packet (-p,
669           --server-port).
670
671       SPA_SERVER_PROTO <protocol>
672           Set the protocol to use for sending the SPA packet (-P,
673           --server-proto).
674
675       KEY <passphrase>
676           This is the passphrase that is used for SPA packet encryption and
677           applies to both Rijndael or GPG encryption modes. The actual
678           encryption key that is used for Rijndael is derived from the PBKDF1
679           algorithm, and the GPG key is derived from the specified GPG key
680           ring.
681
682       KEY_BASE64 <base64 encoded passphrase>
683           Specify the encryption passphrase as a base64 encoded string. This
684           allows non-ascii characters to be included in the base64-decoded
685           key.
686
687       USE_HMAC <Y/N>
688           Set HMAC mode for authenticated encryption of SPA packets. This
689           will have fwknop prompt the user for a dedicated HMAC key that is
690           independent of the encryption key. Alternatively, the HMAC key can
691           be specified with the HMAC_KEY or HMAC_KEY_BASE64 directives (see
692           below).
693
694       HMAC_KEY <key>
695           Specify the HMAC key for authenticated encryption of SPA packets.
696           This supports both Rijndael and GPG encryption modes, and is
697           applied according to the encrypt-then-authenticate model.
698
699       HMAC_KEY_BASE64 <base64 encoded key>
700           Specify the HMAC key as a base64 encoded string. This allows
701           non-ascii characters to be included in the base64-decoded key.
702
703       HMAC_DIGEST_TYPE <digest algorithm>
704           Set the HMAC digest algorithm used for authenticated encryption of
705           SPA packets. Choices are: MD5, SHA1, SHA256 (the default), SHA384,
706           SHA512, SHA3_256, and SHA3_512.
707
708       SPA_SOURCE_PORT <port>
709           Set the source port to use for sending the SPA packet (-S,
710           --source-port).
711
712       FW_TIMEOUT <seconds>
713           Set the firewall rule timeout value (-f, --fw-timeout).
714
715       RESOLVE_IP_HTTPS <Y/N>
716           Set to Y to automatically resolve the externally routable IP
717           associated with the fwknop client. This is done over SSL via wget
718           in --secure-protocol mode against the IP resolution service
719           available at https://www.cipherdyne.org/cgi-bin/myip.
720
721       RESOLVE_HTTP_ONLY <Y/N>
722           When the fwknop client is instructed to resolve the external client
723           IP, this option can be used to force an HTTP connection instead of
724           an HTTPS connection when set to Y. This option is useful when wget
725           is not installed on the local OS, or when it is not compiled
726           against an SSL library.
727
728       RESOLVE_URL <url>
729           Set to a URL that will be used for resolving the source IP address
730           (--resolve-url).
731
732       WGET_CMD <wget full path>
733           Set the full path to the wget command (used for client IP
734           resolution).
735
736       TIME_OFFSET <time>
737           Set a value to apply to the timestamp in the SPA packet. This can
738           be either a positive or negative value (--time-offset-plus/minus).
739
740       ENCRYPTION_MODE <mode>
741           Specify the encryption mode when AES is used. This variable is a
742           synonym for the -M, --encryption-mode command line argument. In
743           general, it is recommended to not include this argument and let the
744           default (CBC) apply. Note that the string “legacy” can be specified
745           in order to generate SPA packets with the old initialization vector
746           strategy used by versions of fwknop prior to 2.5.
747
748       DIGEST_TYPE <digest algorithm>
749           Set the SPA message digest type (-m, --digest-type). Choices are:
750           MD5, SHA1, SHA256 (the default), SHA384, SHA512, SHA3_256, and
751           SHA3_512.
752
753       USE_GPG <Y/N>
754           Set to Y to specify the use of GPG for encryption
755           (--gpg-encryption).
756
757       USE_GPG_AGENT <Y/N>
758           Set to Y to have fwknop interface with a GPG agent instance for the
759           GPG key password (--gpg-agent). Agent information itself is
760           specified with the GPG_AGENT_INFO environmental variable.
761
762       GPG_SIGNING_PW <passphrase>
763           This is the passphrase that is used for signing SPA packet data in
764           GPG encryption mode, and is a synonym for the KEY variable (i.e.
765           the signing passphrase can be specified with the KEY variable
766           instead). The SPA packet is encrypted with the remote server key
767           and signed with the local client key.
768
769       GPG_SIGNING_PW_BASE64 <base64 encoded passphrase>
770           Specify the GPG signing passphrase as a base64 encoded string. This
771           allows non-ascii characters to be included in the base64-decoded
772           key.
773
774       GPG_SIGNER <key ID or Name>
775           Specify the GPG key name or ID for signing the GPG-encrypted SPA
776           data (--gpg-signer-key).
777
778       GPG_RECIPIENT <key ID or Name>
779           Specify the GPG key name or ID for the recipient of the
780           GPG-encrypted SPA data (--gpg-recipient-key).
781
782       GPG_HOMEDIR <dir>
783           Specify the GPG home directory (--gpg-home-dir). Defaults to
784           ~/.gnupg.
785
786       GPG_EXE <path>
787           Specify the path to GPG (--gpg-exe). Defaults to /usr/bin/gpg.
788
789       SPOOF_USER <user>
790           Set the username in the SPA data to the specified value (-U,
791           --spoof-user).
792
793       SPOOF_SOURCE_IP <IP>
794           Set the source IP of the outgoing SPA packet to the specified value
795           (-Q, --spoof-source).
796
797       RAND_PORT <Y/N>
798           Send the SPA packet over a randomly assigned port (-r,
799           --rand-port).
800
801       KEY_FILE <file>
802           Load an encryption key/password from a file (-G, --get-key).
803
804       HTTP_USER_AGENT <agent string>
805           Set the HTTP User-Agent for resolving the external IP via -R, or
806           for sending SPA packets over HTTP (-u, --user-agent).
807
808       USE_WGET_USER_AGENT <Y/N>
809           Allow default wget User-Agent string to be used when resolving the
810           external IP instead of a User-Agent supplied by the fwknop client.
811
812       NAT_ACCESS <internalIP:forwardPort>
813           Gain NAT access to an internal service protected by the fwknop
814           server (-N, --nat-access).
815
816       NAT_LOCAL <Y/N>
817           Access a local service via a forwarded port on the fwknopd server
818           system (--nat-local).
819
820       NAT_PORT <port>
821           Specify the port to forward to access a service via NAT
822           (--nat-port).
823
824       NAT_RAND_PORT <Y/N>
825           Have the fwknop client assign a random port for NAT access
826           (--nat-rand-port).
827

ENVIRONMENT

829       SPOOF_USER, GPG_AGENT_INFO (only used in --gpg-agent mode).
830

SPA PACKET SPOOFING

832       Because fwknop places the IP to be allowed through the firewall within
833       the encrypted SPA payload (unless -s is used which is not recommended
834       and can be prohibited in the fwknopd server configuration), SPA packets
835       can easily be spoofed, and this is a good thing in this context. That
836       is, the source IP of an SPA packet is ignored by the fwknopd daemon
837       (when the REQUIRE_SOURCE_ADDRESS variable is set in the
838       /etc/fwknop/access.conf file) and only the IP that is contained within
839       an authenticated and properly decrypted SPA packet is granted access
840       through the firewall. This makes it possible to make it appear as
841       though, say, www.yahoo.com is trying to authenticate to a target system
842       but in reality the actual connection will come from a seemingly
843       unrelated IP.
844

EXAMPLES

846       The following examples illustrate the command line arguments that could
847       be supplied to the fwknop client in a few situations:
848
849   Quick start
850       The most effective and easiest way to use fwknop is to have the client
851       generate both an encryption key and an HMAC key, and then save them to
852       the “$HOME/.fwknoprc” file along with access request specifics. The
853       keys will also need to be transferred to the system where fwknopd is
854       running. The also client supports a separate set of encryption and HMAC
855       keys for each SPA destination if multiple fwknopd servers are running
856       on different systems.
857
858       So, assuming that the IP 2.2.2.2 is the system where fwknopd is
859       deployed and SSH is protected by the firewall on that system in a
860       default-drop stance, run the client like so to generate encryption and
861       HMAC keys:
862
863               $ fwknop -A tcp/22 --use-hmac -R -D 2.2.2.2 --key-gen --save-rc-stanza --verbose
864               [+] Wrote Rijndael and HMAC keys to rc file: /home/user/.fwknoprc
865
866       With the access request arguments and encryption and HMAC keys
867       generated and saved in “$HOME/.fwknoprc”, the keys themselves need to
868       be transferred to the 2.2.2.2 system where fwknopd is running. As
869       always, this should be done via some secure means such as SSH before
870       SPA is enabled and SSHD is blocked by the firewall. Here is what the
871       new 2.2.2.2 stanza looks like in the ~/.fwknoprc file:
872
873               $ tail -n 8 /home/user/.fwknoprc
874               [2.2.2.2]
875               ACCESS                      tcp/22
876               SPA_SERVER                  2.2.2.2
877               KEY_BASE64                  HvUtIOramehLGKimD4ECXOzinaH4h3U8H1WXum7b54Q=
878               HMAC_KEY_BASE64             DLeLf93a3yBT2vhEpM+dWlirGta5GU+jdyG5uXp4461HgOtbqMem4gX0Bp2PJGzYZlbbcavcOM00UPm+0GqkXA==
879               USE_HMAC                    Y
880               VERBOSE                     Y
881               RESOLVE_IP_HTTPS            Y
882
883       The keys are base64 encoded blobs of random data, and both the
884       KEY_BASE64 and HMAC_KEY_BASE64 lines should be copied verbatim and
885       placed within the /etc/fwknop/access.conf file on 2.2.2.2. Once this is
886       done, fwknopd can be started on that system, a default-drop policy
887       against SSH connections can be put in place, and then access to SSH is
888       managed via fwknop. To access SSH, just use the -n argument to
889       reference the 2.2.2.2 stanza out of the .fwknoprc file (some --verbose
890       output is included for illustration):
891
892               $ fwknop -n 2.2.2.2
893
894               FKO Field Values:
895               =================
896
897                  Random Value: 8950423288486978
898                      Username: mbr
899                     Timestamp: 1370194770
900                   FKO Version: 2.5
901                  Message Type: 1 (Access msg)
902                Message String: 1.1.1.1,tcp/22
903                    Nat Access: <NULL>
904                   Server Auth: <NULL>
905                Client Timeout: 0 (seconds)
906                   Digest Type: 3 (SHA256)
907                     HMAC Type: 3 (SHA256)
908               Encryption Type: 1 (Rijndael)
909               Encryption Mode: 2 (CBC)
910               ...
911
912               $ ssh -l user 2.2.2.2
913               user@2.2.2.2's password:
914
915   Access mode examples
916       The most common usage of fwknop is to gain access to SSH running on a
917       remote system that has the fwknopd daemon deployed along with a
918       default-drop firewall policy. The following command illustrates this
919       where IP 1.1.1.1 is the IP to be allowed through the firewall running
920       on 3.3.3.3 (note that the /etc/fwknop/access.conf file consumed by
921       fwknopd will need to have matching encryption and HMAC keys, and
922       configuration specifics can be found in the fwknopd(8) manual page).
923       Also, note the examples below prompt the user to supply the encryption
924       and HMAC keys via stdin instead of writing them to disk as in the case
925       of using the “$HOME/.fwknoprc” file in the example above. However, all
926       of the following examples can be converted to using the ~/.fwknoprc
927       file just by adding the --save-rc-stanza argument:
928
929               $ fwknop -A tcp/22 --use-hmac -a 1.1.1.1 -D 3.3.3.3
930               Enter encryption key:
931               Enter HMAC key:
932               $ ssh -l user 3.3.3.3
933               user@3.3.3.3's password:
934
935       If the --verbose flag is added to the command line, then some SPA
936       packet specifics are printed to stdout (not all output is shown for
937       brevity):
938
939               $ fwknop -A tcp/22 --use-hmac -a 1.1.1.1 -D 3.3.3.3 --verbose
940               Enter encryption key:
941               Enter HMAC key:
942
943                  Random Value: 1916307060193417
944                      Username: mbr
945                     Timestamp: 1368498909
946                   FKO Version: 2.5
947                  Message Type: 1 (Access msg)
948                Message String: 1.1.1.1,tcp/22
949                    Nat Access: <NULL>
950                   Server Auth: <NULL>
951                Client Timeout: 0 (seconds)
952                   Digest Type: 3 (SHA256)
953                     HMAC Type: 3 (SHA256)
954               Encryption Type: 1 (Rijndael)
955               Encryption Mode: 2 (CBC)
956
957       Simultaneous access to multiple services is also supported, and here is
958       an example of requesting access to both SSH and OpenVPN on 3.3.3.3:
959
960               $ fwknop -A "tcp/22,tcp/1194" --use-hmac -a 1.1.1.1 -D 3.3.3.3
961
962       There are many cases where an fwknop client is deployed on a network
963       behind a NAT device and the externally routable IP is not known to the
964       user. In this case, use the IP resolution service available at
965       https://www.cipherdyne.org/cgi-bin/myip via the -R command line switch
966       in order to derive the external client IP address. This is a safer
967       method of acquiring the client IP address than using the -s option
968       mentioned earlier in this manual page because the source IP is put
969       within the encrypted packet instead of having the fwknopd daemon grant
970       the requested access from whatever IP address the SPA packet originates
971       (i.e. using -s opens the possibility of a MITM attack):
972
973               $ fwknop -A tcp/22 --use-hmac -R -D 3.3.3.3
974
975       Use the Single Packet Authorization mode to gain access to SSH and this
976       time use GnuPG keys to encrypt and decrypt:
977
978               $ fwknop -A tcp/22 --use-hmac --gpg-sign ABCD1234 --gpg--recipient 1234ABCD -R -D 3.3.3.3
979
980       Instruct the fwknop server running at 3.3.3.3 to allow 1.1.1.1 to
981       connect to SSH, but spoof the authorization packet from an IP
982       associated with www.yahoo.com (requires root on the fwknop client OS):
983
984               # fwknop --spoof-src "www.yahoo.com" -A tcp/22 --use-hmac -a 1.1.1.1 -D 3.3.3.3
985
986       When fwknopd is running on an iptables firewall with systems deployed
987       behind it, it is possible to take advantage of the NAT capabilities
988       offered by iptables in order to transparently reach systems behind the
989       firewall via SPA. Here is an example where the fwknop client is used to
990       gain access to SSH running on the non-routable IP 192.168.10.23 that is
991       deployed on the network behind 3.3.3.3. In this case, the SSH
992       connection made to 3.3.3.3 is translated via NAT to the 192.168.10.2
993       system automatically:
994
995               $ fwknop -A tcp/22 -N 192.168.10.2:22 -R -D 3.3.3.3
996

BACKWARDS COMPATIBILITY

998       With the 2.5 release, fwknop underwent significant changes in its usage
999       of cryptography including the addition of support for HMAC
1000       authenticated encryption for both Rijndael and GnuPG modes, ensuring
1001       the proper usage of PBKDF1 for key derivation when SPA packets are
1002       encrypted with Rijndael, and several bugs were fixed from previous
1003       versions of fwknop. In general, this implies that when Rijndael is
1004       used, SPA packets produced by the 2.5 release are incompatible with
1005       previous versions of fwknop. The GnuPG encryption mode is unaffected by
1006       these updates. However, even with Rijndael is used, backwards
1007       compatibility is supported through setting the legacy encryption mode
1008       with -M on the fwknop client command line and/or the ENCRYPTION_MODE
1009       variable in the /etc/fwknop/access.conf file. This way, a pre-2.5
1010       server can decrypt SPA packets produced by a 2.5 and later client (set
1011       -M legacy), and a 2.5 and later server can decrypt SPA packets produced
1012       by pre-2.5 clients (set ENCRYPTION_MODE legacy in the access.conf
1013       file). Note that HMAC is only supported as of 2.5 and is an optional
1014       feature, so backwards compatibility is only for configurations that
1015       don’t use an HMAC on either side. It is strongly recommended to upgrade
1016       all fwknop clients and servers to 2.5 and use the new HMAC mode for
1017       properly authenticated SPA communications. The backwards compatibility
1018       support is used to make it easier to upgrade clients and servers with a
1019       phased approach.
1020
1021       For emphasis, if the fwknopd server is upgraded to 2.5 (or later), but
1022       older clients cannot be upgraded at the same time, then for each SOURCE
1023       stanza in the /etc/fwknop/access.conf file, add the following line:
1024
1025               ENCRYPTION_MODE         legacy
1026
1027       In addition, if the KEY variable has an encryption key longer than 16
1028       bytes, it will need to be truncated to 16 characters in the access.conf
1029       file in order for pre-2.5 clients to work properly. This limitation is
1030       fixed in 2.5, and provides additional motivation for upgrading all
1031       clients and servers to 2.5 or later.
1032
1033       Now, flipping the scenario around, if the fwknop clients are upgraded
1034       but the fwknopd server is still at a pre-2.5 version, then add the -M
1035       legacy argument to the fwknop command line:
1036
1037               $ fwknop -A tcp/22 -M legacy -R -D 2.2.2.2
1038

DEPENDENCIES

1040       The fwknop client requires libfko which is normally included with both
1041       source and binary distributions, and is a dedicated library developed
1042       by the fwknop project. Whenever the fwknopd server is used, libpcap is
1043       a required dependency. However, the upcoming 2.6 release will offer a
1044       UDP listener mode along with privilege separation support and will not
1045       require libpcap in this mode. In UDP listener mode, even though fwknopd
1046       binds to a UDP port, SPA packets are never acknowledged so from an
1047       attacker’s perspective there is no difference between fwknopd sniffing
1048       the wire passively vs. listening on a UDP socket in terms of what can
1049       be scanned for.
1050
1051       For GPG functionality, GnuPG must also be correctly installed and
1052       configured along with the libgpgme library.
1053
1054       To take advantage of all of the authentication and access management
1055       features of the fwknopd daemon/service a functioning iptables, ipfw, or
1056       pf firewall is required on the underlying operating system.
1057

DIAGNOSTICS

1059       The most comprehensive way to gain diagnostic information on fwknop is
1060       to run the test suite test-fwknop.pl script located in the test/
1061       directory in the fwknop sources. The test suite sends fwknop through a
1062       large number of run time tests, has valgrind support, validates both
1063       SPA encryption and HMAC results against OpenSSL, and even has its own
1064       built in fuzzer for SPA communications (and fwknop in version 2.6.4
1065       supports the American Fuzzy Lop (AFL) from Michal Zalewski as well).
1066       For more basic diagnostic information, fwknop can be executed with the
1067       -T (or --test) command line option. This will have fwknop simply create
1068       and print the SPA packet information, then run it through a
1069       decrypt/decode cycle and print it again. In addition, the --verbose
1070       command line switch is useful to see various SPA packet specifics
1071       printed to stdout.
1072

SEE ALSO

1074       fwknopd(8), iptables(8), pf(4), pfctl(8), ipfw(8), gpg(1), libfko
1075       documentation.
1076
1077       More information on Single Packet Authorization can be found in the
1078       paper “Single Packet Authorization with fwknop” available at
1079       http://www.cipherdyne.org/fwknop/docs/SPA.html. A comprehensive
1080       tutorial on fwknop operations and theory can be found at
1081       http://www.cipherdyne.org/fwknop/docs/fwknop-tutorial.html. This
1082       tutorial also includes information about the design of fwknop that may
1083       be worth reading for those interested in why fwknop is different from
1084       other SPA implementations.
1085
1086       fwknop uses the git versioning system as its source code repository
1087       along with Github for tracking of issues and milestones:
1088
1089               $ git clone https://github.com/mrash/fwknop.git fwknop.git
1090
1091       Additional commentary on Single Packet Authorization can be found via
1092       Michael Rash’s Twitter feed: http://twitter.com/michaelrash,
1093       @michaelrash
1094

AUTHORS

1096       The primary developers of fwknop are Michael Rash (project creator)
1097       <mbr@cipherdyne.org>, Damien Stuart <dstuart@dstuart.org>, and Jonathan
1098       Bennett <jbennett@incomsystems.biz>.
1099

CONTRIBUTORS

1101       This “C” version of fwknop was derived from the original Perl-based
1102       version on which many people who are active in the open source
1103       community have contributed. See the CREDITS file in the fwknop sources,
1104       or visit https://github.com/mrash/fwknop/blob/master/CREDITS to view
1105       the online list of contributors. A few contributors deserve to be
1106       singled out including: Franck Joncourt, Max Kastanas, Vlad Glagolev,
1107       Sean Greven, Hank Leininger, Fernando Arnaboldi, and Erik Gomez.
1108
1109       The phrase “Single Packet Authorization” was coined by MadHat and
1110       Simple Nomad at the BlackHat Briefings of 2005.
1111

BUGS

1113       Send bug reports to dstuart@dstuart.org or mbr@cipherdyne.org, or open
1114       a new issue on Github (see https://github.com/mrash/fwknop.git).
1115       Suggestions and/or comments are always welcome as well. Additional
1116       information may be found in the fwknop mailing list archives (see:
1117       https://lists.sourceforge.net/lists/listinfo/fwknop-discuss).
1118

DISTRIBUTION

1120       fwknop is distributed under the GNU General Public License (GPL v2+),
1121       and the latest version may be downloaded from
1122       http://www.cipherdyne.org.
1123
1124
1125
1126Fwknop Client                     08/06/2018                         FWKNOP(8)
Impressum