Iptables Netze absichern

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

Einleitung

  • Nachdem wir ein Hostsystem abgesichert haben, kommen wir nun zum Absichern von Netzen.
  • Die Firewall agiert als Vermittler zwischen verschiedenen Netzen.
  • In unserem Beispiel haben wir 3 Netzbereiche.

WAN

  • Wide Area Net steht für alles was nicht die anderen beiden Netze betrifft

LAN

  • Local Area Net steht in der Regel für ein Netz das von aussen nicht erreichbar ist.
  • Meist ist es über Network Address Translation (NAT) angebunden.

DMZ

  • Demilitarized Zone ist ein Netz welches von außen erreichbar ist.
  • Die Zugriffe werden aber durch die Firewall abgesichert.
  • Dort werden meistens Dienste wie Mail oder Web gehostet. Teilweise auch Proxy Server.

Der Plan

Das Grundgerüst

  • Wir nutzen unsere Host Firewall als Ausgangsskript
  • Wir wollen aber von vorneherein verstärkt mit Variablen arbeiten.
  • Dies macht die Skripte universeller.

iptables-Skript

vim /etc/iptables.sh

#!/bin/bash

# Variablen
WAN_IF="ens18"
DMZ_IF="ens19"
LAN_IF="ens20"
LAN_NET="192.168.4.0/24"
REMOTE_TCP_PORTS="22 25 53 80 465 443"
REMOTE_UDP_PORTS="53"
LOCAL_TCP_PORTS="22 80 443"

# Regelwerk löschen
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X

# Default Policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# Loopback erlauben
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Etablierte Verbindungen
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Lokale Dienste (eingehend)
for port in $LOCAL_TCP_PORTS; do
    iptables -A INPUT -p tcp --dport $port -j ACCEPT
done

# Ausgehende Verbindungen
for port in $REMOTE_TCP_PORTS; do
    iptables -A OUTPUT -p tcp --dport $port -j ACCEPT
done
for port in $REMOTE_UDP_PORTS; do
    iptables -A OUTPUT -p udp --dport $port -j ACCEPT
done

# Logging
iptables -A INPUT -j LOG --log-prefix "--iptables-drop-input--"
iptables -A OUTPUT -j LOG --log-prefix "--iptables-drop-output--"
iptables -A FORWARD -j LOG --log-prefix "--iptables-drop-forward--"

Forwarding

Damit Pakete weitergeleitet werden können, muss als erstes FORWARDING im Kernel aktiviert werden.

Aktivierung

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

sysctl -p

Weitere Tabellen

  • Eine Skizze über die Reihenfolge der Hooks.
  • Als erstes greift der Prerouting-Hook
  • Je nachdem wie geroutet wird greift dann entweder Input- oder Forward-Hook
  • Falls ein lokaler Prozess ein Paket sendet, dann greift der Output-Hook
  • Als letztes kann man das Paket mit dem Postrouting-Hook beeinflußen

SNAT

  • Rechner in einem LAN können nicht ohne weiteres mit dem WAN kommunizieren, da an die lokale IP-Adresse der Rechner im LAN nicht von außen geroutet werden kann.
  • Um eine Internetverbindung aufzubauen, muss die Adresse aus dem LAN in eine öffentliche umgeschrieben werden.

vim /etc/iptables-snat.sh

#!/bin/bash

# Variablen
WAN_IF="ens18"
DMZ_IF="ens19"
LAN_IF="ens20"
LAN_NET="192.168.4.0/24"
WAN_IP="10.82.232.11"

# Regelwerk löschen
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X

# Default Policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# Loopback erlauben
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# ICMP erlauben
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# SSH und andere notwendige Ports
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Etablierte Verbindungen
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED,NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# SNAT für ausgehende Pakete vom LAN ins WAN
iptables -t nat -A POSTROUTING -s $LAN_NET -o $WAN_IF -j SNAT --to-source $WAN_IP

# Logging
iptables -A INPUT -j LOG --log-prefix "--iptables-drop-input--"
iptables -A OUTPUT -j LOG --log-prefix "--iptables-drop-output--"
iptables -A FORWARD -j LOG --log-prefix "--iptables-drop-forward--"

Neu verwendete Syntax in iptables

  • Interface des herausgehenden Paketes:

-o <device_name>

  • match auf Quelladresse des Pakets:

-s <source_ip>

  • Quelladresse umschreiben:

-j SNAT --to-source <new_source_ip>