Unverified Commit 9d662d95 authored by Gary Guo's avatar Gary Guo Committed by Sandro Jäckel
Browse files

nixosTests.firewall: add tests for nixos-firewall-tool



Co-authored-by: default avatarRvfg <i@rvf6.com>
parent cabbab19
Loading
Loading
Loading
Loading
+28 −3
Original line number Diff line number Diff line
@@ -3,14 +3,31 @@
import ./make-test-python.nix ( { pkgs, nftables, ... } : {
  name = "firewall" + pkgs.lib.optionalString nftables "-nftables";
  meta = with pkgs.lib.maintainers; {
    maintainers = [ ];
    maintainers = [ rvfg garyguo ];
  };

  nodes =
    { walled =
        { ... }:
        { networking.firewall.enable = true;
          networking.firewall.logRefusedPackets = true;
        { networking.firewall = {
            enable = true;
            logRefusedPackets = true;
            # Syntax smoke test, not actually verified otherwise
            allowedTCPPorts = [ 25 993 8005 ];
            allowedTCPPortRanges = [
              { from = 980; to = 1000; }
              { from = 990; to = 1010; }
              { from = 8000; to = 8010; }
            ];
            interfaces.eth0 = {
              allowedTCPPorts = [ 10003 ];
              allowedTCPPortRanges = [ { from = 10000; to = 10005; } ];
            };
            interfaces.eth3 = {
              allowedUDPPorts = [ 10003 ];
              allowedUDPPortRanges = [ { from = 10000; to = 10005; } ];
            };
          };
          networking.nftables.enable = nftables;
          services.httpd.enable = true;
          services.httpd.adminAddr = "foo@example.org";
@@ -48,6 +65,14 @@ import ./make-test-python.nix ( { pkgs, nftables, ... } : {
    walled.succeed("curl -v http://attacker/ >&2")
    walled.succeed("ping -c 1 attacker >&2")

    # Open tcp port 80 at runtime
    walled.succeed("nixos-firewall-tool open tcp 80")
    attacker.succeed("curl -v http://walled/ >&2")

    # Reset the firewall
    walled.succeed("nixos-firewall-tool reset")
    attacker.fail("curl --fail --connect-timeout 2 http://walled/ >&2")

    # If we stop the firewall, then connections should succeed.
    walled.stop_job("${unit}")
    attacker.succeed("curl -v http://walled/ >&2")