Назад | Перейти на главную страницу

NFSv4 через portforward

Я хотел бы подключиться к своим серверам NFSv4 через переадресацию порта. Большой план будет состоять из кластера серверов NFSv4 с балансировкой нагрузки с HAProxy, работающим на локальном хосте. Но сейчас это не так уж важно.

На сервере /etc/exports выглядит так

/mnt/x  192.168.0.0/16(rw,sync,no_subtree_check,no_root_squash,fsid=1)

Я могу подключиться со своего клиента к серверу по TCP 2049 и смонтировать общий ресурс следующим образом

mount -t nfs4 -o proto=tcp,port=2049 192.168.2.25:/mnt/x /mnt

Я проверил, что NFVs4 доволен только этим одним открытым TCP-портом, фильтруя все остальные коммуникации между двумя машинами.

Так что я думаю, что NFS работает хорошо.

Но когда я пересылаю порт, например, с redir от клиента к серверу, например

redir --lport=3049 --cport=2049 --caddr=192.168.2.25

и хотите установить его следующим образом

mount -t nfs4 -o proto=tcp,port=3049 127.0.0.1:/mnt/x /mnt

я получил

mount.nfs4: Operation not permitted

Что я скучаю? Я не вижу соответствующей информации в журналах сервера.

Обновить: Я зафиксировал как хорошую, так и плохую попытку подключения, вначале они одинаковы, затем клиент отправляет

PUTROOTFH,GETFH,GETATTR

команда. В хорошем случае сервер отвечает

PUTROOTFH-NFS4_OK,GETFH-NFS4_OK,GETATTR-NFS4_OK

в плохом (перенаправленном) случае он отвечает

PUTROOTFH-NFS4_OK,GETFH-NFS4_OK,GETATTR-NFS4ERR_PERM

В этот момент я изменил экспорт на

/mnt/x  0.0.0.0/0.0.0.0(rw,sync,no_subtree_check,no_root_squash,fsid=1)

но ошибка та же.

В хорошем случае журналы сервера

rpc.mountd[1711]: nfsd_export: inbuf '0.0.0.0/0.0.0.0 /'
rpc.mountd[1711]: nfsd_export: found 0x12dfeb0 path /
rpc.mountd[1711]: nfsd_export: inbuf '0.0.0.0/0.0.0.0 /mnt'
rpc.mountd[1711]: nfsd_export: found 0x12e2810 path /mnt

в плохом случае

rpc.mountd[1711]: nfsd_export: inbuf '0.0.0.0/0.0.0.0 /'
rpc.mountd[1711]: nfsd_export: found 0x12dfeb0 path /

Мой коллега нашел решение в tcpdump, что единственное различие между хорошими и плохими попытками подключения - это порт источника.

Затем Google сказал мне, что мне нужен insecure вариант экспорта, потому что после пересылки исходный порт больше 1024, а в нормальном случае он ниже 1024 и insecure сообщает серверу, что он может принимать клиентов с исходным портом выше 1024.