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