Linux: Firewall
firewall Configuration and Management
Zones
A zone is a named profile that carries itw own rule set for which services and ports are allowed through the zone. To create a zone, run firewall-cmd --permanent --new-zone=<ZONE-NAME> && firewall-cmd --reload
. Run firewall-cmd --get-zones
to see all zones.
Runtime Settings
Runtime settings take effect immediately and stays active until the next reboot or manual reload.
Permanent Settings
Permanent settings persists across reboots but does not touch the running firewall until reload.
firewall-cmd
firewall-cmd
is the command line tool used to manage firewalld
configurations. The general syntax is firewall-cmd <OPTION> <OPTION VALUES>
.
Useful options include:
--get-zones
: display all zones--get-active-zones
: shows only zones that currently have bound interfaces--list-all --zone=<ZONE>
: displays every rule in a given zone--add-port=<PORT>/<PROTOCOL>
: opens individual ports--remove-port=<PORT>/<PROTOCOL>
: closes individual ports--runtime-to-permanent
: to copy current rule set to disk--set-default-zone=<ZONE>
: to change the default zone assigned to new interfaces--zone=<ZONE> --change-interface=<INTERFACE>
: to assign an interface to a zone
Rules and Access Control
Ports
# to add port
firewall-cmd --zone=internal --add-port=8080/tcp --permanent
# to remove a port
firewall-cmd --zone=internal--remove-port=8080/tcp --permanent
Services
# to add https service
firewall-cmd --zone=internal --add-service=https --permanent
# to remove https service
firewall-cmd --zone=internal --add-service=https --permanent
Rich Rules
Rich rules extend firewalld with "if-this-then-that" logic.
# to add rich rule to a zone
firewall-cmd --zone=public --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.10" service name="ssh" accept' --permanent
Uncomplicated Firewall - (UFW)
By default UFW blocks all incoming traffic and allows all outgoing traffic. It writes every change directly to its configuration file and loads it boot.
ufw enable # to enable UFW service
ufw disable # to disable UFW service
ufw allow 8080/tcp # to add a allow rule
ufw allow ssh # to add a allow rule
ufw deny 23 # to add a deny rule
ufw delete allow http # to delete a allow rule
ufw allow from 192.168.1.10 # to allow traffic from specific IP address
ufw deny from 192.168.1.10 # to deny traffic from specific IP address
ufw allow from 192.168.1.0/24 to any port 22 # to allow subnet to access specific port
ufw status numbered # to see numbered rule set
ufw delete 2 # to delete numbered rule set
ufw default deny incoming # to set default incoming (deny)
ufw default allow outgoing # to set default outgoing (allow)
iptables
iptables
is a command line utility used for traffic filtering and alteration. It is build around tables. The main tables are:
filter
nat
mangle
raw
security
Each table contains Chains
:
INPUT
: inspects packets destined for local systemOUTPUT
: filters packets originating from local systemFORWARD
: filters packets moving through the system
The general syntax is iptables [-t <TABLES>] -A <CHAIN> -p <PROTOCOL> [MATCH OPTION] -j <TARGET>
.
ex:
# to accept SSH traffic into a host
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
ipset
ipset
groups many ip addresses or subnets into sets to let servers match and process packets more efficiently than checking each one individually. The generic syntax is ipset [OPTIONS] <COMMAND> <SETNAME> [PARAMS]
. Common commands include: create
, add
, del
, list
.
# to keep a dynamic deny list of know-bad ip addresses and tie it back into iptables
# create new set
ipset create bad_hosts_list hash:ip
# add offending ip address to set
ipset add bad_hosts_list 172.0.0.25
# view ipset list
ipset list bad_hosts_list
nftables
nftables
is a single framework that merges tables and rules. It is a modern successor of iptables
. The general syntax is nft [OPTIONS] add rule <FAMILY> <TABLE> <CHAIN> <EXPRESSION>
# to allow ssh on port 22
nft add rule inet filter input tcp dport 22 ct state new accept
Netfilter Module
The Netfilter module is a Linux kernel module that acts like the digital gatekeeper, examining every data packet entering or leaving the system. and deciding if a packet should be blocked or allowed according to the predefined rules. It is the backend for iptables
, ip6tables
, and nftables
.
Stateful and Stateless Firewall
Stateless Firewall
A stateless firewall treats each incoming packet independently using pre-defined rules.
# accept http traffic
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# drop all other traffic
iptables -A INPUT -j DROP
Every packet will be checked to see if it is destined to port 80. If not the packet will be dropped.
Stateful Firewall
Stateful firewall remembers ongoing communications sessions between computers.
# Allow established and related packets
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow new ssh connections
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
# Drop everything else
iptables -A INPUT -j DROP
IP Forwarding
IP forwarding allows system to pass network traffic from one interface to another, acting like a router. IP forwarding is disabled by default. Set ip forwarding permanently with net.ipv4.ip_forward = 1
in /etc/sysctl.conf
. For temporary enabling ip forwarding, run sysctl -w net.ipv4.ip_forward=1
.