Не удается смонтировать клиент NFS за брандмауэром

У меня есть система Ubuntu 11.10 с брандмауэром iptables. После закрепления портов для mountd, lockd и statd, а затем их открытия в iptables я могу без проблем выставлять общие ресурсы NFS через брандмауэр.

У меня проблема с подключением общего ресурса с другого NFS-сервера, который я не могу контролировать. Если я отключу брандмауэр, я могу смонтировать общий ресурс. Я также могу смонтировать другие общие папки NFS без отключения брандмауэра.

Итак, это приводит меня к двум вопросам:

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

Полная конфигурация и информация об ошибках:

Сервер NFSv3 в соответствии с nfsstat, Когда я делаю гору:

# mount -t nfs -v 192.168.80.48:/location /mnt/tmp
mount.nfs: timeout set for Fri Mar 23 09:13:00 2012
mount.nfs: trying text-based options 'vers=4,addr=192.168.80.48,clientaddr=192.168.40.173'
mount.nfs: mount(2): No such file or directory
mount.nfs: trying text-based options 'addr=192.168.80.48'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: trying 192.168.80.48 prog 100003 vers 3 prot TCP port 2049
mount.nfs: prog 100005, trying vers=3, prot=17
mount.nfs: trying 192.168.80.48 prog 100005 vers 3 prot UDP port 678
mount.nfs: portmap query retrying: RPC: Timed out
mount.nfs: prog 100005, trying vers=3, prot=6
mount.nfs: trying 192.168.80.48 prog 100005 vers 3 prot TCP port 681
mount.nfs: portmap query failed: RPC: Remote system error - Connection timed out

Я вижу отбрасываемые пакеты:

Rejected packets: SRC=192.168.80.48 DST=192.168.40.173 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=TCP SPT=681 DPT=40325 WINDOW=5792 RES=0x00 ACK SYN URGP=0
Rejected packets: SRC=192.168.80.48 DST=192.168.40.173 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=TCP SPT=681 DPT=47419 WINDOW=5792 RES=0x00 ACK SYN URGP=0
Rejected packets: SRC=192.168.80.48 DST=192.168.40.173 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=TCP SPT=681 DPT=41238 WINDOW=5792 RES=0x00 ACK SYN URGP=0

showmount терпит неудачу таким же образом. От многословия mount печатает, похоже, что portmap - это проблема, но я ее открыл.

# 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  32765  status
    100024    1   tcp  32765  status
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    2   tcp   2049
    100227    3   tcp   2049
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    2   udp   2049
    100227    3   udp   2049
    100021    1   udp   4002  nlockmgr
    100021    3   udp   4002  nlockmgr
    100021    4   udp   4002  nlockmgr
    100021    1   tcp   4001  nlockmgr
    100021    3   tcp   4001  nlockmgr
    100021    4   tcp   4001  nlockmgr
    100005    1   udp  32767  mountd
    100005    1   tcp  32767  mountd
    100005    2   udp  32767  mountd
    100005    2   tcp  32767  mountd
    100005    3   udp  32767  mountd
    100005    3   tcp  32767  mountd

# cat /etc/services
sunrpc          111/tcp         portmapper      # RPC 4.0 portmapper
sunrpc          111/udp         portmapper
nfs             2049/tcp                        # Network File System
nfs             2049/udp                        # Network File System

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:smtp
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:sunrpc
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ntp
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:netbios-ns
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:netbios-dgm
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:netbios-ssn
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:microsoft-ds
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:nfs
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:sunrpc
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:3260
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:32765
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:32766
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:32767
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:4001
ACCEPT     udp  --  anywhere             anywhere            udp dpt:domain
ACCEPT     udp  --  anywhere             anywhere            udp dpt:sunrpc
ACCEPT     udp  --  anywhere             anywhere            udp dpt:ntp
ACCEPT     udp  --  anywhere             anywhere            udp dpt:netbios-ns
ACCEPT     udp  --  anywhere             anywhere            udp dpt:netbios-dgm
ACCEPT     udp  --  anywhere             anywhere            udp dpt:netbios-ssn
ACCEPT     udp  --  anywhere             anywhere            udp dpt:https
ACCEPT     udp  --  anywhere             anywhere            udp dpt:microsoft-ds
ACCEPT     udp  --  anywhere             anywhere            udp dpt:nfs
ACCEPT     udp  --  anywhere             anywhere            udp dpt:4002
ACCEPT     udp  --  anywhere             anywhere            udp dpt:32765
ACCEPT     udp  --  anywhere             anywhere            udp dpt:32766
ACCEPT     udp  --  anywhere             anywhere            udp dpt:32767
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:domain
ACCEPT     udp  --  anywhere             anywhere            udp spt:domain
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:sunrpc
ACCEPT     udp  --  anywhere             anywhere            udp spt:sunrpc
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:netbios-ssn
ACCEPT     udp  --  anywhere             anywhere            udp spt:netbios-ssn
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:https
ACCEPT     udp  --  anywhere             anywhere            udp spt:https
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:microsoft-ds
ACCEPT     udp  --  anywhere             anywhere            udp spt:microsoft-ds
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:submission
ACCEPT     udp  --  anywhere             anywhere            udp spt:submission
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:nfs
ACCEPT     udp  --  anywhere             anywhere            udp spt:nfs

1 ответ

Есть настройки в sysctl это определяет диапазоны портов NFS, доступных для соединений.

sunrpc.max_resvport = 1023

sunrpc.min_resvport = 650

Эти настройки определяют самый высокий и самый низкий порты, которые будут использоваться для установления соединений RPC (NFS)

Вы можете открыть эти порты или определить другой диапазон в зависимости от вашей системы. Вы получите отказ, если он попытается использовать порт, заблокированный брандмауэром или другой службой, использующей этот порт.

Редактировать:

Вы также можете увеличить / уменьшить этот диапазон. У меня есть сервер с 460 монтированными NFS в fstab и он потерпит неудачу после 372 или около того. И когда я вручную монтировал один из неисправных, он монтировал его, но отключал один из рабочих монтирований. Я увеличил этот диапазон на 150, и все они смонтированы. Это не лучший способ сделать это. automounter приходит на ум но работает.

Для внесения изменений вы отредактируете свой /etc/sysctl.conf добавить строку вроде:

sunrpc.min_resvport = 900

Чтобы сделать изменение постоянным, если вам нужно изменить их. Помните, что если вы превысите 1024, то это "непривилегированные" порты, и обычные пользователи системы будут иметь к ним доступ по сравнению с - 1024.

Изменить 2:

В вашей команде монтирования NFS вы можете добавить следующее.

proto=tcp - заставляет монтирование использовать TCP / IP

public - обход portmapper полностью и связывается с сервером NFS через порт 2049, если не указано иное

Так, mount nfs.test.com:/export /test

становится

mount -o proto=tcp ,public nfs.test.com:/export /test

РЕДАКТИРОВАТЬ 3

ОК - поехали!!! root@pressyrluck # ./nowhammies > /dev/please

Эта информация была liftedcopiedswipedborrowed от Sourceforge NFS

Некоторые из демонов, участвующих в обмене данными через nfs, уже связаны с портом. portmap всегда находится на порте 111 tcp и udp. nfsd всегда находится на порте 2049 TCP и UDP (однако, начиная с ядра 2.4.17, NFS через TCP считается экспериментальным и не предназначен для использования на производственных машинах).

Другие демоны, statd, mountd, lockd и rquotad, обычно перемещаются к первому доступному порту, о котором им сообщает портмейпер.

Чтобы заставить statd связываться с конкретным портом, используйте параметр -p portnum. Чтобы заставить statd отвечать на определенный порт, дополнительно используйте параметр -o portnum при его запуске.

Чтобы принудительно подключить mountd к определенному порту, используйте параметр -p portnum.

Например, чтобы иметь широковещательную рассылку statd порта 32765 и прослушивание порта 32766 и mountd listen для порта 32767, введите:

# statd -p 32765 -o 32766
# mountd -p 3276

lockd запускается ядром, когда это необходимо. Поэтому вам нужно передать параметры модуля (если он у вас собран как модуль) или параметры ядра, чтобы заставить lockd прослушивать и отвечать только на определенных портах.

Если вы используете загружаемые модули и хотите указать эти параметры в своем файле /etc/modules.conf, добавьте в файл следующую строку:

options lockd nlm_udpport=32768 nlm_tcpport=32768

Ради этого обсуждения давайте опишем сеть и настроим брандмауэр для защиты нашего сервера NFS. Наш сервер NFS - 192.168.0.42, наш клиент - только 192.168.0.45. Как и в приведенном выше примере, statd был запущен так, что он связывается только с портом 32765 для входящих запросов и должен отвечать на порт 32766. mountd принудительно связывается с портом 32767. Параметры модуля lockd установлены на связывание с 32768. nfsd конечно, на порту 2049, а portmapper на порту 111.

Мы не используем квоты.

iptables -A INPUT -f -j ACCEPT -s 192.168.0.45
iptables -A INPUT -s 192.168.0.45 -d 0/0 32765:32768 -p 6 -j ACCEPT
iptables -A INPUT -s 192.168.0.45 -d 0/0 32765:32768 -p 17 -j ACCEPT
iptables -A INPUT -s 192.168.0.45 -d 0/0 2049 -p 17 -j ACCEPT
iptables -A INPUT -s 192.168.0.45 -d 0/0 2049 -p 6 -j ACCEPT
iptables -A INPUT -s 192.168.0.45 -d 0/0 111 -p 6 -j ACCEPT
iptables -A INPUT -s 192.168.0.45 -d 0/0 111 -p 17 -j ACCEPT
iptables -A INPUT -s 0/0 -d 0/0 -p 6 -j DENY --syn --log-level 5
iptables -A INPUT -s 0/0 -d 0/0 -p 17 -j DENY --log-level 5

Первая строка говорит, что нужно принять все фрагменты пакета (кроме первого фрагмента пакета, который будет рассматриваться как обычный пакет). Теоретически, ни один пакет не пройдет до тех пор, пока он не будет повторно собран, и он не будет повторно собран, пока не будет пропущен первый фрагмент пакета. Конечно, существуют атаки, которые могут быть вызваны перегрузкой компьютера фрагментами пакета. Но NFS не будет работать правильно, если вы не пропустите фрагменты. См. Раздел 7 "Устранение неисправностей" для получения подробной информации.

Другие линии разрешают определенные соединения от любого порта на нашем клиентском хосте к определенным портам, которые мы сделали доступными на нашем сервере. Это означает, что если, скажем, 192.158.0.46 попытается связаться с NFS-сервером, он не сможет смонтировать или посмотреть, какие монтирования доступны.

С новыми возможностями закрепления портов, очевидно, намного проще контролировать, какие хосты могут монтировать ваши NFS-ресурсы. Стоит отметить, что NFS не является зашифрованным протоколом, и любой человек в той же физической сети может прослушивать трафик и собирать информацию, передаваемую назад и вперед.

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