nfs client在多ip挂载时报"unmatched host"

client:

# ip -4 addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc htb state UP group default qlen 1000
    inet 192.168.0.121/24 brd 192.168.0.255 scope global eth0:100
       valid_lft forever preferred_lft forever
    inet 192.168.0.119/24 brd 192.168.0.255 scope global secondary eth0:99
       valid_lft forever preferred_lft forever
    inet 192.168.0.30/24 brd 192.168.0.255 scope global secondary eth0
       valid_lft forever preferred_lft forever
    inet 192.168.0.31/24 brd 192.168.0.255 scope global secondary eth0
       valid_lft forever preferred_lft forever
# ip route
169.254.8.0/24 dev inter0  proto kernel  scope link  src 169.254.8.1 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.121
# mount -t nfs -o vers=3  192.168.0.141:/mnt/xfs nfs  -vvvv
mount.nfs: timeout set for Fri Apr 10 09:30:05 2020
mount.nfs: trying text-based options 'vers=3,addr=192.168.0.141'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: trying 192.168.0.141 prog 100003 vers 3 prot TCP port 2049
mount.nfs: prog 100005, trying vers=3, prot=17
mount.nfs: trying 192.168.0.141 prog 100005 vers 3 prot UDP port 49076
mount.nfs: mount(2): Permission denied
mount.nfs: access denied by server while mounting 192.168.0.141:/mnt/xfs

server:

# cat /etc/exports 
/mnt/xfs 192.168.0.31(rw)
# tail -f /var/log/syslog
Apr 10 10:49:56 linux rpc.mountd[7676]: refused mount request from 192.168.0.121 for /mnt/xfs (/mnt/xfs): unmatched host
Apr 10 10:49:56 linux kernel: [311255.442469] nfsd_dispatch: vers 3 proc 0

server端指定了要用192.168.0.31挂载, 但通过tcpdump发现, mount.nfs使用了192.168.0.121发起请求导致被拒绝, 即使clinet mount时使用clientaddr=192.160.0.31选项也是同样的错误, 请问这要如何处理?

阅读 4.5k
1 个回答

原因: 在mount.nfs代码中未发现bind指定ip的操作:

// git clone -b ubuntu/trusty  https://git.launchpad.net/ubuntu/+source/nfs-utils # nfs-common 1:1.2.8-6ubuntu1.2
// nfs-utils/utils/mount/nfsmount.c : 787~817
// 最新版1.3.4-3也是这样
if (nfs_mount_data_version == 1) {
        /* create nfs socket for kernel */
        if (nfs_pmap->pm_prot == IPPROTO_TCP)
            fsock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        else
            fsock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
        if (fsock < 0) {
            perror(_("nfs socket"));
            goto fail;
        }
        if (bindresvport(fsock, 0) < 0) {
            perror(_("nfs bindresvport"));
            goto fail;
        }
    }

#ifdef NFS_MOUNT_DEBUG
    printf(_("using port %lu for nfs deamon\n"), nfs_pmap->pm_port);
#endif
    nfs_saddr->sin_port = htons(nfs_pmap->pm_port);
    /*
     * connect() the socket for kernels 1.3.10 and below only,
     * to avoid problems with multihomed hosts.
     * --Swen
     */
    if (linux_version_code() <= MAKE_VERSION(1, 3, 10) && fsock != -1
        && connect(fsock, (struct sockaddr *) nfs_saddr,
               sizeof (*nfs_saddr)) < 0) {
        perror(_("nfs connect"));
        goto fail;
    }

clientaddr应该是其他作用.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进