Hallo,
diesmal keine Frage sondern ein kleiner Erfahrungsbericht. Vielleicht
interessiert es ja jemanden.
Ich brauchte zu Hause plötzlich unbedingt einen NFS-Server für interne
Zwecke. Und zwar auf dem Rechner, der auch Router ins Internet ist. Das
heißt: Der Rechner brauch RPC-Dienste (*bähkse*) und diese müssen nach
aussen abgesichert werden. NFS-Server bedeutet: portmapper + statd + nfsd +
mountd + lockd
Wenn man das Zeugs einfach alles startet, belegen die verschiedenen
RPC-Dienste wild irgendwelche Ports auf dem Rechner. Der portmapper
vergibt die Ports, wie er gerade Lust hat. Die Dienstliste sieht z.B.
so aus (rpcinfo -p localhost)
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 1091 status
100024 1 tcp 2502 status
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100021 1 udp 1092 nlockmgr
100021 3 udp 1092 nlockmgr
100021 4 udp 1092 nlockmgr
100005 1 udp 1093 mountd
100005 1 tcp 2503 mountd
100005 2 udp 1093 mountd
100005 2 tcp 2503 mountd
100005 3 udp 1093 mountd
100005 3 tcp 2503 mountd
Wenn man den Rechner neu startet, schnappen sich die Dienste völlig
andere Ports, nur die 111 und 2049 von portmapper und nfsd wären konstant.
Das ist ein ekliger Zustand, wenn man den Rechner per Paketfilter
absichern will.
Ich möchte nicht einfach alle Ports (bis auf ein paar erlaubte) sperren
sondern nur die, auf denen auch wirklich was schützenswertes läuft. Also
müßte ich entweder jedesmal die FW-Konfiguration anpassen (*pfui*) oder
die RPC-Server auf feste Ports zwingen.
Die 2. Lösung ist natürlich besser. Deshalb will ich sie hier vorstellen.
Ich habe also in /etc/init.d/* die Startskipte der Daemonen editiert
und ihnen feste Ports (2000 und folgende) zugewiesen. Im einzelnen sind
das:
rcp.statd -p 2000
rpc.nfsd -p 2001
rpc.mountd -p 2003
Nun startete ich den NFS-Kram neu und bekam folgende Dienstliste (ich
habe mal die verantwortlichen Programme mit reingeschrieben):
program vers proto port
portmap
100000 2 tcp 111 portmapper // logo, immer 111
100000 2 udp 111 portmapper
rpc.statd
100024 1 udp 2000 status // auf 2000 gezwungen
100024 1 tcp 2000 status
rpc.nfsd
100003 2 udp 2001 nfs // auf 2001 gezwungen
100003 3 udp 2001 nfs
[lockd]
100021 1 udp 1090 nlockmgr !!!!!!!!
100021 3 udp 1090 nlockmgr !!!!!!!!
100021 4 udp 1090 nlockmgr !!!!!!!!
rpc.mountd
100005 1 udp 2003 mountd // auf 2003 gezwungen
100005 1 tcp 2003 mountd
100005 2 udp 2003 mountd
100005 2 tcp 2003 mountd
100005 3 udp 2003 mountd
100005 3 tcp 2003 mountd
Man sieht, daß einer der Dienste noch verrückt spielt, der nlockmgr. Dieser
Lockmanager ist kein normales Programm sondern ein Kernelthread, der vom
rpc.nfsd automatisch mit gestartet wird. Er taucht als [lockd] in
der Prozessliste auf. Man kann dem Ding nicht einfach beim Aufruf einen
Parameter für den Port verpassen wie den anderen Daemonen.
Ein Blick in der Kernelsource zeigt aber, daß man lockd so wie auch
Gerätetreibern durch die /etc/modules.conf bestimmte Optionen übergeben
kann. Die entsprechende Zeile für die modules.conf lautet:
options lockd nlm_udpport=2002 nlm_tcpport=2002
Nach Neuladen des lockd-Moduls in den Kern und Neustart der NFS-Dienste
sieht es so aus:
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 2000 status
100024 1 tcp 2000 status
100003 2 udp 2001 nfs
100003 3 udp 2001 nfs
100021 1 udp 2002 nlockmgr
100021 3 udp 2002 nlockmgr
100021 4 udp 2002 nlockmgr
100005 1 udp 2003 mountd
100005 1 tcp 2003 mountd
100005 2 udp 2003 mountd
100005 2 tcp 2003 mountd
100005 3 udp 2003 mountd
100005 3 tcp 2003 mountd
Schön! Jetzt kann man einfach die Ports 111 sowie 2000-2003 für UDP und
TCP per Paketfilter für Zugriffe von außen sperren und hat Ruhe. Über
die Wahl der Ports läßt sich natürlich streiten.
Reinhard