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