IPFire Webseite zeitweise auf red freischalten

Ich benutze gerne IPFire, um mal schnell ein Testnetz aufzusetzen. Das red-Interface kommt dann ins vorhandene Gästenetz und das green-Interface stellt das Testnetz dar. Da das Testnetz aber noch keine Computer hat, habe ich nach der Installation keine Oberfläche, um ipfire konfigurieren zu können, da diese standardmäßig nur vom green-Interface aus erreichbar ist. Das kann man aber über einen Einzeiler zeitweise (bis zum nächsten Neustart) ändern, um die Konfiguration über die Management-Oberfläche vornehmen zu können.

Dazu muss man:

  • die IP seines eigenen PCs oder Netzwerkes (hier: 192.168.1.77) und
  • die IP des red-Interfaces der IPFire-Installation (hier: 192.168.0.101) wissen.

Seine eigene IP-Adresse bekommt man über den Befehl ipconfig in einer Kommandozeile unter Windows heraus:

C:\Users>ipconfig

Windows-IP-Konfiguration


Ethernet-Adapter LAN-Verbindung:

   Verbindungsspezifisches DNS-Suffix: domain.local
   IPv4-Adresse  . . . . . . . . . . : 192.168.1.77
   Subnetzmaske  . . . . . . . . . . : 255.255.255.0
   Standardgateway . . . . . . . . . : 192.168.1.1


Dann kann man sich mit dem bei der IPFire-Installation vergebenen Root-Kennwort an der Konsole anmelden und einen iptables-Eintrag vornehmen, der die https-Managment-Webseite auf dem red-Interface freischaltet.

warnung Das sollte man natürlich nur bei internen Netzwerken machen! Wer ipfire als Internet-Zugangsrouter verwendet, schaltet das Management damit in das Internet frei!

iptables -A INPUTFW -s 192.168.1.77/32 -d 192.168.0.101/32 -p tcp -m tcp --dport 444 -j ACCEPT

Erklärung der Parameter:

  • iptables = das Firewall-Programm
  • -A INPUTFW = die Firewall-Kette, in die diese Ausnahme eingetragen wird (werden muss)
  • -s 192.168.1.77/32 = der eine Host (/32) mit der IP 192.168.1.77, der diese Ausnahme nutzen darf (alternativ schaltet man das ganz Sub-Netz frei: -s 192.168.1.0/24)
  • -d 192.168.0.101/32 = die IP-Adresse des red-Interfaces der ipfire-Installation
  • -p tcp -m tcp = es wird das TCP-Protokoll benutzt
  • –dport 444 = der Port, der auf dem red-Interface freigeschaltet wird (standardmäßig verwendet ipfire für das Management per https diesen Port)
  • -j ACCEPT = Datenpakete auf einer Verbindung mit diesen Einschränkungen zulassen.

infoDa diese Konfiguration live vorgenommen und nicht abgespeichert wird, ist diese nach einem Neustart nicht mehr vorhanden! Das ist so gewollt, da die vollständige Konfiguration danach über das Web-Interface erfolgen kann.

logrotate Konfiguration iptables

Diese Konfiguration nutze ich für iptables. Dabei liegen die angelegten Logfiles unter „/var/log/iptables/“. Die Konfiguration des Speicherortes passiert in der iptables-Konfiguration.

/var/log/iptables/*.log {
       daily
       missingok
       rotate 90
       compress
       dateext
       notifempty
       create 640 root adm
       olddir /var/log/iptables/old/
}

Das Verzeichnis für die alten Logs muss manuell angelegt werden.

Zur Überprüfung der Konfiguration sollte man diese testen:

/usr/sbin/logrotate -d /etc/logrotate.d/iptables

Dann müsste ungefähr folgendes erscheinen:

/usr/sbin/logrotate -d /etc/logrotate.d/iptables
reading config file /etc/logrotate.d/iptables
reading config info for /var/log/iptables/*.log
olddir is now /var/log/iptables/old/

Handling 1 logs

rotating pattern: /var/log/iptables/*.log  after 1 days (90 rotations)
olddir is /var/log/iptables/old/, empty log files are not rotated, old logs are removed
considering log /var/log/iptables/accept.log
  log does not need rotating
considering log /var/log/iptables/drop.log
  log does not need rotating

 

iptables Debug-Modus

Um den Debug-Modus zentral ein- und auszuschalten empfiehlt sich eine Variable:

#!/bin/sh
# Variablen
DEBUG=0
LAN_IFACE="eth0"
...

welche dann später die Chains bestimmt:

#
# Debug-Variable auswerten
#
if [ $DEBUG == 1 ]; then
  ACCEPT="OWNACCEPT"
  DROP="OWNDROP"
else
  ACCEPT="ACCEPT"
  DROP="DROP"
fi

So kann man dann (hier am Beispiel der lokalen Kommunikation) einen Parameter bei der iptables-Konfiguration übergeben:

### Lokale Kommunikation ###
iptables -A INPUT -i lo -j $ACCEPT
iptables -A OUTPUT -o lo -j $ACCEPT

iptables personal firewall

Personal Firewall einrichten

Die angegebenen Werte sind nur Beispiel-Werte und müssen natürlich angepasst werden.

Hier mal eine Beispiel-Konfiguration:

#!/bin/sh
# Variablen
LAN_IFACE="eth0"
LAN_IP="192.168.XXX.XXX"
LAN_NET="192.168.XXX.0/24"
 
# Setzen von Kernelparametern
for i in /proc/sys/net/ipv4/conf/*/{accept_source_route,accept_redirects,send_redirects}; do
    echo 0 > $i
done
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
 
### Firewall initialisieren ###
echo "Initialisiere Firewall ..."
iptables -F                                  # Regeln aller Chains löschen
iptables -X                                  # Alle selbst erstellten Chains löschen
iptables -P INPUT DROP                       # Alles was nicht explizit erlaubt ist ...
iptables -P OUTPUT DROP                      # ... wird gedroppt.
iptables -P FORWARD DROP                     #
iptables -Z                                  # Zähler zurücksetzen
iptables -N OWNDROP                          # Eigene Chain für separate Verarbeitung erstellen
iptables -N OWNACCEPT                        # ...
iptables -N SYN-FLOOD                        # DoS-Attacken eingrenzen
 
### Lokale Kommunikation ###
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
 
### Stateful Inspection Regeln ###
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state INVALID -j OWNDROP
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
 
### Eigene Chains OWNDROP und OWNACCEPT konfigurieren (Logging) ###
iptables -A OWNDROP -j LOG --log-prefix "FW-DROP: "
iptables -A OWNDROP -j DROP
iptables -A OWNACCEPT -j LOG --log-prefix "FW-ACCEPT: "
iptables -A OWNACCEPT -j ACCEPT
 
### Schutz vor Syn-Flooding ###
# limits incoming packets
iptables -A SYN-FLOOD -m limit --limit 10/second --limit-burst 50 -j RETURN
# log attacks
iptables -A SYN-FLOOD -j LOG --log-prefix "SYN flood: "
# silently drop the rest
iptables -A SYN-FLOOD -j DROP
 
### Ports und Dienste nach aussen freischalten ###
# Eingehende SSH-Verbindungen
iptables -A INPUT -p tcp --dport 22 -j OWNACCEPT
# Ausgehende SSH-Verbindungen
iptables -A OUTPUT -p tcp --dport 22 -j OWNACCEPT
# PING
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
# ausgehende DNS-Anfragen
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
# WWW
iptables -A INPUT -p tcp --dport 80 -j OWNACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j OWNACCEPT
iptables -A INPUT -p tcp --dport 443 -j OWNACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j OWNACCEPT
# Mails
iptables -A OUTPUT -p tcp --dport 25 -j OWNACCEPT
iptables -A OUTPUT -p tcp --dport 110 -j OWNACCEPT
iptables -A OUTPUT -p tcp --dport 143 -j OWNACCEPT
# Samba
iptables -A INPUT -p udp -m multiport --destination-port 137,138 -s $LAN_NET -j ACCEPT
iptables -A INPUT -p tcp -m multiport --destination-port 139,445 -s $LAN_NET -j ACCEPT
iptables -A OUTPUT -p udp -m multiport --destination-port 137,138 -d $LAN_NET -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --destination-port 139,445 -d $LAN_NET -j ACCEPT
iptables -A INPUT -p udp --sport 137 -s $LAN_NET -j OWNACCEPT
# NTP
iptables -A INPUT -p udp --dport 123 -s $LAN_NET -j ACCEPT
iptables -A OUTPUT -p udp --dport 123 -j ACCEPT
# SNMP
iptables -A INPUT -p udp --dport 161 -s $LAN_NET -j ACCEPT
iptables -A INPUT -p tcp --dport 161 -s $LAN_NET -j ACCEPT
iptables -A OUTPUT -p udp --dport 161 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 161 -j ACCEPT
 
# Protokollierung aller übriggebliebenen Pakete, die verworfen werden
iptables -A INPUT -j LOG --log-prefix "FW-LAST-DROP: "
 
### Fertig ###
echo "Firewall ist konfiguriert und aktiv"

Eigene Logdateien

Log-Präfix einstellen

Damit man die Logs, die iptables erzeugt, vom normalen syslog trennen kann, muss man die Logging-Einträge erst einmal eindeutig kennzeichnen. Dazu am besten eigene Ketten erstellen:

# Eigene Chains MYDROP und MYACCEPT konfigurieren (Logging)
iptables -A OWNDROP -j LOG --log-prefix "FW-DROP: "
iptables -A OWNDROP -j DROP
iptables -A OWNACCEPT -j LOG --log-prefix "FW-ACCEPT: "
iptables -A OWNACCEPT -j ACCEPT

oder die vorhandenen anpassen:

iptables -A DROP -j LOG --log-prefix "FW-DROP: "
iptables -A DROP -j DROP
iptables -A ACCEPT -j LOG --log-prefix "FW-ACCEPT: "
iptables -A ACCEPT -j ACCEPT

Der entsprechende Präfix ist natürlich frei wählbar.

rsyslogd konfigurieren

Jetzt muss man nur noch eine entsprechende Konfigurations-Datei unter /etc/rsyslog.d/iptables.conf anlegen und folgende Zeilen einfügen:

:msg, contains, "FW-ACCEPT: " /var/log/iptables/accept.log
& ~
:msg, contains, "FW-DROP: " /var/log/iptables/drop.log
:msg, contains, "FW-LAST-DROP: " /var/log/iptables/drop.log
& ~

Damit werden alle Einträge die „FW-ACCEPT: „, „FW-DROP: “ oder „FW-LAST-DROP: “ enthalten in separate Logdateien geschrieben. Man muss sich auch keine Gedanken um das Anlegen der Dateien machen. Das erledigt der RSyslog-Daemon bei dem obligatorischen Neustart von alleine:

/etc/init.d/rsyslogd restart

Die letzte Zeile mit dem Inhalt „& ~“ bedeutet, dass diese Nachrichten nicht mehr in das Standard-Log geschrieben werden.

In neueren rsyslog-Versionen ist die Tilde „~“ deprecated, weshalb man sie ersetzen sollte. Die neue Schreibweise sieht so aus:

:msg, contains, "FW-ACCEPT: " /var/log/iptables/accept.log
& stop
:msg, contains, "FW-DROP: " /var/log/iptables/drop.log
:msg, contains, "FW-LAST-DROP: " /var/log/iptables/drop.log
& stop

Logs rotieren

Damit die Logdateien nicht irgendwann die Festplatte zulaufen lassen, sollte auch eine entsprechende logrotate-Konfiguration nicht fehlen. Siehe Logrotate/iptables.