Setting up Firewall with IPTables

2 minutes read

sudo iptables -F
sudo iptables -L

# With line numbers
sudo iptables -L --line-numbers
sudo iptables --policy INPUT DROP
# Block only one IP
sudo iptables -I INPUT -s 10.0.0.11 -j DROP

# Block an entire subnet
sudo iptables -I INPUT -s 10.0.0.11/24 -j DROP
# Usage
sudo iptables -D <Chain> <Line_Number>

# Example
sudo iptables -D INPUT 1
sudo iptables -I INPUT -p tcp --dport 80 -j DROP
sudo iptables -I INPUT -p tcp --dport 80 -s 10.10.11.213 -j ACCEPT

Making Changes permanent

As IP-Tables are not persistent, they will be deleted (“flushed”) with the next reboot.

iptables-save > /etc/iptables.up.rules
vim /etc/network/if-pre-up.d/iptables
 #!/bin/sh
 /sbin/iptables-restore < /etc/iptables.up.rules
chmod +x /etc/network/if-pre-up.d/iptables
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

Another way is to use the package iptables-persistent.

sudo apt install iptables-persistent
sudo systemctl enable netfilter-persistent.service
sudo systemctl status netfilter-persistent.service

Useful Rules

sudo iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp -s src_ip --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Note that blocking other types of icmp packets is considered a bad idea by some remove -m icmp –icmp-type 8 from this line to allow all kinds of icmp: https://security.stackexchange.com/questions/22711

sudo iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
sudo iptables -A OUTPUT -j ACCEPT
sudo iptables -A INPUT -j DROP
sudo iptables -A FORWARD -j DROP

Referances: