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:
- Konfigurationsdateien, Werkzeuge und Hilfsprogramme von iptables und ip6tables
- Werkzeuge, Kommandos und Hilfsprogramme zur Verwaltung von Routingtabellen
- Private Adressbereiche (IPv4) und Unique Local Addresses sowie Link Local Addresses (IPv6)
- Portweiterleitung und IP-Forwarding
- Auflisten und Erstellen von Filterregeln, die IP-Pakete auf der Basis des Protokolls oder der Absender- oder Empfänger-Ports und -Adressen akzeptieren oder blockieren
- Filterkonfigurationen sichern und erneut laden
Dies ist eine auszugsweise Liste der verwendeten Dateien, Begriffe und Hilfsprogramme:
- /proc/sys/net/ipv4/
- /proc/sys/net/ipv6/
- /etc/services
- iptables
- ip6tables
wichtige Man-Pages
- manpage von proc
- manpage von sysctl
- manpage von sysctl.d
- manpage von iptables
- manpage von iptables-extensions
Adressbereiche IPv4
Private Adressbereiche
schon bekannt aus LPIC 1:
- 10.0.0.0/8
- 172.16.0.0/12 (172.16.0.0 bis 172.31.255.255)
- 192.168.0.0/16
shared addresses für cgnat
- 100.64.0.0/10
Link Local
- 169.254.0.0/16 (100.64.0.0 bis 100.127.255.255)
Adressbereiche IPv6
siehe auch https://de.wikipedia.org/wiki/IPv6#Unique_Local_Unicast
Besondere Adressen
- ::/128 bzw. in der ausgeschriebenen Variante 0:0:0:0:0:0:0:0/128 . ist die nicht spezifizierte Adresse. Sie darf keinem Host zugewiesen werden, sondern zeigt das Fehlen einer Adresse an.
- ::/0 bzw. in der ausgeschriebenen Variante 0:0:0:0:0:0:0:0/0 bezeichnet die Standard-Route (default route)
- ::1/128 bzw. in der ausgeschriebenen Variante 0:0:0:0:0:0:0:1/128, ist die Adresse des eigenen Standortes (loopback-Adresse, die in der Regel mit localhost verknüpft ist).
Link-Local-Unicast-Adressen
Beschreibung: abgeschlossene Netzwerksegmente
- fe80::/64
Unique Local Unicast
- fc00::/7 (fc00… bis fdff…)
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.