212.1 Einen Router konfigurieren Gewichtung 3

212.1 Einen Router konfigurieren

Kandidaten sollten ein System so konfigurieren können, dass es IP-Pakete weiterleitet und Adressumsetzung (NAT, IP Masquerading) vornimmt, sowie dessen Bedeutung für den Schutz eines Netzes benennen können. Dieses Lernziel umfasst auch das Einrichten von Portweiterleitung, das Verwalten von Filterregeln und das Abwehren von Angriffen.

Hauptwissensgebiete:

Dies ist eine auszugsweise Liste der verwendeten Dateien, Begriffe und Hilfsprogramme:

wichtige Man-Pages

Adressbereiche IPv4

Private Adressbereiche

schon bekannt aus LPIC 1:

shared addresses für cgnat

Adressbereiche IPv6

siehe auch https://de.wikipedia.org/wiki/IPv6#Unique_Local_Unicast

Besondere Adressen

Beschreibung: abgeschlossene Netzwerksegmente

Unique Local Unicast

Routerfunktion

Das Verzeichnis /proc/sys (seit 1.3.57 vorhanden) enthält eine Reihe von Dateien und Unterverzeichnissen, die den Kernelvariablen entsprechen. Diese Variablen können mit dem Dateisystem / proc und dem (veralteten) Systemaufruf sysctl (2) gelesen und manchmal geändert werden (siehe manpage von proc).

Hier gibt es auch eine Variable ip_forward:

root@ubuntu:~# sysctl -a | grep 'ip_forward'
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_use_pmtu = 0

Wenn ein Linux-System mehrere Netzwerkkarten verwendet, kann man diesen Parameter auf 1 ändern und damit das System als Router einsetzen.

echo 1 > /proc/sys/net/ipv4/ip_forward

Welche Parameter es noch gibt und Ihre Beschreibungen findet man hier https://sysctl-explorer.net/

Im folgenden Video zeige ich, wie man die Werte ändert:

Um IPv6 komplett zu deaktivieren, kann man auf centos 7 in die Datei /etc/sysctl.conf den Wert für net.ipv6.conf.all.disable_ipv6 auf 1 setzen. Nach einem Reboot sind keine IPv6-Adressen mehr zugeordnet.

net.ipv6.conf.all.disable_ipv6 = 1

Auf meinem Ubuntu 18.04 hat das leider nicht funktioniert. Das ist eventuell ein Bug. Im folgenden Video demonstriere ich das Deaktivieren von IPv6 im Centos 7.

/etc/services

Die Datei /etc/services enthält die Zuordnung von Diensten zu Ports und Protokollen. Einige wichtige Zuordnungen habe ich hier in der folgenden Tabelle kurz zusammengefasst:

service Port Beschreibung
ftp-data 20/tcp  
ftp 21/tcp  
ssh 22/tcp  
telnet 23/tcp  
smtp 25/tcp  
domain 53/tcp DNS
domain 53/udp DNS
bootps 67/tcp BOOTP
bootps 67/udp BOOTP
bootpc 68/tcp BOOTP
bootpc 68/udp BOOTP
http 80/tcp  
pop3 110/tcp pop3
ntp 123/udp  
imap2 143/tcp imap
ldap 389/tcp  
https 443/tcp  
imaps 993/tcp IMAP over SSL
pop3s 995/tcp POP-3 over SSL

iptables

folgendes Bild aus dem Artikel “IP-Tables” aus www.selflinux.org erklärt das Zusammenspiel ganz gut:

gefunden auf https://de.wikibooks.org/wiki/Linux-Praxisbuch/_Linux-Firewall_mit_IP-Tables

Syntax

tables

Es gibt 5 Tabellen. Hier die Erläuterungen:

Name Beschreibung
filter Dies ist die Standardtabelle (wenn keine Option -t übergeben wird). Es enthält die integrierten Ketten INPUT (für Pakete, die an lokale Sockets gesendet werden), FORWARD (für Pakete, die durch die Box geleitet werden) und OUTPUT (für lokal generierte Pakete).
nat Diese Tabelle wird konsultiert, wenn ein Paket gefunden wird, das eine neue Verbindung erstellt. Es besteht aus drei integrierten Funktionen: PREROUTING (zum Ändern von Paketen, sobald sie eingehen), OUTPUT (zum Ändern von lokal generierten Paketen vor dem Routing) und POSTROUTING (zum Ändern von Paketen, wenn sie ausgehen). IPv6-NAT-Unterstützung ist seit Kernel 3.7 verfügbar.
mangle Diese Tabelle wird für die spezialisierte Paketänderung verwendet. Bis zum Kernel 2.4.17 gab es zwei eingebaute Ketten: PREROUTING (zum Ändern eingehender Pakete vor dem Routing) und OUTPUT (zum Ändern lokal generierter Pakete vor dem Routing). Seit Kernel 2.4.18 werden auch drei andere eingebaute Ketten unterstützt: INPUT (für Pakete, die in die Box selbst eingehen), FORWARD (zum Ändern von Paketen, die durch die Box geleitet werden) und POSTROUTING (zum Ändern von Paketen, die hinausgehen).
raw Diese Tabelle wird hauptsächlich zum Konfigurieren von Ausnahmen von der Verbindungsverfolgung in Kombination mit dem NOTRACK-Ziel verwendet. Es registriert sich mit höherer Priorität an den Netzfilter-Hooks und wird daher vor ip_conntrack oder anderen IP-Tabellen aufgerufen. Es bietet die folgenden integrierten Ketten: PREROUTING (für Pakete, die über eine beliebige Netzwerkschnittstelle ankommen) OUTPUT (für Pakete, die von lokalen Prozessen generiert wurden)
security Diese Tabelle wird für MAC-Netzwerkregeln (Mandatory Access Control) verwendet, z. B. für die von den SECMARK- und CONNSECMARK-Zielen aktivierten Regeln. Die obligatorische Zugriffssteuerung wird von Linux-Sicherheitsmodulen wie SELinux implementiert. Die Sicherheitstabelle wird nach der Filtertabelle aufgerufen, sodass alle DAC-Regeln (Discretionary Access Control) in der Filtertabelle vor den MAC-Regeln wirksam werden. Diese Tabelle enthält die folgenden integrierten Ketten: INPUT (für Pakete, die in die Box selbst eingehen), OUTPUT (zum Ändern lokal generierter Pakete vor dem Weiterleiten) und FORWARD (zum Ändern von Paketen, die durch die Box geleitet werden).

Jede Tabelle enthält bestimmte Ketten/chains:

chain\table filter(default) nat mangle raw security
PREROUTING   x x x  
INPUT x   x   x
FORWARD x   x   x
OUTPUT x x x x x
POSTROUTING   x x    

chains

chain Beschreibung
PREROUTING Pakete landen in dieser Kette, bevor eine Routing-Entscheidung getroffen wird.
INPUT Paket wird lokal zugestellt.
FORWARD Alle Pakete, die geroutet und nicht lokal zugestellt wurden, passieren diese Kette.
OUTPUT Pakete, die vom eigenen Computer erzeugt wurden, tauchen hier auf.
POSTROUTING Routing-Entscheidung wurde getroffen. Pakete laufen hier nochmals durch, kurz bevor sie an die Hardware abgegeben werden.

Jede Kette enthält Regeln. Die Regeln werden der Reihenfolge nach abgearbeitet. Falls die angegebene Bedingung einer Regel zutrifft, wird die dort definierte Aktion (meist: akzeptieren oder verwerfen) auf das Paket angewendet und die Kette wird nicht weiter durchlaufen. Die möglichen Aktionen werden targets genannt und weiter unten genauer beschrieben.

Operationen/iptables-Optionen

Die Firewall-Regeln lassen sich mit verschiedenen Operationen/iptables-Optionen bearbeiten:

Eine neue Kette erstellen (new-chain) (-N).
Eine leere Kette löschen (-X). (geht nicht mit INPUT, OUTPUT und FORWARD)
Die Policy für eine eingebaute Kette ändern (policy) (-P).
Die Regeln einer Kette auflisten (list) (-L).
Die Regeln aus einer Kette entfernen (flush) (-F).
Paket- und Bytezähler aller Regeln einer Kette auf Null stellen (zero) (-Z).

Verwaltung der Regeln in einer Kette:
Eine neue Regel an eine Kette anhängen (append) (-A).
Eine neue Regel an eine bestimmte Position in der Kette einfügen (insert) (-I).
Eine Regel an bestimmter Position in der Kette ersetzen (replace) (-R).
Eine Regel an einer bestimmten Position in der Kette löschen (delete) (-D).
Die erste passende Regel in einer Kette löschen (delete) (-D).

Syntax

Die meisten Regeln haben die Form iptables [-t table] -A chain rule-specification wobei hier -A die Operation append darstellt. Weitere Regelformen siehe manpage von iptables

Auszug aus der man.page:

rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]

Das bedeutet, die rule-specification setzt sich aus ein oder mehreren matches und einem target zusammen. Ein Target hat einen Namen und eventuell Optionen. Ein match hat einen Namen und eventuell Optionen.

Die matches sind in der manpage von iptables-extensions erläutert, dort findet man für alle gültigen matchnamen die möglichen match-options.

Eine einfachere Möglichkeit sich die Hilfe zu einem matchname direkt anzeigen zu lassen ist: iptables -m <matchname> --help aufzurufen. Am Ende der Ausgaben sieht man die spezifischen Optionen.

Ein Beispie:

$ iptables -m state --help
...
state match options:
 [!] --state [INVALID|ESTABLISHED|NEW|RELATED|UNTRACKED][,...]
                                 State(s) to match

Alternativ zum matchname gibt der Schalter -p <protokollname> wie --protocol <protokollname> indirekt den matchname über den Protokollnamen vor.

Ein Beispiel für das Protokoll icmp:

$ iptables -p icmp --help
icmp match options:
[!] --icmp-type typename        match icmp type
[!] --icmp-type type[/code]     (or numeric type or type/code)
Valid ICMP Types:
any
echo-reply (pong)
destination-unreachable
   network-unreachable
   host-unreachable
   protocol-unreachable
   port-unreachable
   fragmentation-needed
   source-route-failed
   network-unknown
   host-unknown
   network-prohibited
   host-prohibited
   TOS-network-unreachable
   TOS-host-unreachable
   communication-prohibited
   host-precedence-violation
   precedence-cutoff
source-quench
redirect
   network-redirect
   host-redirect
   TOS-network-redirect
   TOS-host-redirect
echo-request (ping)
router-advertisement
router-solicitation
time-exceeded (ttl-exceeded)
   ttl-zero-during-transit
   ttl-zero-during-reassembly
parameter-problem
   ip-header-bad
   required-option-missing
timestamp-request
timestamp-reply
address-mask-request
address-mask-reply

targets sind ACCEPT, DROP or RETURN. ACCEPT bedeutet, das Paket durchzulassen. DROP bedeutet, das Paket zu verwerfen. RETURN bedeutet, dass das Durchlaufen dieser Kette endet und zur nächsten Regel in der vorherigen (aufrufenden) Kette zurückkehrt. Wenn das Ende einer eingebauten Kette erreicht ist oder eine Regel in einer eingebauten Kette mit dem Ziel RETURN übereinstimmt, bestimmt das von der Kettenrichtlinie angegebene Ziel das Schicksal des Pakets.

Alle weiteren targets sind in der manpage von iptables-extensions unter TARGET EXTENSIONS erläutert, zum Beispiel:

DNAT
    This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.  It specifies that the destination address of the packet should  be  modified
    (and all future packets in this connection will also be mangled), and rules should cease being examined.  It takes the following options:

    --to-destination [ipaddr[-ipaddr]][:port[-port]]
           which can specify a single new destination IP address, an inclusive range of IP addresses. Optionally a port range, if the rule also specifies one of the following protocols: tcp, udp, dccp or sctp.  If no port range
           is specified, then the destination port will never be modified. If no IP address is specified then only the destination port will be modified.  In Kernels up to 2.6.10 you can add  several  --to-destination  options.
           For  those  kernels,  if  you  specify more than one destination address, either via an address range or multiple --to-destination options, a simple round-robin (one after another in cycle) load balancing takes place
           between these addresses.  Later Kernels (>= 2.6.11-rc1) don't have the ability to NAT to multiple ranges anymore.

    --random
           If option --random is used then port mapping will be randomized (kernel >= 2.6.22).

    --persistent
           Gives a client the same source-/destination-address for each connection.  This supersedes the SAME target. Support for persistent mappings is available from 2.6.29-rc2.

    IPv6 support available since Linux kernels >= 3.7.

wertvolle Kommandos

Liste alle Regeln mit der Regelnummer:

[root@centos ~]# iptables  -L --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
2    ACCEPT     icmp --  anywhere             anywhere
3    ACCEPT     all  --  anywhere             anywhere
4    ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
5    ACCEPT     tcp  --  10.191.17.9          anywhere             state NEW tcp dpt:ftp
6    REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     tcp  --  anywhere             10.191.17.9          state NEW tcp dpt:http
2    DROP       all  --  anywhere             10.191.17.0/24       state NEW

Installation von iptables unter Centos7

Ich werde hier auf centos7 unterwegs sein.

Die Anleitung von https://support.rackspace.com/how-to/use-iptables-with-centos-7/ ist sehr gut.

firewalld service stoppen und deaktivieren

[root@centos ~]# systemctl stop firewalld
[root@centos ~]# systemctl mask firewalld

iptables installieren und konfigurieren

[root@centos ~]# yum install iptables-services
[root@centos ~]# systemctl enable iptables
[root@centos ~]# systemctl enable ip6tables

Wie ist die Grundkonfiguration?

[root@centos ~]# cat /etc/sysconfig/iptables
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
[root@centos ~]# cat /etc/sysconfig/ip6tables
# sample configuration for ip6tables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p ipv6-icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp --dport 22 -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -d fe80::/64 -p udp -m udp --dport 546 -m state --state NEW -j ACCEPT
-A INPUT -j REJECT --reject-with icmp6-adm-prohibited
-A FORWARD -j REJECT --reject-with icmp6-adm-prohibited
COMMIT

Zustand von iptables prüfen

mit Paramter -vnL bedeutet, verbose, numeric-output, List-chains (all)

[root@centos ~]# iptables -vnL
Chain INPUT (policy ACCEPT 10507 packets, 15M bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 6139 packets, 336K bytes)
 pkts bytes target     prot opt in     out     source               destination
[root@centos ~]# systemctl status iptables
● iptables.service - IPv4 firewall with iptables
   Loaded: loaded (/usr/lib/systemd/system/iptables.service; enabled; vendor preset: disabled)
   Active: inactive (dead)
[root@centos ~]# systemctl start iptables
[root@centos ~]# systemctl restart iptables
[root@centos ~]# iptables -vnL
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -s 10.191.17.9/32 -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Zu beachten ist, dass nach dem systemctl start iptables noch mal ein systemctl restart iptables kam. Erst dadurch wird die Datei /etc/sysconfig/iptables neu eingelesen. In dieser Datei stehen die aktuellen Regeln. Hier trägt man auch neue Regeln ein, die nach Operations_Management Reboot wieder aktiv sein sollen.

testen mit ftp, dazu installieren wir vsftpd:

[root@centos ~]# yum install vsftpd
[root@centos ~]# systemctl enable vsftpd
[root@centos ~]# systemctl start vsftpd
[root@centos ~]# netstat -tulpn | grep ':21 '
tcp6       0      0 :::21                   :::*                    LISTEN      2194/vsftpd

die Ips vom Centos:

[root@centos sysconfig]# ip a | grep 'inet '
    inet 127.0.0.1/8 scope host lo
    inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0
    inet 10.191.17.6/24 brd 10.191.17.255 scope global noprefixroute eth1

Ich versuche nun von Ubuntu darauf zuzugreifen:

root@ubuntu:~# ip a | grep 'inet '
    inet 127.0.0.1/8 scope host lo
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic eth0
    inet 10.191.17.9/24 brd 10.191.17.255 scope global eth1
root@ubuntu:~# telnet 10.191.17.6 21
Trying 10.191.17.6...
telnet: Unable to connect to remote host: No route to host

Funktioniert.

iptables persistieren / sichern / wiederherstellen

# persistieren:
# Debian/Ubuntu:
iptables-save > /etc/iptables/rules.v4
# RHEL/CentOS:
iptables-save > /etc/sysconfig/iptables

# wiederherstellen:
# Debian/Ubuntu:
iptables-restore < /etc/iptables/rules.v4
# RHEL/CentOS:
iptables-restore < /etc/sysconfig/iptables

# ip v6
# Debian/Ubuntu:
ip6tables-save > /etc/iptables/rules.v6
# RHEL/CentOS:
ip6tables-save > /etc/sysconfig/ip6tables

Sichern geht wie persistieren mit ...-save jedoch in eine andere Datei.

Zugriff Erlauben

Eingehend - INPUT-Chain

Für eine IP. Ich ergänze die Datei um eine Zeile. Dabei kommt es genau darauf an, wo man die Zeile einfügt. Die Zeile lautet:

-A INPUT -s 10.191.17.9/32 -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT

die gesamte Konfig sieht dann wie folgt aus:

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -s 10.191.17.9/32 -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Nach einem restart von iptables mit systemctl restart iptables ist die Änderung wirksam:

root@ubuntu:~# telnet 10.191.17.6 21
Trying 10.191.17.6...
Connected to 10.191.17.6.
Escape character is '^]'.
220 (vsFTPd 3.0.2)

Augehend - OUTPUT-Chain

Falls nun umgekehrt das Centos mit aktivierter Firewall auf den Apache von ubuntu auf Port 80 zugreifen muss, so kann man folgende Regel einbauen:

-A OUTPUT -d 10.191.17.9/32 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

Wobei das per default schon offen war, weil keine Regel das unterbunden hat. Bauen wir eine entsprechende Regel für das Netz 10.191.17.0/24:

-A OUTPUT -d 10.191.17.0/24 -m state --state NEW -j DROP

am Ende haben wir folgendes:

[root@centos ~]# cat /etc/sysconfig/iptables
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -s 10.191.17.9/32 -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
-A OUTPUT -d 10.191.17.9/32 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A OUTPUT -d 10.191.17.0/24 -m state --state NEW -j DROP
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Damit werden alle ausgehenden Verbindungen in das Netz 10.191.17.0/24 verworfen nur die Verbindung zu 10.191.17.9 TCP Port 80 wird durchgelassen.

HOME