Как включить монтирование / общий доступ по NFS с iptables с политикой DROP?
NFS использует динамически назначаемые порты, поэтому его сложно использовать с брандмауэрами. У меня есть сервер NFS и несколько клиентов. Я хотел бы принимать трафик ТОЛЬКО на портах, которые необходимы для работы NFS. Я настроил сервер NFS для использования статических портов (4000-4004).
Проблема, однако, в том, что клиенты по-прежнему выбирают случайный порт - и поскольку это UDP, я могу заставить его работать, только если я принимаю весь трафик UDP с сервера.
Я нашел документацию, в которой описывается установка переменной / sys, которая ограничивает использование клиентом статического диапазона портов для NFS, однако я не могу заставить ее работать. Упомянутые переменные / sys:
/sys/module/sunrpc/parameters/max_resvport
/sys/module/sunrpc/parameters/min_resvport
/sys/module/lockd/parameters/nlm_tcpport
/sys/module/lockd/parameters/nlm_udpport
/sys/module/nfs/parameters/callback_tcpport
Я не смог выполнить эту работу. Может я неправильно к этому подхожу? Это кажется излишне сложным для того, что я считал простой задачей.
Я использую NFS в Debian и Ubuntu.
Тот факт, что клиентский порт недолговечен, не является проблемой, хотя, как вы говорите, изменчивость порта на стороне сервера есть.
Предполагая, что вы успешно проинструктировали сервер использовать только порты 4000-4004 для nfsd, у вас есть три проблемы: клиенты должны иметь возможность взаимодействовать с RPC portmapper, демоном монтирования и службой NFS на сервере.
Предполагая, что вы правы, изменив службу NFS для прослушивания 4000-4004, клиенты должны добавить
iptables -A INPUT -d se.rv.er.ip -p udp --dport 4000:4004 -j ACCEPT
iptables -A OUTPUT -s se.rv.er.ip -p udp --sport 4000:4004 -j ACCEPT
в то время как сервер должен добавить
iptables -A INPUT -p udp --dport 4000:4004 -j ACCEPT
iptables -A OUTPUT -p udp --sport 4000:4004 -j ACCEPT
Если вы хотите разрешить NFS через TCP, повторите эти правила с -p tcp
вместо того -p udp
.
Клиенты должны добавить
iptables -A INPUT -d se.rv.er.ip -p udp --dport 111 -j ACCEPT
iptables -A OUTPUT -s se.rv.er.ip -p udp --sport 111 -j ACCEPT
в то время как сервер должен добавить
iptables -A INPUT -p udp --dport 111 -j ACCEPT
iptables -A OUTPUT -p udp --sport 111 -j ACCEPT
Возможно, вам потребуется добавить пары правил для -p tcp
Кроме того, portmapper обычно поддерживает TCP. Проверьте свои журналы отказов, чтобы узнать, что происходит DROP
пед и отрегулируйте соответственно.
Вам нужно узнать, на каком порту он работает на сервере, с server% rpcinfo -p | grep mount
; на моем сервере это UDP / 32775 и TCP / 32769. Для этого клиенты должны добавить
iptables -A INPUT -d se.rv.er.ip -p udp --dport 32775 -j ACCEPT
iptables -A OUTPUT -s se.rv.er.ip -p udp --sport 32775 -j ACCEPT
в то время как сервер должен добавить
iptables -A INPUT -p udp --dport 32775 -j ACCEPT
iptables -A OUTPUT -p udp --sport 32775 -j ACCEPT
и две аналогичные пары с -p tcp --[ds]port 32769
.
Это ваша ответственность чтобы эти строки оказались в нужном месте в вашем INPUT
и OUTPUT
цепи; в начале, вероятно, хорошая идея.
редактировать: в свете вашего ответа ниже я обновил правила выше.
я нашел эта страница который показывает несколько правил iptables о том, как открывать порты NFS.
Также, эта страница предлагает выбрать протокол / порт при монтировании общего ресурса NFS с помощью команды (NFS v4):
# mount -t nfs4 -o proto=tcp,port=2049 nfs-server:/data /mnt/data
Несколько других страниц говорят об открытии этих трех портов: 32771, 111 и 2049.
Вы можете попробовать это, и если это не сработало для вас, вы можете попробовать открыть все порты UDP с IP-адресов своих клиентов, только если вы им доверяете и посмотрите, сработает ли это.