Title: Getting started to write firewall rules | |
Author: Solène | |
Date: 07 December 2024 | |
Tags: network security | |
Description: In this blog post, you will learn how to get started to | |
write firewall rules | |
# Introduction | |
This blog post is about designing firewall rules, not focusing on a | |
specific operating system. | |
The idea came after I made a mistake on my test network where I exposed | |
LAN services to the Internet after setting up a VPN with a static IPv4 | |
on it due to too simplistic firewall rules. While discussing this | |
topic on Mastodon, some mentioned they never know where to start when | |
writing firewall rules. | |
# Firewall rules ordering | |
Firewall rules are evaluated one by one, and the evaluation order | |
matters. | |
Some firewall use a "first match" type, where the first rule matching a | |
packet is the rule that is applied. Other firewalls are of type "last | |
match", where the last matching rule is the one applied. | |
# Block everything | |
The first step when writing firewall rules is to block all incoming and | |
outgoing traffic. | |
There is no other way to correctly configure a firewall, if you plan to | |
block all services you want to restrict and let the default allow rule | |
do its job, you are doing it wrong. | |
# Identify flows to open | |
As all flows should be blocked by default, you have to list what should | |
go through the firewall, inbound and outbound. | |
In most cases, you will want to allow outbound traffic, except if you | |
have a specific environment on which you want to only allow outgoing | |
traffic to a certain IP / port. | |
For inbound traffic, if you do not host any services, there are nothing | |
to open. Otherwise, make a list of TCP, UDP, or any other ports that | |
should be reachable, and who should be allowed to reach it. | |
# Write the rules | |
When writing your rules, whether they are inbound or outbound, be | |
explicit whenever possible about this: | |
* restrict to a network interface | |
* restrict the source addresses (maybe a peer, a LAN, or anyone?) | |
* restrict to required ports only | |
Eventually, in some situations you may want to filter by source and | |
destination port at the same time. This is usually useful when you | |
have two servers communicating over a protocol enforcing both ports. | |
This is actually where I failed and exposed my LAN minecraft server to | |
the wild. After setting up a VPN with a static IPv4 address, I only | |
had a "allow tcp/25565" rule on my firewall as I was relying on my ISP | |
router to not forward traffic. This rule was not effective once the | |
traffic was received from the VPN, although it would have been | |
filtrated when using a given network interface or a source network. | |
If you want to restrict the access of a critical service to a some user | |
(1 or more), but that they do not have a static IP address, you should | |
consider using a VPN for this service and restrict the access to the | |
VPN interface only. | |
# Write comments and keep track of changes | |
Firewall rules will evolve over time, you may want to write for your | |
future you why you added this or that rule. Ideally, use a version | |
control system on the firewall rules file, so you can easily revert | |
changes or track history to understand a change. | |
# Do not lock yourself out | |
When applying the firewall rules the first time, you may have made a | |
mistake and if it is on remote equipment with no (or complicated) | |
physical access, it is important to prepare an escape. | |
There are different methods, the most simple is to run a command in a | |
second terminal that sleeps for 30 seconds before resetting the | |
firewall to a known state, you have to run this command just before | |
loading the new rules. So if you are locked out after applying, just | |
wait 30 seconds to fix the rules. | |
# Add statistics and logging | |
If you want to monitor your firewall, consider adding counters to | |
rules, it will tell you how many times it was evaluated/matched and how | |
many packets and traffic went through. With nftables on Linux they are | |
named "counters", whereas OpenBSD packet filter names this "label". | |
It is also possible to log packets matching a rule, this can be useful | |
to debug an issue on the firewall, or if you want to receive alerts in | |
your logs when a rule is triggered. | |
# Conclusion | |
Writing firewall rules is not a hard task once you identified all | |
flows. | |
While companies have to maintain flow tables, I do not think it can be | |
useful for a personal network (your mileage may vary). |