The GNU project released
version 0.9.0 of its GNUnet peer-to-peer (P2P) networking framework in late November. GNUnet allows users to create secure, decentralized P2P networks, akin to the technique used by Gnutella, in which every node is a peer with no central server coordinating the network. But GNUnet puts its emphasis on secure communication links and anonymity: when used for file-sharing, the files a user uploads to the network cannot be traced to their origin, and no one can monitor download activity. Version 0.9.0 breaks network compatibility with previous releases, but it also adds several architectural improvements, and is the first release to officially support an application other than file sharing.
The birds-eye view of GNUnet makes it sound like yet another Napster clone, because the most easily understood use of P2P networks is sharing files — which many assume focuses on copyright-infringing media files. But GNUnet is more general; the project is interested in providing a secure network for people combating censorship or simply wishing to secure their own network traffic against prying eyes. Although sharing files is one use of a decentralized network, it is not the end goal.
Privacy and anonymity are baked into the framework.
identified solely by the SHA-512 hash of a public key; there is no
mechanism to further identify anyone on the network — no usernames,
or network-wide view of who is connected. Each peer keeps track of its
connections to its neighbors, but the connection data is transient and
regularly expires. Furthermore, when neighbors exchange messages, they use a
mutually-authenticated, encrypted link (a separate link for each
peer-to-peer pair). As long as a peer is being a good citizen and is
helping to route traffic for the rest of the network, to any eavesdroppers
the traffic that originates from the peer is hard to distinguish from traffic
being routed between other hosts.
In GNUnet's file-sharing application module, files uploaded by users are
encoded using an encryption scheme called Encoding for Censorship-Resistant Sharing
(ECRS). ECRS is independent from the link-level encryption, and splits
file contents up into blocks that are distributed between the peers. This
serves two purposes: fault-tolerance, and enabling faster transfers with
Bittorrent-like multi-downloads. Whenever a file is uploaded, special
"keyword" blocks associate its contents with potential search terms (which
GNUnet refers to as "namespaces"). A distributed hash table keeps track of
the namespaces and the files associated with them, so that users can search
for files. On the down side, this setup means that all searches are
probabilistic — there is no guarantee that a search query will turn
up every chunk of the file you search for when you search for it.
On the other hand, the GNUnet client software does not need to
connect to the global network of all GNUnet users; it can also run in
"Friend-to-Friend" mode to create a private network. In this mode, files
uploaded are distributed and replicated in chunks only among the "friends,"
so the participants can speed up file transfers and enjoy a degree of
fault-tolerance, all with a far better probability of finding the files
they need available than they might in the global, distributed GNUnet
You can download GNUnet 0.9.0 from the GNU FTP site. There are separate source packages for the command-line GNUnet core and for the GTK+ GUI. As is generally the case with official GNU projects, the software is tested on Linux-based systems as well as FreeBSD, Mac OS X, and Windows — although one of the new features appears to work only on Linux. The configuration documentation is admirably thorough and is already update-to-date for 0.9.0. GNUnet depends on several other GNU projects, and this release requires some recent versions of some dependencies, so a quick check of the list is recommended. There are generic installation instructions as well, although the Autotools-based process is nothing out of the ordinary.
The file-sharing module found in earlier releases is still provided, but version 0.9.0 is the first to provide another module: a virtual private network (VPN). The VPN module creates a virtual network interface on the client (named vpn-gnunet on Linux boxes), which the user can then use to route IP traffic over GNUnet. This traffic is encrypted between every pair of nodes and is anonymous, much like a Tor tunnel, and like Tor it requires that at least some peers act as "exit" nodes.
GNUnet 0.9.0 introduces protocol changes that make it incompatible with 0.8.0 and earlier releases; in the release notes the project admits that this is inconvenient, but said that "productive development and readable code were considered more important." The protocol changes include a simplified peer-discovery message format (known as a "HELLO") and moving several of the required services (such as identity management and peer discovery) from separate plug-ins into a "core" module.
A bigger architectural change in this release is a move to a
multi-process model, with separate processes running data storage, peer
messaging, and other services, along with a lightweight supervisor process (called the automatic restart manager or "ARM") overseeing all of the others. This removes the need to juggle mutexes and locks between a potentially large number of threads — which made earlier releases difficult to maintain — but it also opens the door to contributors writing GNUnet applications in languages other than C and C++. Last but by no means least, it should also make testing and debugging simpler.
The new VPN system can actually do more than route basic IP traffic through GNUnet. It includes a DNS resolver configured to route the .gnunet pseudo-TLD to GNUnet, so it is possible to run GNUnet-only services by binding them to the GNUnet VPN virtual interface. The VPN module can also translate between IPv4 and IPv6 traffic, which makes it possible to use GNUnet to access IPv6 sites or applications from IPv4-only computers, and vice-versa. The project has a page of screencasts showcasing this feature; they use wget to fetch various sites over the VPN connection using several combinations of IPv4 and IPv6 networking.
GNUnet's closest competitor in terms of features is probably Freenet, which also provides a decentralized, anonymous P2P network with encrypted traffic and storage. Like GNUnet, Freenet can function as a transport layer for applications beyond file-sharing, and already has several example applications in the wild. GNUnet points out a few differences between the frameworks on its site, the most notable of which is that GNUnet is capable of using any number of transport protocols. The list includes familiar application- and transport-layer options like TCP, UDP, HTTP, and HTTPS, but also the link-layer itself — starting with 0.9.0, GNUnet peers can talk to each other directly with 802.11 wireless LAN hardware, without going through an access point.
The direct-over-WLAN code requires Linux (at least for the moment), and a supported WiFi card. It uses packet injection to exchange messages with other GNUnet WLAN peers, which requires a helper binary running with root privileges, but the technique allows the machine to remain connected to an access point at the same time. Currently the data rate is limited to around 1Mbps.
0.9.0 also improves GNUnet's peer discovery in some interesting ways.
Users can bootstrap their connection to the wider GNUnet world by loading a
list of hosts, but, starting with this release, GNUnet peers can also
discover each other on the LAN with IPv4 broadcast messages and IPv6
multicast. Peers can also automatically traverse NAT using a variety of
methods (including using Universal Plug and Play (UPnP) and ICMP hole punching).
Finally, the project has made an effort to make this release more
user-friendly to set up. As the cornucopia of protocols suggests, GNUnet
is known for its flexibility, but that is not always simple to navigate.
In addition to the connectivity settings, GNUnet can use MySQL, PostgreSQL,
or SQLite for storage (both the long-term storage the user contributes to
the distributed storage pool, and for the temporary data GNUnet keeps track
of during a running session). The setup tool now automatically tests the
network and database settings selected by the user and alerts if they do
Applications and all that
On the surface, GNUnet's new functionality makes it more and more like Tor — namely through the availability of separate, anonymous in-network services. Practically speaking, GNUnet still lags behind both Tor and Freenet in terms of what is actually offered to end users; the other networks already support more applications. But GNUnet is making progress; in addition to the VPN code that debuted in 0.9.0, the developers have recently revived the dormant P2P chat application.
At the technical level, GNUnet's main advantage over these other networks is the flexibility it offers in transport protocols — in the past, there were even more options, including a module to route traffic over SMTP (on the grounds that SMTP is rarely blocked by firewalls). Hopefully as the number of applications increases, we will see more and more uses for this flexible transport framework. Routing around censorship is one of the most important uses of this class of project, and the less flexible options — like Tor — are already beginning to be blocked in the wild.
to post comments)