domingo, 15 de junio de 2014

Permitir NFS y servicios relacionados a través del Firewall (iptables)

NFS es un servicio que nos permite compartir recursos de nuestro equipo en la red local. Ya lo hemos configurado antes mientras hacíamos la guía del Servidor PXE. Sin embargo, para el mismo consideramos que habríamos de tener tanto el Firewall como SELinux deshabilitados para evitar inconvenientes a los clientes para arrancar correctamente las diferentes distribuciones servidas mediante PXE (y todos los demás servicios que implica, a parte de NFS). 

Ahora pretendamos servir cualquier recurso con NFS pero con el Firewall habilitado. Muchos piensan que solo basta con permitir el paso a través de los puertos 2049 (NFS) y 111 (rpcbind).

No obstante hay otros servicios de los cuales también depende el correcto funcionamiento de NFS. Ellos son rpc.statd, rpc.lockd, rpc.mountd y rpc.quotad. Para visualizar los puertos que están usando NFS y los demás servicios relacionados, lo haremos con el comando rpcinfo.
[fraterneo@rainbow ~]$ rpcinfo -p | awk -F " " '{print $3 ", " $4 ", " $5}' | uniq
proto, port, service
tcp, 111, portmapper
udp, 111, portmapper
udp, 37007, status
tcp, 40452, status
tcp, 2049, nfs
tcp, 2049, nfs_acl
udp, 2049, nfs
udp, 2049, nfs_acl
udp, 47974, nlockmgr
tcp, 59089, nlockmgr
udp, 875, rquotad
tcp, 875, rquotad
udp, 20048, mountd
tcp, 20048, mountd
udp, 20048, mountd
tcp, 20048, mountd
udp, 20048, mountd
tcp, 20048, mountd
Ahora bien, permitir el paso por los puertos listados ahí no resolverá la situación, puesto que muchos de esos servicios usan puertos aleatorios al iniciar/reiniciarse. Por lo que si permitimos entrada por el puerto 20048 de mountd, funcionará ahora, pero al reiniciar el servicio o el equipo, no lo hará por estar usando un puerto diferente al de ahora.

El fichero /etc/sysconfig/nfs guarda los parámetros de inicio de dichos servicios o daemons y es ahí donde le indicaremos qué puertos usar para que sean siempre los mismos. Dentro de dicho fichero identificamos los siguientes parámetros, quedando como sigue. Los números de puertos que elegí son los recomendados para estos casos.
[fraterneo@rainbow ~]$ sudo nano /etc/sysconfig/nfs 
# TCP port rpc.lockd should listen on.
LOCKD_TCPPORT=32803
# UDP port rpc.lockd should listen on.
LOCKD_UDPPORT=32769
# Optional arguments passed to rpc.mountd. See rpc.mountd(8)
RPCMOUNTDOPTS="--port 2000"
# Optional arguments passed to rpc.statd. See rpc.statd(8)
STATDARG="-p 4000"
# Enable usage of gssproxy. See gssproxy-mech(8).
GSS_USE_PROXY="no"
Reiniciamos los servicios y verificamos que los cambios surtan efecto.
[fraterneo@rainbow ~]$ sudo systemctl restart nfs-idmap.service 
[fraterneo@rainbow ~]$ sudo systemctl restart nfs-lock.service 
[fraterneo@rainbow ~]$ sudo systemctl restart nfs-mountd.service 
[fraterneo@rainbow ~]$ sudo systemctl restart nfs-rquotad.service 
[fraterneo@rainbow ~]$ sudo systemctl restart nfs-idmap.service 
[fraterneo@rainbow ~]$ sudo systemctl restart nfs-server.service 
Verificamos nuevamente con el comando rpcinfo.
[fraterneo@rainbow ~]$ rpcinfo -p | awk -F " " '{print $3 ", " $4 ", " $5}' | uniq
proto, port, service
tcp, 111, portmapper
udp, 111, portmapper
udp, 4000, status
tcp, 4000, status
tcp, 2049, nfs
tcp, 2049, nfs_acl
udp, 2049, nfs
udp, 2049, nfs_acl
udp, 32769, nlockmgr
tcp, 32803, nlockmgr
udp, 875, rquotad
tcp, 875, rquotad
udp, 2000, mountd
tcp, 2000, mountd
udp, 2000, mountd
tcp, 2000, mountd
udp, 2000, mountd
tcp, 2000, mountd
Finalmente permitimos la entrada a dichos puertos a través del Firewall (iptables).
[fraterneo@rainbow ~]$ sudo iptables -t filter -A INPUT -m state --state NEW -m tcp -p tcp --dport 2049 -j ACCEPT
[fraterneo@rainbow ~]$ sudo iptables -t filter -A INPUT -m state --state NEW -m tcp -p tcp --dport 111 -j ACCEPT
[fraterneo@rainbow ~]$ sudo iptables -t filter -A INPUT -m state --state NEW -m udp -p udp --dport 111 -j ACCEPT
[fraterneo@rainbow ~]$ sudo iptables -t filter -A INPUT -m state --state NEW -m tcp -p tcp --dport 2000 -j ACCEPT
[fraterneo@rainbow ~]$ sudo iptables -t filter -A INPUT -m state --state NEW -m udp -p udp --dport 2000 -j ACCEPT
[fraterneo@rainbow ~]$ sudo iptables -t filter -A INPUT -m state --state NEW -m udp -p udp --dport 32769 -j ACCEPT
[fraterneo@rainbow ~]$ sudo iptables -t filter -A INPUT -m state --state NEW -m tcp -p tcp --dport 32803 -j ACCEPT
[fraterneo@rainbow ~]$ sudo iptables -t filter -A INPUT -m state --state NEW -m tcp -p tcp --dport 4000 -j ACCEPT
[fraterneo@rainbow ~]$ sudo iptables -t filter -A INPUT -m state --state NEW -m udp -p udp --dport 4000 -j ACCEPT
[fraterneo@rainbow ~]$ sudo iptables -t filter -A INPUT -m state --state NEW -m tcp -p tcp --dport 875 -j ACCEPT
[fraterneo@rainbow ~]$ sudo iptables -t filter -A INPUT -m state --state NEW -m udp -p udp --dport 875 -j ACCEPT
[fraterneo@rainbow ~]$ sudo iptables-save
Actualización 05/08/2014 
Además hay que agregar al final del fichero /etc/sysconfig/nfs los siguientes parámetros que olvidamos:
STATD_PORT=662
RQUOTAD_PORT=875
MOUNTD_PORT=892

O bien hacerlo todo mediante la interfaz de configuración de NFS que se llama system-config-nfs (si no lo tienes instalado: yum install -y system-config-nfs) en su opción Server Settings


No hay comentarios:

Publicar un comentario