Will man den SSH wirklich sicher machen kann man den Zugriff auch auf eine IP-Adresse oder mehrere beschänken.
Zunächst benötigen wir erstmal eine Dyn-Domain ich nutze hierfür gern dyndns.org es gibt aber noch andere .... also einen Registrieren und auf dem Client-Rechner / Router einrichten. Als Beispiel werde ich nachfolgend meinHost.dyndns.org verwenden.
Jetzt brauchen wir ein kleines Script das regelmäßig Prüft ob sich die IP geändert hat und wenn ja die IP per IP-Tables freigibt.
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
# touch ~/firewall-dyn.sh
# chmod 700 ~/firewall-dyn.sh
Inhalt der firewall-dyn.sh:
Code:
#!/bin/bash
HOST=$1
HOSTFILE="/root/dynhosts/host-$HOST"
CHAIN="dynamichosts"
# eventuell anzupassen
# im zweifelsfal per whereis iptables herausfinden
IPTABLES="/usr/sbin/iptables"
IP=`/usr/bin/dig +short $HOST | /usr/bin/tail -n 1`
if [ "${#IP}" = "0" ]; then
echo "Fehler: Kann den Host ($HOST) nicht aufloesen."
exit
fi
OLDIP=""
if [ -a $HOSTFILE ]; then
OLDIP=`cat $HOSTFILE`
echo "CAT returned: $?"
fi
echo $IP>$HOSTFILE
echo "Update des DynHosts ($HOST) in iptables."
if [ "${#OLDIP}" != "0" ]; then
echo "Loeschen der alten Regel ($OLDIP)"
`$IPTABLES -D $CHAIN -s $OLDIP/32 -j ACCEPT`
fi
echo "Einfuegen der neuen Regel ($IP)"
`$IPTABLES -A $CHAIN -s $IP/32 -j ACCEPT`
|
Nun benötigen wir noch einen tmp Ornder in dem die ip-adressen zwischen gespeichert werden können und eine neue Regelkette in IP-Tables um unsere IPs freizugeben, sowie die Regelkette als erstes Prüfen lassen:
|
Quellcode
|
1
2
3
|
# mkdir ~/dynhosts
# iptables -t filter -N dynamichosts
# iptables -t filter -I INPUT 1 -j dynamichosts
|
So nun müssen wir noch dafür sorgen das unser Script regelmässig ausgeführt wird also legen wir einen Cron-Job an (kann auch mehrmals mit verschiedenen Domains aufgerufen werden):
|
Quellcode
|
1
|
# contab -e
|
und fügen hier die Zeile
0,5,10,15,20,25,30,35,40,45,50,55 * * * * /root/firewall-dyn.sh meinHost.dyndns.org
Jetzt wird alle 5 Minuten unser Script ausgeführt.
Nachdem Cron das erstemal das Script ausgeführt hat(wichtig Cron muss das Script ausführen um sicherzustellen das hier kein Fehler ist und wir uns selbst aussperren), testen wir ob die IP die IP-Tables freigibt auch der entspricht die unser DynHost hat:
|
Quellcode
|
1
|
# iptables -L -t filter
|
Da sollte nun irgendwo etwas stehen wie:
Chain dynamichosts (1 references)
target prot opt source destination
ACCEPT all -- XYZ123456.meinprovider.de anywhere
ACCEPT all -- 1.13.106.127 anywhere
stimmt dies mit
|
Quellcode
|
1
|
ping meinHost.dyndns.org
|
überein kann es weiter gehen:
So wenn nun alles geklappt hat fügen wir abschließend noch folgende 2 Regeln ein:
|
Quellcode
|
1
2
|
# iptables -t filter -I INPUT 2 -p tcp -m tcp -m state --dport 22 --state RELATED,ESTABLISHED -j ACCEPT
# iptables -t filter -I INPUT 3 -p tcp -m tcp -m state --dport 22 --state NEW -j REJECT --reject-with icmp-host-prohibited
|
Die erste sorgt dafür das bereits aufgebaute Verbindungen zu Port 22 erlaubt werden, die zweite kümmert sich dann um die Verbindungen die neu aufgebaut werden und gibt einen entsprechenden Fehler an den Clienten zurück (unsere DynHosts sind ja durch unsere Regelkette dynamichosts bereits Freigegeben)
Fertig nun ist SSH nur noch für unsere DynHost möglich alle anderen werden abgewiesen.