| 
									
										
										
										
											2011-03-11 13:38:52 +00:00
										 |  |  | # Test the firewall module. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-09 19:35:48 +01:00
										 |  |  | import ./make-test-python.nix ( { pkgs, ... } : { | 
					
						
							| 
									
										
										
										
											2014-06-28 16:04:49 +02:00
										 |  |  |   name = "firewall"; | 
					
						
							| 
									
										
										
										
											2021-01-10 20:08:30 +01:00
										 |  |  |   meta = with pkgs.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 ''
 | 
					
						
							| 
									
										
										
										
											2019-11-09 19:35:48 +01:00
										 |  |  |     start_all() | 
					
						
							| 
									
										
										
										
											2016-09-07 14:18:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-09 19:35:48 +01:00
										 |  |  |     walled.wait_for_unit("firewall") | 
					
						
							|  |  |  |     walled.wait_for_unit("httpd") | 
					
						
							|  |  |  |     attacker.wait_for_unit("network.target") | 
					
						
							| 
									
										
										
										
											2011-03-11 13:38:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 14:18:32 +02:00
										 |  |  |     # Local connections should still work. | 
					
						
							| 
									
										
										
										
											2019-11-09 19:35:48 +01:00
										 |  |  |     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. | 
					
						
							| 
									
										
										
										
											2019-11-09 19:35:48 +01:00
										 |  |  |     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. | 
					
						
							| 
									
										
										
										
											2019-11-09 19:35:48 +01:00
										 |  |  |     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. | 
					
						
							| 
									
										
										
										
											2019-11-09 19:35:48 +01:00
										 |  |  |     walled.stop_job("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. | 
					
						
							| 
									
										
										
										
											2019-11-09 19:35:48 +01:00
										 |  |  |     walled.succeed( | 
					
						
							|  |  |  |         "${newSystem}/bin/switch-to-configuration test 2>&1 | grep -qF firewall.service" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2016-09-07 14:18:32 +02:00
										 |  |  |   '';
 | 
					
						
							| 
									
										
										
										
											2015-07-12 12:09:40 +02:00
										 |  |  | }) |