Skip site navigation (1)Skip section navigation (2)

  
 
  

home | help
FWKNOPD(8)			  Fwknop Server 		      FWKNOPD(8)

NAME
     fwknopd - Firewall Knock Operator Daemon

SYNOPSIS
     fwknopd [options]

DESCRIPTION
     fwknopd is the server component for the FireWall Knock Operator, and is re-
     sponsible	for  monitoring and processing Single Packet Authorization (SPA)
     packets that are generated by fwknop clients, modifying a firewall  or  ACL
     policy  to  allow	the desired access after authenticating and decrypting a
     valid SPA packet (in that order), and removing access after a  configurable
     timeout.

     The  main	application  of  this program is to conceal services such as SSH
     with an additional layer of security in order to make the	exploitation  of
     vulnerabilities (both 0-day and unpatched code) much more difficult. In ad-
     dition,  services	that  are  concealed in this fashion naturally cannot be
     scanned for with Nmap or Shodan.

     The  main	configuration  for  fwknopd  is  maintained  within  two  files:
     fwknopd.conf  and	access.conf. The default location for these files is de-
     termined at package configuration	(typically  /usr/local/etc/fwknop).  The
     configuration variables within these files are described below.

     Additional  information  may be found in the tutorial "Single Packet Autho-
     rization: A Comprehensive Guide to Strong Service Concealment with  fwknop"
     available	online (see: http://www.cipherdyne.org/fwknop/docs/fwknop-tutor-
     ial.html).

COMMAND-LINE OPTIONS
     -i, --interface=<interface>
	 Manually specify interface on which to sniff, e.g. "-i eth0". This  op-
	 tion  is  not	usually  needed  because  the "PCAP_INTF" keyword in the
	 fwknopd.conf file defines the sniffing interface.

     -f, --foreground
	 Run fwknopd in the foreground instead of becoming a daemon. When run in
	 the foreground, message that would go to the log would instead be  sent
	 to stderr. This mode is usually used when testing and/or debugging.

     --fw-list
	 List  only  firewall  rules that any running fwknopd daemon has created
	 and then exit.

     -a, --access-file=<access-file>
	 Specify the location of the access.conf file. If  this  option  is  not
	 given,  fwknopd  will	use the compile-time default location (typically
	 /usr/local/etc/fwknop/access.conf).

     --access-folder=<access-folder>
	 Specify the location of the  access.conf  folder.  If	this  option  is
	 given,  rather than load a single access.conf file, all the .conf files
	 in the given folders are processed.

     -c, --config=<config-file>
	 Specify the location of the fwknopd.conf file. If this  option  is  not
	 given,  fwknopd  will	use  the  default  location  (typically /usr/lo-
	 cal/etc/fwknop/fwknopd.conf.

     -C, --packet-limit=<n>
	 Specify the number of candidate SPA packets to process  and  exit  when
	 this limit is reached.

     -d, --digest-file=<digest-file>
	 Specify  the  location  of the digest.cache file. If this option is not
	 given, fwknopd will use the compile-time  default  location  (typically
	 /var/fwknop/digest.cache).

     -D, --dump-config
	 Dump  the  configuration  values that fwknopd derives from the /usr/lo-
	 cal/etc/fwknop/fwknopd.conf   (or   override	files)	 and	/usr/lo-
	 cal/etc/fwknop/access.conf on stderr.

     --dump-serv-err-codes
	 Dump  all  possible fwknopd error codes to stdout and exit. This option
	 is rarely needed in practice, and was added to assist with test  cover-
	 age.

     --fault-injection-tag=<tag>
	 This  option  is  only  used for fault injection testing when fwknop is
	 compiled   to	 support   the	 libfiu   library   (see:    http://bli-
	 tiri.com.ar/p/libfiu/).  Under  normal circumstances this option is not
	 used, and any packaged version of fwknop will not have code compiled in
	 so this capability is not enabled at run time. It  is	documented  here
	 for  completeness.  version of fwknop will not have code compiled in to
	 enable this capability at run time. It is documented here for complete-
	 ness.

     -A, --afl-fuzzing
	 Instruct fwknopd to acquire SPA packets directly from stdin in  support
	 of  fuzzing operations from the American Fuzzy Lop (AFL) fuzzer written
	 by Michal Zalewski. This requires that  fwknop  is  compiled  with  the
	 --enable-afl-fuzzing  argument  to  the configure script as this allows
	 encryption/digest short circuiting in a manner  necessary  for  AFL  to
	 function  properly.  The  benefit of this strategy is that AFL can fuzz
	 the SPA packet decoding routines implemented by libfko.

     --fw-list-all
	 List all firewall rules including those that have nothing  to	do  with
	 fwknopd.

     --fw-flush
	 Flush any firewall rules created by a running fwknopd process. This op-
	 tion  allows  the  used to easily delete fwknopd firewall rules without
	 having to wait for them to be timed out.

     -K, --kill
	 Kill the current fwknopd process. This provides a quick and easy way to
	 stop fwknopd without having to look in the process table.

     --exit-parse-config
	 Parse config files  (/usr/local/etc/fwknop/fwknopd.conf,  and	/usr/lo-
	 cal/etc/fwknop/access.conf)  and then exit. This provides a way to test
	 whether the config files are  properly  structured  without  having  to
	 start processing network traffic.

     --exit-parse-digest-cache
	 Parse	the  digest  cache  file /var/fwknop/digest.cache and exit. This
	 validates the structure of the digest	cache  file  without  having  to
	 start	processing network traffic. Note that the standard configuration
	 files are also parsed in this mode.

     -l, --locale=<locale>
	 Set/override the system default locale setting.

     --no-ipt-check-support
	 Disable the usage of the iptables  -C	option.  This  is  not	normally
	 needed,  and is only useful on older Linux distributions where iptables
	 does not have -C support.

     -O, --override-config=<file>
	 Override config  variable  values  that  are  normally  read  from  the
	 /usr/local/etc/fwknop/fwknopd.conf  file with values from the specified
	 file. Multiple override config files can be given as a  comma-separated
	 list.

     --key-gen
	 Have  fwknopd generate both Rijndael and HMAC keys that can be used for
	 SPA packet encryption and authentication. These keys are  derived  from
	 /dev/urandom  and  then  base64 encoded before being printed to stdout,
	 and are meant to be manually included in a stanza within  the	/usr/lo-
	 cal/etc/fwknop/access.conf  file.  Such  keys are generally more secure
	 than passphrases.

     --key-gen-file=<file>
	 Write generated keys to the specified file. Note that the file is over-
	 written if it already	exists.  If  this  option  is  not  given,  then
	 --key-gen writes the keys to stdout.

     --key-len=<length>
	 Specify  the  number of bytes for a generated Rijndael key. The maximum
	 size is currently 128 bytes.

     --hmac-key-len=<length>
	 Specify the number of bytes for a generated HMAC key. The maximum  size
	 is currently 128 bytes.

     -p, --pid-file=<pid-file>
	 Specify  the  location  of  the fwknopd.pid file. If this option is not
	 given, fwknopd will use the compile-time  default  location  (typically
	 /var/fwknop/fwknopd.pid).

     -P, --pcap-filter=<filter>
	 Specify a Berkeley packet filter statement on the fwknopd command line.
	 This  overrides  the  value  of the PCAP_FILTER variable taken from the
	 /usr/local/etc/fwknop/fwknopd.conf file.

     --pcap-file=<pcap-file>
	 This option instructs fwknopd to read packet data from a pcap file  in-
	 stead	of sniffing an interface directly. This mode is usually used for
	 debugging purposes, and will disable SPA packet age checking unless  it
	 is manually enabled in the /usr/local/etc/fwknop/fwknopd.conf file.

     --pcap-any-direction
	 Allow	fwknopd  to sniff SPA packets regardless of whether they are re-
	 ceived on the sniffing interface or sent from the  sniffing  interface.
	 In the later case, this can be useful to have fwknopd sniff SPA packets
	 that  are  forwarded through a system and destined for a different net-
	 work. If the sniffing interface is the egress interface for such  pack-
	 ets  (and  hence  SPA packets are sent by this interface instead of re-
	 ceived), then this option will need to used in order for fwknopd to see
	 them. The default is to only sniff packets that  are  received  on  the
	 sniffing  interface. Note that this setting is independent of promiscu-
	 ous mode.

     -R, --restart
	 Restart the currently running fwknopd processes. This option will  pre-
	 serve	the  command  line  options  that  were supplied to the original
	 fwknopd process but will force fwknopd to re-read the fwknopd.conf  and
	 /usr/local/etc/fwknop/access.conf  files.  This will also force a flush
	 of the current "FWKNOP" iptables chain(s).

     --rotate-digest-cache
	 Rotate the digest cache file by renaming it to "<name>-old", and start-
	 ing  a  new  one.  The  digest  cache	file  is  typically   found   in
	 /var/fwknop/digest.cache.

     -r, --run-dir=<path>
	 Specify  the  directory  where fwknopd writes run time state files. The
	 default is /var.

     -S, --status
	 Display the status of any fwknopd processes that may or not be running.
	 If there is an existing fwknopd process then 0 is returned for the exit
	 status and 1 is returned otherwise.

     --syslog-enable
	 Allow messages to be sent to syslog even if the foreground mode is set.

     -t, --test
	 Run fwknopd in test mode. This instructs fwknopd to acquire and process
	 SPA packets, but not manipulate firewall rules or execute commands that
	 are provided by SPA clients. This  option  is	mostly	useful	for  the
	 fuzzing tests in the test suite to ensure broad code coverage under ad-
	 verse conditions.

     -U, --udp-server
	 Run  fwknopd  in UDP server mode so that SPA packets are acquired via a
	 UDP socket directly without having to use libpcap. See  the  discussion
	 of the "ENABLE_UDP_SERVER" configuration variable below for more infor-
	 mation.

     -v, --verbose
	 Run  fwknopd in verbose mode. This can option can be specified multiple
	 times to increase the verbosity of the output to the  system  log  file
	 (or to the screen if running in the foreground).

     -h, --help
	 Display usage information and exit.

     -V, --Version
	 Display version information and exit.

FWKNOPD CONFIG AND ACCESS VARIABLES
     fwknopd references the /usr/local/etc/fwknop/fwknopd.conf file for configu-
     ration  variables	to define operational parameters (what network interface
     and port to sniff, what features to enable/disable, etc.). The fwknopd.conf
     file does not define any access control directives or set any encryption or
     authentication keys.

     The   access   control   directives   are	 contained   in   the	/usr/lo-
     cal/etc/fwknop/access.conf  file.	Access control directives define encryp-
     tion keys and level of access that is granted to an fwknop client that  has
     generated the appropriate encrypted SPA message.

   FWKNOPD.CONF VARIABLES
     This  section  list  the  more  prominent	configuration  variables used by
     fwknopd. You will want to make sure to check these to make sure  they  have
     appropriate  values,  but	sensible defaults are provided for most systems.
     See the /usr/local/etc/fwknop/fwknopd.conf file for additional details.

     PCAP_INTF <interface>
	 Specify the ethernet interface on which fwknopd will sniff packets.

     ENABLE_PCAP_PROMISC <Y/N>
	 By default fwknopd puts the pcap interface into promiscuous  mode.  Set
	 this to "N" to disable that behavior (non-promiscuous).

     PCAP_FILTER <pcap filter spec>
	 Define  the  filter  used  for PCAP modes; fwknopd defaults to UDP port
	 62201. However, if an fwknop client uses the --rand-port option to send
	 the SPA packet over a random port, then this variable should be updated
	 to something like "udp dst portrange 10000-65535".

     ENABLE_SPA_PACKET_AGING <Y/N>
	 This instructs fwknopd to not honor SPA packets that have an  old  time
	 stamp. The value for "old" is defined by the "MAX_SPA_PACKET_AGE" vari-
	 able.	If "ENABLE_SPA_PACKET_AGING" is set to "N", fwknopd will not use
	 the client time stamp at all.

     MAX_SPA_PACKET_AGE <seconds>
	 Defines the maximum age (in seconds) that an SPA  packet  will  be  ac-
	 cepted.  This	requires  that	the client system is in relatively close
	 time synchronization with the fwknopd server system (NTP is good).  The
	 default age is 120 seconds (two minutes).

     ENABLE_DIGEST_PERSISTENCE <Y/N>
	 Track	digest	sums  associated  with previous SPA packets processed by
	 fwknopd. This allows digest sums to remain persistent across executions
	 of fwknopd. The default is "Y". If set to "N", fwknopd will  not  check
	 incoming  SPA	packet data against any previously save digests. It is a
	 good idea to leave this feature on to reduce the possibility  of  being
	 vulnerable to a replay attack.

     RULES_CHECK_THRESHOLD <count>
	 Defines  the  number  of  times  firewall rule expiration times must be
	 checked before a "deep" check is run. This  allows  fwknopd  to  remove
	 rules	that  contain  a  proper exp<time> even if a third party program
	 added them instead of fwknopd. The default value for this  variable  is
	 20,  and  this typically results in this check being run every two sec-
	 onds or so. To disable this type of checking altogether, set this vari-
	 able to zero.

     ENABLE_IPT_FORWARDING <Y/N>
	 Allow SPA clients to request access to  services  through  an	iptables
	 firewall  instead of just to it (i.e. access through the FWKNOP_FORWARD
	 chain instead of the INPUT chain).

     ENABLE_IPT_LOCAL_NAT <Y/N>
	 Allow SPA clients to request access to a local  socket  via  NAT.  This
	 still	puts an ACCEPT rule into the FWKNOP_INPUT chain, but a different
	 port is translated via DNAT rules to the real one. So, the  user  would
	 do "ssh -p <port>" to access the local service (see the --NAT-local and
	 --NAT-rand-port on the fwknop client command line).

     ENABLE_IPT_SNAT <Y/N>
	 Set  this  to	"Y"  to enable a corresponding SNAT rule. By default, if
	 forwarding access is enabled (see the "ENABLE_IPT_FORWARDING"	variable
	 above),  then	fwknopd creates DNAT rules for incoming connections, but
	 does not also complement these rules with SNAT rules at the same  time.
	 In  some situations, internal systems may not have a route back out for
	 the source address of the incoming connection, so it  is  necessary  to
	 also  apply  SNAT  rules so that the internal systems see the IP of the
	 internal interface where fwknopd is running.

     SNAT_TRANSLATE_IP <ip_address>
	 Specify the IP address for SNAT. This	functionality  is  only  enabled
	 when  "ENABLE_IPT_SNAT"  is  set  to  "Y" and by default SNAT rules are
	 built with the MASQUERADE target (since then the internal IP  does  not
	 have  to  be  defined	here  in  the /usr/local/etc/fwknop/fwknopd.conf
	 file), but if you want fwknopd to use the SNAT target,  you  must  also
	 define  an  IP address with the "SNAT_TRANSLATE_IP" variable. Note that
	 this variable is generally deprecated	in  favor  of  the  "FORCE_SNAT"
	 variable  in  the  /usr/local/etc/fwknop/access.conf file which enables
	 per-stanza control over the SNAT IP.

     ENABLE_IPT_OUTPUT <Y/N>
	 Add ACCEPT rules to the FWKNOP_OUTPUT chain. This is usually only  use-
	 ful  if there are no state tracking rules to allow connection responses
	 out and the OUTPUT chain has a default-drop stance.

     MAX_SNIFF_BYTES <bytes>
	 Specify the the maximum number of bytes to sniff per frame. 1500 is the
	 default.

     FLUSH_IPT_AT_INIT <Y/N>
	 Flush all existing rules in the fwknop chains at  fwknopd  start  time.
	 The default is "Y".

     FLUSH_IPT_AT_EXIT <Y/N>
	 Flush	all  existing rules in the fwknop chains when fwknopd is stopped
	 or otherwise exits cleanly. The default is "Y".

     EXIT_AT_INTF_DOWN <Y/N>
	 When fwknopd is sniffing an interface, if the interface is  administra-
	 tively downed or unplugged, fwknopd will cleanly exit and an assumption
	 is  made that any process monitoring infrastructure like systemd or up-
	 start will restart it. However, if fwknopd is not  being  monitored  by
	 systemd,  upstart, or anything else, this behavior can be disabled with
	 the "EXIT_AT_INTF_DOWN" variable. If disabled, fwknopd will try to  re-
	 cover when a downed interface comes back up.

     ENABLE_RULE_PREPEND <Y/N>
	 For  systems running iptables or firewalld, have fwknopd insert new SPA
	 rules at the beginning of the relevant chain (such  as  "FWKNOP_INPUT")
	 instead  of  appending  them to the end of the chain. This causes newly
	 created rules to have precedence over older ones.

     ENABLE_NAT_DNS <Y/N>
	 Allow fwknopd to resolve hostnames in NAT access messages.

     GPG_HOME_DIR <path>
	 If GPG keys are used instead of a Rijndael symmetric key, this  is  the
	 default  GPG  keys  directory. Note that each access stanza in /usr/lo-
	 cal/etc/fwknop/access.conf can specify its own GPG directory  to  over-
	 ride  this  default.  If not set here or in an access.conf stanza, then
	 the $HOME/.gnupg directory of the user  running  fwknopd  (most  likely
	 root).

     GPG_EXE <path>
	 Specify the path to GPG, and defaults to /usr/bin/gpg if not set.

     LOCALE <locale>
	 Set  the  locale (via the LC_ALL variable). This can be set to override
	 the default system locale.

     ENABLE_SPA_OVER_HTTP <Y/N>
	 Allow fwknopd to acquire SPA data from HTTP  requests	(generated  with
	 the  fwknop client in --HTTP mode). Note that when this is enabled, the
	 "PCAP_FILTER" variable would need to be updated to sniff  traffic  over
	 TCP/80  connections  and  a  web  server  should be running on the same
	 server as fwknopd.

     ENABLE_X_FORWARDED_FOR <Y/N>
	 Allows fwknopd to use the X-Forwarded-for header from	a  captured  SPA
	 packet  over  HTTP  as  the  source  IP. This can happen when using SPA
	 through an HTTP proxy.

     ENABLE_TCP_SERVER <Y/N>
	 Enable the fwknopd TCP server. This is a "dummy" TCP server  that  will
	 accept TCP connection requests on the specified TCPSERV_PORT. If set to
	 "Y",  fwknopd	will  fork off a child process to listen for, and accept
	 incoming TCP request. This server only accepts the request. It does not
	 otherwise communicate. This is only to allow the incoming SPA over  TCP
	 packet  which	is  detected  via PCAP. The connection is closed after 1
	 second regardless. Note that fwknopd still only gets its data via pcap,
	 so the filter defined by PCAP_FILTER needs to	be  updated  to  include
	 this TCP port.

     TCPSERV_PORT <port>
	 Set the port number that the "dummy" TCP server listens on. This server
	 is only spawned when "ENABLE_TCP_SERVER" is set to "Y".

     ENABLE_UDP_SERVER <Y/N>
	 Enable  the  fwknopd  UDP server. This instructs fwknopd to acquire SPA
	 packets via a UDP socket directly without having to use  libpcap.  When
	 this	mode   is   enabled,   fwknop  should  be  compiled  with  --en-
	 able-udp-server (passed to the configure script) so that libpcap can be
	 removed as a dependency. As one would expect, when the  UDP  server  is
	 used,	no  incoming packets are ever acknowledged by fwknopd and there-
	 fore collecting SPA packets in this  mode  is	a  good  alternative  to
	 sniffing the wire directly.

     UDPSERV_PORT <port>
	 Set the port number that the UDP server listens on. This server is only
	 spawned when "ENABLE_UDP_SERVER" is set to "Y".

     PCAP_DISPATCH_COUNT <count>
	 Sets  the number of packets that are processed when the pcap_dispatch()
	 call is made. The default is zero, since this allows fwknopd to process
	 as many packets as possible in the corresponding callback where the SPA
	 handling routine is called for packets that pass a set of  prerequisite
	 checks.  However,  if fwknopd is running on a platform with an old ver-
	 sion of libpcap, it may be necessary to change this value to a positive
	 non-zero integer. More information can be found in the pcap_dispatch(3)
	 man page.

     PCAP_LOOP_SLEEP <microseconds>
	 Sets the number of microseconds to passed as an argument to usleep() in
	 the pcap loop. The default is 100000, or 1/10th of a second.

     ENABLE_PCAP_ANY_DIRECTION <Y/N>
	 Controls whether fwknopd is permitted to sniff SPA  packets  regardless
	 of whether they are received on the sniffing interface or sent from the
	 sniffing  interface.  In  the	later  case,  this can be useful to have
	 fwknopd sniff SPA packets that are forwarded through a system and  des-
	 tined	for a different network. If the sniffing interface is the egress
	 interface for such packets, then this variable will need to be  set  to
	 "Y"  in  order  for  fwknopd  to  see	them. The default is "N" so that
	 fwknopd only looks for SPA packets that are received  on  the	sniffing
	 interface (note that this is independent of promiscuous mode).

     SYSLOG_IDENTITY <identity>
	 Override syslog identity on message logged by fwknopd. The defaults are
	 usually ok.

     SYSLOG_FACILITY <facility>
	 Override syslog facility. The "SYSLOG_FACILITY" variable can be set to

     ENABLE_DESTINATION_RULE <Y/N>
	 Controls whether fwknopd will set the destination field on the firewall
	 rule  to  the destination address specified on the incoming SPA packet.
	 This is useful for interfaces with multiple IP addresses hosting  sepa-
	 rate  services.  If "ENABLE_IPT_OUTPUT" is set to "Y", the source field
	 of the firewall rule is set. FORWARD and SNAT rules  are  not	affected
	 however, DNAT rules will also have their destination field set. The de-
	 fault is "N", which sets the destination field to 0.0.0.0/0 (any).

     FWKNOP_RUN_DIR <path>
	 Specify  the  directory  where fwknopd writes run time state files. The
	 default is /var.

   ACCESS.CONF VARIABLES
     This section describes  the  access  control  directives  in  the	/usr/lo-
     cal/etc/fwknop/access.conf  file.	Theses	directives define encryption and
     authentication keys, and the level of access  that  is  granted  to  fwknop
     clients  that have generated an appropriate encrypted and authenticated SPA
     packet.

     The access.conf variables described below provide the access directives for
     the SPA packets with a source (or embedded request) IP that matches an  ad-
     dress or network range defined by the "SOURCE" variable. All variables fol-
     lowing  "SOURCE" apply to the source stanza. Each "SOURCE" directive starts
     a new stanza.

     SOURCE <IP,..,IP/NET,..,NET/ANY>
	 This defines the source address from which the SPA packet will  be  ac-
	 cepted.  The string "ANY" is also accepted if a valid SPA packet should
	 be honored from any source IP. Every authorization stanza  in	/usr/lo-
	 cal/etc/fwknop/access.conf definition must start with the "SOURCE" key-
	 word.	 Networks   should   be   specified   in   CIDR  notation  (e.g.
	 "192.168.10.0/24"), and individual IP addresses  can  be  specified  as
	 well.	Also,  multiple  IP's  and/or networks can be defined as a comma
	 separated list (e.g. "192.168.10.0/24,10.1.1.123")

     DESTINATION <IP,..,IP/NET,..,NET/ANY>
	 This defines the destination address for which the SPA packet	will  be
	 accepted.  The  string  "ANY"	is  also  accepted if a valid SPA packet
	 should be honored to any destination IP. Networks should  be  specified
	 in  CIDR notation (e.g. "192.168.10.0/24"), and individual IP addresses
	 can be specified as well. Also, multiple IP's and/or  networks  can  be
	 defined as a comma separated list (e.g. "192.168.10.0/24,10.1.1.123")

     OPEN_PORTS <proto/port>,...,<proto/port>
	 Define a set of ports and protocols (tcp or udp) that will be opened if
	 a  valid knock sequence is seen. If this entry is not set, fwknopd will
	 attempt to honor any proto/port request specified in the SPA data  (un-
	 less  of it matches any "RESTRICT_PORTS" entries). Multiple entries are
	 comma-separated.

     RESTRICT_PORTS <proto/port>,...,<proto/port>
	 Define a set of ports and protocols (tcp or udp)  that  are  explicitly
	 not allowed regardless of the validity of the incoming SPA packet. Mul-
	 tiple entries are comma-separated.

     KEY <passphrase>
	 Define  the  symmetric  key  used for decrypting an incoming SPA packet
	 that is encrypted by the fwknop client with Rijndael.	The  actual  en-
	 cryption  key	that  is  used is derived from the standard PBKDF1 algo-
	 rithm. This variable is required for all SPA packets  unless  GnuPG  is
	 used instead (see the GPG variables below).

     KEY_BASE64 <base64 encoded passphrase>
	 Same as the KEY option above, but specify the symmetric key as a base64
	 encoded  string. This allows non-ascii characters to be included in the
	 base64-decoded key.

     HMAC_KEY <key>
	 Specify the HMAC key for authenticated encryption of SPA packets.  This
	 supports both Rijndael and GPG encryption modes, and is applied accord-
	 ing to the encrypt-then-authenticate model.

     HMAC_KEY_BASE64 <base64 encoded key>
	 Specify  the HMAC key as a base64 encoded string. This allows non-ascii
	 characters to be included in the base64-decoded key.

     FW_ACCESS_TIMEOUT <seconds>
	 Define the length of time access will be granted by fwknopd through the
	 firewall after a valid knock sequence from  a	source	IP  address.  If
	 "FW_ACCESS_TIMEOUT"  is  not set then the default timeout of 30 seconds
	 will automatically be set.

     %include <file>
	 Have fwknopd import an additional access.conf file.  This  allows  more
	 access  stanzas to be defined in other locations in the filesystem, and
	 this can be advantageous in some scenarios  by  letting  non-privileged
	 users define their own encryption and authentication keys for SPA oper-
	 ations.  This	way, users do not need write access to the main /usr/lo-
	 cal/etc/fwknop/access.conf file to change keys  around  or  define  new
	 ones.

     %include_folder <directory>
	 Similarly  to	the %include option above, the %include_folder directive
	 has fwknopd import all .conf files from the specified directory.  There
	 is also command line support for this via the access-folder option.

     ENCRYPTION_MODE <mode>
	 Specify  the encryption mode when AES is used. The default is CBC mode,
	 but other modes can be selected such as OFB and CFB. In general, it  is
	 recommended  to not use this variable and leave it as the default. Note
	 that the string "legacy" can be specified  in	order  to  generate  SPA
	 packets with the old initialization vector strategy used by versions of
	 fwknop before 2.5. With the 2.5 release, fwknop uses PBKDF1 for key de-
	 rivation.

     HMAC_DIGEST_TYPE <digest algorithm>
	 Specify  the  digest  algorithm for incoming SPA packet authentication.
	 Must be  one  of  MD5,  SHA1,	SHA256,  SHA384,  SHA512,  SHA3_256,  or
	 SHA3_512.  This is an optional field, and if not specified then fwknopd
	 defaults to using SHA256 if the access stanza requires an HMAC.

     ACCESS_EXPIRE <MM/DD/YYYY>
	 Defines an expiration date for the access stanza in MM/DD/YYYY  format.
	 All  SPA packets that match an expired stanza will be ignored. This pa-
	 rameter is optional.

     ACCESS_EXPIRE_EPOCH <seconds>
	 Defines an expiration date for the access stanza as the epoch time, and
	 is useful if a more accurate expiration time needs to be given than the
	 day resolution offered by the ACCESS_EXPIRE  variable	above.	All  SPA
	 packets that match an expired stanza will be ignored. This parameter is
	 optional.

     ENABLE_CMD_EXEC <Y/N>
	 This  instructs  fwknopd to accept complete commands that are contained
	 within an authorization packet. Any such command will	be  executed  on
	 the  fwknopd  server as the user specified by the "CMD_EXEC_USER" or as
	 the user that started fwknopd if that is not set.

     ENABLE_CMD_SUDO_EXEC <Y/N>
	 sudo provides a powerful means of restricting the sets of commands that
	 users can execute via the "sudoers" file. By enabling this feature (and
	 in "ENABLE_CMD_EXEC" mode), all incoming commands from valid SPA  pack-
	 ets  will be prefixed by "/path/to/sudo -u <user> -g <group>" where the
	 path to sudo is set by the "SUDO_EXE" variable, "<user>" is set by  the
	 "CMD_SUDO_EXEC_USER"  variable  (default  is  "root"  if  not set), and
	 "<group>" is set by "CMD_SUDO_EXEC_GROUP" (default is	also  "root"  if
	 not set).

     CMD_EXEC_USER <username>
	 Specify  the  user  (via  setuid) that will execute a command contained
	 within a SPA packet. If this variable is not given, fwknopd  will  exe-
	 cute  the command as the user it is running as (most likely root). Set-
	 ting this to a non-root user such as "nobody" is highly recommended  if
	 elevated permissions are not needed.

     CMD_SUDO_EXEC_USER <username>
	 Specify  the  user  (via  "sudo -u <user>") that will execute a command
	 contained within a SPA packet. If this variable is not  given,  fwknopd
	 will assume the command should be executed as root.

     CMD_EXEC_GROUP <groupname>
	 Specify  the  group  (via setgid) that will execute a command contained
	 within a SPA packet. If this variable is not given, fwknopd  will  exe-
	 cute  the command as the user it is running as (most likely root). Set-
	 ting this to a non-root user such as "nobody" is highly recommended  if
	 elevated permissions are not needed.

     CMD_SUDO_EXEC_GROUP <groupname>
	 Specify  the  group (via "sudo -g <group>") that will execute a command
	 contained within a SPA packet. If this variable is not  given,  fwknopd
	 will assume the command should be executed as root.

     CMD_CYCLE_OPEN <command>
	 Specify  a  command  open/close  cycle to be executed upon receipt of a
	 valid SPA packet. This directive sets the initial command, and is meant
	 to be used in conjunction with the  "CMD_CYCLE_CLOSE"	variable  below.
	 The  main  application  of this feature is to allow fwknopd to interact
	 with firewall or ACL's that are not natively supported, and  facilitate
	 the same access model as for the main supported firewalls such as ipta-
	 bles.	That  is, a command is executed to open the firewall or ACL, and
	 then a corresponding close command is executed after a  timer	expires.
	 Both  the "CMD_CYCLE_OPEN" and "CMD_CYCLE_CLOSE" variables support spe-
	 cial substitution strings to allow values to be taken from the SPA pay-
	 load and used on the  command	line  of  the  executed  command.  These
	 strings begin with a "$" character, and include "$IP" (the allow IP de-
	 crypted  from the SPA payload), "$SRC" (synonym for "$IP") , "$PKT_SRC"
	 (the source IP in the network layer header of the SPA	packet),  "$DST"
	 (the destination IP), "$PORT" (the allow port), and "$PROTO" (the allow
	 protocol), "$TIMEOUT" (set the client timeout if specified).

     CMD_CYCLE_CLOSE <command>
	 Specify  the  close command that corresponds to the open command set by
	 the "CMD_CYCLE_OPEN" variable described above. The same string  substi-
	 tutions  such	as  "$IP", "$PORT", and "$PROTO" are supported. In addi-
	 tion, the special value "NONE" can be set to allow no close command  to
	 be executed after the open command. This might be handy in certain sit-
	 uations where, say, indefinite access is desired and allowed.

     CMD_CYCLE_TIMER <seconds>
	 Set the number of seconds after which the close command set in "CMD_CY-
	 CLE_CLOSE"  will  be executed. This defines the open/close timer inter-
	 val.

     SUDO_EXE <path>
	 Define the path to the sudo binary. Default is "/usr/bin/sudo".

     REQUIRE_USERNAME <username>
	 Require a specific username from the client system as	encoded  in  the
	 SPA  data. This variable is optional and if not specified, the username
	 data in the SPA data is ignored.

     REQUIRE_SOURCE_ADDRESS <Y/N>
	 Force all SPA packets to contain a real IP address within the encrypted
	 data. This makes it impossible to use the -s command line  argument  on
	 the fwknop client command line, so either -R has to be used to automat-
	 ically resolve the external address (if the client behind a NAT) or the
	 client must know the external IP and set it via the -a argument.

     REQUIRE_SOURCE_ADDRESS <Y/N>
	 Synonym for "REQUIRE_SOURCE_ADDRESS".

     FORCE_NAT <IP> <PORT>
	 For  any  valid  SPA packet, force the requested connection to be NAT'd
	 through to the specified (usually internal) IP and port value. This  is
	 useful if there are multiple internal systems running a service such as
	 SSHD, and you want to give transparent access to only one internal sys-
	 tem  for each stanza in the access.conf file. This way, multiple exter-
	 nal users can each directly access only one  internal	system	per  SPA
	 key.

     FORCE_SNAT <IP>
	 For any valid SPA packet, add an SNAT rule in addition to any DNAT rule
	 created  with	a  corresponding  (required) FORCE_NAT variable. This is
	 analogous     to     "SNAT_TRANSLATE_IP"     from     the	/usr/lo-
	 cal/etc/fwknop/fwknopd.conf  file  except  that it is per access stanza
	 and overrides any value set with "SNAT_TRANSLATE_IP".	This  is  useful
	 for  situations  where  an  incoming  NAT'd connection may be otherwise
	 unanswerable due to routing constraints (i.e. the system receiving  the
	 SPA  authenticated connection has a default route to a different device
	 than the SPA system itself).

     FORCE_MASQUERADE <Y/N>
	 This is similar to the "FORCE_SNAT" variable, except  that  it  is  not
	 necessary to also specify an IP address for SNAT rules because the MAS-
	 QUERADE target is used instead.

     FORWARD_ALL <Y/N>
	 In  NAT scenarios, control whether all traffic is forwarded through the
	 fwknopd system as opposed to just forwarding  connections  to	specific
	 services as requested by the fwknop client.

     DISABLE_DNAT <Y/N>
	 Control  whether DNAT rules are created in FORCE_NAT scenarios. This is
	 mainly used in conjunction  with  the	FORWARD_ALL  variable  to  allow
	 fwknopd  to  act essentially as an SPA gateway. I.e., the fwknop client
	 is used to gain access via SPA to  the  broader  Internet  after  being
	 granted an IP via DHCP, but prior to sending the SPA packet all traffic
	 is blocked by default to the Internet.

     GPG_DECRYPT_ID <keyID>
	 Define a GnuPG key ID to use for decrypting SPA messages that have been
	 encrypted by an fwknop client. This keyword is required for authentica-
	 tion  that  is  based	on GPG keys. The GPG key ring on the client must
	 have imported and signed the fwknopd server key, and vice versa. It  is
	 ok  to use a sensitive personal GPG key on the client, but each fwknopd
	 server should have its own GPG key that is generated  specifically  for
	 fwknop communications. The reason for this is that the decryption pass-
	 word	for   the   server  key  must  be  placed  within  the	/usr/lo-
	 cal/etc/fwknop/access.conf file for fwknopd to function (it has  to  be
	 able to decrypt SPA messages that have been encrypted with the server's
	 public  key). For more information on using fwknop with GnuPG keys, see
	 the	       following	    link:	     "http://www.cipher-
	 dyne.org/fwknop/docs/gpghowto.html".

     GPG_DECRYPT_PW <decrypt password>
	 Specify the decryption password for the gpg key defined by the "GPG_DE-
	 CRYPT_ID" above. This is a required field for gpg-based authentication.

     GPG_ALLOW_NO_PW <Y/N>
	 Allow	fwknopd to leverage a GnuPG key pair that does not have an asso-
	 ciated password. While this may sound like a  controversial  deployment
	 mode,	in  automated environments it makes sense because "there is usu-
	 ally no way to store a  password  more  securely  than  on  the  secret
	 keyring	       itself"		     according		     to:
	 "http://www.gnupg.org/faq/GnuPG-FAQ.html#how-can-i-use-gnupg-in-an-au-
	 tomated-environment". Using this feature and  removing  the  passphrase
	 from  a GnuPG key pair is useful in some environments where libgpgme is
	 forced to use gpg-agent and/or pinentry to collect a passphrase.

     GPG_REQUIRE_SIG <Y/N>
	 With this setting set to Y, fwknopd check all	GPG-encrypted  SPA  mes-
	 sages	for  a	signature  (signed by the sender's key). If the incoming
	 message is not signed, the decryption process will fail.  If  not  set,
	 the default is Y.

     GPG_DISABLE_SIG <Y/N>
	 Disable signature verification for incoming SPA messages. This is not a
	 recommended setting, and the default is N.

     GPG_IGNORE_SIG_VERIFY_ERROR <Y/N>
	 Setting  this will allow fwknopd to accept incoming GPG-encrypted pack-
	 ets that are signed, but the signature did not pass verification  (i.e.
	 the  signer  key  was	expired, etc.). This setting only applies if the
	 GPG_REQUIRE_SIG is also set to Y.

     GPG_REMOTE_ID <keyID,...,keyID>
	 Define a list of gpg key ID's that are required to have signed any  in-
	 coming SPA message that has been encrypted with the fwknopd server key.
	 This  ensures	that the verification of the remote user is accomplished
	 via a strong cryptographic mechanism. Signature verification is enabled
	 by default, and can only be disabled if "GPG_DISABLE_SIG" is set  to  Y
	 (not a recommended setting). Separate multiple entries with a comma.

     GPG_FINGERPRINT_ID <keyID,...,keyID>
	 Specify  a  set  of  full-length  GnuPG key fingerprints instead of the
	 shorter key identifiers set with the "GPG_REMOTE_ID" variable. Here  is
	 an  example  fingerprint  for	one  of  the  fwknop  test  suite  keys:
	 00CC95F05BC146B6AC4038C9E36F443C6A3FAD56.

     GPG_HOME_DIR <path>
	 Define the path to the GnuPG  directory  to  be  used	by  the  fwknopd
	 server.   If	this   keyword	 is   not   specified	within	/usr/lo-
	 cal/etc/fwknop/access.conf then  fwknopd  will  default  to  using  the
	 /root/.gnupg  directory  for the server key(s) for incoming SPA packets
	 handled by the matching access.conf stanza.

     GPG_EXE <path>
	 Define the path to the GnuPG executable. If this keyword is not  speci-
	 fied within /usr/local/etc/fwknop/access.conf then fwknopd will default
	 to using /usr/bin/gpg.

FILES
     /usr/local/etc/fwknop/fwknopd.conf
	 The main configuration file for fwknop.

     /usr/local/etc/fwknop/access.conf
	 Defines all knock sequences and access control directives.

DEPENDENCIES
     fwknopd requires libfko which is normally included with both source and bi-
     nary  distributions,  and	is  a  dedicated library developed by the fwknop
     project.

     For packet sniffing, fwknopd currently requires libpcap,  but  future  ver-
     sions will (optionally) remove this as a dependency.

     For  GPG  functionality, GnuPG must also be correctly installed and config-
     ured along with the libgpgme library.

     To take advantage of all of the authentication and access	management  fea-
     tures  of	the  fwknopd  daemon/service a functioning iptables, ipfw, or pf
     firewall is required on the underlying operating system.

DIAGNOSTICS
     fwknopd can be run in debug mode by combining the -f, --foreground and  the
     -v,  --verbose  command  line options. This will disable daemon mode execu-
     tion, and print verbose information to the screen on stderr as packets  are
     received.

     The  most comprehensive way to gain diagnostic information on fwknopd is to
     run the test suite test-fwknop.pl script located in the test/ directory  in
     the fwknop sources. The test suite runs sends fwknop through a large number
     of  run time tests, has valgrind support, validates both SPA encryption and
     HMAC results against OpenSSL, and even has its own built in fuzzer for  SPA
     communications.

SEE ALSO
     fwknopd(8),  iptables(8), pf(4), pfctl(8), ipfw(8), gpg(1), libfko documen-
     tation.

     More information on Single Packet Authorization can be found in  the  paper
     "Single  Packet  Authorization with fwknop" available at http://www.cipher-
     dyne.org/fwknop/docs/SPA.html. A comprehensive tutorial  on  fwknop  opera-
     tions     and     theory	  can	 be    found	at    http://www.cipher-
     dyne.org/fwknop/docs/fwknop-tutorial.html. This tutorial also includes  in-
     formation	about  the  design of fwknop that may be worth reading for those
     interested in why fwknop is different from other SPA implementations.

     fwknop uses the git versioning system as its source code  repository  along
     with Github for tracking of issues and milestones:

	     $ git clone https://github.com/mrash/fwknop.git fwknop.git

     Additional  commentary  on  Single  Packet  Authorization	can be found via
     Michael Rash's Twitter feed: http://twitter.com/michaelrash, @michaelrash

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

CONTRIBUTORS
     This "C" version of fwknop was derived from the original Perl-based version
     on which many people who are active in the open source community have  con-
     tributed.	 See   the   CREDITS  file  in	the  fwknop  sources,  or  visit
     https://github.com/mrash/fwknop/blob/master/CREDITS to view the online list
     of contributors. A few contributors deserve to be	singled  out  including:
     Franck  Joncourt, Max Kastanas, Vlad Glagolev, Sean Greven, Hank Leininger,
     Fernando Arnaboldi, and Erik Gomez.

     The phrase "Single Packet Authorization" was coined by  MadHat  and  Simple
     Nomad at the BlackHat Briefings of 2005.

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

DISTRIBUTION
     fwknopd  is distributed under the GNU General Public License (GPL v2+), and
     the latest version may be downloaded from http://www.cipherdyne.org.

Fwknop Server			   08/06/2018			      FWKNOPD(8)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=fwknopd&sektion=8&manpath=FreeBSD+Ports+15.1.quarterly>

home | help