# Generic configuration for any bgpwtf router.

{ config, pkgs, lib, ... }:

with builtins;

rec {
  imports = [
    ./routing.nix
    ./rename-interfaces.nix
    ./rsh-unbound.nix
    ./bootstrap.nix
    ./prometheus.nix
  ];

  environment.systemPackages = with pkgs; [
    tcpdump htop dstat file strace gdb mtr
    vim wget curl htop dstat whois bind
    rxvt_unicode.terminfo dhcpcd efibootmgr
  ];
  networking.useDHCP = false;
  networking.firewall.enable = false;
  boot.kernel.sysctl."net.ipv4.ip_forward" = 1;
  boot.kernel.sysctl."net.ipv4.conf.*.accept_redirects" = 0;
  boot.kernel.sysctl."net.ipv4.conf.*.send_redirects" = 0;
  boot.kernel.sysctl."net.ipv4.conf.*.accept_source_route" = 0;
  boot.kernel.sysctl."net.ipv4.conf.*.proxy_arp" = 0;
  boot.kernel.sysctl."net.ipv4.conf.*.secure_redirects" = 1;
  boot.kernel.sysctl."net.ipv4.conf.*.bootp_relay" = 0;
  boot.kernel.sysctl."net.ipv4.conf.*.arp_filter" = 1;
  boot.kernel.sysctl."net.ipv4.conf.*.arp_ignore" = 1;
  boot.kernel.sysctl."net.ipv4.conf.*.arp_announce" = 2;
  boot.kernel.sysctl."net.ipv4.conf.*.rp_filter" = 0;
  boot.kernel.sysctl."net.ipv6.conf.*.forwarding" = 1;
  boot.kernel.sysctl."net.ipv6.conf.*.accept_ra" = 0;
  boot.kernel.sysctl."net.ipv6.conf.*.autoconf" = 0;
  boot.kernel.sysctl."net.ipv6.conf.*.router_solicitations" = 0;
  boot.kernel.sysctl."net.ipv6.route.max_size" = 2147483647;

  # Limit nscd memory usage, as it sometimes just blows up and the OOMkiller
  # sucks at picking it up.
  systemd.services.nscd.serviceConfig.MemoryMax = "1G";

  # enable coredumpctl
  systemd.coredump.enable = true;

  # Use Chrony instead of systemd-timesyncd
  time.timeZone = "Europe/Warsaw";
  services.chrony.enable = true;
  networking.nameservers = [ "8.8.8.8" ];

  # Enable the OpenSSH daemon.
  services.openssh.enable = true;
  services.openssh.passwordAuthentication = false;
  # Allow for slightly more unauthenticated connections between dropping them,
  # otherwise public bruteforcing will cause DoS preventing actual users from
  # logging in.
  services.openssh.extraConfig = ''
    MaxStartups 100:30:1000
  '';
  users.users.root.openssh.authorizedKeys.keys = [
    "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG599UildOrAq+LIOQjKqtGMwjgjIxozI1jtQQRKHtCP q3k@mimeomia"
    "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQb3YQoiYFZLKwvHYKbu1bMqzNeDCAszQhAe1+QI5SLDOotclyY/vFmOReZOsmyMFl71G2d7d+FbYNusUnNNjTxRYQ021tVc+RkMdLJaORRURmQfEFEKbai6QSFTwErXzuoIzyEPK0lbsQuGgqT9WaVnRzHJ2Q/4+qQbxAS34PuR5NqEkmn4G6LMo3OyJ5mwPkCj9lsqz4BcxRaMWFO3mNcwGDfSW+sqgc3E8N6LKrTpZq3ke7xacpQmcG5DU9VO+2QVPdltl9jWbs3gXjmF92YRNOuKPVfAOZBBsp8JOznfx8s9wDgs7RwPmDpjIAJEyoABqW5hlXfqRbTnfnMvuR informatic@InformaticPC"
    "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDGkMgEVwQM8yeuFUYL2TwlJIq9yUNBmHnwce46zeL2PK2CkMz7sxT/om7sp/K5XDiqeD05Nioe+Dr3drP6B8uI33S5NgxPIfaqQsRS+CBEgk6cqFlcdlKETU/DT+/WsdoO173n7mgGeafPInEuQuGDUID0Fl099kIxtqfAhdeZFMM6/szAZEZsElLJ8K6dp1Ni/jmnXCZhjivZH3AZUlnqrmtDG7FY1bgcOfDXAal45LItughGPtrdiigXe9DK2fW3+9DBZZduh5DMJTNlphAZ+nfSrbyHVKUg6WsgMSprur4KdU47q1QwzqqvEj75JcdP1jOWoZi4F6VJDte9Wb9lhD1jGgjxY9O6Gs4CH35bx15W7CN9hgNa0C8NbPJe/fZYIeMZmJ1m7O2xmnYwP8j+t7RNJWu7Pa3Em4mOEXvhBF07Zfq+Ye/4SluoRgADy5eII2x5fFo5EBhInxK0/X8wF6XZvysalVifoCh7T4Edejoi91oAxFgYAxbboXGlod0eEHIi2hla8SM9+IBHOChmgawKBYp2kzAJyAmHNBF+Pah9G4arVCj/axp/SJZDZbJQoI7UT/fJzEtvlb5RWrHXRq+y6IvjpUq4pzpDWW04+9UMqEEXRmhWOakHfEVM9rN8h3aJBflLUBBnh0Z/hVsKNh8bCRHaKtah8TrD9i+wMw== patryk.jakuszew@gmail.com"
    "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC33naG1ptCvUcRWX9cj9wXM1nW1lyQC4SvMJzWlr9aMD96O8hQ2JMkuIUgUJvorAY02QRplQ2BuoVoVkdkzwjMyi1bL3OdgcKo7Z1yByClGTTocqNJYY0lcUb6EJH8+6e6F9ydrQlSxNzL1uCaA7phZr+yPcmAmWbSfioXn98yXNkE0emHxzJv/nypJY56sDCMC2IXDRd8L2goDtPwgPEW7bWfAQdIFMJ75xOidZOTxJ8eqyXLw/kxY5UlyX66jdoYz1sE5XUHuoQl1AOG9UdlMo0aMhUvP4pX5l7r7EnA9OttKMFB3oWqkVK/R6ynZ52YNOU5BZ9V+Ppaj34W0xNu+p0mbHcCtXYCTrf/OU0hcZDbDaNTjs6Vtcm2wYw9iAKX7Tex+eOMwUwlrlcyPNRV5BTot7lGNYfauHCSIuWJKN4NhCLR/NtVNh4/94eKkPTwJsY6XqDcS7q49wPAs4DAH7BJgsbHPOqygVHrY0YYEfz3Pj0HTxJHQMCP/hQX4fXEGt0BjgoVJbXPAQtPyeg0JuxiUg+b4CgVVfQ6R060MlM1BZzhmh+FY5MJH6nJppS0aHYCvSg8Z68NUlCPKy0jpcyfuAIWQWwSGG1O010WShQG2ELsvNdg5/4HVdCGNl5mmoom6JOd72FOZyQlHDFfeQUQRn9HOeCq/c51rK99SQ== bartek@IHM"
    "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICTR292kx/2CNuWYIsZ6gykQ036aBGrmheIuZa6S1D2x implr@thonk"
    "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGfIRe1nH6vwjQTjqHNnkKAdr1VYqGEeQnqInmf3A6UN ar@khas"
  ];
}
