Я хотел бы подключиться к своим серверам 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.