-{ pkgs, lib, config, ... }:
+{ inputs, pkgs, lib, config, ... }:
let
netns = "riseup";
inherit (config.services) openvpn;
apiUrl = "https://api.black.riseup.net/3/cert";
- ca = pkgs.fetchurl {
- url = "https://black.riseup.net/ca.crt";
- hash = "sha256-Zdvnfz2k7iWlbgmmcUJrpJZ1dp7o0qXeJhP0HWJD7ro=";
- } + "";
key-cert = "/run/openvpn-${netns}/key+cert.pem";
in
{
-services.openvpn.servers.${netns} = {
- inherit netns;
- settings = {
- remote =
- # amsterdam
- ["212.83.182.127" "212.83.165.160" "212.129.4.141"] ++
- # paris
- #["212.83.146.228" "212.83.143.67" "163.172.126.44"] ++
- # miami
- ["37.218.244.249" "37.218.244.251"] ++
- # montreal
- ["199.58.83.10" "199.58.83.10" "199.58.83.12"] ++
- # new-york
- ["185.220.103.12"] ++
- # seattle
- ["198.252.153.28" "198.252.153.28"] ++
- [];
- remote-random = true;
- port = "443";
- proto = "tcp";
- inherit ca;
- key = key-cert;
- cert = key-cert;
+ services.openvpn.servers.${netns} = {
+ inherit netns;
+ settings = {
+ # curl -Ls https://api.black.riseup.net/3/config/eip-service.json |
+ # jq .gateways.'[]'.host
+ remote = [
+ "vpn01-sea.riseup.net"
+ "vpn02-par.riseup.net"
+ "vpn03-par.riseup.net"
+ "vpn04-ams.riseup.net"
+ "vpn05-par.riseup.net"
+ "vpn06-ams.riseup.net"
+ "vpn07-par.riseup.net"
+ "vpn08-par.riseup.net"
+ "vpn09-mia.riseup.net"
+ "vpn10-mtl.riseup.net"
+ "vpn11-par.riseup.net"
+ "vpn12-nyc.riseup.net"
+ "vpn13-ams.riseup.net"
+ "vpn14-par.riseup.net"
+ "vpn15-sea.riseup.net"
+ "vpn16-sea.riseup.net"
+ "vpn17-mia.riseup.net"
+ "vpn18-mtl.riseup.net"
+ "vpn19-ams.riseup.net"
+ "vpn20-par.riseup.net"
+ ];
+ remote-random = true;
+ port = "53";
+ proto = "udp";
+ ca = pkgs.fetchurl
+ {
+ url = "https://black.riseup.net/ca.crt";
+ hash = "sha256-+kzojhwMbFwcf9W6CzXcCaLzBtgeOgXp19XPrP3ZhFM=";
+ } + "";
+ key = key-cert;
+ cert = key-cert;
- auth = "SHA1";
- cipher = "AES-128-CBC";
- client = true;
- dev = "ov-${netns}";
- dev-type = "tun";
- keepalive = "10 30";
- nobind = true;
- persist-key = true;
- persist-tun = true;
- remote-cert-tls = "server";
- reneg-sec = 0;
- script-security = 2;
- tls-cipher = "TLS-DHE-RSA-WITH-AES-128-CBC-SHA";
- tls-client = true;
- tun-ipv6 = true;
- up-restart = true;
- verb = 3;
+ auth = "SHA1";
+ client = true;
+ dev = "ov-${netns}";
+ dev-type = "tun";
+ keepalive = "10 30";
+ nobind = true;
+ persist-key = true;
+ persist-tun = true;
+ remote-cert-tls = "server";
+ reneg-sec = 0;
+ script-security = 2;
+ tls-cipher = "TLS-DHE-RSA-WITH-AES-128-CBC-SHA";
+ tls-client = true;
+ tun-ipv6 = true;
+ up-restart = true;
+ verb = 3;
+ };
};
-};
-systemd.services."openvpn-${netns}" = {
- preStart = ''
- set -e
- ${pkgs.curl}/bin/curl -X POST --cacert ${ca} -o ${key-cert} -Ls ${apiUrl}
- chmod 700 ${key-cert}
- '';
- serviceConfig = {
- RuntimeDirectory = [ "openvpn-${netns}" ];
- RuntimeDirectoryMode = "0700";
+ systemd.services."openvpn-${netns}" = {
+ preStart = ''
+ (
+ set -ex
+ ${pkgs.curl}/bin/curl -v -X POST --cacert ${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt -o ${key-cert} -Ls ${apiUrl}
+ chmod 700 ${key-cert}
+ )
+ '';
+ unitConfig = {
+ StartLimitIntervalSec = 0;
+ };
+ serviceConfig = {
+ RuntimeDirectory = [ "openvpn-${netns}" ];
+ RuntimeDirectoryMode = "0700";
+ };
};
-};
-networking.nftables.ruleset = ''
- add rule inet filter fw2net meta skuid root tcp dport 443 counter accept comment "OpenVPN Riseup"
-'';
-services.netns.namespaces.${netns} = {
- nftables = lib.mkBefore ''
+ environment.systemPackages = [
+ pkgs.riseup-vpn
+ ];
+ networking.nftables.ruleset = ''
table inet filter {
- include "${../../../../networking/nftables/filter.txt}"
- chain input {
- type filter hook input priority filter
- policy drop
- iifname lo accept
- jump check-tcp
- ct state { established, related } accept
- jump accept-connectivity-input
- jump check-broadcast
- ct state invalid drop
- }
- chain forward {
- type filter hook forward priority filter
- policy drop
- jump accept-connectivity-forward
- }
- chain output {
- type filter hook output priority filter
- policy drop
- oifname lo accept
- ct state { related, established } accept
- jump accept-connectivity-output
+ chain output-net {
+ skuid root ${openvpn.servers.${netns}.settings.proto} dport ${openvpn.servers.${netns}.settings.port} counter accept comment "OpenVPN Riseup"
}
}
'';
-};
+ services.netns.namespaces.${netns} = {
+ nftables = lib.mkBefore ''
+ include "${inputs.julm-nix + "/nixos/profiles/networking/nftables.txt"}"
+ '';
+ };
}