linux:iptables

Netfilter / Iptables

Netfilter ist eine Firewall innerhalb des Linux-Kernels.

Einstellungen ausgeben:

/sbin/iptables -L -n -v

Wenn das Modul ip_conntrack geladen ist (wenn nicht: nachholen mit sudo modprobe ip_conntrack ) kann man die aktuelle Verbindungstabelle mit iptstate ausgeben:

sudo iptstate

(benötigt CONFIG_NF_CT_NETLINK in Kernel Config).

Regeln erstellen, z.B. Port 80 → 8080 und 443 → 8443.

sudo iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 8080
sudo iptables -A PREROUTING -t nat -p tcp --dport 443 -j REDIRECT --to-port 8443

Damit die aktuell gültigen Regeln einen reboot überleben:

Skript ablegen in:

  • /etc/network/if-up.d
  • /etc/network/if-down.d

Alternativ gibt es unter Debian/Ubuntu das Paket iptables-persistent:

apt install iptables-persistent

Regel permanent speichern:

iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

Restore sofort:

iptables-restore < /etc/iptables/rules.v4
ip6tables-restore  < /etc/iptables/rules.v6

Der folgende systemd-service sorgt für einen restore beim reboot:

systemctl status netfilter-persistent

Alternative Doku und Anleitung für Redhat-basiertes Systeme

Auflistung aktuell gültiger Regeln (v4):

iptables -L -n --line-numbers

bzw v6:

ip6tables -L -n --line-numbers

löschen:

iptables -D $CHAIN 1

Blockieren einer einzigen IP-Adresse (hier im Beispiel „1.2.3.4“):

iptables -A INPUT -p all -s 1.2.3.4 -j REJECT

Als Ausgangsbasis für eine umfangreichere Firewall:

#!/bin/bash
 
IPTABLES="/sbin/iptables"
 
function firewall_start()
{
# echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
 
# default policy = Drop
# uncomment
#$IPTABLES -P INPUT DROP
#$IPTABLES -P OUTPUT DROP
#$IPTABLES -P FORWARD DROP
 
# example: Drop all packets from host 120.166.10.211
$IPTABLES -I INPUT -s 120.166.10.211 -j DROP
$IPTABLES -I INPUT -s 120.166.10.211 -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level debug --log-prefix "IPT 120.166.10.211 blocked: "
 
}
 
 
function firewall_stop()
{
 
# forwarding off?
# echo "0" > /proc/sys/net/ipv4/ip_forward
#
# reset the default policies in the filter table.
#
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -P OUTPUT ACCEPT
 
#
# reset the default policies in the nat table.
#
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT
 
#
# reset the default policies in the mangle table.
#
$IPTABLES -t mangle -P PREROUTING ACCEPT
$IPTABLES -t mangle -P OUTPUT ACCEPT
 
#
# flush all the rules in the filter and nat tables.
#
$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
#
# erase all chains that's not default in filter and nat table.
#
$IPTABLES -X
$IPTABLES -t nat -X
$IPTABLES -t mangle -X
}
 
 
case "$1" in
start)
      echo "starting firewall..."
      firewall_start
      ;;
stop)
      echo "stopping firewall..."
      firewall_stop
      ;;
restart)
      echo "restarting firewall..."
      firewall_stop
      firewall_start
      ;;
*)
      echo "Usage: $0 {start|stop|restart}"
      exit 1
      ;;
esac