rpcbind - действительно ли нет способа привязать порты tcp к определенному интерфейсу / можно ли запустить nfs без rpcbind?

Мы хотели бы перейти от sshfs к nfs.

последнее, что сдерживает нас, это тот факт, что rpcbind (который, как я полагаю, необходим для работы nfs) не позволяет вам указать tcp (не udp) ip, с которым он связывается.

есть флаг -h, но это только для портов udp, которые он открывает. это не влияет на порты TCP, они все еще открываются на 0.0.0.0:...

Кто-нибудь знает, как мы можем защитить rpcbind, не открывая его нашему общедоступному интерфейсу?

или даже лучше, есть ли способ использовать nfs без rpcbind?

Спасибо!

3 ответа

Команда rpcbind необходима для сопоставления службы RPC с сетевым адресом и портом (чтение TCP или UDP). Для версий NFS 2 и 3 требуется дополнительный сервис mountd, чтобы клиенты могли получить начальный дескриптор файла. В то время как nfs имеет хорошо известный номер порта 2049, mountd не имеет. Итак, если вы хотите использовать NFSv3, вам также нужно будет запустить rpcbind (ну, возможно, есть несколько опций монтирования, чтобы сказать, где работает mound). В отличие от v3, NFSv4 требует только один порт 2049 и не требует монтирования вообще. Это делает возможной установку NFS без rpcbind. Просто имейте в виду, что некоторые (старые) клиенты все еще могут пытаться общаться с rpcbind даже для v4.

Теперь о rpcbind. Почему вы хотите защитить это? Если это не доступно для клиентов, то они не могут смонтировать? Единственная причина защиты - это ограничение количества клиентов, которые могут делать обновления. Но это уже на месте, так как rpcbind использует сокет домена unix и запрещает удаленному клиенту выполнять обновления. Даже на локальном хосте вы должны быть root для этого. Если вы хотите защитить только от некоторых клиентов, то iptables - ваш друг (или какой-либо брандмауэр в вашей ОС):

# iptables -A INPUT -s 10.1.2.0/24 -p tcp --dport 111 -j ACCEPT
# iptables -A INPUT -s 10.1.3.0/24 -p udp --dport 111 -j ACCEPT
# iptables -A INPUT -p tcp --dport 111 -j DROP
# iptables -A INPUT -p udp --dport 111 -j DROP

Для тех, кто ищет ответ в 2019 году. Rpcbind использует опцию -h [IP]. Добавьте в /etc/sysconfig/(Red Hat, Fedora) или /etc/defaults (Debian, Ubuntu) и все будет отсортировано.

Поиск сервисного порта встроен в протокол RPC, поэтому вам придется сделать что-то весьма экзотическое, чтобы избежать использования rpcbind при запуске NFS.

Вы можете заблокировать соединения с определенных адресов или интерфейсов, используя iptables; с tcpwrappers (/etc/hosts.allow, /etc/hosts.deny); или - для любителей приключений - с SELinux.

tcpwrappers доступен изначально, если "ldd / sbin / rpcbind" показывает ссылку на libwrap, в противном случае вам нужно будет подавить обычный запуск и вместо этого запустить его из inetd/xinetd через tcpd. Я не пробовал это сам.

Больше не нужно настраивать правила брандмауэра. С помощью свежего дистрибутива Linux, где доступен /etc/hosts.deny/allow, вы можете просто сделать следующее:

echo "portmap: 10.0.0.0/16" >> /etc/hosts.allow
echo "rpcbind: 10.0.0.0/16" >> /etc/hosts.allow
echo "portmap: ALL" >> /etc/hosts.deny
echo "rpcbind: ALL" >> /etc/hosts.deny

(Предполагая, что 10.0.0.0/16 является вашей частной сетью).

В последних версиях NFS используется rpcbind, но в более старых версиях используется portmap, поэтому это зависит от вашей ОС.

Другие вопросы по тегам