如何强制使用tcp而不是udp for rpcbind?

我试图在Debian Wheezy下使用tcp / 111作为rpcbind而不是udp / 111。 Squeeze中的portmap使用tcp / 111,没有任何特殊configuration,但是Wheezy失败。

甚至很多网站(以及RFC)都说TCP或UDP是dynamicselect的,或者有时在UDP失败的情况下使用TCP … – 当我用rpcbind在Wheezy客户机上拒绝udp / 111(使用iptables )时,出现错误。 ..

 # showmount -e server Export list for server: .... # iptables -I OUTPUT -j REJECT -d server -p udp --dport 111 --reject-with icmp-port-unreachable # showmount -e server clnt_create: RPC: Port mapper failure - Unable to send: errno 1 (Operation not permitted) # 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 # 

我如何设置rpcbind只使用TCP?

如果您使用vers=3,proto=tcp挂载vers=3,proto=tcp ,则在查询rpcbind以查找实际挂载时使用TCP:

 $ tshark -nr nfs.pcap "tcp.stream eq 0" 2 192.168.1.89 36200 192.168.1.60 111 TCP 74 [SYN] 3 192.168.1.60 111 192.168.1.89 36200 TCP 74 [SYN, ACK] 4 192.168.1.89 36200 192.168.1.60 111 TCP 66 [ACK] 5 192.168.1.89 36200 192.168.1.60 111 Portmap 126 V2 GETPORT Call 6 192.168.1.60 111 192.168.1.89 36200 TCP 66 [ACK] 7 192.168.1.60 111 192.168.1.89 36200 Portmap 98 V2 GETPORT Reply (Call In 5) 8 192.168.1.89 36200 192.168.1.60 111 TCP 66 [ACK] 9 192.168.1.89 36200 192.168.1.60 111 TCP 66 [FIN, ACK] 10 192.168.1.60 111 192.168.1.89 36200 TCP 66 [FIN, ACK] 11 192.168.1.89 36200 192.168.1.60 111 TCP 66 [ACK] 

我只能假设showmount是硬编码使用UDP。 我尝试读取nfs-utils的源代码,但在clnt_call()之后在showmount.c丢失了,对不起。