25 Jul, 2010

For the past several months, the pure-C implementation of Single Packet Authorization
with fwknop has been in development, and the first release candidate of
fwknop-2.0.0 is ready for
download.
Damien Stuart is the primary developer of this code, and I wish to thank him for
all of his efforts in making this release possible. The original perl version of
fwknop will continue to receive bug fixes as they are found, but the primary
development effort is now on the lightweight and portable C code. The Trac
interface for the perl code has moved to
fwknop-perl. Any release
that is at fwknop-2.0.0 or above will be the C implementation, and any release in
the 1.9 series or before are in perl (and will remain available
here). The perl and C versions are compatible with
each other, so SPA packets created by the fwknop perl client can be properly
decrypted and decoded by the new fwknopd C server, and similarly SPA packets
built with the fwknop C client can be interpreted by the fwknopd perl server.
The heart of the new C code is the
libfko library,
which is used by both the fwknop client and the fwknopd server for SPA packet
encryption/decryption and interpretation. The libfko library is portable to
several platforms including Linux and Windows, and the standard
GNU autoconf
project is used for building fwknop from sources.
Given the compact nature of the C code, the fwknop-2.0.0rc1 release candidate
is already known to function on
OpenWRT, and
Damien Stuart (the primary developer of the fwknop C code) has built packages
for the OpenWRT Kamikaze and Backfire releases. This brings SPA functionality
to embedded systems, and has been tested on a Linksys WRT54GS V2.0 router. The
OpenWRT packages are available
here.
There will be a few release candidates of
fwknop-2.0.0 to ensure proper
operation on a variety of platforms, and the emphasis will be on stability and
ironing out any bugs. Also, fwknop-2.0.0 will initially support iptables
firewalls on the servers side, with
ipfw support coming soon after. There
is one nice feature in fwknop-2.0.0rc1 that deserves a mention - the fwknop client
now supports the notion of a
~/.fwknoprc file that allows a set of
stanzas to be defined for remote SPA servers and customize the command line
arguments used to access each one. Here is an example stanza:
# Example for a destination server of 192.168.1.20 to open access to
# SSH for an IP that is resolved externally
#
[myssh]
SPA_SERVER 192.168.1.20
ACCESS tcp/22
ALLOW_IP resolve
SPA_SERVER_PORT 50023
Now, with the fwknop client, we reference this stanza with the
-n command
line argument like so:
$ fwknop -n myssh -vvv
Resolved external IP (via http://www.cipherdyne.org/cgi-bin/myip) as: 123.1.2.3
Enter encryption password:
FKO Field Values:
=================
Random Value: 8308719569638051
Username: mbr
Timestamp: 1280030806
FKO Version: 1.9.12
Message Type: 1
Message String: 123.1.2.3,tcp/22
Nat Access: <NULL>
Server Auth: <NULL>
Client Timeout: 0
Digest Type: 3
Encoded Data: 8308719569638051:bWJy:1280030806:1.9.12:1:OTYuMjQ0LjE3MS4yNTMsdGNwLzIy
SPA Data Digest: WcUEVesZDIY+CKRKYTck8zMW7HG0S7RcqmXVIMC4L58
Final Packed/Encrypted/Encoded Data:
87wQ3s171if9x8628P6k1oBrQEJEmS5c/+ECed5cfDmu8hGhC5esUCEVcI8IH5TdjWva44efebX+cfXUVPBU9c/6tJpOLwC8k/8sN87SgYkBK+m64aD4FnnndaeqsrIcO/oHcpXHk9S/8rqqypcumNtlXVZD/isS3Q729LMTa+2uI6TsGX9OQ3
Generating SPA packet:
protocol: udp
port: 50023
send_spa_packet: bytes sent: 182
On the fwknopd server side, we see the following printed to the terminal in
--foreground mode as the SPA packet is received and an iptables ACCEPT
rule is added for SSH access and then removed after 30 seconds.
Using Digest Cache: '/usr/var/run/fwknop/digest.cache' (entry count = 93)
PCAP filter is: udp port 50023
Starting fwknopd main event loop.
SPA Packet from IP: 123.1.2.3 received.
SPA Packet: '87wQ3s171if9x8628P6k1oBrQEJEmS5c/+ECed5cfDmu8hGhC5esUCEVcI8IH5TdjWva44efebX+cfXUVPBU9c/6tJpOLwC8k/8sN87SgYkBK+m64aD4FnnndaeqsrIcO/oHcpXHk9S/8rqqypcumNtlXVZD/isS3Q729LMTa+2uI6TsGX9OQ3'
SPA Decode (res=0):
SPA Field Values:
=================
Random Value: 8308719569638051
Username: mbr
Timestamp: 1280030806
FKO Version: 1.9.12
Message Type: 1
Message String: 123.1.2.3,tcp/22
Nat Access: <NULL>
Server Auth: <NULL>
Client Timeout: 0
Digest Type: 3
Encoded Data: 8308719569638051:bWJy:1280030806:1.9.12:1:OTYuMjQ0LjE3MS4yNTMsdGNwLzIy
SPA Data Digest: WcUEVesZDIY+CKRKYTck8zMW7HG0S7RcqmXVIMC4L58
Added Rule to FWKNOP_INPUT for 123.1.2.3, tcp/22 expires at 1280030886
RES=0, CMD_BUF: /sbin/iptables -t filter -L FWKNOP_INPUT --line-numbers -n 2>&1
RULES LIST: Chain FWKNOP_INPUT (1 references)
num target prot opt source destination
1 ACCEPT tcp -- 123.1.2.3 0.0.0.0/0 tcp dpt:22 /* _exp_1280030886 */
Removed rule 1 from FWKNOP_INPUT with expire time of 1280030886.