Add support for opportunistic TCP encryption.

Set "networking.tcpcrypt.enable = true;" to enable opportunistic TCP encryption
based on the user-space tools available from <http://tcpcrypt.org>.

Network attackers come in two varieties: passive and active (man-in-the-middle).
Passive attacks are much simpler to execute because they just require listening
on the network. Active attacks are much harder as they require listening and
modifying network traffic, often requiring very precise timing that can make
some attacks impractical.

Opportunistic encryption cannot protect against active attackers, but it *does*
protect against passive attackers. Furthermore, Tcpcrypt is powerful enough to
stop active attacks, too, if the application using it performs authentication.

A complete description of the protocol extension can be found at
<http://tools.ietf.org/html/draft-bittau-tcp-crypt-00>.
This commit is contained in:
Peter Simons 2013-09-10 23:32:55 +02:00
parent c4092f2a8d
commit 0afcc637d7
3 changed files with 79 additions and 0 deletions

View file

@ -100,6 +100,7 @@
amule = 90;
minidlna = 91;
elasticsearch = 92;
tcpcryptd = 666;
# When adding a uid, make sure it doesn't match an existing gid.

View file

@ -148,6 +148,7 @@
./services/networking/dnsmasq.nix
./services/networking/ejabberd.nix
./services/networking/firewall.nix
./services/networking/tcpcrypt.nix
./services/networking/flashpolicyd.nix
./services/networking/freenet.nix
./services/networking/git-daemon.nix

View file

@ -0,0 +1,77 @@
{ config, pkgs, ... }:
with pkgs.lib;
let
cfg = config.networking.tcpcrypt;
in
{
###### interface
options = {
networking.tcpcrypt.enable = mkOption {
default = false;
description = ''
Whether to enable opportunistic TCP encryption. If the other end
speaks Tcpcrypt, then your traffic will be encrypted; otherwise
it will be sent in clear text. Thus, Tcpcrypt alone provides no
guarantees -- it is best effort. If, however, a Tcpcrypt
connection is successful and any attackers that exist are
passive, then Tcpcrypt guarantees privacy.
'';
};
};
config = mkIf cfg.enable {
users.extraUsers = singleton {
name = "tcpcryptd";
uid = config.ids.uids.tcpcryptd;
description = "tcpcrypt daemon user";
};
jobs.tcpcrypt = {
description = "tcpcrypt";
startOn = "started network-interfaces";
path = [ pkgs.iptables pkgs.tcpcrypt pkgs.procps ];
preStart = ''
sysctl -n net.ipv4.tcp_ecn >/run/pre-tcpcrypt-ecn-state
sysctl -w net.ipv4.tcp_ecn=0
iptables -t raw -N nixos-tcpcrypt
iptables -t raw -A nixos-tcpcrypt -p tcp -m mark --mark 0x0/0x10 -j NFQUEUE --queue-num 666
iptables -t raw -I PREROUTING -j nixos-tcpcrypt
iptables -t mangle -N nixos-tcpcrypt
iptables -t mangle -A nixos-tcpcrypt -p tcp -m mark --mark 0x0/0x10 -j NFQUEUE --queue-num 666
iptables -t mangle -I POSTROUTING -j nixos-tcpcrypt
'';
exec = "tcpcryptd -x 0x10";
postStop = ''
if [ -f /run/pre-tcpcrypt-ecn-state ]; then
sysctl -w net.ipv4.tcp_ecn=$(cat /run/pre-tcpcrypt-ecn-state)
fi
iptables -t mangle -D POSTROUTING -j nixos-tcpcrypt || true
iptables -t raw -D PREROUTING -j nixos-tcpcrypt || true
iptables -t raw -F nixos-tcpcrypt || true
iptables -t raw -X nixos-tcpcrypt || true
iptables -t mangle -F nixos-tcpcrypt || true
iptables -t mangle -X nixos-tcpcrypt || true
'';
};
};
}