Iptables Netze absichern: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Zeile 11: Zeile 11:
 
= LAN =
 
= LAN =
  
* Local Area Net steht in der Regel für ein Netz das von außen nicht erreichbar ist.
+
* 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.
 
* Meist ist es über Network Address Translation (NAT) angebunden.
  
Zeile 22: Zeile 22:
 
= Der Plan =
 
= Der Plan =
  
{{#drawio:netzplan-iptables-1}}
+
{{#drawio:netzplan-nftables-1}}
  
 
= Das Grundgerüst =
 
= Das Grundgerüst =
  
* Wir nutzen unsere Host-Firewall als Ausgangsskript
+
* Wir nutzen unsere Host Firewall als Ausgangsskript
* Wir wollen aber von vornherein verstärkt mit Variablen arbeiten.
+
* Wir wollen aber von vorneherein verstärkt mit Variablen arbeiten.
 
* Dies macht die Skripte universeller.
 
* Dies macht die Skripte universeller.
* '''vi /usr/local/sbin/firewall'''
 
  
#!/bin/bash
+
= iptables-Skript =
REMOTE_TCP_PORTS="22,25,53,80,465,443"
 
REMOTE_UDP_PORTS="53"
 
LOCAL_TCP_PORTS="22,80,443"
 
WANDEV="ens18"
 
DMZDEV="ens19"
 
LANDEV="ens20"
 
LAN_NET="192.168.4.0/24"
 
WANIP="10.82.232.11"
 
WEBSERVER="192.168.4.12"
 
 
case $1 in
 
  start)
 
    echo "starte firewall"
 
    iptables -F
 
    iptables -F -t nat
 
    iptables -P INPUT DROP
 
    iptables -P OUTPUT DROP
 
    iptables -P FORWARD DROP
 
 
    # Connection Tracking
 
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
    iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
 
    # Loopback
 
    iptables -A INPUT -i lo -j ACCEPT
 
    iptables -A OUTPUT -o lo -j ACCEPT
 
 
    # Output Regeln
 
    iptables -A OUTPUT -p tcp -m multiport --dports $REMOTE_TCP_PORTS -m state --state NEW -j ACCEPT
 
    iptables -A OUTPUT -p udp -m multiport --dports $REMOTE_UDP_PORTS -m state --state NEW -j ACCEPT
 
    iptables -A OUTPUT -p icmp --icmp-type echo-request -m state --state NEW -j ACCEPT
 
 
    # Input Regeln
 
    iptables -A INPUT -p tcp -m multiport --dports $LOCAL_TCP_PORTS -m state --state NEW -j ACCEPT
 
 
    # SNAT
 
    iptables -t nat -A POSTROUTING -s $LAN_NET -o $WANDEV -j SNAT --to-source $WANIP
 
 
    # Portforwarding
 
    iptables -t nat -A PREROUTING -i $WANDEV -p tcp --dport 9922 -j DNAT --to-destination $WEBSERVER:22
 
    iptables -t nat -A PREROUTING -i $WANDEV -p tcp --dport 80 -j DNAT --to-destination $WEBSERVER:80
 
 
    # Zugriff auf Webserver zulassen
 
    iptables -A FORWARD -i $WANDEV -d $WEBSERVER -p tcp --dport 22 -j ACCEPT
 
    iptables -A FORWARD -i $WANDEV -d $WEBSERVER -p tcp --dport 80 -j ACCEPT
 
 
    # Zugriff vom LAN nach außen
 
    iptables -A FORWARD -s $LAN_NET -i $LANDEV -o $WANDEV -p icmp --icmp-type echo-request -j ACCEPT
 
    iptables -A FORWARD -s $LAN_NET -i $LANDEV -o $WANDEV -p udp --dport 53 -j ACCEPT
 
    iptables -A FORWARD -s $LAN_NET -i $LANDEV -o $WANDEV -p tcp -m multiport --dports 25,53,80,143,443,465,993 -j ACCEPT
 
 
    # Eigene Kette für LAN nach WAN
 
    iptables -N LAN2WAN
 
    iptables -A LAN2WAN -s $LAN_NET -i $LANDEV -o $WANDEV -j ACCEPT
 
    iptables -A FORWARD -s $LAN_NET -i $LANDEV -o $WANDEV -p icmp --icmp-type echo-request -j LAN2WAN
 
    iptables -A FORWARD -s $LAN_NET -i $LANDEV -o $WANDEV -p udp --dport 53 -j LAN2WAN
 
    iptables -A FORWARD -s $LAN_NET -i $LANDEV -o $WANDEV -p tcp -m multiport --dports 25,53,80,143,443,465,993 -j LAN2WAN
 
 
    <span style="color:#FF0000"># Limitierte Logging-Regeln</span>
 
    <span style="color:#FF0000">iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "--iptables-drop-input--"</span>
 
    <span style="color:#FF0000">iptables -A OUTPUT -m limit --limit 5/min -j LOG --log-prefix "--iptables-drop-output--"</span>
 
    <span style="color:#FF0000">iptables -A FORWARD -m limit --limit 5/min -j LOG --log-prefix "--iptables-drop-forward--"</span>
 
    ;;
 
  stop)
 
    echo "stoppe firewall"
 
    iptables -F
 
    iptables -F -t nat
 
    iptables -P INPUT ACCEPT
 
    iptables -P OUTPUT ACCEPT
 
    iptables -P FORWARD ACCEPT
 
    ;;
 
  *)
 
    echo "usage: $0 start|stop"
 
    ;;
 
esac
 
  
= Forwarding =
+
'''vim /etc/iptables.sh'''
 +
 
 +
<pre>
 +
#!/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
  
* echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
+
# Logging
* sysctl -p
+
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--"
 +
</pre>
  
= Hinweis zu neuer Syntax =
+
= Forwarding =
  
* Neue Ketten erzeugt mit:
+
Damit Pakete weitergeleitet werden können, muss als erstes FORWARDING im Kernel aktiviert werden.
    iptables -N <KETTENNAME>
 
  
* Portweiterleitungen:
+
== Aktivierung ==
    iptables -t nat -A PREROUTING -i <WAN> -p tcp --dport <PORT> -j DNAT --to-destination <IP:PORT>
 
  
* SNAT für ausgehende Pakete:
+
'''echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf'''
    iptables -t nat -A POSTROUTING -s <LAN> -o <WAN> -j SNAT --to-source <WAN-IP>
 
  
* Limits:
+
'''sysctl -p'''
    iptables -A <CHAIN> -m limit --limit <WERT> -j LOG --log-prefix "--DEIN-PREFIX--"
 

Version vom 12. April 2025, 20:36 Uhr

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