Anmerkung: Diese Anleitung bezieht sich hauptsächlich auf Debian Sarge, sollte sich aber vom Grunde her für jede andere Distribution eignen (mehr dazu unter dem Punkt weiterführende Informationen).
Ziel ist es, den NFS Server so einzurichten, dass dieser durch eine Firewall gesichert werden kann. Die Ermittlung der NFS relevanten Ports lässt sich am besten mit:
netstat -pantu UND rpcinfo -p localhost
durchführen. In meinem Beispiel waren dies (ohne Quota!):
rpcinfo -p localhost program vers proto port 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper 100003 2 udp 2049 nfs 100003 3 udp 2049 nfs 100021 1 udp 1221 nlockmgr 100021 3 udp 1221 nlockmgr 100021 4 udp 1221 nlockmgr 100005 1 udp 782 mountd 100005 1 tcp 785 mountd 100005 2 udp 782 mountd 100005 2 tcp 785 mountd 100005 3 udp 782 mountd 100005 3 tcp 785 mountd 100024 1 udp 749 status 100024 1 tcp 752 status
Der Portmapper (portmap) lauscht Standardmässig auf Port 111 upd / tcp auf allen Verfügbaren Interfaces. Vom Prinzip her muss dieser Dienst nicht weiter angepasst werden, da sich dieser Zustand durch eine Firewall bereits gut regulieren lässt. Wer dennoch konfigurieren möchte, kann dazu die Datei /etc/default/portmap ändern und den portmapper expliziet auf ein Interface / IP-Adresse binden.
# cat /etc/default/portmap # By default listen on all interfaces #OPTIONS="-i 127.0.0.1" OPTIONS="-i 192.168.100.1"
Anmerkung: Der Portmap Dienst lässt sich immer nur auf ein Interface binden.
Hauptproblem des statd ist der zufällig zugewissene Port (tcp/udp) durch den Portmapper. Der rpc.statd Dienst ist Bestandteil des nfs-common Pakets von Debian Sarge und lässt sich ebenfalls über /etc/default/nfs-common konfigurieren. Nachfolgend wurde dem statd der Port 4000 für udp/tcp fest zugewiesen.
cat /etc/default/nfs-common # Options for rpc.statd. # Should rpc.statd listen on a specific port? # If so, set this variable to a statd argument like: "--port 1000". STATDOPTS="--port 4000" # Are you _sure_ that your kernel does or does not need a lockd daemon? # If so, set this variable to either "yes" or "no". NEED_LOCKD=
Sollten Sie eine andere Distribution als Debian verwenden, können sie durch die Zuweisung des Parameters “-p PORTNUMMER“ an das Startskript des statd den gleichen Effekt erzielen.
cat /etc/init.d/<statd-startscript> # Start daemons. if [ "$USERLAND_LOCKD" ]; then echo -n $"Starting NFS locking: " daemon rpc.lockd echo fi echo -n $"Starting NFS statd: " daemon rpc.statd -p 4000 RETVAL=$?
Anmerkung: Die Verwendung des Ports 4000 ist reine willkür - Sie können jeden beliebigen wählen.
Wie auch der Portmapper, arbeitet der NFS Dienst selbst auf einem Standardport. Dieser ist der Port 2049 udp. Vom Grunde her sollte es egal sein ob dabei der Kernel NFS Server oder der User Space NFS Server verwendet wird.
Bei dem NFS Lockmanager handelt es sich um ein Kernelmodul was entweder fest im Kernel integriert oder als Modul compiliert werden kann. Auch hier werden die verwendeten Ports zufällig vergeben. Haben Sie die Modulvariante gewählt, so fügen Sie die folgende Zeile in die Datei /etc/modules.conf ein:
options lockd nlm_udpport=4001 nlm_tcpport=4001
Für diejenigen die alles fest in den Kernel integrieren funktioniert dies nicht. Dennoch lassen sich beide Ports fest zuweisen. Dazu einfach dem verwendeten Bootmanager wie etwa LILO oder GRUB folgende Parameter anhängen:
lockd.udpport=4001 lockd.tcpport=4001
Anmerkung: Die Verwendung des Ports 4001 ist reine willkür - Sie können jeden beliebigen wählen.
Der mountd verwendet auch zufällig zugewiesene Portnummern des Portmapper. Auch dieser lässt sich zu festen Ports überreden, wenn Sie die Datei /etc/default/nfs-kernel-server bearbeiten. Verwenden Sie keinen Kernel Server und nicht Debian, können sie dennoch durch die Angabe von “-p PORTNUMMER“ einen festen Port zuweisen.
cat /etc/default/nfs-kernel-server # Number of servers to start up RPCNFSDCOUNT=8 # Options for rpc.mountd RPCMOUNTDOPTS="-p 4002"
Anmerkung: Die Verwendung des Ports 4002 ist reine willkür - Sie können jeden beliebigen wählen.
Der quota Dienst lässt sich ebenfalls an feste Port Nummern binden. Stellen Sie dazu sicher, dass die Zeile:
rquotad 100011 rquotaprog quota rquota
in der Datei /etc/rpc vorhanden ist. Wichtig ist, dass sie diese Zeile unter keinen Umständen ändern. Als nächstes müssen der Datei /etc/services folgende Einträge hinzugefügt werden:
rquotad 4003/tcp rquotad 4003/udp
Anmerkung: Die Verwendung des Ports 4003 ist reine willkür - Sie können jeden beliebigen wählen.
Als beispielhafte Darstellung der möglichen Firewall-Regeln auf Netfilter / IPTables Basis sollen folgende gelten:
#!/bin/sh IPTABLES=`which iptables` LAN="192.168.100.0/24" # clean out ${IPTABLES} ${IPTABLES} -F ${IPTABLES} -t nat -F ${IPTABLES} -t mangle -F ${IPTABLES} -X ${IPTABLES} -t nat -X ${IPTABLES} -t mangle -X # set defaulf policy - drop ${IPTABLES} -P INPUT DROP ${IPTABLES} -P OUTPUT DROP ${IPTABLES} -P FORWARD DROP # allow loopback ${IPTABLES} -A INPUT -i lo -j ACCEPT ${IPTABLES} -A OUTPUT -o lo -j ACCEPT # use connection tracking ${IPTABLES} -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT ${IPTABLES} -A FORWARD -i ! eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT ${IPTABLES} -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT ${IPTABLES} -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #permit nfs ${IPTABLES} -A INPUT -p tcp -i eth0 -s ${LAN} -m tcp --dport 111 -j ACCEPT ${IPTABLES} -A INPUT -p tcp -i eth0 -s ${LAN} -m tcp --dport 2049 -j ACCEPT ${IPTABLES} -A INPUT -p tcp -i eth0 -s ${LAN} -m tcp --dport 4000:4003 -j ACCEPT ${IPTABLES} -A INPUT -p udp -i eth0 -s ${LAN} -m udp --dport 111 -j ACCEPT ${IPTABLES} -A INPUT -p udp -i eth0 -s ${LAN} -m udp --dport 2049 -j ACCEPT ${IPTABLES} -A INPUT -p udp -i eth0 -s ${LAN} -m udp --dport 4000:4003 -j ACCEPT # drop nfs from internet #${IPTABLES} -A INPUT -p tcp -i eth0 -s 0/0 -m tcp --dport 111 -j DROP #${IPTABLES} -A INPUT -p tcp -i eth0 -s 0/0 -m tcp --dport 2049 -j DROP #${IPTABLES} -A INPUT -p tcp -i eth0 -s 0/0 -m tcp --dport 4000:4003 -j DROP #${IPTABLES} -A INPUT -p udp -i eth0 -s 0/0 -m udp --dport 111 -j DROP #${IPTABLES} -A INPUT -p udp -i eth0 -s 0/0 -m udp --dport 2049 -j DROP #${IPTABLES} -A INPUT -p udp -i eth0 -s 0/0 -m udp --dport 4000:4003 -j DROP
Anmerkung: Dies ist nur ein Vorschlag und sollte immer den gegebenen Bedingungen hin angepasst werden!