В данной статье мы настроим клиентскую и серверную часть, определим статичные порты и закроем их фаерволлом.
NFS (Network File System) - представляет собой распределенный протокол файловой системы, позволяющий монтировать на сервер удаленные каталоги. За подробностями можно сходить в википедию NFS
Из нюансов начиная с версии Ubuntu 22.04 дефолтные файлы конфигурации находящиеся в /etc/default/nfs-* больше не работают, несмотря на то что они там остаются при установке пакетов из дефолтного репозитория, что вносит некоторую путаницу в конфигурацию.
Установим пакеты которые нам потребуются, в процессе установки соглашаемся с сохранением правил iptables
apt update && apt install nfs-kernel-server iptables-persistent jq -y
Открываем файл конфигурации для установки статичных портов /etc/nfs.conf и меняем дефолтные параметры в блоках lockd,mountd,statd:
Блок | Изменения |
---|---|
lockd | port=2001, udp-port=2002 |
mountd | port=2000 |
statd | port=2003, outgoing-port=2004 |
Итоговый файл конфигурации должен выглядеть примерно так:
/etc/nfs.conf
[general]
pipefs-directory=/run/rpc_pipefs
#
[exports]
# rootdir=/export
#
[exportfs]
# debug=0
#
[gssd]
# verbosity=0
# rpc-verbosity=0
# use-memcache=0
# use-machine-creds=1
# use-gss-proxy=0
# avoid-dns=1
# limit-to-legacy-enctypes=0
# context-timeout=0
# rpc-timeout=5
# keytab-file=/etc/krb5.keytab
# cred-cache-directory=
# preferred-realm=
#
[lockd]
port=2001
udp-port=2002
#
[mountd]
# debug=0
manage-gids=y
# descriptors=0
port=2000
# threads=1
# reverse-lookup=n
# state-directory-path=/var/lib/nfs
# ha-callout=
#
[nfsdcld]
# debug=0
# storagedir=/var/lib/nfs/nfsdcld
#
[nfsdcltrack]
# debug=0
# storagedir=/var/lib/nfs/nfsdcltrack
#
[nfsd]
# debug=0
# threads=8
# host=
# port=0
# grace-time=90
# lease-time=90
# udp=n
# tcp=y
# vers2=n
# vers3=y
# vers4=y
# vers4.0=y
# vers4.1=y
# vers4.2=y
# rdma=n
# rdma-port=20049
#
[statd]
# debug=0
port=2003
outgoing-port=2004
# name=
# state-directory-path=/var/lib/nfs/statd
# ha-callout=
# no-notify=0
#
[sm-notify]
# debug=0
# force=0
# retry-time=900
# outgoing-port=
# outgoing-addr=
# lift-grace=y
#
[svcgssd]
# principal=
Создадим директорию в корне и изменим ей владельца:
mkdir /storage
chown nobody:nogroup /storage
Делаем export директории в файле /etc/exports, предварительно записав адрес клиента в переменную:
export CLIENT_IP=<IP адерес клиента>
echo "/storage $CLIENT_IP(rw,sync,no_subtree_check,no_root_squash)" >> /etc/exports
Перезапускаем службы и проверяем что изменения вступили в силу:
systemctl restart rpcbind.service rpc-statd.service nfs-kernel-server
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 2003 status
100024 1 tcp 2003 status
100005 1 udp 2000 mountd
100005 1 tcp 2000 mountd
100005 2 udp 2000 mountd
100005 2 tcp 2000 mountd
100005 3 udp 2000 mountd
100005 3 tcp 2000 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049
100021 1 udp 2002 nlockmgr
100021 3 udp 2002 nlockmgr
100021 4 udp 2002 nlockmgr
100021 1 tcp 2001 nlockmgr
100021 3 tcp 2001 nlockmgr
100021 4 tcp 2001 nlockmgr
Настройка выполняется на чистой виртуальной машине, в которой отсутствуют какие-либо правила, можно скорректировать в зависимости от обстоятельств.
У сервера имеется 2 сетевых интерфейса, один внешний адрес eth0, второй внутренний eth1.
export EXTERNAL_IF=`ip -4 -j a | jq -r '.[] | select(.ifname == "eth0") | .addr_info[0].local'` && echo $EXTERNAL_IF
export INTERNAL_IF=`ip -4 -j a | jq -r '.[] | select(.ifname == "eth1") | .addr_info[0].local'` && echo $INTERNAL_IF
iptables -A INPUT -s $EXTERNAL_IF/32 -p tcp -j ACCEPT
iptables -A INPUT -s $EXTERNAL_IF/32 -p udp -j ACCEPT
iptables -A INPUT -s $CLIENT_IP/32 -p tcp -m multiport --ports 111,2000,2001,2003,2049 -j ACCEPT
iptables -A INPUT -s $CLIENT_IP/32 -p udp -m multiport --ports 111,2000,2002,2004,2049 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 111,2000,2001,2003,2049 -j DROP
iptables -A INPUT -p udp -m multiport --dports 111,2000,2002,2004,2049 -j DROP
Сохраняем и проверяем правила
netfilter-persistent save
cat /etc/iptables/rules.v4
Установим пакеты которые нам потребуются, в процессе установки соглашаемся с сохранением правил iptables:
apt update && apt install nfs-common iptables-persistent jq -y
Сохраним значение IP адреса сервера в переменную и проверим доступность точки монтирования для клиента:
export NFS_SERVER=<IP адерес сервера>
showmount -e $NFS_SERVER
После того как убедлись что всё корректно и в списке экспорта увидели свой IP можно подключать файловую систему:
mkdir -p /mnt/nfs/storage
mount -v -t nfs $NFS_SERVER:storage /mnt/nfs/storage
В выводе должно отобразить что подключён удалённое хранилище, так же создайте файл на клиентской машине и проверьте на сервере что он появился, при необходимости постоянного подключения добавляем в fstab:
df -h
touch /mnt/nfs/storage/test.txt
echo "$NFS_SERVER:/storage /mnt/nfs/storage nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0" >> /etc/fstab