| 
									
										
										
										
											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; { | 
					
						
							|  |  |  |     maintainers = [ eelco chaoflow ]; | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2011-03-11 13:38:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   nodes = | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  |     { walled = | 
					
						
							| 
									
										
										
										
											2011-03-11 13:38:52 +00:00
										 |  |  |         { config, pkgs, nodes, ... }: | 
					
						
							|  |  |  |         { networking.firewall.enable = true; | 
					
						
							|  |  |  |           networking.firewall.logRefusedPackets = true; | 
					
						
							|  |  |  |           services.httpd.enable = true; | 
					
						
							|  |  |  |           services.httpd.adminAddr = "foo@example.org"; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  |       attacker = | 
					
						
							| 
									
										
										
										
											2011-03-11 13:38:52 +00:00
										 |  |  |         { config, pkgs, ... }: | 
					
						
							|  |  |  |         { 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
										 |  |  |         }; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   testScript = | 
					
						
							|  |  |  |     { nodes, ... }: | 
					
						
							|  |  |  |     ''
 | 
					
						
							|  |  |  |       startAll; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-24 18:22:53 +02:00
										 |  |  |       $walled->waitForUnit("firewall"); | 
					
						
							|  |  |  |       $walled->waitForUnit("httpd"); | 
					
						
							|  |  |  |       $attacker->waitForUnit("network.target"); | 
					
						
							| 
									
										
										
										
											2011-03-11 13:38:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       # Local connections should still work. | 
					
						
							|  |  |  |       $walled->succeed("curl -v http://localhost/ >&2"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # Connections to the firewalled machine should fail. | 
					
						
							| 
									
										
										
										
											2014-04-11 17:15:56 +02:00
										 |  |  |       $attacker->fail("curl --fail --connect-timeout 2 http://walled/ >&2"); | 
					
						
							| 
									
										
										
										
											2011-03-11 13:38:52 +00:00
										 |  |  |       $attacker->fail("ping -c 1 walled >&2"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # Outgoing connections/pings should still work. | 
					
						
							|  |  |  |       $walled->succeed("curl -v http://attacker/ >&2"); | 
					
						
							|  |  |  |       $walled->succeed("ping -c 1 attacker >&2"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # If we stop the firewall, then connections should succeed. | 
					
						
							| 
									
										
										
										
											2012-10-24 18:11:21 +02:00
										 |  |  |       $walled->stopJob("firewall"); | 
					
						
							| 
									
										
										
										
											2011-03-11 13:38:52 +00:00
										 |  |  |       $attacker->succeed("curl -v http://walled/ >&2"); | 
					
						
							|  |  |  |     '';
 | 
					
						
							| 
									
										
										
										
											2015-07-12 12:09:40 +02:00
										 |  |  | }) |