| 
									
										
										
										
											2011-03-11 13:38:52 +00:00
										 |  |  | # Test the firewall module. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-12 12:09:40 +02:00
										 |  |  | import ./make-test.nix ( { pkgs, ... } : { | 
					
						
							| 
									
										
										
										
											2014-06-28 16:04:49 +02:00
										 |  |  |   name = "firewall"; | 
					
						
							| 
									
										
										
										
											2015-07-12 12:09:40 +02:00
										 |  |  |   meta = with pkgs.stdenv.lib.maintainers; { | 
					
						
							| 
									
										
										
										
											2019-02-22 16:14:13 +01:00
										 |  |  |     maintainers = [ eelco ]; | 
					
						
							| 
									
										
										
										
											2015-07-12 12:09:40 +02:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2011-03-11 13:38:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   nodes = | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  |     { walled = | 
					
						
							| 
									
										
										
										
											2018-07-20 20:56:59 +00:00
										 |  |  |         { ... }: | 
					
						
							| 
									
										
										
										
											2011-03-11 13:38:52 +00:00
										 |  |  |         { networking.firewall.enable = true; | 
					
						
							|  |  |  |           networking.firewall.logRefusedPackets = true; | 
					
						
							|  |  |  |           services.httpd.enable = true; | 
					
						
							|  |  |  |           services.httpd.adminAddr = "foo@example.org"; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 14:18:32 +02:00
										 |  |  |       # Dummy configuration to check whether firewall.service will be honored | 
					
						
							|  |  |  |       # during system activation. This only needs to be different to the | 
					
						
							|  |  |  |       # original walled configuration so that there is a change in the service | 
					
						
							|  |  |  |       # file. | 
					
						
							|  |  |  |       walled2 = | 
					
						
							| 
									
										
										
										
											2018-07-20 20:56:59 +00:00
										 |  |  |         { ... }: | 
					
						
							| 
									
										
										
										
											2016-09-07 14:18:32 +02:00
										 |  |  |         { networking.firewall.enable = true; | 
					
						
							|  |  |  |           networking.firewall.rejectPackets = true; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  |       attacker = | 
					
						
							| 
									
										
										
										
											2018-07-20 20:56:59 +00:00
										 |  |  |         { ... }: | 
					
						
							| 
									
										
										
										
											2011-03-11 13:38:52 +00:00
										 |  |  |         { services.httpd.enable = true; | 
					
						
							|  |  |  |           services.httpd.adminAddr = "foo@example.org"; | 
					
						
							| 
									
										
										
										
											2014-04-11 17:15:56 +02:00
										 |  |  |           networking.firewall.enable = false; | 
					
						
							| 
									
										
										
										
											2011-03-11 13:38:52 +00:00
										 |  |  |         }; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 14:18:32 +02:00
										 |  |  |   testScript = { nodes, ... }: let | 
					
						
							|  |  |  |     newSystem = nodes.walled2.config.system.build.toplevel; | 
					
						
							|  |  |  |   in ''
 | 
					
						
							|  |  |  |     $walled->start; | 
					
						
							|  |  |  |     $attacker->start; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $walled->waitForUnit("firewall"); | 
					
						
							|  |  |  |     $walled->waitForUnit("httpd"); | 
					
						
							|  |  |  |     $attacker->waitForUnit("network.target"); | 
					
						
							| 
									
										
										
										
											2011-03-11 13:38:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 14:18:32 +02:00
										 |  |  |     # Local connections should still work. | 
					
						
							|  |  |  |     $walled->succeed("curl -v http://localhost/ >&2"); | 
					
						
							| 
									
										
										
										
											2011-03-11 13:38:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 14:18:32 +02:00
										 |  |  |     # Connections to the firewalled machine should fail, but ping should succeed. | 
					
						
							|  |  |  |     $attacker->fail("curl --fail --connect-timeout 2 http://walled/ >&2"); | 
					
						
							|  |  |  |     $attacker->succeed("ping -c 1 walled >&2"); | 
					
						
							| 
									
										
										
										
											2011-03-11 13:38:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 14:18:32 +02:00
										 |  |  |     # Outgoing connections/pings should still work. | 
					
						
							|  |  |  |     $walled->succeed("curl -v http://attacker/ >&2"); | 
					
						
							|  |  |  |     $walled->succeed("ping -c 1 attacker >&2"); | 
					
						
							| 
									
										
										
										
											2011-03-11 13:38:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 14:18:32 +02:00
										 |  |  |     # If we stop the firewall, then connections should succeed. | 
					
						
							|  |  |  |     $walled->stopJob("firewall"); | 
					
						
							|  |  |  |     $attacker->succeed("curl -v http://walled/ >&2"); | 
					
						
							| 
									
										
										
										
											2011-03-11 13:38:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 14:18:32 +02:00
										 |  |  |     # Check whether activation of a new configuration reloads the firewall. | 
					
						
							|  |  |  |     $walled->succeed("${newSystem}/bin/switch-to-configuration test 2>&1" . | 
					
						
							|  |  |  |                      " | grep -qF firewall.service"); | 
					
						
							|  |  |  |   '';
 | 
					
						
							| 
									
										
										
										
											2015-07-12 12:09:40 +02:00
										 |  |  | }) |