A montagem do cliente NFS falha por trás do firewall

3

Eu tenho um sistema Ubuntu 11.10 com um firewall iptables. Depois de fixar as portas para mountd, lockd e statd, abrindo-as em iptables, posso expor os compartilhamentos NFS através do firewall sem problemas.

Estou tendo problemas com a montagem de um compartilhamento de outro servidor NFS sobre o qual não tenho controle. Se eu desabilitar o firewall, eu posso montar o compartilhamento. Eu também posso montar outros compartilhamentos NFS sem desabilitar o firewall.

Isso me leva a duas perguntas :

  • Por que um firewall impediria que um cliente NFS montasse alguns servidores e não outros?
  • Um cliente pode especificar portas para usar em uma montagem NFS?

Configuração completa e informações de erro:

O servidor é NFSv3 de acordo com nfsstat . Quando eu faço o monte:

# mount -t nfs -v 192.168.80.48:/location /mnt/tmp
mount.nfs: timeout set for Fri Mar 23 09:13:00 2012
mount.nfs: trying text-based options 'vers=4,addr=192.168.80.48,clientaddr=192.168.40.173'
mount.nfs: mount(2): No such file or directory
mount.nfs: trying text-based options 'addr=192.168.80.48'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: trying 192.168.80.48 prog 100003 vers 3 prot TCP port 2049
mount.nfs: prog 100005, trying vers=3, prot=17
mount.nfs: trying 192.168.80.48 prog 100005 vers 3 prot UDP port 678
mount.nfs: portmap query retrying: RPC: Timed out
mount.nfs: prog 100005, trying vers=3, prot=6
mount.nfs: trying 192.168.80.48 prog 100005 vers 3 prot TCP port 681
mount.nfs: portmap query failed: RPC: Remote system error - Connection timed out

Eu vejo os pacotes sendo descartados:

Rejected packets: SRC=192.168.80.48 DST=192.168.40.173 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=TCP SPT=681 DPT=40325 WINDOW=5792 RES=0x00 ACK SYN URGP=0
Rejected packets: SRC=192.168.80.48 DST=192.168.40.173 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=TCP SPT=681 DPT=47419 WINDOW=5792 RES=0x00 ACK SYN URGP=0
Rejected packets: SRC=192.168.80.48 DST=192.168.40.173 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=TCP SPT=681 DPT=41238 WINDOW=5792 RES=0x00 ACK SYN URGP=0

showmount falha da mesma maneira. A partir do mount detalhado, parece que o portmap é o problema, mas eu o abri.

# rpcinfo -p
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  32765  status
    100024    1   tcp  32765  status
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    2   tcp   2049
    100227    3   tcp   2049
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    2   udp   2049
    100227    3   udp   2049
    100021    1   udp   4002  nlockmgr
    100021    3   udp   4002  nlockmgr
    100021    4   udp   4002  nlockmgr
    100021    1   tcp   4001  nlockmgr
    100021    3   tcp   4001  nlockmgr
    100021    4   tcp   4001  nlockmgr
    100005    1   udp  32767  mountd
    100005    1   tcp  32767  mountd
    100005    2   udp  32767  mountd
    100005    2   tcp  32767  mountd
    100005    3   udp  32767  mountd
    100005    3   tcp  32767  mountd

# cat /etc/services
sunrpc          111/tcp         portmapper      # RPC 4.0 portmapper
sunrpc          111/udp         portmapper
nfs             2049/tcp                        # Network File System
nfs             2049/udp                        # Network File System

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:smtp
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:sunrpc
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ntp
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:netbios-ns
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:netbios-dgm
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:netbios-ssn
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:microsoft-ds
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:nfs
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:sunrpc
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:3260
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:32765
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:32766
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:32767
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:4001
ACCEPT     udp  --  anywhere             anywhere            udp dpt:domain
ACCEPT     udp  --  anywhere             anywhere            udp dpt:sunrpc
ACCEPT     udp  --  anywhere             anywhere            udp dpt:ntp
ACCEPT     udp  --  anywhere             anywhere            udp dpt:netbios-ns
ACCEPT     udp  --  anywhere             anywhere            udp dpt:netbios-dgm
ACCEPT     udp  --  anywhere             anywhere            udp dpt:netbios-ssn
ACCEPT     udp  --  anywhere             anywhere            udp dpt:https
ACCEPT     udp  --  anywhere             anywhere            udp dpt:microsoft-ds
ACCEPT     udp  --  anywhere             anywhere            udp dpt:nfs
ACCEPT     udp  --  anywhere             anywhere            udp dpt:4002
ACCEPT     udp  --  anywhere             anywhere            udp dpt:32765
ACCEPT     udp  --  anywhere             anywhere            udp dpt:32766
ACCEPT     udp  --  anywhere             anywhere            udp dpt:32767
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:domain
ACCEPT     udp  --  anywhere             anywhere            udp spt:domain
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:sunrpc
ACCEPT     udp  --  anywhere             anywhere            udp spt:sunrpc
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:netbios-ssn
ACCEPT     udp  --  anywhere             anywhere            udp spt:netbios-ssn
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:https
ACCEPT     udp  --  anywhere             anywhere            udp spt:https
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:microsoft-ds
ACCEPT     udp  --  anywhere             anywhere            udp spt:microsoft-ds
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:submission
ACCEPT     udp  --  anywhere             anywhere            udp spt:submission
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:nfs
ACCEPT     udp  --  anywhere             anywhere            udp spt:nfs
    
por JoeFish 23.03.2012 / 14:34

1 resposta

5

Existem configurações em sysctl que definem intervalos de porta NFS disponíveis para conexões.

sunrpc.max_resvport = 1023

sunrpc.min_resvport = 650

Essas configurações definem as portas mais alta e mais baixa a serem usadas para fazer conexões RPC (NFS)

Você pode abrir essas portas ou definir um intervalo diferente, dependendo do seu sistema. Você receberá negações se tentar usar uma porta bloqueada por um firewall ou outro serviço usando essa porta.

Editar:

Você também pode aumentar / diminuir esse intervalo. Eu tenho um servidor que tinha 460 montagens NFS definidas em fstab e iria falhar depois de 372 ou mais. E quando eu montaria manualmente um dos que falharam, ele montaria, mas desmontaria uma das montagens de trabalho. Eu aumentei esse range em 150 e todos eles montaram. Esta não é a melhor maneira de fazer isso. automounter vem à mente, mas funciona.

Para fazer a modificação, edite sua /etc/sysctl.conf e adicione uma linha como:

sunrpc.min_resvport = 900

Para tornar a alteração permanente se você precisar alterá-las. Lembre-se, se você for acima de 1024, que essas portas são "não-privilegiadas" e os usuários normais do sistema terão acesso a elas vs. -1024.

Editar 2:

No seu comando NFS mount você pode adicionar o seguinte.

proto=tcp - força a montagem a usar TCP / IP

public - ignora portmapper completamente e entra em contato com o servidor NFS na porta 2049, a menos que especificado de outra forma

Então, mount nfs.test.com:/export /test

torna-se

mount -o proto=tcp ,public nfs.test.com:/export /test

EDIT 3

OK - aqui vamos nós !!! root@pressyrluck # ./nowhammies > /dev/please

Essas informações eram lifted copied swiped borrowed de NFS da Sourceforge

Alguns daemons envolvidos no compartilhamento de dados via nfs já estão vinculados a uma porta. O portmap está sempre na porta 111 tcp e udp. O nfsd está sempre na porta 2049 TCP e UDP (no entanto, a partir do kernel 2.4.17, o NFS sobre TCP é considerado experimental e não é para uso em máquinas de produção).

Os outros daemons, statd, mountd, lockd e rquotad normalmente se moverão para a primeira porta disponível da qual são informados pelo portmapper.

Para forçar o statd a se ligar a uma porta específica, use a opção -p portnum. Para forçar o statd a responder em uma porta específica, use adicionalmente a opção -o portnum ao iniciá-lo.

Para forçar o mountd a se ligar a uma porta específica, use a opção -p portnum.

Por exemplo, para transmitir statd da porta 32765 e escutar na porta 32766 e mountd listen na porta 32767, digite:

# statd -p 32765 -o 32766
# mountd -p 3276

O lockd é iniciado pelo kernel quando é necessário. Portanto, você precisa passar as opções do módulo (se você tiver construído como um módulo) ou as opções do kernel para forçar o lockd a escutar e responder apenas em certas portas.

Se você está usando módulos carregáveis e gostaria de especificar essas opções em seu arquivo /etc/modules.conf, adicione uma linha como esta no arquivo:

options lockd nlm_udpport=32768 nlm_tcpport=32768

Por uma questão de discussão, vamos descrever uma rede e configurar um firewall para proteger nosso servidor nfs. Nosso servidor nfs é 192.168.0.42 nosso cliente é 192.168.0.45 somente. Como no exemplo acima, o statd foi iniciado de forma que ele só se vincule à porta 32765 para solicitações recebidas e ele deve responder na porta 32766. mountd é forçado a ligar à porta 32767. Os parâmetros do módulo de lockd foram configurados para ligar a 32768. nfsd é, obviamente, na porta 2049 e o portmapper está na porta 111.

Não estamos usando cotas.

iptables -A INPUT -f -j ACCEPT -s 192.168.0.45
iptables -A INPUT -s 192.168.0.45 -d 0/0 32765:32768 -p 6 -j ACCEPT
iptables -A INPUT -s 192.168.0.45 -d 0/0 32765:32768 -p 17 -j ACCEPT
iptables -A INPUT -s 192.168.0.45 -d 0/0 2049 -p 17 -j ACCEPT
iptables -A INPUT -s 192.168.0.45 -d 0/0 2049 -p 6 -j ACCEPT
iptables -A INPUT -s 192.168.0.45 -d 0/0 111 -p 6 -j ACCEPT
iptables -A INPUT -s 192.168.0.45 -d 0/0 111 -p 17 -j ACCEPT
iptables -A INPUT -s 0/0 -d 0/0 -p 6 -j DENY --syn --log-level 5
iptables -A INPUT -s 0/0 -d 0/0 -p 17 -j DENY --log-level 5

A primeira linha diz para aceitar todos os fragmentos de pacote (exceto o primeiro fragmento de pacote que será tratado como um pacote normal). Em teoria, nenhum pacote passará até que seja remontado, e não será remontado a menos que o primeiro fragmento de pacote seja passado. Claro que existem ataques que podem ser gerados sobrecarregando uma máquina com fragmentos de pacotes. Mas o NFS não funcionará corretamente, a menos que você deixe os fragmentos passarem. Veja a Seção 7, “Solução de problemas” para detalhes.

As outras linhas permitem conexões específicas de qualquer porta em nosso host cliente para as portas específicas que disponibilizamos em nosso servidor. Isso significa que se, por exemplo, 192.158.0.46 tentar entrar em contato com o servidor NFS, ele não poderá montar ou ver quais montagens estão disponíveis.

Com os novos recursos de fixação de portas, é obviamente muito mais fácil controlar quais hosts podem montar seus compartilhamentos NFS. Vale ressaltar que o NFS não é um protocolo criptografado e qualquer pessoa na mesma rede física poderia farejar o tráfego e remontar as informações que estão sendo transmitidas de um lado para outro.

    
por 23.03.2012 / 15:26