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:
parent
c4092f2a8d
commit
0afcc637d7
@ -100,6 +100,7 @@
|
|||||||
amule = 90;
|
amule = 90;
|
||||||
minidlna = 91;
|
minidlna = 91;
|
||||||
elasticsearch = 92;
|
elasticsearch = 92;
|
||||||
|
tcpcryptd = 666;
|
||||||
|
|
||||||
# When adding a uid, make sure it doesn't match an existing gid.
|
# When adding a uid, make sure it doesn't match an existing gid.
|
||||||
|
|
||||||
|
@ -148,6 +148,7 @@
|
|||||||
./services/networking/dnsmasq.nix
|
./services/networking/dnsmasq.nix
|
||||||
./services/networking/ejabberd.nix
|
./services/networking/ejabberd.nix
|
||||||
./services/networking/firewall.nix
|
./services/networking/firewall.nix
|
||||||
|
./services/networking/tcpcrypt.nix
|
||||||
./services/networking/flashpolicyd.nix
|
./services/networking/flashpolicyd.nix
|
||||||
./services/networking/freenet.nix
|
./services/networking/freenet.nix
|
||||||
./services/networking/git-daemon.nix
|
./services/networking/git-daemon.nix
|
||||||
|
77
modules/services/networking/tcpcrypt.nix
Normal file
77
modules/services/networking/tcpcrypt.nix
Normal 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
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user