Назад | Перейти на главную страницу

Сбой при монтировании клиента NFS за брандмауэром

У меня есть система Ubuntu 11.10 с брандмауэром iptables. После закрепления портов для mountd, lockd и statd, а затем открытия их в iptables, я могу без проблем открывать общие ресурсы 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

Есть настройки в 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

Эта информация была lifted copied swiped borrowed из Sourceforge NFS

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

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

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

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

Например, чтобы иметь статистическую трансляцию порта 32765 и прослушивать порт 32766, а mountd слушать порт 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, а средство отображения портов - порт 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 не является зашифрованным протоколом, и любой человек в одной физической сети может прослушивать трафик и повторно собирать передаваемую информацию.